Commit Graph
277 Commits
Author SHA1 Message Date
codingetandClaude 5bcf7fb0a7 docs: record TLS-upgrade integration in AI_CHANGES.md
CI / format (pull_request) Successful in 1m33s
CI / lint (pull_request) Successful in 1m48s
CI / install (pull_request) Successful in 5m45s
CI / typetest (pull_request) Successful in 1m57s
CI / node-tests (pull_request) Successful in 2m10s
CI / typecheck (pull_request) Successful in 2m13s
CI / browser-tests (pull_request) Successful in 3m39s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:15:12 +00:00
codingetandClaude f2f2293f13 feat(tsconnect-worker): integrate TLS upgrades with state transfer
Transferred conns keep their TLS state: claim replies and conn
ResourceMeta carry isTls, upgradeTls is serialized through the resource
chan lock (never overlapping an in-flight read, reply dropped on detach
mid-upgrade), and transferState refuses while an upgrade is in progress.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:15:09 +00:00
codingetandClaude 33b9ff5c65 docs: record state transfer review round in AI_CHANGES.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:09:12 +00:00
codingetandClaude 3a7c711484 fix(http): prune emptied pool slots on exportIdle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:09:12 +00:00
codingetandClaude b0a641a68d fix(drive): close remaining exports when transferState fails mid-loop
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:09:12 +00:00
codingetandClaude 82396fffc0 fix(tsconnect-worker): collect nested transfer tokens and fix replay order
transfer() only recognized a bare TransferToken, so composite states like
DavTransferState were sent with an empty tokens list, skipping worker-side
validation and queue-expiry cleanup. Handshake-buffered envelopes are now
replayed before awaiting the client lock so channel ordering is preserved,
and the main-thread promise-returning stubs reject instead of throwing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:09:12 +00:00
codingetandClaude 8944a8a8fc fix(tsconnect-worker): preserve in-flight results across ownership transfer
Results of reads/accepts that were in flight when a resource was detached
were delivered to the old owner's dead port, and accepted conns were
registered on (and leaked with) the old client entry. Each resource now
carries a generation-tagged channel; stale completions are deposited into
a backlog the next owner's bridge drains first, serialized so stream order
is preserved. TTL expiry and cancel close backlogged conns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:09:12 +00:00
codingetandClaude b7f3bd46c3 docs: record state transfer work in AI_CHANGES.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude a228434d11 test(tsconnect-worker): two-tab state transfer browser tests
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude 007f1695bb fix(tsconnect-worker): buffer transfer envelopes during connect handshake
Envelopes flushed by the worker when a client key registers arrive before
ready and were dropped by the temporary handshake handler.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude c2a4414b0d feat(drive): state transfer support via pool export and adopt
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude fd2867f889 feat(http): connection pool export and seed for state transfer
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude c6c843cf9b feat(tsconnect-worker): workerDialer adapter
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:08:12 +00:00
codingetandClaude b52ac28e74 feat(tsconnect-worker): client-side transfer proxies and broker
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:07:55 +00:00
codingetandClaude 2e33163eb1 feat(tsconnect-worker): worker-side resource transfer registry
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:06:24 +00:00
codingetandClaude efc0338265 feat(tsconnect-worker): protocol types and worker resource ids
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 17:06:24 +00:00
codingetandClaude 2797234f23 feat(transport): add StateTransferable interface
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 17:05:47 +00:00
codingetandClaude 59398e8b52 docs: record TLS-upgrade review rounds in AI_CHANGES.md
CI / format (pull_request) Successful in 1m17s
CI / lint (pull_request) Successful in 1m20s
CI / install (pull_request) Successful in 5m18s
CI / node-tests (pull_request) Successful in 1m48s
CI / typetest (pull_request) Successful in 1m49s
CI / typecheck (pull_request) Successful in 2m1s
CI / browser-tests (pull_request) Successful in 3m27s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XfRgMke8p7QDxD5QM5thxH
2026-07-12 14:09:28 +00:00
codingetandClaude 2555cdd47f fix(transport): make pre-handshake upgrade failures consistent and leak-free
Addresses a blocking external-review finding: pre-handshake TLS
configuration failures could leave the connection state inconsistent
or leak the underlying socket.

- The Go upgradeTLS now closes the conn on configuration errors too
  (submodule bump), so Conn.upgradeTls marking itself closed on any
  raw rejection no longer strands a live, unclosable Go conn.
