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
|
@@ -1027,7 +1027,7 @@ function installAttachmentRuntime(runtime) {
|
|
|
1027
1027
|
createdAt: now,
|
|
1028
1028
|
}));
|
|
1029
1029
|
} catch (error) { void error; /* notification is best-effort */ }
|
|
1030
|
-
runtime.broadcastSessionList(true);
|
|
1030
|
+
runtime.broadcastSessionList(true, { reason: 'plan-decision' });
|
|
1031
1031
|
}
|
|
1032
1032
|
}
|
|
1033
1033
|
|
|
@@ -1061,7 +1061,7 @@ function installAttachmentRuntime(runtime) {
|
|
|
1061
1061
|
// Always refresh the sidebar when plan state drops — the input / pty-resumed
|
|
1062
1062
|
// callers reset the wait reason BEFORE calling here, so hadPlanWait can be
|
|
1063
1063
|
// false even though the Needs-You chip must clear now.
|
|
1064
|
-
runtime.broadcastSessionList(true);
|
|
1064
|
+
runtime.broadcastSessionList(true, { reason: 'plan-decision-cleared' });
|
|
1065
1065
|
}
|
|
1066
1066
|
|
|
1067
1067
|
function _ensurePlanCardDelivered(reason) {
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// WP-0a (docs/session-create-accept-then-complete-2026-11-01.html §6.1): the ONE phase clock every
|
|
4
|
+
// create on this machine is measured with, and the ONE `[create]` line built from it.
|
|
5
|
+
//
|
|
6
|
+
// The clock is a chain of deltas, not a set of timestamps: each `mark(key)` stores the elapsed time
|
|
7
|
+
// since the PREVIOUS mark (the first one measures from the clock's creation), so the eleven phases of
|
|
8
|
+
// CREATE_PHASE_KEYS tile the create's wall-clock instead of overlapping. `now()` is injected and
|
|
9
|
+
// defaults to `performance.now` — a monotonic timer, never a wall-clock timestamp — so a phase is
|
|
10
|
+
// unaffected by clock steps, and a host that wants a deterministic clock (tests) simply supplies one.
|
|
11
|
+
//
|
|
12
|
+
// Nothing here reads the message, the socket, the session or the environment: this module is pure,
|
|
13
|
+
// which is what makes "a create's telemetry can never change a create's behaviour" checkable.
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The phase keys, in the ORDER the `[create]` line prints them. A key that was never marked reads
|
|
17
|
+
* -1 (`UNMARKED`) in `fields()` — "not reached on this exit", never a fabricated 0.
|
|
18
|
+
*/
|
|
19
|
+
const CREATE_PHASE_KEYS = Object.freeze([
|
|
20
|
+
'admitMs', // handleCreatePrepared entry -> end of the idempotency block (prepared.js)
|
|
21
|
+
'reserveMs', // reserveSessionGeneration
|
|
22
|
+
'mkdirMs', // createCwd mkdir; -1 when no folder was requested
|
|
23
|
+
'metaMs', // readLaunchMetadata
|
|
24
|
+
'warmMs', // _launchPlanWarmInputs
|
|
25
|
+
'planMs', // _launchPlanCoordinator.prepare
|
|
26
|
+
'rungMs', // _resolveMissingTranscriptRung + re-plan
|
|
27
|
+
'restoreMs', // block verdict + copyBakToMissingLive
|
|
28
|
+
'codexMcpMs', // _awaitCodexMcpReadinessForPlan
|
|
29
|
+
'estimateMs', // _resumeReadyEstimator.estimate
|
|
30
|
+
// The awaited `handleCreate` call in prepared.js, marked the moment it returns (success or null):
|
|
31
|
+
// provider preparation, PTY spawn and the `created` send all happen inside that one call, so it is
|
|
32
|
+
// the last phase and it reaches `created`. A `handleCreate` that THROWS never returns and leaves it
|
|
33
|
+
// -1, like every other phase whose await did not resolve.
|
|
34
|
+
'providerMs',
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
const UNMARKED = -1;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A monotonic phase clock. Deltas are whole milliseconds (`Math.round`), so a line is stable to read
|
|
41
|
+
* and a sub-millisecond phase is 0 rather than 0.4.
|
|
42
|
+
*
|
|
43
|
+
* @param {{ now?: () => number }} [opts] `now` defaults to `performance.now`.
|
|
44
|
+
* @returns {{ mark: (key: string) => void, fields: () => Record<string, number>, totalMs: () => number }}
|
|
45
|
+
* `mark(key)` stores `round(now() - previousMark)` under `key` (the first mark measures from
|
|
46
|
+
* creation) and throws a `TypeError` for a key outside CREATE_PHASE_KEYS; a key never marked reads
|
|
47
|
+
* -1 in `fields()`; `totalMs()` is the elapsed time since creation.
|
|
48
|
+
*/
|
|
49
|
+
function createPhaseClock(opts) {
|
|
50
|
+
const source = opts && typeof opts === 'object' ? opts : {};
|
|
51
|
+
const now = typeof source.now === 'function' ? source.now : () => performance.now();
|
|
52
|
+
const startedAt = now();
|
|
53
|
+
const marks = new Map();
|
|
54
|
+
let previous = startedAt;
|
|
55
|
+
return {
|
|
56
|
+
mark(key) {
|
|
57
|
+
if (!CREATE_PHASE_KEYS.includes(key)) throw new TypeError(`Unknown create phase key: ${String(key)}`);
|
|
58
|
+
const at = now();
|
|
59
|
+
marks.set(key, Math.round(at - previous));
|
|
60
|
+
previous = at;
|
|
61
|
+
},
|
|
62
|
+
fields() {
|
|
63
|
+
const fields = {};
|
|
64
|
+
for (const key of CREATE_PHASE_KEYS) fields[key] = marks.has(key) ? marks.get(key) : UNMARKED;
|
|
65
|
+
return fields;
|
|
66
|
+
},
|
|
67
|
+
totalMs() {
|
|
68
|
+
return Math.round(now() - startedAt);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A number or -1. Never throws: a written field is the only way a phase value reaches the line. */
|
|
74
|
+
function _number(value) {
|
|
75
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : UNMARKED;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** A scalar as text; anything else (a missing field, an object, a function) reads ''. Never throws. */
|
|
79
|
+
function _text(value) {
|
|
80
|
+
const type = typeof value;
|
|
81
|
+
if (type === 'string') return value;
|
|
82
|
+
if (type === 'number' || type === 'boolean' || type === 'bigint') return String(value);
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The ONE `[create]` line: the fixed prefix, then the eleven CREATE_PHASE_KEYS in order, then
|
|
88
|
+
* load1/cores. NEVER throws — a line that cannot be built is still a line, because this is the only
|
|
89
|
+
* record that a create happened at all (a bad argument degrades a field to '' or -1, never the
|
|
90
|
+
* caller's create). Every value is coerced through {@link _text}/{@link _number}, and `clock` is used
|
|
91
|
+
* only through the two methods this module itself defines.
|
|
92
|
+
*
|
|
93
|
+
* @param {{ id?: string, agent?: string, forwardedBy?: string,
|
|
94
|
+
* outcome?: 'created'|'duplicate'|'refused'|'failed', code?: string,
|
|
95
|
+
* clock?: ReturnType<typeof createPhaseClock>, load1?: number, cores?: number }} [r]
|
|
96
|
+
* @returns {string} e.g.
|
|
97
|
+
* "[create] id=f9edf6cf agent=claude forwardedBy=ctm-3456-1a2c9c outcome=created code=- totalMs=16912
|
|
98
|
+
* admitMs=2 reserveMs=41 mkdirMs=-1 metaMs=12 warmMs=0 planMs=11 rungMs=3 restoreMs=0 codexMcpMs=-1
|
|
99
|
+
* estimateMs=4 providerMs=15020 load1=76.9 cores=16"
|
|
100
|
+
*/
|
|
101
|
+
function formatCreateLine(r) {
|
|
102
|
+
const source = r && typeof r === 'object' ? r : {};
|
|
103
|
+
const clock = source.clock && typeof source.clock.fields === 'function' ? source.clock : null;
|
|
104
|
+
const fields = clock ? clock.fields() : null;
|
|
105
|
+
const values = fields && typeof fields === 'object' ? fields : {};
|
|
106
|
+
const totalMs = clock && typeof clock.totalMs === 'function' ? clock.totalMs() : UNMARKED;
|
|
107
|
+
let line = '[create]'
|
|
108
|
+
+ ` id=${_text(source.id).slice(0, 8)}`
|
|
109
|
+
+ ` agent=${_text(source.agent) || '-'}`
|
|
110
|
+
+ ` forwardedBy=${_text(source.forwardedBy)}`
|
|
111
|
+
+ ` outcome=${_text(source.outcome) || 'failed'}`
|
|
112
|
+
+ ` code=${_text(source.code) || '-'}`
|
|
113
|
+
+ ` totalMs=${_number(totalMs)}`;
|
|
114
|
+
for (const key of CREATE_PHASE_KEYS) line += ` ${key}=${_number(values[key])}`;
|
|
115
|
+
return `${line} load1=${_number(source.load1)} cores=${_number(source.cores)}`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
module.exports = { CREATE_PHASE_KEYS, createPhaseClock, formatCreateLine };
|
|
@@ -284,6 +284,13 @@ async function createWorkerSession(opts = {}) {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
const { agent, harness, workerProfile } = _normalizeWorkerRequest(opts);
|
|
287
|
+
// WP-14 (design D-21, rev 4): the worker TABLE names a dsh worker's harness `'dsh-acp'`, but every
|
|
288
|
+
// proxy-facing decision below (route servability/execution profile, worker-capability records, the
|
|
289
|
+
// minted token's binding) is keyed by the WIRE FACE the child speaks. A dsh child speaks
|
|
290
|
+
// `/v1/messages`, exactly a routed Claude lead's face, so the proxy side is `'claude-code'`;
|
|
291
|
+
// an `'dsh-acp'` capability/binding could never match it (lib/acp/dsh-route-patch.js DSH_HARNESS is
|
|
292
|
+
// the same literal for the same reason). The worker table and the launch recipe keep `'dsh-acp'`.
|
|
293
|
+
const proxyHarness = agent === 'dsh' ? 'claude-code' : harness;
|
|
287
294
|
if (opts.effort !== undefined && !EFFORT_VALUES.has(opts.effort)) {
|
|
288
295
|
throw new DelegateError('effort_invalid', 400, `effort must be one of low|medium|high|xhigh, got "${opts.effort}"`);
|
|
289
296
|
}
|
|
@@ -345,17 +352,17 @@ async function createWorkerSession(opts = {}) {
|
|
|
345
352
|
}
|
|
346
353
|
const settingSources = inheritUserSettings === true ? ['user', 'project', 'local'] : ['project', 'local'];
|
|
347
354
|
const routeStartedAt = Date.now();
|
|
348
|
-
const { alias, model, baseUrl, upstreamApis, workerCapabilities, executionProfile: routeProfile, maxOutputTokensFact, routeConfiguredMaxOutput } = await _resolveRoute({ route: opts.route, model: opts.model, agent, harness });
|
|
355
|
+
const { alias, model, baseUrl, upstreamApis, workerCapabilities, executionProfile: routeProfile, maxOutputTokensFact, routeConfiguredMaxOutput } = await _resolveRoute({ route: opts.route, model: opts.model, agent, harness: proxyHarness });
|
|
349
356
|
// D-7 (routed-worker-visibility-and-review-workers-2026-10-16.html): a review worker is
|
|
350
357
|
// budgeted like an implementation worker -- the request policy is proxied for BOTH; only the
|
|
351
358
|
// profile name on the budget sentence and the (later) launch argv differ.
|
|
352
359
|
const budgeted = workerProfile === 'implementation' || workerProfile === 'review';
|
|
353
|
-
const proxied = workerBudgetSetup.isProxiedRecipe({ requestPolicy: budgeted, route: alias }); let exec; try { exec = resolveExecutionProfile({ request: opts, routeProfile, projectConfig: cfg?.data?.worker, harness, proxied }); } catch (err) { throw new DelegateError('execution_profile_invalid', 400, err.message); }
|
|
360
|
+
const proxied = workerBudgetSetup.isProxiedRecipe({ requestPolicy: budgeted, route: alias }); let exec; try { exec = resolveExecutionProfile({ request: opts, routeProfile, projectConfig: cfg?.data?.worker, harness: proxyHarness, proxied }); } catch (err) { throw new DelegateError('execution_profile_invalid', 400, err.message); }
|
|
354
361
|
const maxTurns = cliMaxTurns(exec.values, proxied);
|
|
355
362
|
renderedBrief = renderedBriefWithBudget(renderedBrief, exec.values, { proxied, profile: workerProfile });
|
|
356
363
|
const requestPolicy = budgeted ? policyFromValues(exec.values) : null;
|
|
357
|
-
const selection = workerCapabilitySelection.forLaunch({ workerProfile, callerEffort: opts.effort, capabilities: workerCapabilities, modelId: model, harness });
|
|
358
|
-
if (selection.error) throw new DelegateError(selection.error, 400, `route "${alias}" has an unsafe capability record for model "${model}" and harness "${
|
|
364
|
+
const selection = workerCapabilitySelection.forLaunch({ workerProfile, callerEffort: opts.effort, capabilities: workerCapabilities, modelId: model, harness: proxyHarness });
|
|
365
|
+
if (selection.error) throw new DelegateError(selection.error, 400, `route "${alias}" has an unsafe capability record for model "${model}" and harness "${proxyHarness}"`);
|
|
359
366
|
const effectiveEffort = selection.effort, capabilityRevision = selection.revision, executionProfile = { ...exec, ...(proxied ? { lease: { current: 1, ceiling: require('../model-proxy/request-budget').LEASE_CEILING } } : {}), maxOutputTokensFact, outputCapSource: require('../model-proxy/output-cap').effectiveOutputCap({ capabilityMaxOutput: selection.capability?.max_output_tokens, factMaxOutput: maxOutputTokensFact, routeConfiguredMaxOutput }).source };
|
|
360
367
|
// Admission gates the LAUNCH, right after the route alias is known and before any
|
|
361
368
|
// proxy/token work happens for it -- never a retry, never a queue, never a concurrency cap:
|
|
@@ -426,7 +433,7 @@ async function createWorkerSession(opts = {}) {
|
|
|
426
433
|
}
|
|
427
434
|
|
|
428
435
|
token = await workerBudgetSetup.mintInitialToken(deps.oauthProxySupervisor, {
|
|
429
|
-
sessionId: id, alias, model, harness, ttlMs: DEFAULT_TOKEN_TTL_MS, policy: requestPolicy, capabilityRevision, capabilityBasis: selection.basis,
|
|
436
|
+
sessionId: id, alias, model, harness: proxyHarness, ttlMs: DEFAULT_TOKEN_TTL_MS, policy: requestPolicy, capabilityRevision, capabilityBasis: selection.basis,
|
|
430
437
|
delegationInvocationId,
|
|
431
438
|
}, (err) => new DelegateError('proxy_unready', 503, `could not mint worker token: ${err.message}`));
|
|
432
439
|
|
|
@@ -535,6 +542,13 @@ async function createWorkerSession(opts = {}) {
|
|
|
535
542
|
createCwd: false,
|
|
536
543
|
_isRestore: false, agentRole: 'worker',
|
|
537
544
|
workerRow,
|
|
545
|
+
// WP-14 (§9b W-2/W-3): the SAME create path every other worker uses -- deps.createSession is
|
|
546
|
+
// server.js's handleCreatePrepared -> handleCreate, whose structured-session dispatcher
|
|
547
|
+
// (lib/session-create/structured-session.js -> dsh-session.js) owns a non-PTY create. A dsh
|
|
548
|
+
// worker is routed there by its agentType, and its ACP start params (the brief as the first
|
|
549
|
+
// prompt, the routed pick, the MCP set, the report path) ride the launch spec the dsh branch
|
|
550
|
+
// of resolveWorkerLaunchParams built. No other agent ever carries `agentType`/`acp`.
|
|
551
|
+
...(agent === 'dsh' && launch.acp ? { agentType: 'dsh', routeAlias: launch.acp.routeAlias || null, model: model || null, acp: launch.acp } : {}),
|
|
538
552
|
});
|
|
539
553
|
} catch (err) {
|
|
540
554
|
await _revokeQuietly(token);
|
|
@@ -601,7 +615,7 @@ async function createWorkerSession(opts = {}) {
|
|
|
601
615
|
bash_calls: 0,
|
|
602
616
|
});
|
|
603
617
|
if (typeof deps.broadcastSessionList === 'function') {
|
|
604
|
-
try { deps.broadcastSessionList(true); } catch { /* expected: a stale socket/list update cannot invalidate a launched worker */ }
|
|
618
|
+
try { deps.broadcastSessionList(true, { reason: 'worker-launched' }); } catch { /* expected: a stale socket/list update cannot invalidate a launched worker */ }
|
|
605
619
|
}
|
|
606
620
|
|
|
607
621
|
// Fix round 6: the identity write above is DEFERRED off the create's critical path
|
|
@@ -704,6 +718,19 @@ const _computeExitFailure = computeExitFailure;
|
|
|
704
718
|
const workerAdmissionExit = createWorkerAdmissionExit({ admission, computeExitFailure, getSupervisor: () => _deps && _deps.oauthProxySupervisor });
|
|
705
719
|
const { releaseAdmissionOnExit, resetIgnoredConfigWarningsForTest: _resetIgnoredConfigWarningsForTest } = workerAdmissionExit;
|
|
706
720
|
|
|
721
|
+
// WP-14 (docs/deepseek-harness-acp-agent-2026-10-28.html §9b W-3, D-21): a dsh worker is not a PTY
|
|
722
|
+
// worker, so `session._workerTurnCounter` (the WorkerStreamObserver) never exists for it and
|
|
723
|
+
// `observer.finalText` is always empty. Its brief turn travels over ACP instead, and its report is
|
|
724
|
+
// the LAST assistant text of that turn: lib/acp/dsh-session-runtime.js accumulates it per
|
|
725
|
+
// `agent_message_chunk` and lib/session-create/dsh-session.js publishes it on the live session as a
|
|
726
|
+
// non-enumerable `_dshFinalText` accessor. The exit path (retireNow below) stamps the same text into
|
|
727
|
+
// runtime_json.finalText, so a status read AFTER the session is gone still reports it.
|
|
728
|
+
function _dshFinalTextFor(session) {
|
|
729
|
+
if (!session) return '';
|
|
730
|
+
const value = session._dshFinalText;
|
|
731
|
+
return typeof value === 'string' ? value : '';
|
|
732
|
+
}
|
|
733
|
+
|
|
707
734
|
function _probeWorkerFiles(session, reportPath, lastMessagePath, now) {
|
|
708
735
|
return probeCachedFileState(session, now, () => {
|
|
709
736
|
const reportPresent = fs.existsSync(reportPath);
|
|
@@ -753,7 +780,7 @@ function getWorkerStatus(ctmSessionId, { now = Date.now } = {}) {
|
|
|
753
780
|
let failure = null;
|
|
754
781
|
let reportSource = null;
|
|
755
782
|
let reportText = '';
|
|
756
|
-
const successfulFinalText = boundedWorkerText(observer?.finalText || runtime?.finalText || '');
|
|
783
|
+
const successfulFinalText = boundedWorkerText(observer?.finalText || runtime?.finalText || _dshFinalTextFor(session) || '');
|
|
757
784
|
if ((failure = workerBudgetSetup.failureForGeneration(runtime, workerRow?.generation || 1))) status = 'failed';
|
|
758
785
|
else if (reportPresent) {
|
|
759
786
|
status = 'report_ready';
|
|
@@ -861,7 +888,7 @@ function getWorkerStatus(ctmSessionId, { now = Date.now } = {}) {
|
|
|
861
888
|
write_tool_calls: observer && Number.isInteger(observer.writerActions) ? observer.writerActions : 0,
|
|
862
889
|
read_tool_calls: observer ? (Number.isInteger(observer.readToolCalls) ? observer.readToolCalls : 0) : null,
|
|
863
890
|
bash_calls: observer ? (Number.isInteger(observer.bashCalls) ? observer.bashCalls : 0) : null,
|
|
864
|
-
harness: launchRecipe.harness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'claude' ? 'claude-code' : null),
|
|
891
|
+
harness: launchRecipe.harness || (workerRow?.agent === 'codex' ? 'codex-cli' : workerRow?.agent === 'dsh' ? 'dsh-acp' : workerRow?.agent === 'claude' ? 'claude-code' : null),
|
|
865
892
|
worker_profile: launchRecipe.workerProfile || 'legacy',
|
|
866
893
|
original_brief_sha256: launchRecipe.originalBriefSha256 || null,
|
|
867
894
|
rendered_brief_sha256: launchRecipe.renderedBriefSha256 || null,
|
|
@@ -1056,7 +1083,7 @@ async function _hideWorker(ctmSessionId, { now = Date.now } = {}) {
|
|
|
1056
1083
|
}
|
|
1057
1084
|
_hideFailures.delete(ctmSessionId);
|
|
1058
1085
|
console.log(workerHideLogLine(ctmSessionId, deps.dbModule, retireReason, hiddenAtIso));
|
|
1059
|
-
if (typeof deps.broadcastSessionList === 'function') deps.broadcastSessionList(true);
|
|
1086
|
+
if (typeof deps.broadcastSessionList === 'function') deps.broadcastSessionList(true, { reason: 'worker-hidden' });
|
|
1060
1087
|
}
|
|
1061
1088
|
|
|
1062
1089
|
// Lifecycle WP-5 (§5 D-10, §9 S-13): stamps consumed_at exactly once -- called by
|
|
@@ -1129,13 +1156,30 @@ function _invalidateWorkerFailureCache(deps, ctmSessionId) {
|
|
|
1129
1156
|
session._workerFailure = null;
|
|
1130
1157
|
}
|
|
1131
1158
|
|
|
1132
|
-
function markWorkerTerminal(ctmSessionId,
|
|
1159
|
+
function markWorkerTerminal(ctmSessionId, options = {}) {
|
|
1160
|
+
// C7-B1 (worker-terminal-retry-generation-fence-2026-10-27.html §3.2): the options object is
|
|
1161
|
+
// destructured from a named binding (not inline) so the OWN presence of expectedGeneration can
|
|
1162
|
+
// tell "this retry chain carried the generation it began in" apart from "not provided"; a
|
|
1163
|
+
// present-but-invalid target is refused rather than silently treated as unfenced. Every other
|
|
1164
|
+
// option keeps its exact default, and the legacy `|| 1` row interpretation is unchanged.
|
|
1165
|
+
const { terminalStatus, failure = null, runtime = null, now = Date.now, retry = 0, firstAttemptMs = null } = options;
|
|
1166
|
+
const hasExpectedGeneration = Object.prototype.hasOwnProperty.call(options, 'expectedGeneration');
|
|
1133
1167
|
const deps = _requireDeps();
|
|
1134
1168
|
let row;
|
|
1135
1169
|
try { row = deps.dbModule.getWorkerSession(ctmSessionId); } catch { row = null; /* expected: an unreadable row is treated as no worker row, so nothing is stamped or scheduled -- a later exit-path call or the boot reload retries */ }
|
|
1136
1170
|
// WP-1: a row that no longer exists, or that another path already hid (hidden_at stamped =
|
|
1137
1171
|
// the worker is retired and its row is out of every listing), ends the retry chain here.
|
|
1138
1172
|
if (!row || row.hidden_at) return;
|
|
1173
|
+
// C7-B1 (§3.2): the generation this stamp BEGAN in -- captured once on the first entry and
|
|
1174
|
+
// carried verbatim through every retry, never resampled and never taken from runtime.generation
|
|
1175
|
+
// (absent on a boot retirement, possibly stale telemetry). A resume legitimately reopens the
|
|
1176
|
+
// empty-terminal window for its successor generation (worker-continuation.js); this operation
|
|
1177
|
+
// must not spend that window, so a row that has moved on is left with no mutation and no
|
|
1178
|
+
// terminal side effect at all.
|
|
1179
|
+
const observedGeneration = Number(row.generation || 1);
|
|
1180
|
+
const targetGeneration = hasExpectedGeneration ? options.expectedGeneration : observedGeneration;
|
|
1181
|
+
if (!Number.isSafeInteger(targetGeneration) || targetGeneration <= 0) return;
|
|
1182
|
+
if (observedGeneration !== targetGeneration) return;
|
|
1139
1183
|
const nowMs = typeof now === 'function' ? now() : Number(now);
|
|
1140
1184
|
const nowIso = new Date(nowMs).toISOString();
|
|
1141
1185
|
const patch = {};
|
|
@@ -1167,8 +1211,12 @@ function markWorkerTerminal(ctmSessionId, { terminalStatus, failure = null, runt
|
|
|
1167
1211
|
});
|
|
1168
1212
|
}
|
|
1169
1213
|
if (Object.keys(patch).length) {
|
|
1214
|
+
let accepted;
|
|
1170
1215
|
try {
|
|
1171
|
-
|
|
1216
|
+
// C7-B1 (§3.2): the write goes through the existing helper with the generation fence
|
|
1217
|
+
// bound out-of-band (never inside the patch), so a row that advanced since the read above
|
|
1218
|
+
// matches zero rows instead of being stamped by a stale operation.
|
|
1219
|
+
accepted = deps.dbModule.updateWorkerSession(ctmSessionId, patch, { expectedGeneration: targetGeneration });
|
|
1172
1220
|
} catch (err) {
|
|
1173
1221
|
// WP-7 live finding: a busy write lock fails FAST and the old early return also dropped the wait wake + terminal sentinel -- disposition is now REPORT + retry of the whole stamp.
|
|
1174
1222
|
// WP-1: that retry has NO attempt ceiling -- a transient lock error is not the stamp's
|
|
@@ -1181,10 +1229,17 @@ function markWorkerTerminal(ctmSessionId, { terminalStatus, failure = null, runt
|
|
|
1181
1229
|
if (['SQLITE_WRITE_LOCK_BUSY', 'SQLITE_BUSY', 'SQLITE_LOCKED'].includes(err && err.code)) {
|
|
1182
1230
|
const firstAtMs = firstAttemptMs ?? nowMs;
|
|
1183
1231
|
if (retry === 5) console.warn(`[delegate-worker] terminal stamp still busy after 6 attempts (${String((err && err.code) || 'write_failed').slice(0, 48)}); retrying every ${TERMINAL_STAMP_RETRY_CAP_MS} ms`);
|
|
1184
|
-
|
|
1232
|
+
// The retry carries the SAME captured generation, so the fence is re-applied against
|
|
1233
|
+
// whatever the row says when it fires rather than re-derived from a newer row.
|
|
1234
|
+
return void workerLedger.trackTerminalWork(new Promise((resolve) => setTimeout(() => { try { markWorkerTerminal(ctmSessionId, { terminalStatus, failure, runtime, now, retry: retry + 1, firstAttemptMs: firstAtMs, expectedGeneration: targetGeneration }); } finally { resolve(); } }, Math.min(100 * (retry + 1), TERMINAL_STAMP_RETRY_CAP_MS)).unref?.()));
|
|
1185
1235
|
}
|
|
1186
1236
|
console.warn(`[delegate-worker] terminal stamp failed (${String((err && err.code) || "write_failed").slice(0, 48)})`); return;
|
|
1187
1237
|
}
|
|
1238
|
+
// C7-B1 (§3.2): a refused write is not a hint -- a definite false exits here, BEFORE the
|
|
1239
|
+
// local row merge, the failure-cache invalidation, the terminal publication/ledger, the
|
|
1240
|
+
// sentinel/journal and the retention arm. Legacy producers that return undefined keep their
|
|
1241
|
+
// existing behavior; the production helper always returns a boolean.
|
|
1242
|
+
if (accepted === false) return;
|
|
1188
1243
|
row = { ...row, ...patch };
|
|
1189
1244
|
if (retry > 0) console.log(`[delegate-worker] terminal stamp landed for ${ctmSessionId} after ${retry + 1} attempts in ${nowMs - (firstAttemptMs ?? nowMs)} ms`);
|
|
1190
1245
|
_invalidateWorkerFailureCache(deps, ctmSessionId);
|
|
@@ -1228,13 +1283,20 @@ const _TERMINAL_STATUSES = new Set(['report_ready', 'exited', 'failed']);
|
|
|
1228
1283
|
|
|
1229
1284
|
// Callers don't await: a PROXIED worker is first stamped with the proxy's journaled stop record (one async read),
|
|
1230
1285
|
// so that deferred stamp is tracked by the terminal settle (its sentinel/journal writes start only after the read).
|
|
1286
|
+
// C7-B2-P1 (docs/worker-deferred-stop-record-generation-2026-10-27.html §5 D2, §6): the helper's captured
|
|
1287
|
+
// numeric generation is forwarded verbatim into the deferred retirement, so the callback retires the
|
|
1288
|
+
// generation the exit began in rather than whatever the row says once the awaited read resolves. The
|
|
1289
|
+
// proxyless/unreadable-row path calls run() with no argument and keeps its synchronous legacy behavior.
|
|
1231
1290
|
function retireWorkerOnExit(session, { now = Date.now } = {}) {
|
|
1232
1291
|
if (!session || session.agentRole !== 'worker' || !session.id) return undefined;
|
|
1233
|
-
const result = workerBudgetSetup.retireAfterStopRecord(() => _requireDeps().dbModule, session.id, _readWorkerLaunchRecipe, () => retireNow(session, now));
|
|
1292
|
+
const result = workerBudgetSetup.retireAfterStopRecord(() => _requireDeps().dbModule, session.id, _readWorkerLaunchRecipe, (expectedGeneration) => retireNow(session, now, expectedGeneration));
|
|
1234
1293
|
return result && typeof result.then === 'function' ? workerLedger.trackTerminalWork(result) : result;
|
|
1235
1294
|
}
|
|
1236
1295
|
|
|
1237
|
-
|
|
1296
|
+
// C7-B2-P1 (§5 D2, §6): `expectedGeneration` is an INTERNAL continuation argument -- the numeric
|
|
1297
|
+
// generation captured before the deferred stop-record read. undefined means the legacy proxyless /
|
|
1298
|
+
// unreadable-row path, which keeps its exact behavior.
|
|
1299
|
+
function retireNow(session, now, expectedGeneration) {
|
|
1238
1300
|
let result;
|
|
1239
1301
|
try {
|
|
1240
1302
|
result = getWorkerStatus(session.id, { now });
|
|
@@ -1242,6 +1304,9 @@ function retireNow(session, now) {
|
|
|
1242
1304
|
/* expected: a status derivation that throws at exit (deps not configured, db closing during shutdown) cannot name a terminal status, so the row is left un-stamped and retention degrades to "never auto-hidden" rather than stamping a guess */
|
|
1243
1305
|
return;
|
|
1244
1306
|
}
|
|
1307
|
+
// A provided target differing from current-row status exits before terminal side effects.
|
|
1308
|
+
// Omission retains the legacy proxyless/unreadable-row path.
|
|
1309
|
+
if (expectedGeneration !== undefined && result.generation !== expectedGeneration) return;
|
|
1245
1310
|
if (!_TERMINAL_STATUSES.has(result.status)) return;
|
|
1246
1311
|
// F1: invalidate unconditionally here too -- markWorkerTerminal only invalidates on the
|
|
1247
1312
|
// branch that actually writes failure_json (row.terminal_at was empty); a racing/duplicate
|
|
@@ -1257,10 +1322,15 @@ function retireNow(session, now) {
|
|
|
1257
1322
|
contextTokens: observer ? observer.contextTokens : null,
|
|
1258
1323
|
peakContextTokens: observer ? observer.peakContextTokens : null,
|
|
1259
1324
|
compactions: observer ? observer.compactions : [],
|
|
1260
|
-
finalText: observer ? observer.finalText :
|
|
1325
|
+
finalText: observer ? observer.finalText : _dshFinalTextFor(session), cliReportedCostUsd: observer ? observer.cliReportedCostUsd : null,
|
|
1261
1326
|
providerThreadId: observer ? observer.providerThreadId : '',
|
|
1262
1327
|
};
|
|
1263
|
-
|
|
1328
|
+
// The target is spread in ONLY when this call actually carries one: B1 rejects a present-but-invalid
|
|
1329
|
+
// guard (a present `undefined` key is invalid), so the legacy path must omit the key, not pass undefined.
|
|
1330
|
+
markWorkerTerminal(session.id, {
|
|
1331
|
+
terminalStatus: result.status, failure: result.failure, runtime, now,
|
|
1332
|
+
...(expectedGeneration === undefined ? {} : { expectedGeneration }),
|
|
1333
|
+
});
|
|
1264
1334
|
}
|
|
1265
1335
|
|
|
1266
1336
|
// WP-2 (worker-terminal-stamp-durable-2026-10-26 D-2/D-3): one idempotent read repair for a
|