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,383 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ACP v1 client (Agent Client Protocol, JSON-RPC 2.0 over an ND-JSON stdio transport).
|
|
4
|
+
//
|
|
5
|
+
// WP-1 of docs/deepseek-harness-acp-agent-2026-10-28.html (§6.2, decisions D-5, D-6, D-7).
|
|
6
|
+
// It is deliberately hand-written and CommonJS: @agentclientprotocol/sdk is ESM-only,
|
|
7
|
+
// removed its client class in v2.0.0 and CTM needs eight methods (D-6 in the decision
|
|
8
|
+
// table). The client owns id correlation, timeouts, the server-request door
|
|
9
|
+
// (session/request_permission) and the capability gate; it renders nothing and knows
|
|
10
|
+
// nothing about transcripts, sessions or the server — WP-2..WP-5 wire those in.
|
|
11
|
+
//
|
|
12
|
+
// UNWIRED: no non-test module requires this file yet (AC-1c).
|
|
13
|
+
//
|
|
14
|
+
// Wire rules:
|
|
15
|
+
// * every outgoing message carries jsonrpc:'2.0';
|
|
16
|
+
// * request ids are a per-client monotonically increasing integer starting at 1;
|
|
17
|
+
// * an unparsable line is logged (truncated to 200 chars) and dropped — never fatal;
|
|
18
|
+
// * every server request is answered exactly once (P-4), including on cancel/dispose;
|
|
19
|
+
// * session/prompt has no client timeout — it settles when the turn settles.
|
|
20
|
+
|
|
21
|
+
const ACP_PROTOCOL_VERSION = 1;
|
|
22
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
|
|
23
|
+
const MAX_LOGGED_LINE_CHARS = 200;
|
|
24
|
+
|
|
25
|
+
/** An ACP-layer failure. `code` is the stable machine token, `data` the structured detail. */
|
|
26
|
+
class AcpError extends Error {
|
|
27
|
+
constructor(code, data) {
|
|
28
|
+
// The message always names the machine code; the first human-readable field of `data`
|
|
29
|
+
// (upstream message, RPC method, or the reason) is appended so a bare log line still
|
|
30
|
+
// says which method timed out and why a handshake was refused.
|
|
31
|
+
const detail = ['message', 'method', 'reason']
|
|
32
|
+
.map((key) => (data && typeof data[key] === 'string' ? data[key] : ''))
|
|
33
|
+
.find((value) => value !== '');
|
|
34
|
+
super(detail ? `${code}: ${detail}` : code);
|
|
35
|
+
this.name = 'AcpError';
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.data = data;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {object} opts
|
|
43
|
+
* @param {{write, onLine, onExit}} opts.transport
|
|
44
|
+
* @param {(sessionId: string, update: object) => void} [opts.onSessionUpdate]
|
|
45
|
+
* @param {(params: {sessionId: string, toolCall: object, options: object[]}) =>
|
|
46
|
+
* Promise<{outcome: 'selected', optionId: string} | {outcome: 'cancelled'}>} [opts.onRequestPermission]
|
|
47
|
+
* @param {(entry: {level: 'warn'|'info', msg: string}) => void} [opts.log] // default no-op
|
|
48
|
+
* @param {number} [opts.requestTimeoutMs=DEFAULT_REQUEST_TIMEOUT_MS]
|
|
49
|
+
* @param {{name: string, version: string}} [opts.clientInfo={name:'ctm', version:'1'}]
|
|
50
|
+
*/
|
|
51
|
+
function createAcpClient(opts = {}) {
|
|
52
|
+
const {
|
|
53
|
+
transport,
|
|
54
|
+
onSessionUpdate = () => {},
|
|
55
|
+
onRequestPermission = async () => ({ outcome: 'cancelled' }),
|
|
56
|
+
log = () => {},
|
|
57
|
+
requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS,
|
|
58
|
+
clientInfo = { name: 'ctm', version: '1' },
|
|
59
|
+
} = opts;
|
|
60
|
+
if (!transport) throw new Error('createAcpClient: transport required');
|
|
61
|
+
|
|
62
|
+
let nextId = 1;
|
|
63
|
+
let disposedError = null;
|
|
64
|
+
let lastInitializeResult = null;
|
|
65
|
+
const pending = new Map(); // id → { method, resolve, reject, timer, settled }
|
|
66
|
+
const permissions = new Map(); // id → { id, sessionId, answered }
|
|
67
|
+
const permissionsBySession = new Map(); // sessionId → Set<id>
|
|
68
|
+
|
|
69
|
+
const send = (obj) => transport.write(JSON.stringify(obj));
|
|
70
|
+
|
|
71
|
+
function truncate(line) {
|
|
72
|
+
return line.length > MAX_LOGGED_LINE_CHARS ? line.slice(0, MAX_LOGGED_LINE_CHARS) : line;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function request(method, params, timeoutOverride) {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
if (disposedError) {
|
|
78
|
+
reject(disposedError);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const id = nextId++;
|
|
82
|
+
const entry = { method, resolve, reject, timer: null, settled: false };
|
|
83
|
+
pending.set(id, entry);
|
|
84
|
+
const timeoutMs = timeoutOverride === undefined ? requestTimeoutMs : timeoutOverride;
|
|
85
|
+
if (typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) && timeoutMs >= 0) {
|
|
86
|
+
entry.timer = setTimeout(() => {
|
|
87
|
+
if (entry.settled) return;
|
|
88
|
+
entry.settled = true;
|
|
89
|
+
pending.delete(id);
|
|
90
|
+
reject(new AcpError('acp_request_timeout', { method }));
|
|
91
|
+
}, timeoutMs);
|
|
92
|
+
}
|
|
93
|
+
send({ jsonrpc: '2.0', id, method, params: params || {} });
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function notify(method, params) {
|
|
98
|
+
send({ jsonrpc: '2.0', method, params: params || {} });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function settleResponse(id, msg) {
|
|
102
|
+
const entry = pending.get(id);
|
|
103
|
+
if (!entry) {
|
|
104
|
+
// Late (already timed out) or unknown — dropped, never fatal (D-5).
|
|
105
|
+
log({ level: 'warn', msg: `acp-client: dropped response for unknown or settled id ${id}` });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
pending.delete(id);
|
|
109
|
+
entry.settled = true;
|
|
110
|
+
if (entry.timer) {
|
|
111
|
+
clearTimeout(entry.timer);
|
|
112
|
+
entry.timer = null;
|
|
113
|
+
}
|
|
114
|
+
if (msg.error != null) {
|
|
115
|
+
entry.reject(new AcpError('acp_rpc_error', {
|
|
116
|
+
rpcCode: msg.error.code,
|
|
117
|
+
message: msg.error.message,
|
|
118
|
+
method: entry.method,
|
|
119
|
+
}));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
entry.resolve(msg.result);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// --- permissions (D-7, P-4) -------------------------------------------------
|
|
126
|
+
|
|
127
|
+
// The record handed in is the same object the handler's late resolution closes over, so
|
|
128
|
+
// "answered exactly once" is decided by one shared flag (P-4).
|
|
129
|
+
function trackPermission(record) {
|
|
130
|
+
permissions.set(record.id, record);
|
|
131
|
+
let ids = permissionsBySession.get(record.sessionId);
|
|
132
|
+
if (!ids) {
|
|
133
|
+
ids = new Set();
|
|
134
|
+
permissionsBySession.set(record.sessionId, ids);
|
|
135
|
+
}
|
|
136
|
+
ids.add(record.id);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function releasePermission(record) {
|
|
140
|
+
permissions.delete(record.id);
|
|
141
|
+
const ids = permissionsBySession.get(record.sessionId);
|
|
142
|
+
if (ids) {
|
|
143
|
+
ids.delete(record.id);
|
|
144
|
+
if (ids.size === 0) permissionsBySession.delete(record.sessionId);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// The returned object is {outcome:'selected', optionId} or {outcome:'cancelled'}.
|
|
149
|
+
function normaliseOutcome(outcome) {
|
|
150
|
+
if (outcome && typeof outcome === 'object' && typeof outcome.outcome === 'string') return outcome;
|
|
151
|
+
return { outcome: 'cancelled' };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function answerPermission(record, outcome) {
|
|
155
|
+
if (record.answered) return false;
|
|
156
|
+
record.answered = true;
|
|
157
|
+
releasePermission(record);
|
|
158
|
+
send({ jsonrpc: '2.0', id: record.id, result: { outcome } });
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function handlePermissionRequest(msg) {
|
|
163
|
+
const params = msg.params || {};
|
|
164
|
+
const sessionId = params.sessionId;
|
|
165
|
+
const record = { id: msg.id, sessionId, answered: false };
|
|
166
|
+
trackPermission(record);
|
|
167
|
+
const answer = (outcome) => answerPermission(record, normaliseOutcome(outcome));
|
|
168
|
+
let result;
|
|
169
|
+
try {
|
|
170
|
+
result = onRequestPermission({
|
|
171
|
+
sessionId,
|
|
172
|
+
toolCall: params.toolCall,
|
|
173
|
+
options: params.options,
|
|
174
|
+
});
|
|
175
|
+
} catch (error) {
|
|
176
|
+
log({ level: 'warn', msg: `acp-client: permission handler threw (${error && error.message})` });
|
|
177
|
+
answer({ outcome: 'cancelled' });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
Promise.resolve(result).then(
|
|
181
|
+
(outcome) => { answer(outcome); },
|
|
182
|
+
(error) => {
|
|
183
|
+
if (record.answered) return;
|
|
184
|
+
log({ level: 'warn', msg: `acp-client: permission handler rejected (${error && error.message})` });
|
|
185
|
+
answer({ outcome: 'cancelled' });
|
|
186
|
+
},
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Settles every pending permission for one session as 'cancelled'. Returns the count.
|
|
191
|
+
function cancelSessionPermissions(sessionId) {
|
|
192
|
+
const ids = permissionsBySession.get(sessionId);
|
|
193
|
+
if (!ids) return 0;
|
|
194
|
+
let settled = 0;
|
|
195
|
+
for (const id of [...ids]) {
|
|
196
|
+
const record = permissions.get(id);
|
|
197
|
+
if (record && answerPermission(record, { outcome: 'cancelled' })) settled += 1;
|
|
198
|
+
}
|
|
199
|
+
return settled;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function disposeInternal(error) {
|
|
203
|
+
if (disposedError) return;
|
|
204
|
+
// P-4: every server request is answered exactly once, including on cancel/dispose.
|
|
205
|
+
for (const record of [...permissions.values()]) {
|
|
206
|
+
answerPermission(record, { outcome: 'cancelled' });
|
|
207
|
+
}
|
|
208
|
+
disposedError = error;
|
|
209
|
+
for (const [id, entry] of [...pending]) {
|
|
210
|
+
if (entry.timer) {
|
|
211
|
+
clearTimeout(entry.timer);
|
|
212
|
+
entry.timer = null;
|
|
213
|
+
}
|
|
214
|
+
entry.settled = true;
|
|
215
|
+
pending.delete(id);
|
|
216
|
+
entry.reject(error);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// --- inbound line classification (D-5/D-6/D-7) -------------------------------
|
|
221
|
+
|
|
222
|
+
function handleServerRequest(msg) {
|
|
223
|
+
if (msg.method === 'session/request_permission') {
|
|
224
|
+
handlePermissionRequest(msg);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
send({ jsonrpc: '2.0', id: msg.id, error: { code: -32601, message: 'Method not found' } });
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function handleNotification(msg) {
|
|
231
|
+
if (msg.method === 'session/update') {
|
|
232
|
+
const params = msg.params || {};
|
|
233
|
+
try {
|
|
234
|
+
onSessionUpdate(params.sessionId, params.update);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
// A throwing observer must not break the read loop (updates stay in arrival order).
|
|
237
|
+
log({ level: 'warn', msg: `acp-client: onSessionUpdate threw (${error && error.message})` });
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
log({ level: 'info', msg: `acp-client: unhandled notification ${msg.method}` });
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function handleLine(line) {
|
|
245
|
+
if (disposedError) return;
|
|
246
|
+
let msg;
|
|
247
|
+
try {
|
|
248
|
+
msg = JSON.parse(line);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
log({ level: 'warn', msg: `acp-client: unparsable line (${line.length} chars): ${truncate(line)}` });
|
|
251
|
+
void error;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (!msg || typeof msg !== 'object' || Array.isArray(msg)) {
|
|
255
|
+
log({ level: 'warn', msg: `acp-client: non-object message dropped: ${truncate(line)}` });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
// 1) a response to one of OUR requests — id != null, never truthiness (id 0 is legal).
|
|
259
|
+
if (msg.id != null && (Object.prototype.hasOwnProperty.call(msg, 'result') || msg.error != null)) {
|
|
260
|
+
settleResponse(msg.id, msg);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
// 2) a SERVER-initiated request — approvals live here.
|
|
264
|
+
if (msg.id != null && typeof msg.method === 'string') {
|
|
265
|
+
handleServerRequest(msg);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// 3) a notification (method, no id).
|
|
269
|
+
if (typeof msg.method === 'string') {
|
|
270
|
+
handleNotification(msg);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
log({ level: 'warn', msg: `acp-client: unrecognised message dropped: ${truncate(line)}` });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
transport.onLine(handleLine);
|
|
277
|
+
if (typeof transport.onExit === 'function') {
|
|
278
|
+
transport.onExit((info) => {
|
|
279
|
+
disposeInternal(new AcpError('acp_child_exited', {
|
|
280
|
+
exitCode: info && info.code !== undefined ? info.code : null,
|
|
281
|
+
signal: info && info.signal !== undefined ? info.signal : null,
|
|
282
|
+
}));
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// --- capability gate (D-6) ---------------------------------------------------
|
|
287
|
+
|
|
288
|
+
function incompatibilityReason(result) {
|
|
289
|
+
if (!result || typeof result !== 'object') return 'initialize returned no result';
|
|
290
|
+
if (result.protocolVersion !== ACP_PROTOCOL_VERSION) {
|
|
291
|
+
return `protocolVersion ${JSON.stringify(result.protocolVersion)} is not ${ACP_PROTOCOL_VERSION}`;
|
|
292
|
+
}
|
|
293
|
+
if (!result.agentCapabilities || !result.agentCapabilities.sessionCapabilities
|
|
294
|
+
|| !result.agentCapabilities.sessionCapabilities.resume) {
|
|
295
|
+
return 'agentCapabilities.sessionCapabilities.resume is missing';
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async function initialize() {
|
|
301
|
+
const result = await request('initialize', {
|
|
302
|
+
protocolVersion: ACP_PROTOCOL_VERSION,
|
|
303
|
+
clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
|
|
304
|
+
clientInfo,
|
|
305
|
+
});
|
|
306
|
+
const reason = incompatibilityReason(result);
|
|
307
|
+
if (reason) throw new AcpError('dsh_acp_incompatible', { reason });
|
|
308
|
+
lastInitializeResult = result;
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async function newSession({ cwd, mcpServers = [] } = {}) {
|
|
313
|
+
return request('session/new', { cwd, mcpServers });
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async function resumeSession({ sessionId, cwd, mcpServers = [] } = {}) {
|
|
317
|
+
return request('session/resume', { sessionId, cwd, mcpServers });
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
async function listSessions({ cwd } = {}) {
|
|
321
|
+
return request('session/list', { cwd });
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// session/prompt carries no client timeout: it settles when the turn settles.
|
|
325
|
+
async function prompt({ sessionId, text, blocks } = {}) {
|
|
326
|
+
const promptBlocks = Array.isArray(blocks) ? blocks : [{ type: 'text', text }];
|
|
327
|
+
try {
|
|
328
|
+
return await request('session/prompt', { sessionId, prompt: promptBlocks }, null);
|
|
329
|
+
} catch (error) {
|
|
330
|
+
if (error instanceof AcpError && error.code === 'acp_rpc_error') {
|
|
331
|
+
throw new AcpError('acp_turn_failed', {
|
|
332
|
+
rpcCode: error.data && error.data.rpcCode,
|
|
333
|
+
message: error.data && error.data.message,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// A notification; also settles this session's pending permissions 'cancelled' (P-4).
|
|
341
|
+
// Returns how many permissions it answered. Throws once the client is disposed.
|
|
342
|
+
function cancel({ sessionId } = {}) {
|
|
343
|
+
if (disposedError) throw disposedError;
|
|
344
|
+
notify('session/cancel', { sessionId });
|
|
345
|
+
return cancelSessionPermissions(sessionId);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
async function closeSession({ sessionId } = {}) {
|
|
349
|
+
return request('session/close', { sessionId });
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
async function setConfigOption({ sessionId, configId, value } = {}) {
|
|
353
|
+
return request('session/set_config_option', { sessionId, configId, value });
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function capabilities() {
|
|
357
|
+
return lastInitializeResult;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function dispose(reason) {
|
|
361
|
+
disposeInternal(new AcpError('acp_disposed', { reason }));
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return {
|
|
365
|
+
initialize,
|
|
366
|
+
newSession,
|
|
367
|
+
resumeSession,
|
|
368
|
+
listSessions,
|
|
369
|
+
prompt,
|
|
370
|
+
cancel,
|
|
371
|
+
closeSession,
|
|
372
|
+
setConfigOption,
|
|
373
|
+
capabilities,
|
|
374
|
+
dispose,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
module.exports = {
|
|
379
|
+
createAcpClient,
|
|
380
|
+
AcpError,
|
|
381
|
+
ACP_PROTOCOL_VERSION,
|
|
382
|
+
DEFAULT_REQUEST_TIMEOUT_MS,
|
|
383
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// WP-9 step 1 — the DeepSeek Harness context chip (design
|
|
4
|
+
// docs/deepseek-harness-acp-agent-2026-10-28.html §9b C-1/C-2, §5 D-18, T-19).
|
|
5
|
+
//
|
|
6
|
+
// A dsh session's ACP child emits one `session/update` per model response carrying
|
|
7
|
+
// `{ sessionUpdate: 'usage_update', used, size }` — the tokens currently in the model's context and the
|
|
8
|
+
// context window (see tests/fixtures/acp/dsh-0.2.1-rc.2-turn.jsonl). Nothing in CTM read them, so a dsh
|
|
9
|
+
// tab's context chip stayed empty.
|
|
10
|
+
//
|
|
11
|
+
// This module turns each one into runtime context truth over the SAME durable channel a WALL-E coding
|
|
12
|
+
// session uses (`_recordWalleUsageSnapshotRuntimeTruth`, server.js) — and keeps the chip's badge value on
|
|
13
|
+
// the session, so the request-safe (lightweight) broadcast can serve it with no DB read, no transcript
|
|
14
|
+
// append and no reload. Rules, mirroring that precedent:
|
|
15
|
+
// * only `sessionUpdate === 'usage_update'` is considered;
|
|
16
|
+
// * `used`/`size` must be non-negative integers, and `used <= 0` is ignored — a 0/0 row must never
|
|
17
|
+
// stamp over a good prior value;
|
|
18
|
+
// * an identical repeat for the same session writes nothing (per-session signature);
|
|
19
|
+
// * ACP carries NO cumulative per-request token count, so `totalTokens` is omitted rather than
|
|
20
|
+
// invented (`buildRuntimeTokenUsagePayload` resolves a missing total to 0 — the honest "unknown"
|
|
21
|
+
// for a harness whose wire has context occupancy only) and no cost is ever recorded;
|
|
22
|
+
// * a recording failure is REPORTED via `recordDiagnostic` and never thrown into the ACP read loop.
|
|
23
|
+
// * no session_tokens write: db.updateSessionTokens drops an exact write with no cumulative total
|
|
24
|
+
// (db.js exact/zero-total guard), and ACP has none — the chip reads runtime truth instead.
|
|
25
|
+
|
|
26
|
+
const { formatTokens } = require('../session-token-usage');
|
|
27
|
+
|
|
28
|
+
// The `source` stamped on every runtime-truth row this module writes (D-18).
|
|
29
|
+
const DSH_CONTEXT_SOURCE = 'dsh-usage-update';
|
|
30
|
+
|
|
31
|
+
function _nonNegativeInt(value) {
|
|
32
|
+
const n = Number(value);
|
|
33
|
+
if (!Number.isFinite(n) || n < 0) return null;
|
|
34
|
+
return Math.round(n);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function _message(error) {
|
|
38
|
+
return error && error.message ? String(error.message) : String(error || '');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The badge the chip renders for a dsh session, derived ONLY from what the harness reported.
|
|
43
|
+
*
|
|
44
|
+
* Field names follow lib/runtime-context-truth.js's public token summary (`ctx`/`window`/`ctxWindow`/
|
|
45
|
+
* `label`/`ctxPct`/...) so the client chip reads it exactly like a provider-transcript summary or a
|
|
46
|
+
* runtime-truth row — no client change is needed (D-18 "no chip code changes").
|
|
47
|
+
*
|
|
48
|
+
* @param {{contextTokens?: number, contextWindow?: number, model?: string, createdAtMs?: number}} input
|
|
49
|
+
* @returns {object}
|
|
50
|
+
*/
|
|
51
|
+
function buildDshContextBadge(input = {}) {
|
|
52
|
+
const ctx = Math.max(0, Math.round(Number(input.contextTokens) || 0));
|
|
53
|
+
const window = Math.max(0, Math.round(Number(input.contextWindow) || 0));
|
|
54
|
+
const ctxPct = window > 0 ? Math.round((Math.min(ctx, window) / window) * 100) : null;
|
|
55
|
+
return {
|
|
56
|
+
// ACP has no per-request cumulative count: total stays an explicit 0, never a fabricated sum.
|
|
57
|
+
total: 0,
|
|
58
|
+
cumulativeTotal: 0,
|
|
59
|
+
cumulativeLabel: formatTokens(0),
|
|
60
|
+
totalLabel: formatTokens(0),
|
|
61
|
+
label: formatTokens(ctx),
|
|
62
|
+
contextLabel: formatTokens(ctx),
|
|
63
|
+
ctx,
|
|
64
|
+
contextTokens: ctx,
|
|
65
|
+
window,
|
|
66
|
+
ctxWindow: window,
|
|
67
|
+
ctxPct,
|
|
68
|
+
pctLeftNative: ctxPct == null ? null : Math.max(0, 100 - ctxPct),
|
|
69
|
+
exact: true,
|
|
70
|
+
headline: 'context',
|
|
71
|
+
fidelity: 'native',
|
|
72
|
+
suppressPct: false,
|
|
73
|
+
windowSource: 'acp-usage-update',
|
|
74
|
+
source: DSH_CONTEXT_SOURCE,
|
|
75
|
+
provider: 'dsh',
|
|
76
|
+
model: String(input.model || ''),
|
|
77
|
+
compacted: false,
|
|
78
|
+
created_at_ms: Math.max(0, Number(input.createdAtMs) || 0),
|
|
79
|
+
diagnostics: { runtimeTruth: true, truthSource: DSH_CONTEXT_SOURCE },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @param {object} deps
|
|
85
|
+
* @param {(db: object, input: object) => object|null} [deps.recordRuntimeTokenUsage] // lib/runtime-context-truth.js
|
|
86
|
+
* @param {object} [deps.db] // the owner db client the record is written through
|
|
87
|
+
* @param {(sessionId: string, event: string, details?: object) => void} [deps.recordDiagnostic]
|
|
88
|
+
* @param {() => number} [deps.now]
|
|
89
|
+
* @returns {{onUsageUpdate: (session: object, update: object) => object|null, badgeForSession: (session: object) => object|null}}
|
|
90
|
+
*/
|
|
91
|
+
function createDshContextTruth(deps = {}) {
|
|
92
|
+
const recordRuntimeTokenUsage = typeof deps.recordRuntimeTokenUsage === 'function' ? deps.recordRuntimeTokenUsage : null;
|
|
93
|
+
const db = deps.db || null;
|
|
94
|
+
const recordDiagnostic = typeof deps.recordDiagnostic === 'function' ? deps.recordDiagnostic : () => {};
|
|
95
|
+
const now = typeof deps.now === 'function' ? deps.now : () => Date.now();
|
|
96
|
+
|
|
97
|
+
// REPORT (never throw): a failed truth write must not break the ACP read loop.
|
|
98
|
+
function _report(session, error) {
|
|
99
|
+
if (!session || !session.id) return;
|
|
100
|
+
try {
|
|
101
|
+
recordDiagnostic(session.id, 'dsh-usage-runtime-truth-record-failed', { error: _message(error) });
|
|
102
|
+
} catch { /* expected: a diagnostic sink that throws is not this caller's problem */ } // HANDLE: the failure is already reported elsewhere; never re-enter the sink
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Record one `usage_update` as runtime context truth and remember the chip badge on the session.
|
|
107
|
+
* Returns the badge when the update was accepted, `null` when it was ignored (not a usage update, a
|
|
108
|
+
* 0/0 snapshot, or an identical repeat). Never throws.
|
|
109
|
+
*/
|
|
110
|
+
function onUsageUpdate(session, update) {
|
|
111
|
+
try {
|
|
112
|
+
if (!session || typeof session !== 'object' || !session.id) return null;
|
|
113
|
+
if (!update || typeof update !== 'object' || update.sessionUpdate !== 'usage_update') return null;
|
|
114
|
+
const contextTokens = _nonNegativeInt(update.used);
|
|
115
|
+
// The 0/0 guard (mirrors _recordWalleUsageSnapshotRuntimeTruth): a snapshot with no tokens in
|
|
116
|
+
// context would otherwise stamp a bogus "exact" row over a good prior value.
|
|
117
|
+
if (contextTokens == null || contextTokens <= 0) return null;
|
|
118
|
+
const windowHint = _nonNegativeInt(update.size);
|
|
119
|
+
const contextWindow = windowHint == null ? 0 : windowHint;
|
|
120
|
+
const model = String(session.model_id || session.model || '');
|
|
121
|
+
// Per-session signature: an identical repeat (same used/size/model) writes nothing at all.
|
|
122
|
+
const signature = [contextTokens, contextWindow, model].join(':');
|
|
123
|
+
if (session._dshUsageUpdateSig === signature) return null;
|
|
124
|
+
session._dshUsageUpdateSig = signature;
|
|
125
|
+
const createdAtMs = Math.max(0, Number(now()) || 0);
|
|
126
|
+
const badge = buildDshContextBadge({ contextTokens, contextWindow, model, createdAtMs });
|
|
127
|
+
session._dshContextBadge = badge;
|
|
128
|
+
const agentSessionId = String(
|
|
129
|
+
session.agentSessionId || session.chatSessionId || session._claudeSessionId || ''
|
|
130
|
+
);
|
|
131
|
+
if (recordRuntimeTokenUsage && db) {
|
|
132
|
+
try {
|
|
133
|
+
recordRuntimeTokenUsage(db, {
|
|
134
|
+
ctmSessionId: session.id,
|
|
135
|
+
agentSessionId,
|
|
136
|
+
adapter: 'dsh',
|
|
137
|
+
provider: 'dsh',
|
|
138
|
+
model: model || null,
|
|
139
|
+
// No totalTokens/cumulativeTotal: ACP's usage_update carries context occupancy only, so the
|
|
140
|
+
// honest cumulative value is "unknown", not a guessed sum. No cost field either (D-18).
|
|
141
|
+
contextTokens,
|
|
142
|
+
contextWindow,
|
|
143
|
+
exact: true,
|
|
144
|
+
source: DSH_CONTEXT_SOURCE,
|
|
145
|
+
createdAtMs,
|
|
146
|
+
idempotencyKey: `${DSH_CONTEXT_SOURCE}:${session.id}:${signature}`,
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
_report(session, error);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return badge;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
_report(session, error);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// The chip's read seam for a dsh session: what the harness last told us, held in memory. The server's
|
|
160
|
+
// request-safe (lightweight) broadcast serves this FIRST — it is written the moment the ACP
|
|
161
|
+
// notification arrives, so it is always at least as fresh as the runtime truth the heartbeat batch
|
|
162
|
+
// primes — which is what makes a usage_update visible on the next debounced broadcast, with no DB
|
|
163
|
+
// read, no transcript append and no reload.
|
|
164
|
+
function badgeForSession(session) {
|
|
165
|
+
const badge = session && session._dshContextBadge;
|
|
166
|
+
return badge && typeof badge === 'object' ? badge : null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return { onUsageUpdate, badgeForSession };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
module.exports = {
|
|
173
|
+
DSH_CONTEXT_SOURCE,
|
|
174
|
+
buildDshContextBadge,
|
|
175
|
+
createDshContextTruth,
|
|
176
|
+
};
|