- NodeTransport.upgradeTls constructs the TLS socket inside the
  try/catch: createSecureContext/connectTls throw synchronously on
  invalid PEM, which previously escaped after listeners were detached
  and #upgrading was set, leaving the transport permanently stuck.
- Contract documented on RawTransport: synchronous option-validation
  rejections leave the transport usable; any failure after the upgrade
  starts closes it.

Regression tests: malformed server certPem/keyPem (sync throw path)
and malformed client caCerts (verification failure path) on node, both
asserting the closed-and-not-stuck end state; fatal-rejection contract
on the tsconnect Conn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XfRgMke8p7QDxD5QM5thxH
2026-07-12 14:08:40 +00:00
codingetandClaude da345d4d58 fix(transport): address neutral-review findings on TLS upgrade
- NodeTransport server-side upgrade no longer rejects on buffered data:
  a pipelining peer's ClientHello can land in the internal buffer in the
  gap between writing the go-ahead and calling upgradeTls. Buffered
  chunks are unshifted back into the stream for the TLS wrap to consume.
  Client-side, buffered data still rejects (there it is a protocol bug).
- The worker upgradeError reply now carries a closed flag so WorkerConn
  only tears down the connection when the handshake actually failed;
  rejected upgrades (bad options, stale wasm) leave it usable, matching
  the direct Conn semantics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XfRgMke8p7QDxD5QM5thxH
2026-07-12 14:08:40 +00:00
codingetandClaude e29e097863 fix(transport): guard read/write during an in-flight TLS upgrade
Review finding: the quiescence check ran only before starting the
upgrade; reads or writes issued while the handshake was in flight
would race it on the underlying socket (node) or hit the stale
pre-upgrade Go handle (tsconnect). All three implementations now
track an upgrading flag that read(), write() and a second
upgradeTls() reject on. Also front-load the serverName-required
check in Conn.upgradeTls to match NodeTransport.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XfRgMke8p7QDxD5QM5thxH
2026-07-12 14:08:40 +00:00
codingetandClaude 1689c2eacc feat(transport): add explicit TLS upgrade (STARTTLS / AUTH TLS) to RawTransport
Adds an optional in-place upgradeTls(options) method and an isTls
getter to RawTransport, implemented on the node and tsconnect
transports. Client mode takes serverName/insecureSkipVerify/caCerts
(serverName required unless skipping verification); server mode takes
isServer with a PEM cert/key pair. Upgrading requires a quiescent
transport and closes the connection on handshake failure.

NodeTransport wraps its existing socket with node:tls; tsconnect's
Conn swaps its raw handle via the new upgradeTLS wasm bridge method
(tailscale submodule bump); tsconnect-worker forwards the upgrade over
new per-conn protocol messages and carries isTls on conn/accepted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XfRgMke8p7QDxD5QM5thxH
2026-07-12 14:08:40 +00:00
codingetandCodex d60c6d1736 docs: require labels on issues
CI / install (pull_request) Successful in 5m21s
CI / typetest (pull_request) Successful in 1m55s
CI / node-tests (pull_request) Successful in 2m5s
CI / typecheck (pull_request) Successful in 2m6s
CI / lint (pull_request) Successful in 1m20s
CI / browser-tests (pull_request) Successful in 3m33s
CI / format (pull_request) Successful in 1m21s
Co-Authored-By: GPT-5.6 Luna <noreply@openai.com>
2026-07-12 01:52:36 +00:00
codingetandCodex 95ec85db15 docs: clarify scoped checks and CI finalisation
CI / typetest (pull_request) Successful in 1m56s
CI / node-tests (pull_request) Successful in 2m5s
CI / typecheck (pull_request) Successful in 2m7s
CI / browser-tests (pull_request) Successful in 3m39s
CI / format (pull_request) Successful in 1m39s
CI / lint (pull_request) Successful in 1m39s
CI / install (pull_request) Successful in 5m32s
Co-Authored-By: GPT-5.6 Luna <noreply@openai.com>
2026-07-12 01:33:50 +00:00
codingetandCodex 07ca1eaea9 test(ftp): add real-server integration coverage
CI / lint (pull_request) Successful in 1m35s
CI / browser-tests (pull_request) Successful in 6m7s
CI / node-tests (pull_request) Successful in 2m12s
CI / typetest (pull_request) Successful in 2m22s
CI / typecheck (pull_request) Successful in 2m32s
CI / format (pull_request) Successful in 1m32s
CI / install (pull_request) Successful in 7m55s
Co-Authored-By: GPT-5.5 <noreply@openai.com>
2026-07-12 01:15:11 +00:00
codingetandCodex 77041f815f feat(dev): add remote host development mode
CI / typecheck (pull_request) Successful in 2m11s
CI / node-tests (pull_request) Successful in 2m11s
CI / browser-tests (pull_request) Successful in 3m40s
CI / lint (pull_request) Successful in 1m25s
CI / format (pull_request) Successful in 1m18s
CI / install (pull_request) Successful in 5m31s
CI / typetest (pull_request) Successful in 1m58s
Co-Authored-By: GPT-5.6 Terra <noreply@openai.com>
2026-07-12 00:36:02 +00:00
codinget fee32aeb67 feat(test-app): add ftp to test-app
CI / format (pull_request) Successful in 1m39s
CI / browser-tests (pull_request) Successful in 3m45s
CI / install (pull_request) Successful in 5m29s
CI / typetest (pull_request) Successful in 2m1s
CI / node-tests (pull_request) Successful in 2m11s
CI / lint (pull_request) Successful in 1m34s
CI / typecheck (pull_request) Successful in 2m13s
2026-07-12 00:22:09 +00:00
codingetandClaude 33e59e3927 fix(ftp): address review findings on error handling and interop
- server: reply 451 (and notify onError) instead of dropping the control
  connection when a VFS backend throws a non-VFSError
