Repository navigation
feat(client): daemonLifecycle attach mode and ensureDaemon() - #3765
Conversation
Size Report
Startup median (7 runs, lower is better):
|
|
There was a problem hiding this comment.
All reported issues were addressed across 26 files
You’re at about 92% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
1a5cedd to
9f6aff4
Compare
There was a problem hiding this comment.
All reported issues were addressed across 2 files (changes from recent commits).
You’re at about 92% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
9f6aff4 to
4488553
Compare
685c01a to
c95c9c8
Compare
c95c9c8 to
44eefce
Compare
There was a problem hiding this comment.
All reported issues were addressed across 14 files (changes from recent commits).
You’re at about 94% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
44eefce to
5035bed
Compare
769eda3 to
ddb6a5e
Compare
ddb6a5e to
e9819db
Compare
ad96e33 to
0c26950
Compare
|
The reviewed commit 0c26950 has one problem that should change before merge. src/cli/commands/proxy.ts:32 used to call the managed ensureDaemon, which replaced an incompatible or socket-only daemon. It now calls ensureDaemonInfo. Three cases now fail: a daemon from the previous release with no Not blocking, and fine to take or leave: the rule "may this caller start or retire the daemon" is now encoded four times (daemonLifecycle, retireIncompatibleContender, the sendRequest timeoutRecovery, and handleRequestTimeout's retireUnresponsive); daemonStopCommand in daemon-client-timeout.ts duplicates stopHint and the inline strings in daemon-client-lifecycle.ts; the attach test in daemon-client-explicit-lifecycle.test.ts only checks the timeoutRecovery value on a spy, and every quiesce outcome comes from a scripted /rpc stub rather than the #3764 handler, so one sendToDaemon attach test with a wedged daemon and one ensureDaemon test that replaces a real spawned daemon would close that gap; the quiesce timeout in daemon-client-ensure.ts can rethrow the attach-worded hint "start one with ensureDaemon()" and needs its own hint; and the PR body says 26 files while the diff has 29. Simplicity question: could daemonLifecycle, retireIncompatibleContender and timeoutRecovery/retireUnresponsive become one DaemonClientSettings field, CI has no result on this head. All 9 checks that did not pass were cancelled as superseded runs on the stacked branch, and the diff touches each of those lanes, so please rerun them. I read the code and did not run the tests or check:affected, so the "passed" in the PR body is unverified by me. No test drives ensureDaemon against the real #3764 daemon_quiesce handler, so the client and daemon pairing rests on contract constants only. There are no conflicts. Before merge, keep proxy.ts on ensureManagedDaemon (or document its new idle-only replacement in the CHANGELOG and remote-proxy.md) and rerun the cancelled CI lanes on this head. |
0c26950 to
d892ab3
Compare
|
Thanks, the proxy regression was real. Fixed in d892ab3.
|
There was a problem hiding this comment.
All reported issues were addressed across 12 files (changes from recent commits).
You’re at about 95% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
An attach client connects to the daemon registered in its state directory and never starts, replaces or kills one, including after a request times out; it fails with daemon-not-running or daemon-incompatible. ensureDaemon() starts a missing daemon and replaces an incompatible one only through the daemon's own quiesce answer, refusing with daemon-busy while it holds work and never replacing a daemon that predates the capability. managed stays the default and unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
d892ab3 to
f21b001
Compare
|
The PR is ready at f21b001. The earlier findings from 0c26950 (#3765 (comment)) are fixed, and I found no new problems in the code. Not blocking, and you can take or leave these: the daemon-not-running hint in https://github.com/callstack/agent-device/blob/f21b001/src/daemon-client/daemon-lifecycle-errors.ts#L62 tells CLI users to run Of the four inline threads from the other review, these no longer apply, so you can resolve them: #3765 (comment) (the startup-busy hint now ends with the stop command), #3765 (comment) (the proxy test matches main apart from the rename, and proxy.ts passes the same transport settings as on main), #3765 (comment) (the docs now name streaming resumable uploads and lease-less host human-control holds as uncounted), and #3765 (comment) (the hint wording is fixed; the missing I did not run any tests, so the "passes at d892ab3" claim is unverified on my side. No ensureDaemon test uses a real spawned daemon; the client and daemon pairing rests on the shared request builder and the stand-in daemons. CI is pending after the rebase: 16 of 18 checks are queued or in progress, and none has finished with a failure. The diff touches the daemon-client lifecycle, the contracts, a daemon runtime test, the proxy command and its test, and the docs, so it overlaps Lint/Typecheck, Coverage, Integration, Smoke and command-docs-gate. There is no failure to attribute yet. There are no conflicts. The remaining step before merge is for CI on f21b001 to finish green. |
|
The review at f21b001 is still clean and the branch now merges cleanly, so I added the ready-for-human label. |
…ment * origin/main: feat(cli): ensure the daemon explicitly before attaching in the CLI and MCP (#3766) feat(client): daemonLifecycle attach mode and ensureDaemon() (#3765) feat(daemon): quiesce request that retires an idle daemon atomically (#3764) fix(daemon): answer a named missing session on the session, not the device (#3701) test: route test/ and scripts/ off the daemon's testing exports (#3733) refactor(plugins): make the plugin framework provider-independent (#3722) fix(apple): name an Xcode too old for its host macOS as a runner startup failure (#3739) # Conflicts: # packages/daemon/src/server/http/daemon-runtime.ts # packages/daemon/src/sessions/handlers/session-appstate-device-runtime.ts # packages/daemon/test/nightly/concurrency-torture/real-scope-serialization.ts # src/__tests__/daemon-registration-owner.test.ts # src/agent-device-client.ts # src/cli.ts # src/cli/commands/proxy.ts # src/daemon-client/daemon-client-lifecycle.ts # src/daemon-client/daemon-client-metadata.ts # src/daemon-client/daemon-client.ts # test/integration/provider-scenarios/harness.ts
…refactor/daemon-runtime-no-process-globals * origin/refactor/host-environment: refactor(daemon): read configuration from the request host instead of the ambient scope test: merge the duplicate test-kit import in the stale provider admission scenarios feat(cli): ensure the daemon explicitly before attaching in the CLI and MCP (#3766) feat(client): daemonLifecycle attach mode and ensureDaemon() (#3765) feat(daemon): quiesce request that retires an idle daemon atomically (#3764) fix(daemon): answer a named missing session on the session, not the device (#3701) test: route test/ and scripts/ off the daemon's testing exports (#3733) refactor(plugins): make the plugin framework provider-independent (#3722) fix(apple): name an Xcode too old for its host macOS as a runner startup failure (#3739) # Conflicts: # packages/daemon/src/server/http/daemon-runtime.ts
Summary
Layer 2 of 3 for #3754 (umbrella #3747); based on #3764. The client half: who owns the daemon is now an explicit choice.
createAgentDeviceClient({ daemonLifecycle: 'attach' | 'managed' });managedis the default and behaves as before (additive in 0.21.x).attachconnects to the registered daemon and never starts, replaces or kills one, including after a timeout. A missing daemon fails withdetails.reason: 'daemon-not-running', an incompatible one with'daemon-incompatible'(both identities, hint namesagent-device daemon stop).ensureDaemon({ stateDir, onStart })starts a missing daemon and replaces an incompatible one only through the quiesce request from feat(daemon): quiesce request that retires an idle daemon atomically #3764. A busy daemon failsdaemon-busy, a daemon without the capability is never replaced, and a live daemon on another transport is quiesced, not killed. A daemon that times out on quiesce is force-retired only after repeated failed liveness probes.daemonBaseUrlconnection never starts or retires a local daemon in either mode;ensureDaemonreads no remote env.30 files incl. docs and changelog. The repo has no changeset tooling, so the
CHANGELOG.mdUnreleased entry is the changeset. Layer 3 adopts this in the CLI and MCP.Validation
pnpm check:affected --run --head f21b0019dd: passed. New tests cover attach (missing, incompatible, unreachable, timeout),ensureDaemon(start, idle replace, busy, old daemon, transport, contention, unconfirmed retirement) and remote.🤖 Generated with Claude Code