create-walle 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/release-schema.json +2 -2
- package/lib/runtime-closure-policy.json +8 -7
- package/package.json +1 -1
- package/template/coding-task-manager/api-prompts.js +45 -7
- package/template/coding-task-manager/bin/claude-hook.js +55 -1
- package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
- package/template/coding-task-manager/bin/land.js +2069 -0
- package/template/coding-task-manager/bin/memory-census.js +4 -2
- package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
- package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
- package/template/coding-task-manager/db.js +156 -32
- package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
- package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
- package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
- package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
- package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
- package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
- package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
- package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
- package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
- package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
- package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
- package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
- package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
- package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
- package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
- package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
- package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
- package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
- package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
- package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
- package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
- package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
- package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
- package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
- package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
- package/template/coding-task-manager/lib/agent-definitions.js +19 -0
- package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
- package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
- package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
- package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
- package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
- package/template/coding-task-manager/lib/agent-presets.js +84 -1
- package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
- package/template/coding-task-manager/lib/agent-version-service.js +74 -11
- package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
- package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
- package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
- package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
- package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
- package/template/coding-task-manager/lib/api/fleet.js +118 -0
- package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
- package/template/coding-task-manager/lib/api/ingress.js +9 -1
- package/template/coding-task-manager/lib/api/landing.js +403 -0
- package/template/coding-task-manager/lib/api/machines.js +691 -2
- package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
- package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
- package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
- package/template/coding-task-manager/lib/api/session-attach.js +623 -0
- package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
- package/template/coding-task-manager/lib/api/sessions.js +77 -51
- package/template/coding-task-manager/lib/api/setup-network.js +544 -16
- package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
- package/template/coding-task-manager/lib/api/setup.js +829 -10
- package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
- package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
- package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
- package/template/coding-task-manager/lib/auth-rules.js +292 -21
- package/template/coding-task-manager/lib/background-stop.js +369 -0
- package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
- package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
- package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
- package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
- package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
- package/template/coding-task-manager/lib/build-info.js +4 -2
- package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
- package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
- package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
- package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
- package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
- package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
- package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
- package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
- package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
- package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
- package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
- package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
- package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
- package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
- package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
- package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
- package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
- package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
- package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
- package/template/coding-task-manager/lib/conversation-sync.js +355 -0
- package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
- package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
- package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
- package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
- package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
- package/template/coding-task-manager/lib/db-domains.js +1 -0
- package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
- package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
- package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
- package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
- package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
- package/template/coding-task-manager/lib/feature-manifest.js +4 -0
- package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
- package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
- package/template/coding-task-manager/lib/fleet-hub.js +762 -0
- package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
- package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
- package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
- package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
- package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
- package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
- package/template/coding-task-manager/lib/fleet-update.js +798 -0
- package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
- package/template/coding-task-manager/lib/fs-watcher.js +58 -42
- package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
- package/template/coding-task-manager/lib/headless-term-service.js +84 -8
- package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
- package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
- package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
- package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
- package/template/coding-task-manager/lib/host-handoff.js +16 -19
- package/template/coding-task-manager/lib/host-stats.js +150 -3
- package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
- package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
- package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
- package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
- package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
- package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
- package/template/coding-task-manager/lib/hub-bridge.js +398 -0
- package/template/coding-task-manager/lib/idle-notify.js +491 -0
- package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
- package/template/coding-task-manager/lib/instance-manifest.js +5 -1
- package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
- package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
- package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
- package/template/coding-task-manager/lib/landing/config.js +536 -0
- package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
- package/template/coding-task-manager/lib/landing/gate.js +360 -0
- package/template/coding-task-manager/lib/landing/git.js +344 -0
- package/template/coding-task-manager/lib/landing/lease.js +247 -0
- package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
- package/template/coding-task-manager/lib/landing/proof.js +223 -0
- package/template/coding-task-manager/lib/landing/queue.js +998 -0
- package/template/coding-task-manager/lib/landing/radar.js +489 -0
- package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
- package/template/coding-task-manager/lib/landing/state.js +263 -0
- package/template/coding-task-manager/lib/landing/stop.js +49 -0
- package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
- package/template/coding-task-manager/lib/landing/sync.js +456 -0
- package/template/coding-task-manager/lib/landing/train.js +885 -0
- package/template/coding-task-manager/lib/landing/window.js +57 -0
- package/template/coding-task-manager/lib/launch-environment.js +121 -0
- package/template/coding-task-manager/lib/launch-model-override.js +36 -10
- package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
- package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
- package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
- package/template/coding-task-manager/lib/lead-model-options.js +160 -3
- package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
- package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
- package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
- package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
- package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
- package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
- package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
- package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
- package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
- package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
- package/template/coding-task-manager/lib/machine-registry.js +750 -5
- package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
- package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
- package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
- package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
- package/template/coding-task-manager/lib/memory-join.js +337 -0
- package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
- package/template/coding-task-manager/lib/memory-sync.js +565 -0
- package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
- package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
- package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
- package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
- package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
- package/template/coding-task-manager/lib/model-availability.js +727 -0
- package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
- package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
- package/template/coding-task-manager/lib/model-id-rule.js +19 -0
- package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
- package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
- package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
- package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
- package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
- package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
- package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
- package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
- package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
- package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
- package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
- package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
- package/template/coding-task-manager/lib/native-history-control.js +6 -4
- package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
- package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
- package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
- package/template/coding-task-manager/lib/opencode-cli.js +480 -0
- package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
- package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
- package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
- package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
- package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
- package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
- package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
- package/template/coding-task-manager/lib/perf-summary.js +7 -0
- package/template/coding-task-manager/lib/perf-tracker.js +63 -2
- package/template/coding-task-manager/lib/project-config.js +7 -0
- package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
- package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
- package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
- package/template/coding-task-manager/lib/read-pool-client.js +89 -2
- package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
- package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
- package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
- package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
- package/template/coding-task-manager/lib/relay-client.js +57 -3
- package/template/coding-task-manager/lib/relink-audit.js +34 -5
- package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
- package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
- package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
- package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
- package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
- package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
- package/template/coding-task-manager/lib/restart-guard.js +18 -6
- package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
- package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
- package/template/coding-task-manager/lib/resume-admission.js +17 -3
- package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
- package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
- package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
- package/template/coding-task-manager/lib/runtime-contract.js +3 -1
- package/template/coding-task-manager/lib/schema-indexes.js +1 -0
- package/template/coding-task-manager/lib/session-context-locator.js +742 -0
- package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
- package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
- package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
- package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
- package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
- package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
- package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
- package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
- package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
- package/template/coding-task-manager/lib/session-create/response.js +7 -7
- package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
- package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
- package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
- package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
- package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
- package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
- package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
- package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
- package/template/coding-task-manager/lib/session-empty.js +13 -10
- package/template/coding-task-manager/lib/session-host-manager.js +60 -0
- package/template/coding-task-manager/lib/session-jobs.js +3 -1
- package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
- package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
- package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
- package/template/coding-task-manager/lib/session-park.js +738 -0
- package/template/coding-task-manager/lib/session-path-grant.js +13 -4
- package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
- package/template/coding-task-manager/lib/session-transport.js +17 -0
- package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
- package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
- package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
- package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
- package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
- package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
- package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
- package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
- package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
- package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
- package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
- package/template/coding-task-manager/lib/submission-ack.js +90 -2
- package/template/coding-task-manager/lib/systemd-scope.js +115 -0
- package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
- package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
- package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
- package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
- package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
- package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
- package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
- package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
- package/template/coding-task-manager/lib/transcript-source.js +36 -4
- package/template/coding-task-manager/lib/transcript-store.js +9 -0
- package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
- package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
- package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
- package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
- package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
- package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
- package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
- package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
- package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
- package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
- package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
- package/template/coding-task-manager/lib/walle/turn.js +1 -1
- package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
- package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
- package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
- package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
- package/template/coding-task-manager/lib/walle-row-history.js +495 -0
- package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
- package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
- package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
- package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
- package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
- package/template/coding-task-manager/lib/ws/misc.js +1 -1
- package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
- package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
- package/template/coding-task-manager/oauth-proxy.js +112 -115
- package/template/coding-task-manager/package-lock.json +10 -94
- package/template/coding-task-manager/package.json +4 -3
- package/template/coding-task-manager/protocol/message-table.json +10 -0
- package/template/coding-task-manager/protocol/messages.js +10 -0
- package/template/coding-task-manager/protocol/ws-schema.json +20 -0
- package/template/coding-task-manager/protocol/ws-schema.md +2 -0
- package/template/coding-task-manager/public/css/app.css +170 -0
- package/template/coding-task-manager/public/css/walle-session.css +4 -0
- package/template/coding-task-manager/public/index.html +473 -243
- package/template/coding-task-manager/public/js/agent-command.js +86 -0
- package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
- package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
- package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
- package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
- package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
- package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
- package/template/coding-task-manager/public/js/background-work.js +196 -27
- package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
- package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
- package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
- package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
- package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
- package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
- package/template/coding-task-manager/public/js/document-review-links.js +9 -1
- package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
- package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
- package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
- package/template/coding-task-manager/public/js/message-renderer.js +4 -3
- package/template/coding-task-manager/public/js/model-picker.js +3 -1
- package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
- package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
- package/template/coding-task-manager/public/js/pasted-content.js +236 -0
- package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
- package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
- package/template/coding-task-manager/public/js/prompts.js +11 -10
- package/template/coding-task-manager/public/js/protocol.js +10 -0
- package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
- package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
- package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
- package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
- package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
- package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
- package/template/coding-task-manager/public/js/stream-view.js +6 -5
- package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
- package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
- package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
- package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
- package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
- package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
- package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
- package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
- package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
- package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
- package/template/coding-task-manager/public/js/walle.js +6 -0
- package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
- package/template/coding-task-manager/public/m/app.css +140 -0
- package/template/coding-task-manager/public/m/app.js +507 -68
- package/template/coding-task-manager/public/m/index.html +17 -0
- package/template/coding-task-manager/public/m/machines.js +838 -4
- package/template/coding-task-manager/public/m/private-api.js +31 -1
- package/template/coding-task-manager/public/usage.html +1 -0
- package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
- package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
- package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
- package/template/coding-task-manager/server.js +1950 -11679
- package/template/coding-task-manager/session-integrity.js +64 -4
- package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
- package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
- package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
- package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
- package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
- package/template/coding-task-manager/workers/session-host-process.js +5 -5
- package/template/coding-task-manager/workers/watch-worker.js +105 -0
- package/template/coding-task-manager/workers/worktree-worker.js +168 -33
- package/template/ctm-relay/lib/protocol.js +14 -1
- package/template/package-lock.json +2 -2
- package/template/package.json +1 -1
- package/template/shared/backup-retention.js +82 -0
- package/template/shared/conversation-admission.js +2 -0
- package/template/shared/conversation-provenance.js +3 -7
- package/template/shared/conversation-storage-v2-contract.js +5 -0
- package/template/shared/linked-worktree.js +51 -0
- package/template/shared/macos-fda-target.js +57 -0
- package/template/shared/orphan-parents.js +55 -0
- package/template/shared/release-schema.json +2 -2
- package/template/shared/storage/contract.js +3 -0
- package/template/wall-e/adapters/imessage.js +12 -0
- package/template/wall-e/agent.js +71 -4
- package/template/wall-e/api-walle.js +21 -1
- package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
- package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
- package/template/wall-e/brain/brain-join.js +859 -0
- package/template/wall-e/brain/brain-sync-membership.js +20 -0
- package/template/wall-e/brain/brain-sync-store.js +131 -77
- package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
- package/template/wall-e/brain/brain-sync-v2.js +578 -0
- package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
- package/template/wall-e/brain/deterministic-id.js +51 -0
- package/template/wall-e/brain/memories.js +2 -2
- package/template/wall-e/brain/migrations.js +40 -6
- package/template/wall-e/brain/model-identity-migration.js +1 -1
- package/template/wall-e/brain/owner-call-whitelist.js +23 -7
- package/template/wall-e/brain/schema.js +45 -85
- package/template/wall-e/brain.js +171 -35
- package/template/wall-e/chat.js +3 -3
- package/template/wall-e/coding/agent-shell-env.js +7 -2
- package/template/wall-e/coding/prompt-bundle.js +66 -21
- package/template/wall-e/config/main-loop-exemptions.json +2 -2
- package/template/wall-e/http/admin-api.js +37 -0
- package/template/wall-e/http/gws-api.js +4 -0
- package/template/wall-e/http/helper-rules-api.js +7 -1
- package/template/wall-e/http/model-admin.js +8 -1
- package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
- package/template/wall-e/http/model-proxy-providers.js +174 -1
- package/template/wall-e/http/model-route-health.js +157 -0
- package/template/wall-e/http/sync-api.js +278 -464
- package/template/wall-e/jobs/job-runner.js +28 -1
- package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
- package/template/wall-e/lib/ctm-data-dir.js +26 -0
- package/template/wall-e/lib/derivation-home.js +147 -0
- package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
- package/template/wall-e/lib/helper-rules/grade.js +51 -8
- package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
- package/template/wall-e/lib/helper-rules/store.js +4 -2
- package/template/wall-e/lib/landing-mcp-tools.js +170 -0
- package/template/wall-e/lib/mcp-client-config.js +133 -14
- package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
- package/template/wall-e/lib/mcp-integration.js +58 -13
- package/template/wall-e/lib/parent-death.js +7 -1
- package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
- package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
- package/template/wall-e/llm/delegate-vendor-default.js +12 -5
- package/template/wall-e/llm/model-roles.js +1 -1
- package/template/wall-e/llm/native-delegate-selection.js +56 -8
- package/template/wall-e/llm/worker-delegate-args.js +72 -7
- package/template/wall-e/llm/worker-mcp-routing.js +66 -17
- package/template/wall-e/loops/brain-custom-writes.js +19 -0
- package/template/wall-e/loops/ingest.js +17 -1
- package/template/wall-e/loops/think.js +19 -4
- package/template/wall-e/mcp-contract.js +222 -6
- package/template/wall-e/mcp-protocol-contract.js +40 -5
- package/template/wall-e/mcp-server.js +128 -29
- package/template/wall-e/mcp-worker-schemas.js +5 -5
- package/template/wall-e/memory/ctm-context-client.js +85 -0
- package/template/wall-e/memory/ctm-session-context.js +9 -3
- package/template/wall-e/memory/hub-bridge-client.js +388 -0
- package/template/wall-e/memory/replica-origin.js +56 -0
- package/template/wall-e/memory/session-pool.js +135 -0
- package/template/wall-e/runtime/live-capabilities.js +8 -3
- package/template/wall-e/server.js +4 -2
- package/template/wall-e/shared/release-schema.json +2 -2
- package/template/wall-e/shared/sqlite-file-set.js +39 -0
- package/template/wall-e/shared/storage/contract.js +3 -0
- package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
- package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
- package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
- package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
- package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
- package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
- package/template/wall-e/tools/chrome-automation.js +6 -0
- package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
- package/template/wall-e/workers/brain-owner-worker.js +18 -4
- package/template/wall-e/workers/mcp-gateway-process.js +5 -5
|
@@ -262,6 +262,22 @@ async function readLeadPosture({ parent, deps } = {}) {
|
|
|
262
262
|
};
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
// WP-14 (docs/deepseek-harness-acp-agent-2026-10-28.html §9b W-9). A dsh worker is the ONE worker
|
|
266
|
+
// harness with no argv at all: it is an ACP child (lib/acp/dsh-session-runtime.js) driven over
|
|
267
|
+
// JSON-RPC, so neither Claude Code's `--settings` sandbox block nor Codex's `-c
|
|
268
|
+
// sandbox_workspace_write...` override can express its confinement. The child's own permission mode
|
|
269
|
+
// is the write rule that exists, so this is an EXPLICIT dsh branch rather than the claude-code
|
|
270
|
+
// fallthrough (which would silently hand dsh a Claude-only settings shape nothing consumes):
|
|
271
|
+
// * a review worker is read-only (D-5: it owns no files and produces a report);
|
|
272
|
+
// * every other profile is workspace-write, which is also the runtime's own default
|
|
273
|
+
// (dsh-session-runtime.js DSH_PERMISSION_MODE) — stated here so the worker's rule is decided in
|
|
274
|
+
// the same place a claude/codex worker's is.
|
|
275
|
+
// `cwd` is NOT re-derived: the caller (delegate-worker.js) already validated it inside the lead's
|
|
276
|
+
// scope (checkCallerAuthority + workerCwdInScope) before any launch spec exists.
|
|
277
|
+
function dshWorkerSandbox({ profile = 'implementation' } = {}) {
|
|
278
|
+
return { permissionMode: profile === 'review' ? 'read-only' : 'workspace-write' };
|
|
279
|
+
}
|
|
280
|
+
|
|
265
281
|
// WP-4's launch-time half (D-29 table): the argv each posture maps to, per harness.
|
|
266
282
|
// `harness` is 'claude-code' or 'codex-cli'. No posture (null) is today's argv; an
|
|
267
283
|
// unresolved caller never reaches a launch (D-10 refused it first). read-only throws --
|
|
@@ -336,11 +352,12 @@ function workerClaudeSettingsArgs({ settingSources, cleanupPeriodDays, sandbox }
|
|
|
336
352
|
//
|
|
337
353
|
// D-10 (caller-door doc): an unresolved caller is REFUSED -- 403 caller_unresolved with
|
|
338
354
|
// reason no_caller (empty/blank input id) | unknown (resolution returns no parent id) |
|
|
339
|
-
// lead_not_live (
|
|
340
|
-
// row_unreadable (D-14: getSession or getWorkerSession threw).
|
|
341
|
-
// (worker-failure-classify NEXT_STEPS). Then the unchanged order:
|
|
342
|
-
// 403 -> worker_cwd_outside_lead 400 -> worker_exceeds_lead_sandbox
|
|
343
|
-
// passes
|
|
355
|
+
// lead_not_live (the resolved id -- 'owner' or 'live' -- is not in the live map, so its cwd
|
|
356
|
+
// and posture cannot be read) | row_unreadable (D-14: getSession or getWorkerSession threw).
|
|
357
|
+
// The 403 carries next_step (worker-failure-classify NEXT_STEPS). Then the unchanged order:
|
|
358
|
+
// worker_nesting_refused 403 -> worker_cwd_outside_lead 400 -> worker_exceeds_lead_sandbox
|
|
359
|
+
// 403. Only a LIVE lead passes, whatever the lookup path that named it (D-6); there is no
|
|
360
|
+
// allowed anonymous delegate (closes F-2 and F-5).
|
|
344
361
|
//
|
|
345
362
|
// "Is a worker" = getSession(parentId) is a session with agentRole === 'worker' (lib/
|
|
346
363
|
// session-class.js isWorkerSession) OR getWorkerSession(parentId) returns a row -- the row
|
|
@@ -372,10 +389,12 @@ async function checkCallerAuthority(deps, opts = {}, helpers = {}) {
|
|
|
372
389
|
const parentId = resolved.parent_ctm_session_id;
|
|
373
390
|
if (!parentId) throw _callerUnresolved('unknown');
|
|
374
391
|
|
|
375
|
-
// D-10 reason 3: the
|
|
376
|
-
// CTM session is not
|
|
377
|
-
//
|
|
378
|
-
|
|
392
|
+
// D-10 reason 3: the resolved lead is not in the live map. An 'owner' resolution (a Codex
|
|
393
|
+
// thread id whose owning CTM session is not live) is refused HERE, and so is a 'live' id
|
|
394
|
+
// whose session row has gone -- in both cases the cwd and posture cannot be read (closes
|
|
395
|
+
// F-5). D-6: the resolution LABEL is not the gate -- a live owner is a valid caller, since
|
|
396
|
+
// the bearer is one shared runtime token, so presenting an owner's thread id grants exactly
|
|
397
|
+
// what presenting that owner's own CTM id already grants.
|
|
379
398
|
let parentSession = null;
|
|
380
399
|
try {
|
|
381
400
|
parentSession = typeof deps.getSession === 'function' ? deps.getSession(parentId) : null;
|
|
@@ -418,7 +437,16 @@ async function checkCallerAuthority(deps, opts = {}, helpers = {}) {
|
|
|
418
437
|
throw _authorityError('worker_exceeds_lead_sandbox', 403, READ_ONLY_LEAD_MESSAGE, { lead_posture: leadPosture });
|
|
419
438
|
}
|
|
420
439
|
|
|
421
|
-
|
|
440
|
+
// D-6: the authorised resolution label is carried through, not flattened to 'live' -- a
|
|
441
|
+
// caller named by its Codex thread id records the owner CTM session it resolved to
|
|
442
|
+
// ('owner'), which is what the worker row/launch record then shows. Only the two
|
|
443
|
+
// resolvable labels can reach here (an empty parent id was refused as 'unknown'), and a
|
|
444
|
+
// resolver returning anything else is recorded as the authorised 'live' it now is.
|
|
445
|
+
return {
|
|
446
|
+
parent_ctm_session_id: parentId,
|
|
447
|
+
parent_resolution: resolved.parent_resolution === 'owner' ? 'owner' : 'live',
|
|
448
|
+
leadPosture,
|
|
449
|
+
};
|
|
422
450
|
}
|
|
423
451
|
|
|
424
452
|
module.exports = {
|
|
@@ -434,5 +462,6 @@ module.exports = {
|
|
|
434
462
|
workerClaudeSettingsArgs,
|
|
435
463
|
readLeadPosture,
|
|
436
464
|
workerSandboxArgs,
|
|
465
|
+
dshWorkerSandbox,
|
|
437
466
|
checkCallerAuthority,
|
|
438
467
|
};
|
|
@@ -339,7 +339,7 @@ function stampRestoredWorkerMarkers(session, row) {
|
|
|
339
339
|
session._parentAgentSessionId = workerRow.parent_ctm_session_id || '';
|
|
340
340
|
session._workerAlias = workerRow.route_alias || '';
|
|
341
341
|
session._workerAgent = workerRow.agent || '';
|
|
342
|
-
session._workerHarness = recipe.harness || (workerRow.agent === 'codex' ? 'codex-cli' : 'claude-code');
|
|
342
|
+
session._workerHarness = recipe.harness || (workerRow.agent === 'codex' ? 'codex-cli' : workerRow.agent === 'dsh' ? 'dsh-acp' : 'claude-code');
|
|
343
343
|
session._workerProfile = recipe.workerProfile || 'legacy';
|
|
344
344
|
session._workerTerminalAt = String(workerRow.terminal_at || '');
|
|
345
345
|
if (workerRow.model) session.model_selected = workerRow.model;
|
|
@@ -671,7 +671,7 @@ function createWorkerObservability({ getDeps, readWorkerRuntime, getBaseStatus }
|
|
|
671
671
|
generation,
|
|
672
672
|
model: boundedText(workerRow?.model || recipe.model || session?.model_selected || ''),
|
|
673
673
|
route: boundedText(workerRow?.route_alias || recipe.route || session?._workerAlias || ''),
|
|
674
|
-
harness: boundedText(recipe.harness || session?._workerHarness || (workerRow?.agent === 'codex' ? 'codex-cli' : 'claude-code'), 32),
|
|
674
|
+
harness: boundedText(recipe.harness || session?._workerHarness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'dsh' ? 'dsh-acp' : 'claude-code'), 32),
|
|
675
675
|
worker_profile: boundedText(recipe.workerProfile || session?._workerProfile || 'legacy', 32),
|
|
676
676
|
evidence: safeEvidence,
|
|
677
677
|
};
|
|
@@ -13,6 +13,13 @@ function agentSessionUserMsgCount(agent) {
|
|
|
13
13
|
return maxUserMsgCount(agent.userMsgCount, agent.user_msg_count, agent.message_count);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
function hasTranscriptBytes(value) {
|
|
17
|
+
// D-6: a session NAME (title/rename_name/displayTitle) is not conversation content, but
|
|
18
|
+
// real transcript bytes on disk are. 2048 matches lib/recent-session-visibility.js:11 and
|
|
19
|
+
// lib/session-empty-file-selection.js:19.
|
|
20
|
+
return Number(value) > 2048;
|
|
21
|
+
}
|
|
22
|
+
|
|
16
23
|
function agentSessionHasConversationSignal(agent) {
|
|
17
24
|
if (!agent) return false;
|
|
18
25
|
return !!(
|
|
@@ -23,11 +30,9 @@ function agentSessionHasConversationSignal(agent) {
|
|
|
23
30
|
hasText(agent.last_user_content) ||
|
|
24
31
|
hasText(agent.firstAssistantText) ||
|
|
25
32
|
hasText(agent.first_assistant_text) ||
|
|
26
|
-
hasText(agent.renameName) ||
|
|
27
|
-
hasText(agent.rename_name) ||
|
|
28
|
-
hasText(agent.displayTitle) ||
|
|
29
33
|
hasText(agent.aiTitle) ||
|
|
30
|
-
|
|
34
|
+
hasTranscriptBytes(agent.fileSize) ||
|
|
35
|
+
hasTranscriptBytes(agent.file_size)
|
|
31
36
|
);
|
|
32
37
|
}
|
|
33
38
|
|
|
@@ -53,16 +58,14 @@ function recentSessionHasConversationSignal(session, dbRow) {
|
|
|
53
58
|
hasText(session?.last_user_content) ||
|
|
54
59
|
hasText(session?.firstAssistantText) ||
|
|
55
60
|
hasText(session?.first_assistant_text) ||
|
|
56
|
-
hasText(session?.renameName) ||
|
|
57
|
-
hasText(session?.rename_name) ||
|
|
58
|
-
hasText(session?.displayTitle) ||
|
|
59
61
|
hasText(session?.aiTitle) ||
|
|
60
|
-
|
|
62
|
+
hasTranscriptBytes(session?.fileSize) ||
|
|
63
|
+
hasTranscriptBytes(session?.file_size) ||
|
|
61
64
|
hasText(dbRow?.first_message) ||
|
|
62
65
|
hasText(dbRow?.last_user_content) ||
|
|
63
66
|
hasText(dbRow?.first_assistant_text) ||
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
hasTranscriptBytes(dbRow?.file_size) ||
|
|
68
|
+
hasTranscriptBytes(dbRow?.fileSize) ||
|
|
66
69
|
agents.some(agentSessionHasConversationSignal)
|
|
67
70
|
);
|
|
68
71
|
}
|
|
@@ -28,6 +28,10 @@ const { sanitizeSessionOps, createOverdueEdgeTrigger } = require('./headless-inf
|
|
|
28
28
|
const { dialHostState, shutdownHostSession } = require('./host-adopt-dial');
|
|
29
29
|
const handoffOrchestrator = require('./host-handoff-orchestrator');
|
|
30
30
|
const { applyModelHostReceipt, applyStartedModelHostReceipt } = require('./model-host-receipt');
|
|
31
|
+
// WP-1 (S-5): the host-carried launch-environment record is validated at the manager boundary with the
|
|
32
|
+
// same `{}`-or-`{launchEnvironment}` shape the other host-carried fields use.
|
|
33
|
+
const { moveToOwnScope, scopeMoveEnabled } = require('./systemd-scope');
|
|
34
|
+
const { launchEnvironmentMetadata } = require('./launch-environment');
|
|
31
35
|
|
|
32
36
|
// WP-1 (pty-survival design doc, deliverable 1): a host process must survive the
|
|
33
37
|
// manager's own death (crash, restart) -- fork() alone still ties the child's
|
|
@@ -121,6 +125,24 @@ function _stampMainArrival(message) {
|
|
|
121
125
|
//
|
|
122
126
|
// State carries headlessReady so adoption can rebuild a missing mirror without waiting for snapshots.
|
|
123
127
|
const ADOPT_DIAL_TIMEOUT_MS = 3000;
|
|
128
|
+
// WP-1 (session-host-cgroup-survival design doc, D-1..D-6): on a systemd service host, move a freshly forked
|
|
129
|
+
// survivor (dedicated host or pool) into its own transient scope. Returns null when the move is not applicable
|
|
130
|
+
// (launchd, dev shell, flag off) so callers keep today's synchronous behaviour. The returned promise never
|
|
131
|
+
// rejects; `onSettled(result)` runs first (before any gated frame), and a failed move is REPORTED once.
|
|
132
|
+
function _startScopeMove(child, label, hostId, logger, onSettled) {
|
|
133
|
+
if (!scopeMoveEnabled()) return null;
|
|
134
|
+
return moveToOwnScope(child.pid, { label }).then((result) => {
|
|
135
|
+
if (!result.moved) {
|
|
136
|
+
(logger?.warn ? logger.warn.bind(logger) : console.warn)(`[host-scope] move failed host=${hostId} pid=${child.pid} reason=${result.reason}`);
|
|
137
|
+
}
|
|
138
|
+
try { onSettled(result); } catch (err) {
|
|
139
|
+
// REPORT: a bookkeeping failure must not strand the gated frames.
|
|
140
|
+
(logger?.warn ? logger.warn.bind(logger) : console.warn)(`[host-scope] bookkeeping failed host=${hostId}: ${err && err.message}`);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
124
146
|
class HostedPtyAdapter {
|
|
125
147
|
constructor(options = {}) {
|
|
126
148
|
if (!options.sessionId) throw new Error('HostedPtyAdapter requires sessionId');
|
|
@@ -129,6 +151,9 @@ class HostedPtyAdapter {
|
|
|
129
151
|
this.args = Array.isArray(options.args) ? options.args : [];
|
|
130
152
|
this.cwd = options.cwd;
|
|
131
153
|
this.env = options.env;
|
|
154
|
+
// WP-1 (S-5): the per-spawn launch-environment record this host is told to carry (undefined when the
|
|
155
|
+
// spawn sent none -- an older CTM, or a legacy adapter).
|
|
156
|
+
this.launchEnvironment = launchEnvironmentMetadata(options.launchEnvironment).launchEnvironment;
|
|
132
157
|
this.cols = Number(options.cols || 120) || 120;
|
|
133
158
|
this.rows = Number(options.rows || 30) || 30;
|
|
134
159
|
this.initialHeadlessData = typeof options.initialHeadlessData === 'string' ? options.initialHeadlessData : '';
|
|
@@ -171,6 +196,7 @@ class HostedPtyAdapter {
|
|
|
171
196
|
args: this.args,
|
|
172
197
|
cwd: this.cwd,
|
|
173
198
|
env: this.env,
|
|
199
|
+
launchEnvironment: this.launchEnvironment,
|
|
174
200
|
cols: this.cols,
|
|
175
201
|
rows: this.rows,
|
|
176
202
|
initialHeadlessData: this.initialHeadlessData,
|
|
@@ -245,6 +271,16 @@ class HostedPtyAdapter {
|
|
|
245
271
|
this._child = child;
|
|
246
272
|
this.hostPid = child.pid || 0;
|
|
247
273
|
this.pid = this.hostPid;
|
|
274
|
+
// WP-1 (S-1): own scope; frames are held until it settles (D-6: cgroup membership is inherited at fork).
|
|
275
|
+
this.scopeUnit = null;
|
|
276
|
+
this.scopeReason = null;
|
|
277
|
+
this._scopePending = false;
|
|
278
|
+
this._scopeMove = _startScopeMove(child, `host-${this._hostId}`, this._hostId, this._logger, (r) => {
|
|
279
|
+
this._scopePending = false;
|
|
280
|
+
this.scopeUnit = r.unit;
|
|
281
|
+
this.scopeReason = r.reason;
|
|
282
|
+
});
|
|
283
|
+
this._scopePending = !!this._scopeMove;
|
|
248
284
|
|
|
249
285
|
child.stdout?.on('data', (buf) => {
|
|
250
286
|
const text = String(buf || '').trimEnd();
|
|
@@ -331,6 +367,7 @@ class HostedPtyAdapter {
|
|
|
331
367
|
args: this.args,
|
|
332
368
|
cwd: this.cwd,
|
|
333
369
|
env: this.env,
|
|
370
|
+
launchEnvironment: this.launchEnvironment,
|
|
334
371
|
cols: this.cols,
|
|
335
372
|
rows: this.rows,
|
|
336
373
|
initialHeadlessData: this.initialHeadlessData,
|
|
@@ -341,6 +378,11 @@ class HostedPtyAdapter {
|
|
|
341
378
|
}
|
|
342
379
|
|
|
343
380
|
_post(message) {
|
|
381
|
+
// WP-1 D-6: hold every frame (order preserved: then-callbacks run in registration order) until the scope move settled.
|
|
382
|
+
if (!this._pooled && this._scopePending) {
|
|
383
|
+
this._scopeMove.then(() => { this._post(message); });
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
344
386
|
if (this._pooled) {
|
|
345
387
|
// A1: only a truly ABSENT manager refuses here; a present manager keeps its COPY + forwarded scope.
|
|
346
388
|
if (this._manager === undefined || this._manager === null) { notePostRefusal(message); return false; }
|
|
@@ -606,6 +648,11 @@ class SessionHostManager extends EventEmitter {
|
|
|
606
648
|
this.poolPath = options.poolPath || path.resolve(__dirname, '..', 'workers', 'session-host-pool-process.js');
|
|
607
649
|
this.usePool = options.usePool === true;
|
|
608
650
|
this.logger = options.logger || console; this.isRecoveryProtectedHost = options.isRecoveryProtectedHost;
|
|
651
|
+
// WP-3a (live-defer-wake-adopted-host-death R-6): how the manager stops a host
|
|
652
|
+
// process it has just declared dead. Injected exactly like
|
|
653
|
+
// isRecoveryProtectedHost above -- this lib never learns how to kill a host
|
|
654
|
+
// (server.js owns that), it just asks. Null when the caller supplies none.
|
|
655
|
+
this.retireDeadHost = typeof options.retireDeadHost === 'function' ? options.retireDeadHost : null;
|
|
609
656
|
this._adoptDialTimeoutMs = Number(options.adoptDialTimeoutMs) > 0 ? Number(options.adoptDialTimeoutMs) : ADOPT_DIAL_TIMEOUT_MS; // test seam (B-4)
|
|
610
657
|
// WP-0 (pty-survival design doc): registry/socket wiring is entirely
|
|
611
658
|
// conditional on the caller supplying a dataDir -- this lib never reads
|
|
@@ -1623,6 +1670,14 @@ class SessionHostManager extends EventEmitter {
|
|
|
1623
1670
|
this._poolChild = child;
|
|
1624
1671
|
this._poolClosed = false;
|
|
1625
1672
|
this._poolHostId = `pool-${child.pid}`;
|
|
1673
|
+
// WP-1 (S-2): own scope; no frame reaches the pool until it settles (D-6).
|
|
1674
|
+
this._poolScopeUnit = null;
|
|
1675
|
+
this._poolScopeReason = null;
|
|
1676
|
+
this._poolScopePending = false;
|
|
1677
|
+
this._poolScopeMove = _startScopeMove(child, `pool-${child.pid}`, this._poolHostId, this.logger, (r) => {
|
|
1678
|
+
if (this._poolChild === child) { this._poolScopePending = false; this._poolScopeUnit = r.unit; this._poolScopeReason = r.reason; }
|
|
1679
|
+
});
|
|
1680
|
+
this._poolScopePending = !!this._poolScopeMove;
|
|
1626
1681
|
this._poolSocketPath = socketPath;
|
|
1627
1682
|
// WP-1 (deliverable 2): pool-wide control flip, same shape as the dedicated
|
|
1628
1683
|
// host's per-adapter dial in _startDedicated.
|
|
@@ -1750,6 +1805,11 @@ class SessionHostManager extends EventEmitter {
|
|
|
1750
1805
|
|
|
1751
1806
|
_postToPool(message) {
|
|
1752
1807
|
const child = this._ensurePool();
|
|
1808
|
+
// WP-1 D-6: hold frames for a pool whose scope move is still in flight (registration order preserved).
|
|
1809
|
+
if (child && this._poolScopePending && this._poolScopeMove) {
|
|
1810
|
+
this._poolScopeMove.then(() => { this._postToPool(message); });
|
|
1811
|
+
return true;
|
|
1812
|
+
}
|
|
1753
1813
|
// A1: an absent/closed pool posts nothing -- recorded as a refusal, joined CONSERVATIVELY below.
|
|
1754
1814
|
if (!child || this._poolClosed) { notePostRefusal(message); return false; }
|
|
1755
1815
|
// WP-1 (deliverable 2): once the pool's control flip has succeeded, ALL
|
|
@@ -916,7 +916,9 @@ function registerSessionJobs(scheduler, deps) {
|
|
|
916
916
|
const scans = [];
|
|
917
917
|
const statPaths = new Set();
|
|
918
918
|
for (const [id, session] of sessions) {
|
|
919
|
-
|
|
919
|
+
// S-6 (D-5): gate on the ONE detector, not a substring — a non-Claude tab under a
|
|
920
|
+
// `claude`-containing path (e.g. an opencode binary under a claude-tools dir) no longer enters.
|
|
921
|
+
if (detectAgentType(session.cmd) !== 'claude') continue;
|
|
920
922
|
if (!session._claudeSessionId || !session._claudeProjectDir) continue;
|
|
921
923
|
if (session.type === 'walle') continue;
|
|
922
924
|
const currentJsonl = path.join(session._claudeProjectDir, `${session._claudeSessionId}.jsonl`);
|
|
@@ -124,7 +124,6 @@ function lifecycleConfigFromEnv(env = process.env) {
|
|
|
124
124
|
resourceSampleMs: envInt(env, 'CTM_RESOURCE_SAMPLE_MS', 60_000),
|
|
125
125
|
parkPreSignalGraceMs: envInt(env, 'CTM_PARK_PRE_SIGNAL_GRACE_MS', 50),
|
|
126
126
|
parkTermGraceMs: envInt(env, 'CTM_PARK_TERM_GRACE_MS', 8_000),
|
|
127
|
-
draftTtlMs: envInt(env, 'CTM_PARK_DRAFT_TTL_MS', 24 * 60 * 60_000),
|
|
128
127
|
prewarm: envBool(env, 'CTM_PREWARM', false),
|
|
129
128
|
prewarmTtlMs: envInt(env, 'CTM_PREWARM_TTL_MS', 60_000, 1_000),
|
|
130
129
|
prewarmTopK: envInt(env, 'CTM_PREWARM_TOP_K', 1, 1),
|
|
@@ -230,9 +229,12 @@ function evaluatePark(session, host, config) {
|
|
|
230
229
|
if (session?.hasPendingInput) protections.push('input');
|
|
231
230
|
if (Number(session?.queueDepth) > 0) protections.push('queue');
|
|
232
231
|
if (Number(session?.queueDepth) < 0) protections.push('queue-unknown');
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
// WP-1 (park-draft-truth-from-screen §5 D-1/D-4): `composerDraft` is the verdict the caller read
|
|
233
|
+
// from the agent's own composer row (lib/park-composer-draft.js) — 'text' protects, 'unknown' gets
|
|
234
|
+
// its own protection so only a user-requested park (evaluateManualPark) treats it as no draft.
|
|
235
|
+
// Browser presence and the old keystroke stamp are no longer inputs here (D-5 deleted them).
|
|
236
|
+
if (session?.composerDraft === 'text') protections.push('draft');
|
|
237
|
+
if (session?.composerDraft === 'unknown') protections.push('composer-unknown');
|
|
236
238
|
if (session?.pinned) protections.push('pinned');
|
|
237
239
|
if (session?.isActiveTab) protections.push('active-tab');
|
|
238
240
|
if (session?.isMru) {
|
|
@@ -276,6 +278,9 @@ function evaluateManualPark(session, host, config) {
|
|
|
276
278
|
isMru: false,
|
|
277
279
|
recentNonStatusActivityAt: 0,
|
|
278
280
|
lastActivatedAt: 0,
|
|
281
|
+
// D-4: the user who asked is present, so an unreadable composer is not evidence of a draft --
|
|
282
|
+
// same reason the manual view already drops active-tab and MRU.
|
|
283
|
+
composerDraft: session?.composerDraft === 'text' ? 'text' : 'empty',
|
|
279
284
|
};
|
|
280
285
|
return evaluatePark(view, host, {
|
|
281
286
|
...config,
|
|
@@ -328,6 +333,7 @@ const PARK_PROTECTION_PRIORITY = [
|
|
|
328
333
|
'queue',
|
|
329
334
|
'queue-unknown',
|
|
330
335
|
'draft',
|
|
336
|
+
'composer-unknown',
|
|
331
337
|
'active-tab',
|
|
332
338
|
'visibility-grace',
|
|
333
339
|
'pinned',
|
|
@@ -25,6 +25,8 @@ const {
|
|
|
25
25
|
validateSessionModelIntentRequest,
|
|
26
26
|
DTO_BYTE_LIMIT,
|
|
27
27
|
} = require('./session-model-intent-contract');
|
|
28
|
+
// WP-8 (§9b M-10): the owner agent-type list is the ONE declaration in lib/coding-session-model-owner.js.
|
|
29
|
+
const { OWNER_AGENT_TYPES } = require('./coding-session-model-owner');
|
|
28
30
|
|
|
29
31
|
// The EXACT public request body: the four retained target/precondition fields plus the THREE
|
|
30
32
|
// preconditions (client id, owner, revision). `scope` is NOT a precondition: a missing/invalid scope
|
|
@@ -34,7 +36,8 @@ const ACTION_KEYS = Object.freeze([
|
|
|
34
36
|
]);
|
|
35
37
|
const PRECONDITION_KEYS = Object.freeze(['client_request_id', 'expected_owner', 'expected_intent_revision']);
|
|
36
38
|
const OWNER_KEYS = Object.freeze(['ctmSessionId', 'agentType', 'providerSessionId', 'processGeneration']);
|
|
37
|
-
|
|
39
|
+
// Derived from the ONE owner declaration (never a private copy of the four-agent literal).
|
|
40
|
+
const AGENT_TYPES = OWNER_AGENT_TYPES;
|
|
38
41
|
const SCOPES = Object.freeze(['session', 'session+default']);
|
|
39
42
|
const CLIENT_REQUEST_ID_MAX = 128;
|
|
40
43
|
// The ACTUAL accepted approval reference grammar (lib/session-model-intent-contract.js
|
|
@@ -145,10 +148,11 @@ function historyPreparationMessage(reason, suppliedMessage = '', { postPark = fa
|
|
|
145
148
|
compaction_hash_mismatch: 'The source and target history compaction settings disagree, so the move cannot be verified safely. The current session is still running unchanged.',
|
|
146
149
|
native_transition_policy_unknown: 'The Codex permission policy for the source or the target could not be read. The current session is still running unchanged.',
|
|
147
150
|
native_transition_policy_mismatch: 'The Codex permission policy on the target differs from the source, so the history cannot be moved safely. The current session is still running unchanged.',
|
|
148
|
-
native_fork_adapter_unqualified: '
|
|
151
|
+
native_fork_adapter_unqualified: 'The Codex adapter or version metadata this history move needs is unavailable, so it cannot be carried over. The current session is still running unchanged.',
|
|
149
152
|
native_policy_override_unqualified: 'This source session uses a Codex policy override that cannot yet be reproduced safely for history transfer. The current session is still running unchanged.',
|
|
150
153
|
native_token_usage_record_invalid: 'The Codex usage record for this session could not be verified, so the history size cannot be trusted. The current session is still running unchanged.',
|
|
151
154
|
history_media_not_portable: 'This history contains an image, and the target model cannot receive images. The current session is still running unchanged.',
|
|
155
|
+
history_configuration_not_portable: 'This history contains Codex configuration records that the target model cannot carry over. The current session is still running unchanged.',
|
|
152
156
|
// WP-2 (docs/codex-lead-routed-switch-history-handoff-2026-10-21.html §5 D-5/D-6, §6.5): the
|
|
153
157
|
// encrypted-compaction path. The source model writes a plaintext handoff before the switch, and
|
|
154
158
|
// each way that handoff can fail says which one it was.
|
|
@@ -18,9 +18,13 @@
|
|
|
18
18
|
|
|
19
19
|
const { createHash } = require('node:crypto');
|
|
20
20
|
const { CLAUDE_ALIASES } = require('./claude-model-selection-vocabulary');
|
|
21
|
+
// D-2 (docs/lead-model-id-rule-at-tilde-prefix-2026-10-28.html §5): there is exactly ONE model-id
|
|
22
|
+
// rule, and it lives in lib/model-id-rule.js. A second copy here already diverged once.
|
|
23
|
+
const { isValidOverrideModel } = require('./model-id-rule');
|
|
24
|
+
// WP-8 (§9b M-10): the owner agent-type list is the ONE declaration in lib/coding-session-model-owner.js.
|
|
25
|
+
const { OWNER_AGENT_TYPES } = require('./coding-session-model-owner');
|
|
21
26
|
|
|
22
27
|
const DTO_BYTE_LIMIT = 4 * 1024;
|
|
23
|
-
const MODEL_ID_MAX = 200;
|
|
24
28
|
const OWNER_TEXT_MAX_BYTES = 256;
|
|
25
29
|
const EVIDENCE_MAX_BYTES = 256;
|
|
26
30
|
const TRANSITION_ID_MAX = 128;
|
|
@@ -28,16 +32,17 @@ const CLIENT_REQUEST_ID_MAX = 128;
|
|
|
28
32
|
const ROUTE_ID_MAX_BYTES = 256;
|
|
29
33
|
const TRANSITION_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
30
34
|
|
|
31
|
-
// The existing journal request grammar for a model id, including the `[1m]` decoration.
|
|
32
|
-
const MODEL_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:/@+\-\[\]]*$/;
|
|
33
35
|
// The existing journal effort grammar.
|
|
34
36
|
const EFFORT_RE = /^[a-z]{2,12}$/;
|
|
35
37
|
// The existing journal bounded ASCII reference grammar (transition ids, client request ids).
|
|
36
38
|
const BOUNDED_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
37
39
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
+
// WP-8 (§9b M-10): derived from the ONE owner declaration in lib/coding-session-model-owner.js.
|
|
42
|
+
const AGENT_TYPES = OWNER_AGENT_TYPES;
|
|
43
|
+
// The harness name a worker profile declares for each agent (lib/create/worker-role-profile.js).
|
|
44
|
+
// WP-8: a dsh worker dispatches over ACP as 'dsh-acp'.
|
|
45
|
+
const HARNESS_AGENT_TYPES = Object.freeze({ 'claude-code': 'claude', 'codex-cli': 'codex', 'dsh-acp': 'dsh' });
|
|
41
46
|
const SELECTION_KINDS = Object.freeze(['concrete', 'alias', 'policy', 'default']);
|
|
42
47
|
const EFFORT_ACTIONS = Object.freeze(['none', 'set', 'delete']);
|
|
43
48
|
const OPERATIONS = Object.freeze(['set-selection', 'effort-only']);
|
|
@@ -118,9 +123,7 @@ function requireOwnerText(value, label) {
|
|
|
118
123
|
}
|
|
119
124
|
|
|
120
125
|
function requireModelId(value, label) {
|
|
121
|
-
if (
|
|
122
|
-
throw invalid(`${label} is not a bounded model id`);
|
|
123
|
-
}
|
|
126
|
+
if (!isValidOverrideModel(value)) throw invalid(`${label} is not a bounded model id`);
|
|
124
127
|
return value;
|
|
125
128
|
}
|
|
126
129
|
|