- server: drop dead TYPE/PROT session state (accept-and-ignore is
  deliberate; binary transfers are correct for the compat targets)
- client: guard close() against a failed connect; reconnect transparently
  when the cached control connection has dropped (FTP idle timeouts)
- client: send REST immediately before RETR, after PASV/EPSV (RFC 3659 5.3)
- replies: map 550 'permission denied' text to forbidden, not not-found

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:09 +00:00
codingetandClaude 743227cd96 fix(ftp): reject CR/LF in control commands and replies
Prevents command injection when an argument (e.g. a VFS path) contains
CRLF, which would otherwise be written verbatim onto the control channel
and let a caller smuggle additional FTP commands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:09 +00:00
codingetandClaude 20c6e5b0d5 docs: add @webnet/ftp entry to AI_CHANGES.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:09 +00:00
codingetandClaude 1d5f0e25e7 test(ftp): add client/server integration and protocol tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:09 +00:00
codingetandClaude 683df707f9 feat(ftp): add FTP client implementing AsyncVFS
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:08 +00:00
codingetandClaude 2afe26c452 feat(ftp): add FTP server
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:08 +00:00
codingetandClaude 312cb102bc feat(ftp): add common protocol layer (codec, listings, replies, paths)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:08 +00:00
codingetandClaude 82a53dea91 feat(ftp): scaffold @webnet/ftp package
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMqjFbejK5h7MJamdfh3VY
2026-07-12 00:22:08 +00:00
codingetandCodex ec0a53e4d0 fix(ci): require built WASM artifacts for tests
CI / typecheck (pull_request) Successful in 1m53s
CI / node-tests (pull_request) Successful in 1m55s
CI / typetest (pull_request) Successful in 1m57s
CI / browser-tests (pull_request) Successful in 3m30s
CI / format (pull_request) Successful in 1m11s
CI / lint (pull_request) Successful in 1m14s
CI / install (pull_request) Successful in 5m22s
Co-Authored-By: GPT-5.6 Terra <noreply@openai.com>
2026-07-11 13:41:04 +00:00
codingetandCodex cca5e974cf docs(agents): clarify npm workspace structure
CI / format (pull_request) Successful in 1m46s
CI / lint (pull_request) Successful in 1m51s
CI / install (pull_request) Successful in 5m28s
CI / typetest (pull_request) Successful in 1m39s
CI / node-tests (pull_request) Successful in 1m47s
CI / typecheck (pull_request) Successful in 1m47s
CI / browser-tests (pull_request) Successful in 3m10s
Co-Authored-By: GPT-5.6 Luna <noreply@openai.com>
2026-07-11 12:38:18 +00:00
codingetandCodex 97b78f6b61 docs(agents): require exact model attribution
CI / format (pull_request) Successful in 1m19s
CI / lint (pull_request) Successful in 1m24s
CI / install (pull_request) Successful in 4m49s
CI / typetest (pull_request) Successful in 1m32s
CI / node-tests (pull_request) Successful in 1m39s
CI / typecheck (pull_request) Successful in 1m43s
CI / browser-tests (pull_request) Successful in 3m9s
Co-Authored-By: GPT-5.6-Sol <noreply@openai.com>
2026-07-10 23:31:54 +00:00
codingetandClaude 1313152b66 docs(agents): clarify CLAUDE.md symlink and tea mergeability output
CI / lint (pull_request) Successful in 1m1s
CI / format (pull_request) Successful in 1m9s
CI / install (pull_request) Successful in 4m3s
CI / typetest (pull_request) Successful in 55s
CI / node-tests (pull_request) Successful in 1m5s
CI / typecheck (pull_request) Successful in 1m6s
CI / browser-tests (pull_request) Successful in 2m15s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 08:35:43 +00:00
codinget 6471558e18 ci: don't run CI on main branch, it's guaranteed to have run earlier via PRs
CI / format (pull_request) Successful in 1m32s
CI / lint (pull_request) Successful in 1m35s
CI / install (pull_request) Successful in 4m30s
CI / typecheck (pull_request) Successful in 1m13s
CI / typetest (pull_request) Successful in 1m19s
CI / node-tests (pull_request) Successful in 1m19s
CI / browser-tests (pull_request) Successful in 2m40s
2026-07-04 01:23:50 +02:00
codingetandClaude f693b21210 test(tsconnect-worker): poll for message conditions instead of fixed sleeps
CI / format (pull_request) Successful in 1m15s
CI / lint (pull_request) Successful in 1m22s
CI / install (pull_request) Successful in 5m26s
CI / typetest (pull_request) Successful in 1m16s
CI / typecheck (pull_request) Successful in 1m24s
CI / node-tests (pull_request) Successful in 1m26s
CI / browser-tests (pull_request) Successful in 2m43s
CI / format (push) Successful in 53s
CI / lint (push) Successful in 1m2s
CI / install (push) Successful in 4m8s
CI / typetest (push) Successful in 1m9s
CI / node-tests (push) Successful in 1m14s
CI / typecheck (push) Successful in 1m20s
CI / browser-tests (push) Successful in 3m28s
Several worker.test.ts tests (WorkerSSHSession.resize()/close() flagged
as flaky in CI, plus other close()-message, callback-firing, and
pumpStreamToPort tests) waited a flat setTimeout(r, 10) after
postMessage before asserting the message arrived — the same race
already fixed for closed-state checks in b917cd8. Under CI load the
10ms sleep can elapse before the message is delivered, causing
sporadic AssertionErrors.

