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
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// WP-6 (docs/deepseek-harness-acp-agent-2026-10-28.html §5 D-11/D-21, §6.6, OQ-1/OQ-4/OQ-7).
|
|
4
|
+
//
|
|
5
|
+
// Routed model access for a `dsh` (DeepSeek Harness) conv session. dsh's own `deepseek-official`
|
|
6
|
+
// provider wants a DeepSeek key CTM must never hold (P-5: keys live only in the proxy), so the child
|
|
7
|
+
// is pointed at CTM's loopback model proxy instead:
|
|
8
|
+
//
|
|
9
|
+
// * the non-secret provider config travels in a `--patch` YAML (mode 0600, NO secret) that declares
|
|
10
|
+
// pi-ai's BUILT-IN `anthropic` provider with `baseURL http://127.0.0.1:<proxyPort>/r/<alias>` and
|
|
11
|
+
// every model the route serves (§6.6, proven by OQ-1/OQ-7 against a header-logging stub);
|
|
12
|
+
// * the session token travels in the child ENVIRONMENT as `ANTHROPIC_AUTH_TOKEN` — the one thing
|
|
13
|
+
// pi-ai's built-in anthropic provider turns into `Authorization: Bearer …` (§3b OQ-1).
|
|
14
|
+
//
|
|
15
|
+
// The token is minted with the SAME supervisor call a routed Claude lead uses (`registerLeadToken`),
|
|
16
|
+
// so a proxy restart that replays its in-memory lead registry keeps the session working (D-11), and it
|
|
17
|
+
// is NEVER persisted to `session_lead_token`/`session_lead_route` — whose `agent` CHECK is
|
|
18
|
+
// ('claude','codex') (lib/migrations/v46-session-lead-token.js). `releaseDshRoute` revokes it; the
|
|
19
|
+
// patch file is evidence and is NEVER unlinked (D-10's spirit: CTM does not delete artifacts).
|
|
20
|
+
|
|
21
|
+
const fs = require('node:fs');
|
|
22
|
+
const path = require('node:path');
|
|
23
|
+
|
|
24
|
+
const ANTHROPIC_MESSAGES_API = 'anthropic-messages';
|
|
25
|
+
// The proxy derives a request's harness from its wire face (oauth-proxy.js `requestHarness`): a dsh
|
|
26
|
+
// child speaks the anthropic-messages face, so its token binds the same harness a routed Claude lead
|
|
27
|
+
// does. A distinct 'dsh-acp' harness (design D-21) would never match that face-derived tuple.
|
|
28
|
+
const DSH_HARNESS = 'claude-code';
|
|
29
|
+
// The literal a create payload may name to keep dsh on its OWN `deepseek-official` provider (no patch,
|
|
30
|
+
// no token) — pre-WP-6 behaviour as an EXPLICIT opt-out, never a silent fallback (D-12).
|
|
31
|
+
const DSH_OWN_KEY_ALIAS = 'dsh-own-key';
|
|
32
|
+
// A dsh session has no PTY generation: a fresh create mints its one routed token at generation 1, and
|
|
33
|
+
// a proxy restart replays that exact registration (D-11).
|
|
34
|
+
const DSH_ROUTE_PROCESS_GENERATION = 1;
|
|
35
|
+
// §6.6: the effort map is fixed (OQ-7) and its VALUES are the wire spellings the proxy accepts
|
|
36
|
+
// (lib/model-proxy/routes.js REASONING_LEVELS low|medium|xhigh|off).
|
|
37
|
+
const DSH_REASONING_EFFORTS = "reasoningEfforts: { off: null, low: low, high: medium, max: xhigh }";
|
|
38
|
+
// OQ-4: today that is a Portkey-served route whose DeepSeek deployment speaks anthropic-messages.
|
|
39
|
+
const DEEPSEEK_MODEL_RE = /deepseek/i;
|
|
40
|
+
const PORTKEY_ALIAS_RE = /portkey/i;
|
|
41
|
+
const READINESS_BUDGET_MS = 12000;
|
|
42
|
+
const SAFE_YAML_ID_RE = /^[@A-Za-z0-9][A-Za-z0-9._:/@+-]{0,159}$/;
|
|
43
|
+
const FACTS_REVISION_RE = /^[a-f0-9]{64}$/;
|
|
44
|
+
|
|
45
|
+
function _message(error) {
|
|
46
|
+
return String((error && error.message) || error).slice(0, 200);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The exact directory naming the design fixes: `<dataDir>/dsh/patches/<ctmSessionId>.yml`.
|
|
51
|
+
* @param {string} ctmSessionId
|
|
52
|
+
* @param {string} dataDir
|
|
53
|
+
* @returns {string}
|
|
54
|
+
*/
|
|
55
|
+
function dshPatchPath(ctmSessionId, dataDir) {
|
|
56
|
+
return path.join(dataDir, 'dsh', 'patches', `${ctmSessionId}.yml`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The models a dsh child may send: the route's deployments on the anthropic-messages wire (D-21 —
|
|
60
|
+
// pi-ai's Bearer path exists only on the built-in anthropic provider, so openai-* rows are not offered).
|
|
61
|
+
function anthropicDeployments(row) {
|
|
62
|
+
const deployments = row && Array.isArray(row.model_deployments) ? row.model_deployments : [];
|
|
63
|
+
return deployments.filter((d) => d && d.protocol === ANTHROPIC_MESSAGES_API && typeof d.wireModelId === 'string');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function servesAnthropicMessages(row) {
|
|
67
|
+
const apis = row && Array.isArray(row.upstream_apis) ? row.upstream_apis : [];
|
|
68
|
+
return apis.includes(ANTHROPIC_MESSAGES_API) && anthropicDeployments(row).length > 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* OQ-4 default: the first DeepSeek-model route that serves anthropic-messages, preferring a
|
|
73
|
+
* Portkey-served one. An explicitly named alias is honoured as long as the route serves dsh.
|
|
74
|
+
* @param {Array<object>} routes redacted route feed (oauth-proxy-supervisor.listWorkerRoutes())
|
|
75
|
+
* @param {string|null} routeAlias
|
|
76
|
+
* @returns {{ok:true, row:object}|{ok:false, reason:string, detail:string}}
|
|
77
|
+
*/
|
|
78
|
+
function selectDshRoute(routes, routeAlias) {
|
|
79
|
+
const rows = (Array.isArray(routes) ? routes : []).filter((row) => row && typeof row.id === 'string' && row.id);
|
|
80
|
+
if (routeAlias) {
|
|
81
|
+
const row = rows.find((candidate) => candidate.id === routeAlias);
|
|
82
|
+
if (!row) return { ok: false, reason: 'dsh_route_unavailable', detail: `unknown route alias: ${routeAlias}` };
|
|
83
|
+
if (row.enabled === false || row.enabled === 0) return { ok: false, reason: 'dsh_route_unavailable', detail: `route is disabled: ${routeAlias}` };
|
|
84
|
+
if (!servesAnthropicMessages(row)) {
|
|
85
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: `route "${routeAlias}" does not serve ${ANTHROPIC_MESSAGES_API}` };
|
|
86
|
+
}
|
|
87
|
+
return { ok: true, row };
|
|
88
|
+
}
|
|
89
|
+
const deepseekRoutes = rows
|
|
90
|
+
.filter(servesAnthropicMessages)
|
|
91
|
+
.filter((row) => anthropicDeployments(row).some((d) => DEEPSEEK_MODEL_RE.test(d.wireModelId)));
|
|
92
|
+
const chosen = deepseekRoutes.find((row) => PORTKEY_ALIAS_RE.test(row.id)) || deepseekRoutes[0];
|
|
93
|
+
if (!chosen) {
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
reason: 'dsh_route_unavailable',
|
|
97
|
+
detail: `no route serves ${ANTHROPIC_MESSAGES_API} with a DeepSeek model`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { ok: true, row: chosen };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The route's model the child runs: an explicit pick when given (and served), else the first
|
|
104
|
+
// DeepSeek model, else the route's first anthropic-messages model.
|
|
105
|
+
function pickDeployment(deployments, model) {
|
|
106
|
+
if (typeof model === 'string' && model) return deployments.find((d) => d.wireModelId === model) || null;
|
|
107
|
+
return deployments.find((d) => DEEPSEEK_MODEL_RE.test(d.wireModelId)) || deployments[0] || null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function describeModel(deployment) {
|
|
111
|
+
const modalities = Array.isArray(deployment.inputModalities) ? deployment.inputModalities : [];
|
|
112
|
+
const reasoningLevels = Array.isArray(deployment.reasoningLevels) ? deployment.reasoningLevels : [];
|
|
113
|
+
return {
|
|
114
|
+
id: deployment.wireModelId,
|
|
115
|
+
contextWindow: Number.isSafeInteger(deployment.contextTokens) && deployment.contextTokens > 0 ? deployment.contextTokens : null,
|
|
116
|
+
acceptsImages: modalities.includes('image'),
|
|
117
|
+
reasoning: reasoningLevels.length > 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// §6.6's patch, byte for byte: no token, no key, no upstream URL — only the loopback base and the
|
|
122
|
+
// model facts. `ctmSessionId` is part of the PATH, never of the content.
|
|
123
|
+
function renderPatch({ alias, model, models, proxyPort }) {
|
|
124
|
+
const lines = [
|
|
125
|
+
'- id: llm-pi-ai',
|
|
126
|
+
' config:',
|
|
127
|
+
' providers:',
|
|
128
|
+
' anthropic:',
|
|
129
|
+
` baseURL: 'http://127.0.0.1:${proxyPort}/r/${alias}'`,
|
|
130
|
+
' models:',
|
|
131
|
+
];
|
|
132
|
+
for (const entry of models) {
|
|
133
|
+
lines.push(` - id: '${entry.id}'`);
|
|
134
|
+
if (entry.contextWindow) lines.push(` contextWindow: ${entry.contextWindow}`);
|
|
135
|
+
if (entry.acceptsImages) lines.push(' input: [text, image]');
|
|
136
|
+
if (entry.reasoning) lines.push(` ${DSH_REASONING_EFFORTS}`);
|
|
137
|
+
}
|
|
138
|
+
lines.push('- id: acp');
|
|
139
|
+
lines.push(` config: { provider: anthropic, model: '${model}' }`);
|
|
140
|
+
return `${lines.join('\n')}\n`;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function writePatchFile(patchPath, content) {
|
|
144
|
+
await fs.promises.mkdir(path.dirname(patchPath), { recursive: true });
|
|
145
|
+
await fs.promises.writeFile(patchPath, content, { mode: 0o600 });
|
|
146
|
+
// `mode` on writeFile applies only at CREATION, so an id that is re-created over an existing file
|
|
147
|
+
// keeps whatever bits were there; re-assert so a patch is never group/world readable.
|
|
148
|
+
await fs.promises.chmod(patchPath, 0o600);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Prepare a routed dsh launch: resolve the route, run the same readiness sequence a routed lead runs,
|
|
153
|
+
* mint a lead token, and write the 0600 patch.
|
|
154
|
+
*
|
|
155
|
+
* @param {{ ctmSessionId: string, routeAlias?: string|null, model?: string|null, deps?: object }} opts
|
|
156
|
+
* @returns {Promise<{ok:true, patchPath:string|null, env:object, token:string|null, alias:string, model:string|null, ownKey?:boolean}
|
|
157
|
+
* | {ok:false, reason:string, detail?:string}>}
|
|
158
|
+
*/
|
|
159
|
+
async function prepareDshRoute({ ctmSessionId, routeAlias = null, model = null, deps = null } = {}) {
|
|
160
|
+
if (typeof ctmSessionId !== 'string' || !ctmSessionId) {
|
|
161
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: 'ctmSessionId is required' };
|
|
162
|
+
}
|
|
163
|
+
// Explicit opt-out: dsh keeps its own provider and CTM mints nothing (no patch, no token).
|
|
164
|
+
if (routeAlias === DSH_OWN_KEY_ALIAS) {
|
|
165
|
+
return { ok: true, ownKey: true, patchPath: null, env: {}, token: null, alias: DSH_OWN_KEY_ALIAS, model: model || null };
|
|
166
|
+
}
|
|
167
|
+
const d = deps || {};
|
|
168
|
+
// `readiness` is resolved through a thunk exactly as server.js hands it to a routed lead
|
|
169
|
+
// (server.js `readiness: () => …getLeadRouteReadiness()`): the singleton is created at boot by
|
|
170
|
+
// delegate-worker.configure, so reading it here — per create — is what keeps it from being null.
|
|
171
|
+
const readiness = typeof d.readiness === 'function' ? d.readiness() : d.readiness;
|
|
172
|
+
if (typeof d.listRoutes !== 'function' || !d.supervisor || !readiness || typeof d.getDataDir !== 'function') {
|
|
173
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: 'routed dsh dependencies are not configured' };
|
|
174
|
+
}
|
|
175
|
+
let routes;
|
|
176
|
+
try {
|
|
177
|
+
routes = await d.listRoutes();
|
|
178
|
+
} catch (error) {
|
|
179
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: `route feed failed: ${_message(error)}` };
|
|
180
|
+
}
|
|
181
|
+
const selected = selectDshRoute(routes, routeAlias);
|
|
182
|
+
if (!selected.ok) return selected;
|
|
183
|
+
const row = selected.row;
|
|
184
|
+
const deployments = anthropicDeployments(row);
|
|
185
|
+
const deployment = pickDeployment(deployments, model);
|
|
186
|
+
if (!deployment) {
|
|
187
|
+
return { ok: false, reason: 'dsh_model_unavailable', detail: `route "${row.id}" does not serve model "${model}" on ${ANTHROPIC_MESSAGES_API}` };
|
|
188
|
+
}
|
|
189
|
+
const factsRevision = deployment.factsRevision;
|
|
190
|
+
if (typeof factsRevision !== 'string' || !FACTS_REVISION_RE.test(factsRevision)) {
|
|
191
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: `route "${row.id}" has no model facts revision for "${deployment.wireModelId}"` };
|
|
192
|
+
}
|
|
193
|
+
// The patch is single-quoted YAML: an id outside the deployment grammar (quote, newline, whitespace)
|
|
194
|
+
// could break out of it, so it is refused rather than escaped.
|
|
195
|
+
const patchModels = deployments.map(describeModel);
|
|
196
|
+
if (!SAFE_YAML_ID_RE.test(row.id) || !SAFE_YAML_ID_RE.test(deployment.wireModelId)
|
|
197
|
+
|| patchModels.some((entry) => !SAFE_YAML_ID_RE.test(entry.id))) {
|
|
198
|
+
return { ok: false, reason: 'dsh_route_unavailable', detail: `route "${row.id}" carries an identifier the patch cannot express` };
|
|
199
|
+
}
|
|
200
|
+
const proxyPort = typeof d.proxyPort === 'function' ? d.proxyPort() : d.proxyPort;
|
|
201
|
+
if (!Number.isSafeInteger(proxyPort) || proxyPort <= 0) {
|
|
202
|
+
return { ok: false, reason: 'proxy_unhealthy', detail: 'the model proxy port is unknown' };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// F-5 order, exactly as a routed lead runs it: health -> route push -> upstream probe, all inside
|
|
206
|
+
// the same budget. A readiness failure is a REFUSAL (D-12), never a silent downgrade to dsh's own key.
|
|
207
|
+
const supervisor = d.supervisor;
|
|
208
|
+
if (typeof supervisor.isRunning === 'function' && !supervisor.isRunning()) {
|
|
209
|
+
const started = supervisor.start();
|
|
210
|
+
if (started && started.ok === false) {
|
|
211
|
+
return { ok: false, reason: 'proxy_unhealthy', detail: `could not start oauth-proxy: ${started && started.error}` };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const startedAt = Date.now();
|
|
215
|
+
const remaining = () => READINESS_BUDGET_MS - (Date.now() - startedAt);
|
|
216
|
+
const baseUrl = String(row.base_url || row.baseUrl || '');
|
|
217
|
+
try {
|
|
218
|
+
await readiness.waitForProxyHealth(remaining());
|
|
219
|
+
await readiness.pushRoutesIfNeeded(row.id);
|
|
220
|
+
} catch (error) {
|
|
221
|
+
return { ok: false, reason: 'proxy_unhealthy', detail: _message(error) };
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
await readiness.probeUpstream({ alias: row.id, baseUrl, budgetMs: Math.max(0, remaining()) });
|
|
225
|
+
} catch (error) {
|
|
226
|
+
return { ok: false, reason: 'probe_failed', detail: _message(error) };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
let registration;
|
|
230
|
+
try {
|
|
231
|
+
registration = await supervisor.registerLeadToken({
|
|
232
|
+
ctmSessionId,
|
|
233
|
+
purpose: 'routed-primary',
|
|
234
|
+
delegateScope: true,
|
|
235
|
+
aliases: [row.id],
|
|
236
|
+
bindings: [{
|
|
237
|
+
alias: row.id,
|
|
238
|
+
wireModelId: deployment.wireModelId,
|
|
239
|
+
harness: DSH_HARNESS,
|
|
240
|
+
metadataRevision: factsRevision,
|
|
241
|
+
}],
|
|
242
|
+
processGeneration: DSH_ROUTE_PROCESS_GENERATION,
|
|
243
|
+
harness: DSH_HARNESS,
|
|
244
|
+
// WP-9 §9b L-2 (D-19): the mark that makes the proxy append one per-request usage row to
|
|
245
|
+
// <dataDir>/dsh-usage/<ctmSessionId>.jsonl for this session. ACP has no token counts on the wire,
|
|
246
|
+
// so this token IS the ledger's only source for dsh spend; every other lead registration omits it.
|
|
247
|
+
usageLog: 'dsh',
|
|
248
|
+
});
|
|
249
|
+
} catch (error) {
|
|
250
|
+
/* REPORT: registration refused by the supervisor's own validator; only its message is surfaced. */
|
|
251
|
+
return { ok: false, reason: 'token_failed', detail: _message(error) };
|
|
252
|
+
}
|
|
253
|
+
if (!registration || registration.ok !== true || typeof registration.token !== 'string') {
|
|
254
|
+
return { ok: false, reason: 'token_failed', detail: (registration && registration.reason) || 'registerLeadToken failed' };
|
|
255
|
+
}
|
|
256
|
+
const token = registration.token;
|
|
257
|
+
const patchPath = dshPatchPath(ctmSessionId, d.getDataDir());
|
|
258
|
+
const content = renderPatch({
|
|
259
|
+
alias: row.id,
|
|
260
|
+
model: deployment.wireModelId,
|
|
261
|
+
models: patchModels,
|
|
262
|
+
proxyPort,
|
|
263
|
+
});
|
|
264
|
+
try {
|
|
265
|
+
await writePatchFile(patchPath, content);
|
|
266
|
+
} catch (error) {
|
|
267
|
+
// A token with no child to use it is a leak: revoke before reporting the failure.
|
|
268
|
+
await releaseDshRoute({ ctmSessionId, token, deps: d });
|
|
269
|
+
return { ok: false, reason: 'patch_write_failed', detail: _message(error) };
|
|
270
|
+
}
|
|
271
|
+
return { ok: true, patchPath, env: { ANTHROPIC_AUTH_TOKEN: token }, token, alias: row.id, model: deployment.wireModelId };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Revoke a routed dsh token. Idempotent, never throws, and NEVER unlinks the patch file (it holds no
|
|
276
|
+
* secret — it is evidence of what the child was told).
|
|
277
|
+
* @param {{ ctmSessionId: string, token: string|null, deps?: object }} opts
|
|
278
|
+
* @returns {Promise<{ok:boolean, revoked:boolean, reason?:string}>}
|
|
279
|
+
*/
|
|
280
|
+
async function releaseDshRoute({ ctmSessionId, token, deps = null } = {}) {
|
|
281
|
+
void ctmSessionId;
|
|
282
|
+
if (typeof token !== 'string' || !token) return { ok: true, revoked: false };
|
|
283
|
+
const supervisor = deps && deps.supervisor;
|
|
284
|
+
if (!supervisor || typeof supervisor.revokeLeadToken !== 'function') {
|
|
285
|
+
return { ok: false, revoked: false, reason: 'release_unconfigured' };
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const result = await supervisor.revokeLeadToken(token);
|
|
289
|
+
return { ok: !(result === false || (result && result.ok === false)), revoked: true };
|
|
290
|
+
} catch (error) {
|
|
291
|
+
/* REPORT: the supervisor keeps a pending revoke obligation of its own; nothing is thrown here. */
|
|
292
|
+
return { ok: false, revoked: true, reason: _message(error) };
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
module.exports = {
|
|
297
|
+
DSH_HARNESS,
|
|
298
|
+
DSH_OWN_KEY_ALIAS,
|
|
299
|
+
DSH_ROUTE_PROCESS_GENERATION,
|
|
300
|
+
dshPatchPath,
|
|
301
|
+
selectDshRoute,
|
|
302
|
+
describeModel,
|
|
303
|
+
renderPatch,
|
|
304
|
+
prepareDshRoute,
|
|
305
|
+
releaseDshRoute,
|
|
306
|
+
servesAnthropicMessages,
|
|
307
|
+
anthropicDeployments,
|
|
308
|
+
};
|