Added a generic waitFor(predicate, timeoutMs?) helper that polls via
setImmediate, replaced every fixed sleep with a poll on the actual
condition, and consolidated the four pre-existing
`while (!x.closed) await setImmediate()` spin-loops from b917cd8 onto
the same helper for consistency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 22:59:40 +00:00
codingetandClaude 1aa26fd33e ci: consolidate workflows, build once per run
CI / lint (pull_request) Successful in 1m24s
CI / format (pull_request) Successful in 1m26s
CI / install (pull_request) Successful in 4m16s
CI / typetest (pull_request) Successful in 1m0s
CI / typecheck (pull_request) Successful in 1m29s
CI / browser-tests (pull_request) Successful in 2m48s
CI / node-tests (pull_request) Successful in 28s
CI / format (push) Successful in 1m6s
CI / lint (push) Successful in 1m6s
CI / install (push) Successful in 4m33s
CI / typecheck (push) Successful in 1m40s
CI / typetest (push) Successful in 1m42s
CI / node-tests (push) Successful in 1m38s
CI / browser-tests (push) Successful in 3m11s
Every job in the old checks.yml/test-node.yml/test-browser.yml
independently repeated checkout + tailscale submodule clone + npm ci,
and 5 of 7 also independently rebuilt the whole workspace via Turbo.
There was no caching anywhere.

Live smoke tests against this Gitea instance found actions/cache
(and setup-node's built-in cache: npm, same API) times out against
the built-in cache proxy - a server-side issue, not fixable from
workflow YAML - and actions/upload-artifact/download-artifact v4
refuse to run at all (GHES detection). v3 of the artifact actions
work correctly, so they're used as the handoff mechanism instead.

.gitea/workflows/checks.yml, test-node.yml, and test-browser.yml are
merged into one ci.yml. A new `install` job does the real work once
(submodule clone, npm ci, build) and hands node_modules plus Turbo's
local cache off via v3 artifacts to typecheck/typetest/node-tests/
browser-tests (all `needs: install`), instead of every job reinstalling
and rebuilding from scratch. lint/format never touched the submodule
or build output, so they drop that step and stay independent for fast
feedback. The shared checkout+submodule+setup-node preamble is now a
composite action, .gitea/actions/setup/action.yml (composite actions
require the repo to already be checked out, so actions/checkout stays
a separate first step in every job). A concurrency group cancels
superseded runs on the same ref.

The node_modules archive step must include per-package node_modules
overrides, not just the root: packages/xml and packages/vfs pin a
newer local TypeScript than the workspace root, installed by npm as
nested packages/{xml,vfs}/node_modules/typescript. Missing those in
the archive caused those two packages to silently typecheck against
the wrong TypeScript version.

Cross-run caching (reusing a previous run's install/build) isn't
available until the Gitea instance's cache backend is fixed
server-side - that's a separate, out-of-scope follow-up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 22:40:24 +00:00
codingetandClaude 3ed8095263 chore: update AI_CHANGES.md for PR #56
Checks / lint (pull_request) Successful in 1m24s
Checks / format (pull_request) Successful in 1m30s
Checks / typetest (pull_request) Successful in 7m56s
Checks / build (pull_request) Successful in 8m33s
Checks / typecheck (pull_request) Successful in 8m37s
Node Tests / node-tests (pull_request) Successful in 7m44s
Browser Tests / browser-tests (pull_request) Successful in 8m51s
Checks / lint (push) Successful in 1m40s
Checks / format (push) Successful in 1m48s
Checks / typetest (push) Successful in 8m59s
Checks / build (push) Successful in 9m11s
Checks / typecheck (push) Successful in 9m22s
Node Tests / node-tests (push) Successful in 8m13s
Browser Tests / browser-tests (push) Successful in 9m35s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 02:24:39 +00:00
codingetandClaude b917cd88eb test(tsconnect-worker): fix flaky closed-state tests
Checks / lint (pull_request) Successful in 1m15s
Checks / format (pull_request) Successful in 1m21s
Checks / typecheck (pull_request) Successful in 7m21s
Checks / typetest (pull_request) Successful in 7m42s
Checks / build (pull_request) Successful in 8m0s
Node Tests / node-tests (pull_request) Successful in 7m13s
Browser Tests / browser-tests (pull_request) Successful in 8m16s
Replace racy `setTimeout(r, 10)` waits with a `setImmediate` poll on
the `.closed` property. The 10 ms sleep was insufficient under load,
causing `readFrom()`/`read()`/`write()`/`accept()` to run before the
"closed" message was delivered, resulting in "packet conn closed"
instead of the expected "already closed" error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 23:49:43 +00:00
codingetandClaude c04b0d6eea fix(utils): fix suggestedName typo and defer URL revocation in download()
Checks / format (pull_request) Successful in 3m6s
Checks / lint (pull_request) Successful in 3m14s
Checks / typecheck (pull_request) Successful in 11m10s
Checks / typetest (pull_request) Successful in 11m39s
Checks / build (pull_request) Successful in 11m43s
Node Tests / node-tests (pull_request) Successful in 9m46s
Browser Tests / browser-tests (pull_request) Successful in 11m10s
Checks / lint (push) Successful in 2m46s
Checks / format (push) Successful in 3m32s
Checks / typecheck (push) Successful in 11m31s
Checks / typetest (push) Successful in 12m29s
Checks / build (push) Successful in 12m41s
Node Tests / node-tests (push) Failing after 10m51s
Browser Tests / browser-tests (push) Successful in 12m36s
- Fix `suggegestedName` typo in showSaveFilePicker call (extra "ge");
  the browser silently ignored the unknown key so the Save dialog opened
  with a blank filename on Chrome/Edge
- Defer URL.revokeObjectURL to setTimeout() so Safari's download
  manager has a task boundary to open the object URL before revocation
- Add AI_CHANGES.md entry for the @webnet/react/@webnet/utils integration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 18:29:45 +00:00
codingetandClaude 37f2fb04a0 feat: integrate @webnet/react and @webnet/utils into example-app and test-app
Checks / lint (pull_request) Successful in 2m50s
Checks / format (pull_request) Successful in 3m22s
Checks / typetest (pull_request) Successful in 10m10s
Checks / typecheck (pull_request) Successful in 10m43s
Node Tests / node-tests (pull_request) Successful in 10m50s
Checks / build (pull_request) Successful in 11m27s
Browser Tests / browser-tests (pull_request) Successful in 12m2s
- example-app: replace local useClient duplicate with @webnet/react, add
  useLocalStorage to persist SharedWorker preference across page reloads
- example-app: replace local fmtSize duplicate with @webnet/utils/fmtSize,
  use download() util in WaitingFileDebug instead of inline logic
- test-app: add @webnet/utils dependency and expose it on window alongside
  other globals for console testing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 16:34:42 +00:00
codingetandClaude 5dc0478970 feat: add @webnet/react and @webnet/utils packages
Checks / lint (pull_request) Successful in 2m5s
Checks / format (pull_request) Successful in 2m4s
Checks / typecheck (pull_request) Successful in 9m10s
Checks / typetest (pull_request) Successful in 10m16s
Checks / build (pull_request) Successful in 11m12s
Node Tests / node-tests (pull_request) Successful in 10m57s
Browser Tests / browser-tests (pull_request) Successful in 12m28s
Checks / format (push) Successful in 3m15s
Checks / lint (push) Successful in 3m46s
Checks / typetest (push) Successful in 9m41s
Checks / typecheck (push) Successful in 11m54s
Checks / build (push) Successful in 11m59s
Node Tests / node-tests (push) Failing after 9m54s
Browser Tests / browser-tests (push) Successful in 14m28s
Extracts the useClient and useLocalStorage hooks into @webnet/react,
and the download, upload, readBlob, and fmtSize utilities into @webnet/utils,
so they can be shared by tailshare and other apps without living inside
a single app package.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 00:42:38 +00:00
codingetandClaude 9914bd07a8 docs(agents): PR labeling and auto-finalise guidance
Node Tests / node-tests (push) Has been cancelled
Browser Tests / browser-tests (push) Has been cancelled
Checks / lint (push) Has been cancelled
Checks / format (push) Has been cancelled
Checks / typecheck (push) Has been cancelled
Checks / typetest (push) Has been cancelled
Checks / build (push) Has been cancelled
Node Tests / node-tests (pull_request) Has been cancelled
Browser Tests / browser-tests (pull_request) Has been cancelled
Checks / lint (pull_request) Successful in 3m34s
Checks / format (pull_request) Successful in 3m1s
Checks / typetest (pull_request) Successful in 9m17s
Checks / typecheck (pull_request) Successful in 9m45s
Checks / build (pull_request) Successful in 9m42s
Add instructions for agents to apply `Agentic` + `Agent/<model-line>`
labels to every PR they open (creating the labels via `tea labels create`
if absent), and to auto-finalise PRs without user prompting when the
work is trivial or was fully specified upfront.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 02:25:32 +02:00
codingetandClaude d1e4352765 docs(ai): finalise AI_CHANGES.md for PR #51
Checks / format (pull_request) Successful in 3m32s
Checks / lint (pull_request) Successful in 3m33s
Checks / typetest (pull_request) Successful in 11m24s
Checks / build (pull_request) Successful in 11m54s
Checks / typecheck (pull_request) Successful in 12m1s
Node Tests / node-tests (pull_request) Successful in 9m19s
Browser Tests / browser-tests (pull_request) Successful in 6m48s
Checks / typecheck (push) Successful in 8m34s
Browser Tests / browser-tests (push) Has been cancelled
Checks / typetest (push) Has been cancelled
Checks / build (push) Has been cancelled
Checks / lint (push) Has been cancelled
Checks / format (push) Has been cancelled
Node Tests / node-tests (push) Successful in 8m10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 23:36:11 +00:00
codingetandClaude 1ad12e7a77 fix(tsconnect-worker): address code review findings
Checks / lint (pull_request) Successful in 3m11s
Checks / format (pull_request) Successful in 3m23s
Checks / typecheck (pull_request) Successful in 10m21s
Checks / typetest (pull_request) Successful in 10m45s
Checks / build (pull_request) Successful in 10m55s
Node Tests / node-tests (pull_request) Successful in 8m14s
Browser Tests / browser-tests (pull_request) Successful in 4m57s
- IpnClientHandle.disconnect() JSDoc clarifies that the main-thread path
  terminates IPN while the worker path is a soft detach
- connectWithFallback logs a console.warn with the caught error when falling
  back from the SharedWorker path, so unexpected fallbacks are diagnosable
- IpnMainThreadHandle constructor comment explains that pre-run() callbacks
  are intentionally dropped (run() snapshots current state on subscribe)
- lock?.release ?? null -> lock ? () => lock.release() : null to avoid
  passing an unbound method reference
- Browser test: first test adds stateStorage: "memory" to avoid leaving IDB
  state between runs
- Browser test: new test covers the IDB lock-contention path — acquires the
  lock manually then confirms connectMainThread rejects immediately

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 07:50:01 +00:00