create-walle 0.10.1 → 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 +7 -1
- package/lib/owner-write-safety.js +135 -0
- package/lib/public-runtime.js +13 -5
- package/lib/release-schema.json +3 -2
- package/lib/runtime-closure-policy.json +11 -8
- package/package.json +1 -1
- package/template/bin/deps-doctor.js +1 -1
- package/template/bin/node-bin.sh +11 -0
- package/template/coding-task-manager/api-prompts.js +55 -29
- package/template/coding-task-manager/bin/claude-hook.js +62 -4
- package/template/coding-task-manager/bin/claude-table-parity.js +307 -0
- package/template/coding-task-manager/bin/conversation-storage-auto-migration-lib.js +16 -1
- package/template/coding-task-manager/bin/conversation-storage-generation-evidence.js +9 -2
- package/template/coding-task-manager/bin/conversation-storage-service-entry-lib.js +16 -1
- package/template/coding-task-manager/bin/conversation-storage-walle-owner.js +247 -0
- package/template/coding-task-manager/bin/ctm-machine-pair.js +160 -0
- 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/lead-wait-census.js +1348 -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/bin/repair-foreign-clone.js +564 -0
- package/template/coding-task-manager/bin/repair-resume-echo-titles.js +248 -0
- package/template/coding-task-manager/bin/write-lock-bench.js +111 -0
- package/template/coding-task-manager/db.js +860 -317
- package/template/coding-task-manager/git-utils.js +44 -0
- 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 -7
- 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 +99 -1
- package/template/coding-task-manager/lib/agent-title-apply.js +88 -0
- package/template/coding-task-manager/lib/agent-title-backfill-read.js +92 -0
- 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/host-stats.js +98 -0
- package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
- package/template/coding-task-manager/lib/api/ingress.js +43 -12
- package/template/coding-task-manager/lib/api/landing.js +403 -0
- package/template/coding-task-manager/lib/api/machine-pairing.js +285 -0
- package/template/coding-task-manager/lib/api/machine-pool.js +307 -0
- package/template/coding-task-manager/lib/api/machines.js +1150 -0
- package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
- package/template/coding-task-manager/lib/api/misc-ops.js +25 -5
- package/template/coding-task-manager/lib/api/providers.js +53 -6
- package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
- package/template/coding-task-manager/lib/api/resume-from-store.js +25 -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 +237 -59
- 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/transcript-history.js +17 -4
- package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
- package/template/coding-task-manager/lib/api/worktrees.js +38 -37
- package/template/coding-task-manager/lib/approval-drift.js +16 -1
- package/template/coding-task-manager/lib/approval-logical-frame.js +5 -1
- package/template/coding-task-manager/lib/approval-scope.js +68 -4
- package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
- package/template/coding-task-manager/lib/auth-context.js +32 -2
- package/template/coding-task-manager/lib/auth-rate-limit.js +64 -1
- package/template/coding-task-manager/lib/auth-rules.js +474 -62
- 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 +7 -1
- package/template/coding-task-manager/lib/browser-session-broker.js +9 -1
- package/template/coding-task-manager/lib/browser-use-adapter.js +33 -2
- package/template/coding-task-manager/lib/build-info.js +4 -2
- package/template/coding-task-manager/lib/claude-markdown-ansi.js +27 -85
- package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
- package/template/coding-task-manager/lib/claude-session-title.js +6 -30
- package/template/coding-task-manager/lib/claude-table-layout.js +322 -0
- package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
- package/template/coding-task-manager/lib/client-diag-handler.js +69 -2
- package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
- package/template/coding-task-manager/lib/codex-config-guard.js +33 -3
- package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
- package/template/coding-task-manager/lib/codex-harness-qualification.js +55 -20
- package/template/coding-task-manager/lib/codex-launch-health.js +29 -2
- package/template/coding-task-manager/lib/codex-link-preparation.js +9 -8
- package/template/coding-task-manager/lib/codex-paths.js +2 -1
- package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
- package/template/coding-task-manager/lib/coding-agent-models.js +48 -42
- package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
- package/template/coding-task-manager/lib/coding-session-model-adapters.js +70 -4
- package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
- package/template/coding-task-manager/lib/coding-session-model-projection.js +5 -0
- package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
- package/template/coding-task-manager/lib/coding-session-model-runtime.js +24 -6
- package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
- package/template/coding-task-manager/lib/coding-session-model-state.js +17 -0
- package/template/coding-task-manager/lib/coding-session-model-sync-state.js +0 -1
- package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
- package/template/coding-task-manager/lib/conversation-import/cursor-guard-owner.js +10 -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 +104 -13
- 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-boot-lifecycle.js +17 -1
- package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
- package/template/coding-task-manager/lib/db-domain-tables.js +8 -0
- package/template/coding-task-manager/lib/db-domains.js +22 -2
- package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
- package/template/coding-task-manager/lib/db-owner-op-registry.js +7 -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 +6 -0
- package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
- package/template/coding-task-manager/lib/feature-manifest.js +5 -1
- 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 +61 -44
- package/template/coding-task-manager/lib/harness-history-transition.js +52 -11
- package/template/coding-task-manager/lib/headless-inflight-ops.js +203 -0
- package/template/coding-task-manager/lib/headless-missing-reply.js +42 -0
- package/template/coding-task-manager/lib/headless-term-service.js +139 -25
- 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-control-dial.js +167 -0
- 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-orchestrator.js +16 -2
- package/template/coding-task-manager/lib/host-handoff.js +50 -15
- package/template/coding-task-manager/lib/host-health-ledger.js +164 -12
- package/template/coding-task-manager/lib/host-self-truth-watchdog.js +4 -0
- package/template/coding-task-manager/lib/host-stats.js +475 -0
- package/template/coding-task-manager/lib/host-threadpool-evacuation.js +160 -0
- package/template/coding-task-manager/lib/host-threadpool-monitor.js +14 -1
- package/template/coding-task-manager/lib/hosted-input-dispatch.js +203 -0
- package/template/coding-task-manager/lib/hosted-sync-worker.js +141 -310
- 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 +12 -0
- package/template/coding-task-manager/lib/instance-manifest-runtime.js +3 -0
- package/template/coding-task-manager/lib/instance-manifest.js +18 -2
- package/template/coding-task-manager/lib/instance-sync-status.js +33 -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 +193 -8
- 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/launch-plan-worker.js +59 -2
- 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 +409 -72
- package/template/coding-task-manager/lib/lead-model-switch.js +115 -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 +85 -9
- 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/legacy-draft-cancellation-recovery.js +111 -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/login-tripwire.js +1 -0
- package/template/coding-task-manager/lib/machine-pairing.js +238 -0
- package/template/coding-task-manager/lib/machine-pool.js +409 -0
- package/template/coding-task-manager/lib/machine-registry.js +1494 -0
- package/template/coding-task-manager/lib/machine-self.js +66 -0
- package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
- package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +485 -57
- 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/media-journal-control-reader.js +473 -0
- package/template/coding-task-manager/lib/media-journal.js +84 -27
- package/template/coding-task-manager/lib/media-store-options.js +43 -15
- 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/v56-host-samples-and-machine-pool.js +76 -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/mirror-feed-sanitize.js +12 -3
- 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 +8 -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 +6 -0
- package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
- package/template/coding-task-manager/lib/model-proxy/handoff.js +494 -0
- 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/lead-worker-picks.js +25 -0
- package/template/coding-task-manager/lib/model-proxy/native-lead-listener.js +61 -7
- package/template/coding-task-manager/lib/model-proxy/proxy-cli.js +200 -0
- package/template/coding-task-manager/lib/model-proxy/proxy-instance-record.js +257 -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/stream-accounting.js +205 -0
- package/template/coding-task-manager/lib/model-proxy/tokens.js +147 -5
- package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +18 -0
- package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
- package/template/coding-task-manager/lib/native-history-control.js +7 -5
- package/template/coding-task-manager/lib/native-lead-settings-client.js +46 -5
- package/template/coding-task-manager/lib/native-lead-tls.js +18 -4
- package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +776 -75
- 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 +15 -1
- package/template/coding-task-manager/lib/painted-row-recorder.js +9 -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/prompt-submission-contract.js +21 -1
- package/template/coding-task-manager/lib/provider-login-broker.js +264 -24
- package/template/coding-task-manager/lib/provider-login-capture.js +153 -0
- package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
- package/template/coding-task-manager/lib/queue-draft-status-overlay.js +36 -0
- package/template/coding-task-manager/lib/raw-codex-history-window.js +5 -3
- package/template/coding-task-manager/lib/read-pool-client.js +94 -4
- package/template/coding-task-manager/lib/read-pool-op-registry.js +10 -1
- package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
- package/template/coding-task-manager/lib/recent-catalog-query.js +41 -0
- package/template/coding-task-manager/lib/recent-session-catalog-response.js +76 -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-command-context.js +12 -0
- package/template/coding-task-manager/lib/remote-command-runtime.js +13 -1
- package/template/coding-task-manager/lib/remote-machine-catalog.js +1357 -0
- package/template/coding-task-manager/lib/remote-machine-create.js +1233 -0
- package/template/coding-task-manager/lib/remote-machine-link.js +1426 -0
- package/template/coding-task-manager/lib/remote-machine-proxy.js +654 -0
- package/template/coding-task-manager/lib/remote-session-forward.js +364 -0
- package/template/coding-task-manager/lib/remote-submission-status.js +6 -0
- 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/restart-outcome-truth.js +20 -3
- package/template/coding-task-manager/lib/restart-preflight.js +9 -2
- package/template/coding-task-manager/lib/restore-backoff-gate.js +10 -2
- package/template/coding-task-manager/lib/restore-prepare-retry.js +12 -5
- package/template/coding-task-manager/lib/restore-resume-batch.js +22 -1
- 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/resume-blocked-wire.js +62 -1
- package/template/coding-task-manager/lib/resume-cwd.js +13 -0
- package/template/coding-task-manager/lib/resume-from-store.js +12 -1
- package/template/coding-task-manager/lib/resume-origin-facts.js +38 -1
- package/template/coding-task-manager/lib/resume-preflight.js +21 -16
- package/template/coding-task-manager/lib/review-repo-admission.js +39 -6
- package/template/coding-task-manager/lib/review-repo-registry.js +74 -18
- package/template/coding-task-manager/lib/root-delivery-runtime.js +74 -17
- package/template/coding-task-manager/lib/root-delivery-selection.js +37 -1
- package/template/coding-task-manager/lib/root-prompt-admission.js +33 -2
- package/template/coding-task-manager/lib/root-prompt-flow.js +168 -34
- 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/scrollback-archive-store.js +7 -4
- package/template/coding-task-manager/lib/session-analysis-memory.js +2 -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/codex-native-provider-gate.js +218 -0
- package/template/coding-task-manager/lib/session-create/codex-resume-exit-classify.js +52 -0
- package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
- package/template/coding-task-manager/lib/session-create/delegate-worker.js +179 -20
- package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
- package/template/coding-task-manager/lib/session-create/identity.js +20 -1
- 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 +201 -9
- package/template/coding-task-manager/lib/session-create/provider-launch-context.js +77 -0
- package/template/coding-task-manager/lib/session-create/provider-process.js +193 -64
- package/template/coding-task-manager/lib/session-create/response.js +37 -19
- 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 +14 -5
- 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 +50 -2
- package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
- package/template/coding-task-manager/lib/session-create/worker-notices.js +94 -5
- package/template/coding-task-manager/lib/session-create/worker-observability.js +101 -9
- package/template/coding-task-manager/lib/session-create/worker-stop.js +11 -3
- package/template/coding-task-manager/lib/session-create/worker-wait-watcher.js +315 -0
- package/template/coding-task-manager/lib/session-empty.js +13 -10
- package/template/coding-task-manager/lib/session-geometry-authority-handler.js +10 -1
- package/template/coding-task-manager/lib/session-host-manager.js +212 -206
- package/template/coding-task-manager/lib/session-jobs.js +20 -10
- package/template/coding-task-manager/lib/session-lifecycle.js +28 -4
- package/template/coding-task-manager/lib/session-model-action-preconditions.js +15 -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-resource-sampler.js +19 -9
- package/template/coding-task-manager/lib/session-standup.js +67 -4
- package/template/coding-task-manager/lib/session-status-ledger.js +147 -6
- package/template/coding-task-manager/lib/session-status-runtime.js +45 -1
- package/template/coding-task-manager/lib/session-title-mirror.js +25 -57
- package/template/coding-task-manager/lib/session-transcript-trash.js +8 -1
- 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/startup-pointer-write.js +57 -0
- 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/state-sync/painted-frame-field.js +11 -0
- package/template/coding-task-manager/lib/storage/coding-session-model-store.js +25 -23
- 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/surviving-owner-bootstrap.js +7 -2
- package/template/coding-task-manager/lib/surviving-owner-recovery.js +2 -1
- 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-http-status.js +25 -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-archiver.js +229 -229
- package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
- package/template/coding-task-manager/lib/transcript-frame-cache.js +20 -5
- package/template/coding-task-manager/lib/transcript-guard-job.js +55 -4
- package/template/coding-task-manager/lib/transcript-link.js +77 -0
- package/template/coding-task-manager/lib/transcript-manifest-store.js +8 -4
- package/template/coding-task-manager/lib/transcript-source.js +44 -7
- package/template/coding-task-manager/lib/transcript-store.js +49 -0
- package/template/coding-task-manager/lib/tunnel-lane-governor.js +6 -3
- package/template/coding-task-manager/lib/typing-interaction-trace.js +198 -3
- package/template/coding-task-manager/lib/typing-worker-stages.js +60 -0
- 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/visible-revision-watchdog.js +8 -12
- package/template/coding-task-manager/lib/wake-skip-reasons.js +47 -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 +130 -27
- package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
- package/template/coding-task-manager/lib/worker-failure-classify.js +13 -1
- 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 +125 -6
- package/template/coding-task-manager/lib/ws/terminal-attach.js +123 -1
- package/template/coding-task-manager/lib/ws-router.js +68 -1
- package/template/coding-task-manager/lib/ws-send-admission.js +22 -4
- package/template/coding-task-manager/oauth-proxy.js +211 -170
- package/template/coding-task-manager/package-lock.json +34 -94
- package/template/coding-task-manager/package.json +7 -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/providers/codex-mcp-extract.js +121 -19
- package/template/coding-task-manager/providers/codex-mcp.js +14 -5
- package/template/coding-task-manager/public/css/app.css +449 -1
- package/template/coding-task-manager/public/css/reviews.css +4 -0
- package/template/coding-task-manager/public/css/walle-session.css +4 -0
- package/template/coding-task-manager/public/index.html +766 -465
- 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 +2572 -0
- package/template/coding-task-manager/public/js/app/models-tab.js +658 -73
- package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
- package/template/coding-task-manager/public/js/app/worktrees-panel.js +191 -7
- package/template/coding-task-manager/public/js/background-work.js +203 -28
- package/template/coding-task-manager/public/js/coding-session-model-presentation.js +181 -13
- 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 +847 -5
- package/template/coding-task-manager/public/js/core/session-selectors.js +5 -1
- 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 +48 -4
- package/template/coding-task-manager/public/js/history-painted-rows.js +17 -2
- package/template/coding-task-manager/public/js/history-reader-park.js +13 -1
- package/template/coding-task-manager/public/js/history-scroller.js +187 -9
- package/template/coding-task-manager/public/js/history-transcript-pages.js +5 -5
- package/template/coding-task-manager/public/js/machine-pool-shared.js +991 -0
- 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/private-state-scope.js +31 -3
- package/template/coding-task-manager/public/js/prompt-submission-client.js +173 -8
- package/template/coding-task-manager/public/js/prompt-submission-tray.js +281 -0
- 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/queue-panel-submission-reconcile.js +174 -1
- package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
- package/template/coding-task-manager/public/js/reviews.js +7 -3
- package/template/coding-task-manager/public/js/root-draft-lifetime.js +139 -2
- package/template/coding-task-manager/public/js/root-queue-builder-lifetime.js +16 -0
- package/template/coding-task-manager/public/js/row-join.js +4 -2
- package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
- package/template/coding-task-manager/public/js/session-search-utils.js +64 -21
- 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 +14 -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-02.js +16 -7
- package/template/coding-task-manager/public/js/terminal/runtime-03.js +41 -0
- package/template/coding-task-manager/public/js/terminal/runtime-04.js +41 -4
- 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 +60 -3
- package/template/coding-task-manager/public/js/terminal/runtime-16.js +16 -12
- package/template/coding-task-manager/public/js/terminal/runtime-18.js +14 -0
- package/template/coding-task-manager/public/js/terminal/runtime-19.js +8 -4
- package/template/coding-task-manager/public/js/terminal/runtime-20.js +211 -74
- package/template/coding-task-manager/public/js/terminal/runtime-21.js +19 -6
- package/template/coding-task-manager/public/js/terminal/runtime-22.js +86 -0
- package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
- package/template/coding-task-manager/public/js/terminal-history-viewport.js +1 -1
- package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
- package/template/coding-task-manager/public/js/terminal-wheel.js +62 -5
- package/template/coding-task-manager/public/js/walle/chat-conversation.js +15 -7
- package/template/coding-task-manager/public/js/walle-session.js +30 -7
- 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 +366 -8
- package/template/coding-task-manager/public/m/app.js +1006 -74
- package/template/coding-task-manager/public/m/index.html +55 -1
- package/template/coding-task-manager/public/m/machines.js +2147 -0
- package/template/coding-task-manager/public/m/pool-failover.js +391 -0
- package/template/coding-task-manager/public/m/private-api.js +31 -1
- package/template/coding-task-manager/public/m/private-queue-actions.js +26 -7
- package/template/coding-task-manager/public/m/sw.js +5 -0
- package/template/coding-task-manager/public/usage.html +1 -0
- package/template/coding-task-manager/queue-engine.js +13 -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/approvals.js +5 -6
- package/template/coding-task-manager/server/boot.js +136 -17
- package/template/coding-task-manager/server.js +2819 -11885
- package/template/coding-task-manager/session-integrity.js +71 -13
- package/template/coding-task-manager/workers/db-owner-worker.js +72 -9
- 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 +93 -12
- package/template/coding-task-manager/workers/session-host-pool-process.js +24 -10
- package/template/coding-task-manager/workers/session-host-process.js +19 -8
- package/template/coding-task-manager/workers/transcript-archive-worker.js +1 -1
- package/template/coding-task-manager/workers/watch-worker.js +105 -0
- package/template/coding-task-manager/workers/worktree-worker.js +202 -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/scripts/conversation-storage-v2-migration.js +78 -11
- 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 +47 -6
- package/template/shared/fixtures/worker-status-payloads.json +392 -0
- package/template/shared/git-remote-key.js +83 -0
- package/template/shared/host-identity.js +98 -2
- 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/owner-write-safety.js +135 -0
- package/template/shared/public-runtime.js +13 -5
- package/template/shared/release-schema.json +3 -2
- package/template/shared/report-citations.js +14 -0
- package/template/shared/sqlite-write-lock.js +361 -223
- package/template/shared/storage/contract.js +38 -3
- package/template/wall-e/adapters/imessage.js +12 -0
- package/template/wall-e/agent.js +92 -4
- package/template/wall-e/api-walle.js +26 -1
- package/template/wall-e/bin/brain-purge-legacy-ctm.js +3 -2
- package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
- package/template/wall-e/bin/walle-mcp-stdio.js +14 -8
- 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/helper-rules-schema.js +129 -0
- package/template/wall-e/brain/memories.js +2 -2
- package/template/wall-e/brain/migrations.js +91 -28
- package/template/wall-e/brain/model-deployment-facts.js +31 -1
- package/template/wall-e/brain/model-identity-migration.js +1 -1
- package/template/wall-e/brain/owner-call-whitelist.js +39 -7
- package/template/wall-e/brain/schema-ensures.js +22 -0
- package/template/wall-e/brain/schema.js +45 -85
- package/template/wall-e/brain.js +172 -36
- package/template/wall-e/chat.js +3 -3
- package/template/wall-e/coding/agent-shell-env.js +7 -2
- package/template/wall-e/coding/journal-dispatcher.js +51 -0
- package/template/wall-e/coding/prompt-bundle.js +66 -21
- package/template/wall-e/coding/session-journal.js +28 -40
- package/template/wall-e/coding-orchestrator.js +23 -26
- 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/auth.js +18 -1
- package/template/wall-e/http/blog-views-api.js +318 -0
- package/template/wall-e/http/gws-api.js +4 -0
- package/template/wall-e/http/helper-rules-api.js +327 -0
- 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 +177 -2
- 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/http/telemetry-api.js +12 -0
- package/template/wall-e/jobs/job-runner.js +28 -1
- package/template/wall-e/lib/blog-view-policy.js +88 -0
- package/template/wall-e/lib/blog-view-store.js +169 -0
- package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
- package/template/wall-e/lib/client-config-lock.js +2 -1
- package/template/wall-e/lib/coding-journal-writer-child-client.js +67 -18
- 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/error-kinds.js +10 -1
- package/template/wall-e/lib/feature-manifest.js +1 -1
- package/template/wall-e/lib/helper-rules/cell-state.js +123 -0
- package/template/wall-e/lib/helper-rules/evaluate.js +398 -0
- package/template/wall-e/lib/helper-rules/explore-rubric.md +12 -0
- package/template/wall-e/lib/helper-rules/grade.js +320 -0
- package/template/wall-e/lib/helper-rules/label.js +247 -0
- package/template/wall-e/lib/helper-rules/lead-call-hook.js +555 -0
- package/template/wall-e/lib/helper-rules/store.js +669 -0
- 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 +63 -19
- package/template/wall-e/lib/parent-death.js +7 -1
- package/template/wall-e/lib/runtime-worker-pool.js +1 -0
- package/template/wall-e/lib/scheduler-worker-jobs.js +12 -4
- package/template/wall-e/lib/telemetry-db-schema.js +37 -0
- package/template/wall-e/lib/telemetry-process-client.js +76 -1
- package/template/wall-e/llm/default-fallback.js +4 -0
- 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-catalog.js +13 -4
- package/template/wall-e/llm/model-roles.js +7 -1
- package/template/wall-e/llm/native-delegate-selection.js +56 -8
- package/template/wall-e/llm/portkey-http.js +150 -0
- package/template/wall-e/llm/portkey-sync.js +15 -145
- package/template/wall-e/llm/worker-delegate-args.js +72 -7
- package/template/wall-e/llm/worker-mcp-routing.js +117 -7
- package/template/wall-e/llm/worker-route.js +43 -1
- package/template/wall-e/loops/brain-custom-writes.js +64 -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 +77 -2
- package/template/wall-e/mcp-server.js +141 -31
- package/template/wall-e/mcp-worker-schemas.js +25 -7
- package/template/wall-e/memory/ctm-context-client.js +110 -5
- 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 +3 -2
- package/template/wall-e/shared/sqlite-file-set.js +39 -0
- package/template/wall-e/shared/sqlite-write-lock.js +361 -223
- package/template/wall-e/shared/storage/contract.js +38 -3
- package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
- package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +13 -1
- package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +11 -6
- package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +13 -8
- 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/tools/local-tools.js +6 -4
- package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
- package/template/wall-e/workers/brain-owner-worker.js +27 -4
- package/template/wall-e/workers/coding-journal-writer-child.js +8 -1
- package/template/wall-e/workers/mcp-gateway-process.js +5 -5
- package/template/wall-e/workers/telemetry-worker.js +8 -0
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ Screenshots show the real application with fictional `acme-ledger` data and scri
|
|
|
26
26
|
|
|
27
27
|
### Choose the agent for the task
|
|
28
28
|
|
|
29
|
-
Every session has its own agent choice. Run Claude Code, Codex, Gemini CLI, OpenCode, Cursor Agent, Wall-E or a shell side by side and move between them from the same workspace.
|
|
29
|
+
Every session has its own agent choice. Run Claude Code, Codex, Gemini CLI, OpenCode, Cursor Agent, DeepSeek Harness, Wall-E or a shell side by side and move between them from the same workspace.
|
|
30
30
|
|
|
31
31
|
The CLI, the model and the connection serving that model are separate decisions: the AI Providers area brings native agent options, direct provider connections and configured routers into one place, using your own accounts and credentials. Agents differ in what they support, so the available model-switching controls depend on the CLI you pick.
|
|
32
32
|
|
|
@@ -73,6 +73,12 @@ CTM can park an eligible inactive session to stop its process and free resources
|
|
|
73
73
|
|
|
74
74
|
A shared MCP gateway lets eligible tool servers reuse one process across sessions; tools needing session-specific state keep separate instances.
|
|
75
75
|
|
|
76
|
+
### Use more than one machine
|
|
77
|
+
|
|
78
|
+
Pair another machine running CTM and its sessions join the same list, tagged by machine. Pick the machine when you start a session, open and type into it from the hub's browser, and sign that machine's coding agents in from the Machines page, on desktop or phone.
|
|
79
|
+
|
|
80
|
+
Recent Sessions and search cover every paired machine, and a session link from any of them opens wherever that session lives. Paired machines share Wall-E memory, receive the hub's skills, and can be kept up to date from the hub. A session on another machine can ask to use the hub's files, commands or browser, and it waits for your approval first.
|
|
81
|
+
|
|
76
82
|
### Review changes in one place
|
|
77
83
|
|
|
78
84
|
The Review page moves between rendered HTML or Markdown, source files and diffs, and new files appear before Git tracks them. Comments collect into one message for the session responsible for the change, keeping feedback beside the files that produced it.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Shared "no other account can write through this path" predicate for paths CTM and
|
|
4
|
+
// Wall-E did not create themselves (a Codex sessions root, an enrolled provider root,
|
|
5
|
+
// a data directory handed in by an installer, ~/.walle/data).
|
|
6
|
+
//
|
|
7
|
+
// The rule is Debian OpenSSH's `user-group-modes.patch` rule, adapted: world write is
|
|
8
|
+
// never acceptable, and group write is acceptable ONLY when the owning group is the
|
|
9
|
+
// current user's own one-member private group (the user-private-group scheme that
|
|
10
|
+
// `pam_umask(8)` sets up as umask 002 on every Debian/Ubuntu/Fedora login). On a shared
|
|
11
|
+
// group (`staff` on macOS, `users` on many hosts) the check is exactly as strict as
|
|
12
|
+
// before.
|
|
13
|
+
//
|
|
14
|
+
// Accepted gap (same as the Debian patch): a group password held in `/etc/gshadow`
|
|
15
|
+
// (usable through `newgrp`) and accounts that exist only in NSS (LDAP/SSSD) are invisible
|
|
16
|
+
// to the `/etc/group` + `/etc/passwd` parse this module performs, so a gid that cannot be
|
|
17
|
+
// proven from the local files is refused — the check always fails closed.
|
|
18
|
+
|
|
19
|
+
const fs = require('node:fs');
|
|
20
|
+
const os = require('node:os');
|
|
21
|
+
|
|
22
|
+
const MAX_DB_BYTES = 1024 * 1024;
|
|
23
|
+
const GROUP_PATH = '/etc/group';
|
|
24
|
+
const PASSWD_PATH = '/etc/passwd';
|
|
25
|
+
|
|
26
|
+
/** Default reader: one bounded read (≤ MAX_DB_BYTES), the fd always closed. */
|
|
27
|
+
function _readBoundedFile(filePath) {
|
|
28
|
+
const fd = fs.openSync(filePath, 'r');
|
|
29
|
+
try {
|
|
30
|
+
const stat = fs.fstatSync(fd);
|
|
31
|
+
if (Number(stat.size) > MAX_DB_BYTES) {
|
|
32
|
+
throw new Error(`${filePath} is larger than ${MAX_DB_BYTES} bytes`);
|
|
33
|
+
}
|
|
34
|
+
return fs.readFileSync(fd, 'utf8');
|
|
35
|
+
} finally {
|
|
36
|
+
fs.closeSync(fd);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A seam explicitly passed as `null` means "this platform has no such call" (the Windows
|
|
41
|
+
// shape); `undefined` means "use the process default".
|
|
42
|
+
function _seam(deps, name, fallback) {
|
|
43
|
+
if (deps[name] === null) return null;
|
|
44
|
+
if (typeof deps[name] === 'function') return deps[name];
|
|
45
|
+
return typeof fallback === 'function' ? fallback : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Split a local-database file into usable lines: blanks and `#` comments are skipped, and a
|
|
49
|
+
// `+`/`-` NIS compat line makes the whole file unprovable (return null).
|
|
50
|
+
function _usableLines(text) {
|
|
51
|
+
const lines = [];
|
|
52
|
+
for (const raw of String(text).split('\n')) {
|
|
53
|
+
const line = raw.trim();
|
|
54
|
+
if (!line || line.startsWith('#')) continue;
|
|
55
|
+
if (line.startsWith('+') || line.startsWith('-')) return null;
|
|
56
|
+
lines.push(line);
|
|
57
|
+
}
|
|
58
|
+
return lines;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function _numericField(value) {
|
|
62
|
+
return /^\d+$/.test(value || '') ? Number(value) : null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** D-2: `gid` is the current user's one-member private group. Any doubt ⇒ false. */
|
|
66
|
+
function isUserPrivateGroup(gid, deps = {}) {
|
|
67
|
+
try {
|
|
68
|
+
const getuid = _seam(deps, 'getuid', process.getuid);
|
|
69
|
+
const getgid = _seam(deps, 'getgid', process.getgid);
|
|
70
|
+
if (typeof getuid !== 'function' || typeof getgid !== 'function') return false;
|
|
71
|
+
const targetGid = _numericField(String(gid));
|
|
72
|
+
if (targetGid === null) return false;
|
|
73
|
+
if (Number(getgid()) !== targetGid) return false;
|
|
74
|
+
const uid = Number(getuid());
|
|
75
|
+
const usernameFn = _seam(deps, 'username', () => os.userInfo().username);
|
|
76
|
+
if (typeof usernameFn !== 'function') return false;
|
|
77
|
+
const username = String(usernameFn() || '');
|
|
78
|
+
if (!username) return false;
|
|
79
|
+
const readFile = _seam(deps, 'readFile', _readBoundedFile);
|
|
80
|
+
if (typeof readFile !== 'function') return false;
|
|
81
|
+
|
|
82
|
+
// (b) /etc/group: exactly one line with this gid, named after the login, members ⊆ {login}.
|
|
83
|
+
const groupLines = _usableLines(readFile(GROUP_PATH));
|
|
84
|
+
if (!groupLines) return false;
|
|
85
|
+
const groupEntries = [];
|
|
86
|
+
for (const line of groupLines) {
|
|
87
|
+
const fields = line.split(':');
|
|
88
|
+
const lineGid = fields.length >= 3 ? _numericField(fields[2]) : null;
|
|
89
|
+
if (lineGid === null || lineGid !== targetGid) continue;
|
|
90
|
+
if (fields.length !== 4) return false;
|
|
91
|
+
groupEntries.push({ name: fields[0], members: fields[3].split(',').map(m => m.trim()).filter(Boolean) });
|
|
92
|
+
}
|
|
93
|
+
if (groupEntries.length !== 1) return false;
|
|
94
|
+
const group = groupEntries[0];
|
|
95
|
+
if (group.name !== username) return false;
|
|
96
|
+
if (group.members.length > 1) return false;
|
|
97
|
+
if (group.members.length === 1 && group.members[0] !== username) return false;
|
|
98
|
+
|
|
99
|
+
// (c) /etc/passwd: every account whose primary gid is this gid is this uid, and one exists.
|
|
100
|
+
const passwdLines = _usableLines(readFile(PASSWD_PATH));
|
|
101
|
+
if (!passwdLines) return false;
|
|
102
|
+
let primaryAccounts = 0;
|
|
103
|
+
for (const line of passwdLines) {
|
|
104
|
+
const fields = line.split(':');
|
|
105
|
+
const lineGid = fields.length >= 4 ? _numericField(fields[3]) : null;
|
|
106
|
+
if (lineGid === null || lineGid !== targetGid) continue;
|
|
107
|
+
if (fields.length !== 7) return false;
|
|
108
|
+
primaryAccounts += 1;
|
|
109
|
+
const lineUid = _numericField(fields[2]);
|
|
110
|
+
if (lineUid === null || lineUid !== uid) return false;
|
|
111
|
+
}
|
|
112
|
+
if (primaryAccounts === 0) return false;
|
|
113
|
+
return true;
|
|
114
|
+
} catch {
|
|
115
|
+
/* expected: any unreadable or unparsable account database fails closed (D-3) */
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* True iff no account other than the current user can write through `stat`'s permission bits.
|
|
122
|
+
* Accepts fs.Stats (Number) and fs.BigIntStats (bigint) alike.
|
|
123
|
+
* @param {{ mode: number|bigint, gid: number|bigint }} stat
|
|
124
|
+
* @param {{ readFile?: (p: string) => string, getuid?: () => number, getgid?: () => number,
|
|
125
|
+
* username?: () => string }} [deps] test seams
|
|
126
|
+
* @returns {boolean}
|
|
127
|
+
*/
|
|
128
|
+
function isWritableOnlyByOwner(stat, deps = {}) {
|
|
129
|
+
const mode = Number(stat.mode);
|
|
130
|
+
if ((mode & 0o002) !== 0) return false; // world write is never acceptable
|
|
131
|
+
if ((mode & 0o020) === 0) return true; // no group write: no file is read
|
|
132
|
+
return isUserPrivateGroup(Number(stat.gid), deps);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
module.exports = { isWritableOnlyByOwner, isUserPrivateGroup, MAX_DB_BYTES, _readBoundedFile };
|
package/lib/public-runtime.js
CHANGED
|
@@ -36,6 +36,11 @@ const os = require('node:os');
|
|
|
36
36
|
const path = require('node:path');
|
|
37
37
|
const { execFileSync } = require('node:child_process');
|
|
38
38
|
|
|
39
|
+
// The ONE "no other account can write through this path" predicate, shared with CTM and Wall-E. It
|
|
40
|
+
// is a relative SIBLING require on purpose: the mirror is byte-identical, so the same bytes resolve it
|
|
41
|
+
// from `shared/` and from `create-walle/lib/`.
|
|
42
|
+
const { isWritableOnlyByOwner } = require('./owner-write-safety');
|
|
43
|
+
|
|
39
44
|
const {
|
|
40
45
|
parseReleaseRuntimePolicy,
|
|
41
46
|
releaseRuntimeArchive,
|
|
@@ -187,10 +192,13 @@ function publicRuntimeNpmEnv(nodeBin) {
|
|
|
187
192
|
|
|
188
193
|
// ── the one cache-directory admission ───────────────────────────────────────────────────────────
|
|
189
194
|
/**
|
|
190
|
-
* Assert that `dir` is a REAL directory (never a link), owned by the current user, and
|
|
191
|
-
* group
|
|
192
|
-
*
|
|
193
|
-
*
|
|
195
|
+
* Assert that `dir` is a REAL directory (never a link), owned by the current user, and writable only
|
|
196
|
+
* by its owner (a user-private group counts as the owner: world write is never acceptable, and group
|
|
197
|
+
* write is acceptable only when the owning group is the user's own one-member private group, the
|
|
198
|
+
* umask-002 scheme of a Debian/Ubuntu/Fedora login). Ancestors ABOVE the owned cache boundary are
|
|
199
|
+
* deliberately not inspected: a system path or a sticky ancestor is not this installer's ownership
|
|
200
|
+
* requirement, and pretending otherwise would refuse every legitimate `~/.walle` under a shared
|
|
201
|
+
* parent.
|
|
194
202
|
*/
|
|
195
203
|
function assertOwnedCacheDirectory(fsOps, dir, phase) {
|
|
196
204
|
let stat;
|
|
@@ -202,7 +210,7 @@ function assertOwnedCacheDirectory(fsOps, dir, phase) {
|
|
|
202
210
|
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
203
211
|
throw refuse(phase, 'public runtime cache directory is not a real directory');
|
|
204
212
|
}
|
|
205
|
-
if ((
|
|
213
|
+
if (!isWritableOnlyByOwner(stat)) {
|
|
206
214
|
throw refuse(phase, 'public runtime cache directory is group or other writable');
|
|
207
215
|
}
|
|
208
216
|
if (typeof process.getuid === 'function' && Number(stat.uid) !== process.getuid()) {
|
package/lib/release-schema.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
|
10
10
|
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
11
11
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
|
12
|
-
51, 52, 53, 54, 55
|
|
12
|
+
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61
|
|
13
13
|
]
|
|
14
14
|
},
|
|
15
15
|
"walle": {
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
|
|
25
25
|
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
|
|
26
26
|
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
|
|
27
|
-
97, 98, 99
|
|
27
|
+
97, 98, 99, 100,
|
|
28
|
+
101, 102, 103, 104, 105
|
|
28
29
|
]
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"coding-task-manager/bin/client-server-boundary-lint.js",
|
|
10
10
|
"coding-task-manager/bin/conv-order-write-lint.js",
|
|
11
11
|
"coding-task-manager/bin/conversation-provenance-lint.js",
|
|
12
|
+
"coding-task-manager/bin/credential-dir-fixture-lint.js",
|
|
12
13
|
"coding-task-manager/bin/dashboard-client-source.js",
|
|
13
14
|
"coding-task-manager/bin/deadline-lint.js",
|
|
14
15
|
"coding-task-manager/bin/delivery-contract-lint.js",
|
|
@@ -39,7 +40,9 @@
|
|
|
39
40
|
"coding-task-manager/bin/seam-replay.js",
|
|
40
41
|
"coding-task-manager/bin/session-access-lint.js",
|
|
41
42
|
"coding-task-manager/bin/session-create-fanout-lint.js",
|
|
43
|
+
"coding-task-manager/bin/session-host-kill-lint.js",
|
|
42
44
|
"coding-task-manager/bin/session-runtime-evidence-lint.js",
|
|
45
|
+
"coding-task-manager/bin/startup-pointer-writer-lint.js",
|
|
43
46
|
"coding-task-manager/bin/status-verdict-lint.js",
|
|
44
47
|
"coding-task-manager/bin/term-container-band-lint.js",
|
|
45
48
|
"coding-task-manager/bin/terminal-write-lint.js",
|
|
@@ -1783,14 +1786,14 @@
|
|
|
1783
1786
|
"coding-task-manager/lib/runtime-interaction-action-resolver.js": "178eebe1294c3b761da0085e0dcccef36c027bd8c08e4c7779efda2f3984aa04",
|
|
1784
1787
|
"coding-task-manager/lib/sqlite-driver.js": "78a1cd2a604748cf895dc44547b4cf1e4a3bdec6f02d77965f4b7b21a2b8a31b",
|
|
1785
1788
|
"coding-task-manager/lib/walle-deps-repair.js": "be85620d08795ea0fe9539820416d5cc50b654519abddab0811907fa3fe93a7f",
|
|
1786
|
-
"coding-task-manager/lib/walle-mcp-auto-config.js": "
|
|
1789
|
+
"coding-task-manager/lib/walle-mcp-auto-config.js": "369c4d1c7d91d822510e74cfe2b6b2a85a2543e32e52e34590b4b329f6d9f64b",
|
|
1787
1790
|
"coding-task-manager/lib/walle-native-health.js": "9fdf7f17eb77837aac4ea16140a6f4e5a97d7a568945da30f29b9a7541c3d967",
|
|
1788
|
-
"coding-task-manager/lib/walle-supervisor.js": "
|
|
1791
|
+
"coding-task-manager/lib/walle-supervisor.js": "f7597199724270f8fe0fabf0840606d52a568bb7e97421cf8079fd0d5cb4eded",
|
|
1789
1792
|
"coding-task-manager/public/js/client-health-worker.js": "07e300113ee749ac7a6adaaa1461502d1562087af395b6c89cf1b885f1f5e00e",
|
|
1790
1793
|
"coding-task-manager/public/js/image-normalize-worker.js": "37cb0758bddcf10c66060fae52088c1a842409f30e919988e789cfea7d05e2be",
|
|
1791
|
-
"coding-task-manager/public/m/app.js": "
|
|
1792
|
-
"coding-task-manager/server.js": "
|
|
1793
|
-
"scripts/conversation-storage-v2-migration.js": "
|
|
1794
|
+
"coding-task-manager/public/m/app.js": "982f3a1b5910b4fb2843cf3028afaeabde8f1cd5ad37fb6cb52511fdbf7cfcb3",
|
|
1795
|
+
"coding-task-manager/server.js": "a329e948c2f8f2aefa8753a69169c826ccb5e884d6132c1f785080a1386c2d56",
|
|
1796
|
+
"scripts/conversation-storage-v2-migration.js": "f2620ba24893c4d2ec6c594428ddb41dc098da38b4066f1df25fb87abbfaebfa",
|
|
1794
1797
|
"shared/storage/schema-port.js": "e41cec8c075a6167fba2efd0177d9e20a11c0cd49ae176aaf36d5b9257409e67",
|
|
1795
1798
|
"shared/storage/schema-sync.js": "7ca080e44e35e8178a0f74317023881f920ae75bde4f7431702ce1f9fa4a1d03",
|
|
1796
1799
|
"wall-e/adapters/chatgpt.js": "8c0fa31ae65ed5c10776e50a1a26c131bc62cb1aa3d88eb4617e7b83b43789d9",
|
|
@@ -1801,7 +1804,7 @@
|
|
|
1801
1804
|
"wall-e/adapters/claude-web.plugin.json": "29945817a251b14c0789ae527f7ecd345cb0097c654f851fe062b208c30a0a6b",
|
|
1802
1805
|
"wall-e/adapters/codex-memory.js": "18d6d0af08d9d48d5c92621a16b2b9a597d30b3993c534f88a4bc8b3d60c0d71",
|
|
1803
1806
|
"wall-e/adapters/codex-memory.plugin.json": "4cbc6a0f2023264a59ec703ec7553ed9997b1e55626831342bf3ee60f3828663",
|
|
1804
|
-
"wall-e/adapters/imessage.js": "
|
|
1807
|
+
"wall-e/adapters/imessage.js": "b689b538abb809df08c3f6f2a08673d6c38a6cb50d2f1d49aa693de28e0b11bd",
|
|
1805
1808
|
"wall-e/adapters/imessage.plugin.json": "28dc369a489ea44bd2063d6f9eae998099134b9de5db76118808f5def8534bb1",
|
|
1806
1809
|
"wall-e/adapters/plaintext.js": "3a834c50ef76b746987819c8fd453f0161ffb70a1c588e5c4161b1f102190599",
|
|
1807
1810
|
"wall-e/adapters/plaintext.plugin.json": "de4b6c6d151fdabf897be9856f6357cbb83cdff14a62186096de55e495cd4352",
|
|
@@ -1844,7 +1847,7 @@
|
|
|
1844
1847
|
"wall-e/llm/typesafe.plugin.json": "93109b5f27dcf0fb25cb18d461eda3bc6b294ebdd1614740da0bc2cee715948e",
|
|
1845
1848
|
"wall-e/llm/zai.js": "f94c77663cd450b2e54dc7450f0c24666b1fd5ced795e685c6d94d6f09d3931d",
|
|
1846
1849
|
"wall-e/llm/zai.plugin.json": "d9c6408fca68fed17a3a94f27d9119b947eadeb01f4a40a00e27e59faa942e00",
|
|
1847
|
-
"wall-e/memory/ctm-session-context.js": "
|
|
1850
|
+
"wall-e/memory/ctm-session-context.js": "635225f1070ea7bc95a057090122720450000aac52257f0b46a5ba089b5a3ed6",
|
|
1848
1851
|
"wall-e/plugins/discovery.js": "44dfc422e9cf570d1d300c4ebfe4be63ab8f2709d38da1d35f30f6a7e65b20bb",
|
|
1849
1852
|
"wall-e/plugins/manifest-loader.js": "501d3098c2356c35a0650def273e7c65cb076d986fe4bb0d4eba3189a08c5c52",
|
|
1850
1853
|
"wall-e/plugins/manifest-schema.js": "59b5dd76f0f85cc136a6511e2f4945a9d1fc16133495c9b5c64df097b47a6571",
|
|
@@ -1866,7 +1869,7 @@
|
|
|
1866
1869
|
"wall-e/skills/_bundled/model-trainer/index.js": "1c0e5f039dc7b06624c14631ea8427af956b243354da2ebd9930f6d382eee5bc",
|
|
1867
1870
|
"wall-e/skills/_bundled/morning-briefing/run.js": "e09ca88ed0a65570b11c8007d27a4cd42990a35df3343443fc560df90564f50d",
|
|
1868
1871
|
"wall-e/skills/skill-loader.js": "8572c97cb88bcc9fc78a89ed10bf5134b57cbc838dd06dd5cf46509bfcfd54be",
|
|
1869
|
-
"wall-e/workers/mcp-gateway-process.js": "
|
|
1872
|
+
"wall-e/workers/mcp-gateway-process.js": "3a5a22e2c620911510d452c7ce4714a6908682a1c0fa303f0e24f2eb31e20380"
|
|
1870
1873
|
},
|
|
1871
1874
|
"discoveryInventories": [
|
|
1872
1875
|
{
|
package/package.json
CHANGED
|
@@ -248,7 +248,7 @@ function checkDeps(pkgDir, opts = {}) {
|
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// The package dirs a gate depends on, relative to a checkout root.
|
|
251
|
-
const TREE_SUBS = ['', 'coding-task-manager', 'wall-e', 'shared', 'create-walle'];
|
|
251
|
+
const TREE_SUBS = ['', 'coding-task-manager', 'wall-e', 'shared', 'create-walle', 'ctm-relay'];
|
|
252
252
|
|
|
253
253
|
// `npm --prefix <owner> install --no-save`: <owner> is the checkout that really
|
|
254
254
|
// holds node_modules (a gate tree borrows it through a symlink). Never
|
package/template/bin/node-bin.sh
CHANGED
|
@@ -56,6 +56,17 @@ bootstrap_candidates() {
|
|
|
56
56
|
for cache_node in "$HOME"/.walle/runtimes/*/*/runtime/bin/node; do
|
|
57
57
|
if [ -e "$cache_node" ]; then printf '%s\n' "$cache_node"; fi
|
|
58
58
|
done
|
|
59
|
+
# Linux boxes (e.g. DGX Spark) install Node via nvm/fnm, so with a non-interactive ssh session
|
|
60
|
+
# that never sources the manager there is no `node` on PATH and none of the macOS Wall-E paths
|
|
61
|
+
# above exist. Any version found here only RUNS the fixed helper; the pin is still enforced by the
|
|
62
|
+
# candidate ladder below, so a version-globbed bootstrap can never select a mismatched ABI.
|
|
63
|
+
local manager_node
|
|
64
|
+
for manager_node in \
|
|
65
|
+
"$HOME"/.nvm/versions/node/*/bin/node \
|
|
66
|
+
"$HOME"/.local/share/fnm/node-versions/*/installation/bin/node \
|
|
67
|
+
"$HOME"/.fnm/node-versions/*/installation/bin/node; do
|
|
68
|
+
if [ -e "$manager_node" ]; then printf '%s\n' "$manager_node"; fi
|
|
69
|
+
done
|
|
59
70
|
return 0
|
|
60
71
|
}
|
|
61
72
|
|
|
@@ -5,8 +5,11 @@ const os = require('os');
|
|
|
5
5
|
const { isMainThread } = require('node:worker_threads');
|
|
6
6
|
const { classifySqliteError } = require('./lib/sqlite-driver');
|
|
7
7
|
const { reportRouteError, routeError, tagRouteValidationError } = require('./lib/route-error');
|
|
8
|
+
const { terminalDraftHttpStatus: _terminalDraftStatus } = require('./lib/terminal-draft-http-status');
|
|
8
9
|
// WP-2 (§9): the delivery-completion request projection lives with the image-protocol owners.
|
|
9
10
|
const { buildDraftDeliveryCompletionRequest } = require('./lib/terminal-draft-publication-api');
|
|
11
|
+
const remoteSessionForward = require('./lib/remote-session-forward'); // WP-3 (§6/D-1..D-3): an image-draft request for a MIRROR id is answered by the owning box
|
|
12
|
+
const { overlayQueueDraftStatuses } = require('./lib/queue-draft-status-overlay'); // R-1 (§5): the queue-draft GET overlays durable engine status, never writes
|
|
10
13
|
const db = require('./db-owner-client');
|
|
11
14
|
const queueEngine = require('./queue-engine');
|
|
12
15
|
const harvest = require('./prompt-harvest');
|
|
@@ -21,6 +24,9 @@ const { resolveWallePermissionV2 } = require('./lib/walle-permission-reply');
|
|
|
21
24
|
const claudeDesktopSessions = require('./lib/claude-desktop-sessions');
|
|
22
25
|
const desktopFork = require('./lib/desktop-fork');
|
|
23
26
|
const skillAutocomplete = require('./lib/skill-autocomplete');
|
|
27
|
+
// WP-9 (§9 S-9, AC-9d): the machine filter is applied HERE, on the main thread — the read pool runs
|
|
28
|
+
// the query in another process and holds none of the registry's in-memory machine state.
|
|
29
|
+
const skillAutocompleteQuery = require('./lib/skill-autocomplete-query');
|
|
24
30
|
const storageMigration = require('./lib/storage-migration');
|
|
25
31
|
const perfTracker = require('./lib/perf-tracker');
|
|
26
32
|
const { runSync } = perfTracker;
|
|
@@ -92,7 +98,16 @@ function _shouldLogWalleMigrationStep(sessionId, result = {}, nowMs = Date.now()
|
|
|
92
98
|
Number(result.sourceSize || 0),
|
|
93
99
|
]);
|
|
94
100
|
const prior = walleMigrationLogState.get(id);
|
|
95
|
-
|
|
101
|
+
// D-10 (docs/temp-file-leaks-disk-full-2026-10-25.html §5): a step that made no progress and whose
|
|
102
|
+
// disposition is already `complete` is a settled fact about the session, not a clock-driven event.
|
|
103
|
+
// Re-logging it every 5 minutes per session was 64% of ctm.log (605k lines in 26.8 d). Log it once
|
|
104
|
+
// per session per process: only when this session has no prior state, or the signature changed.
|
|
105
|
+
// Every other step keeps the 5-minute deferred repeat below.
|
|
106
|
+
if (!_walleMigrationMadeProgress(result)
|
|
107
|
+
&& String(result.action || '') === 'noop'
|
|
108
|
+
&& resolveMigrationDisposition(result) === MIGRATION_DISPOSITIONS.complete) {
|
|
109
|
+
if (prior?.signature === signature) return false;
|
|
110
|
+
} else if (prior?.signature === signature
|
|
96
111
|
&& nowMs - prior.loggedAtMs < WALLE_MIGRATION_DEFERRED_LOG_INTERVAL_MS) return false;
|
|
97
112
|
if (!prior && walleMigrationLogState.size >= WALLE_MIGRATION_LOG_STATE_LIMIT) {
|
|
98
113
|
walleMigrationLogState.delete(walleMigrationLogState.keys().next().value);
|
|
@@ -820,11 +835,22 @@ function handlePromptApi(req, res, url, deps = {}) {
|
|
|
820
835
|
// --- Images ---
|
|
821
836
|
if (p === '/api/images/upload' && m === 'POST') return handleUploadImage(req, res, url);
|
|
822
837
|
if (/^\/api\/sessions\/[^/]+\/image-drafts(?:\/[^/]+(?:\/content|\/delivery|\/freeze|\/submit|\/retry)?)?$/.test(p)) {
|
|
823
|
-
|
|
838
|
+
const route = _terminalDraftRoute(url); // WP-3: a MIRROR id is answered by the box; a local id takes the same-tick path
|
|
839
|
+
if (!route || !remoteSessionForward.isMirrorSessionRequest(req, url, route.sessionId)) return handleTerminalImageDraft(req, res, url);
|
|
840
|
+
return remoteSessionForward.maybeForwardSessionRequest(req, res, url, route.sessionId)
|
|
841
|
+
.then((forwarded) => (forwarded ? undefined : handleTerminalImageDraft(req, res, url)));
|
|
824
842
|
}
|
|
825
843
|
if (p === '/api/images/ingest-path' && m === 'POST') return handleIngestImagePath(req, res);
|
|
826
844
|
if (p === '/api/mobile/attachments/upload' && m === 'POST') return handleUploadMobileAttachment(req, res, url);
|
|
827
|
-
|
|
845
|
+
// R-1 (docs/composer-image-chip-stuck-submission-recovery-2026-10-30.html): session-scoped so a MIRROR id is answered by the box.
|
|
846
|
+
const imageRefsMatch = /^\/api\/sessions\/([^/]+)\/image-refs$/.exec(p);
|
|
847
|
+
if (imageRefsMatch && m === 'POST') {
|
|
848
|
+
let sessionId = '';
|
|
849
|
+
try { sessionId = decodeURIComponent(imageRefsMatch[1]); } catch { return jsonResponse(res, 400, { error: 'Invalid session id' }); }
|
|
850
|
+
if (!remoteSessionForward.isMirrorSessionRequest(req, url, sessionId)) return handleSessionImageRefs(req, res, sessionId);
|
|
851
|
+
return remoteSessionForward.maybeForwardSessionRequest(req, res, url, sessionId)
|
|
852
|
+
.then((forwarded) => (forwarded ? undefined : handleSessionImageRefs(req, res, sessionId)));
|
|
853
|
+
}
|
|
828
854
|
if (p.match(/^\/api\/images\/\d+$/) && m === 'GET') return handleGetImage(req, res, url);
|
|
829
855
|
if (p.match(/^\/api\/images\/\d+\/annotations$/) && m === 'PUT') return handleUpdateAnnotations(req, res, url);
|
|
830
856
|
if (p.match(/^\/api\/images\/\d+$/) && m === 'DELETE') return handleDeleteImage(req, res, url);
|
|
@@ -844,9 +870,9 @@ function handlePromptApi(req, res, url, deps = {}) {
|
|
|
844
870
|
if (p === '/api/permissions/log' && m === 'GET') return handleListPermLog(req, res, url);
|
|
845
871
|
|
|
846
872
|
// --- Session Conversations ---
|
|
847
|
-
if (p === '/api/conversations' && m === 'GET') return handleListConversations(req, res, url);
|
|
873
|
+
if (p === '/api/conversations' && m === 'GET') return (handleListConversations.fleet ||= require('./lib/fleet-session-lists').fleetRouted('GET /api/conversations', handleListConversations, require('./lib/fleet-conversation-route').conversationsFleetSpec))(req, res, url); // fleet WP-4, wrapped once
|
|
848
874
|
if (p === '/api/conversations/import' && m === 'POST') return handleImportConversations(req, res);
|
|
849
|
-
if (p.match(/^\/api\/conversations\/[a-f0-9-]+$/) && m === 'GET') return handleGetConversation(req, res, url);
|
|
875
|
+
if (p.match(/^\/api\/conversations\/[a-f0-9-]+$/) && m === 'GET') return (handleGetConversation.byMachine ||= require('./lib/remote-machine-proxy').machineRouted('GET /api/conversations/:id', handleGetConversation))(req, res, url); // fleet WP-4: ?machine= -> owner box
|
|
850
876
|
|
|
851
877
|
// --- Templates ---
|
|
852
878
|
if (p === '/api/templates' && m === 'GET') return handleListTemplates(req, res);
|
|
@@ -1466,26 +1492,6 @@ function _terminalDraftRoute(url) {
|
|
|
1466
1492
|
} catch { return null; }
|
|
1467
1493
|
}
|
|
1468
1494
|
|
|
1469
|
-
function _terminalDraftStatus(error) {
|
|
1470
|
-
if (!error) return 500;
|
|
1471
|
-
if (error.code === 'CTM_MAIN_DB_REQUEST_FORBIDDEN') return 501;
|
|
1472
|
-
if (error.code === 'CTM_OWNERSHIP_UNAVAILABLE' || error.code === 'CTM_DB_OWNER_UNAVAILABLE' ||
|
|
1473
|
-
error.code === 'CTM_MEDIA_JOURNAL_UNAVAILABLE') return 503;
|
|
1474
|
-
if (error.code === 'CTM_DRAFT_NOT_FOUND' || error.code === 'CTM_DRAFT_SESSION_NOT_FOUND') return 404;
|
|
1475
|
-
if (error.code === 'CTM_SESSION_OWNER_MISMATCH') return 409;
|
|
1476
|
-
if (error.code === 'CTM_DRAFT_REVISION_CONFLICT') return 412;
|
|
1477
|
-
// CTM_IMAGE_IDEMPOTENCY_CONFLICT is the legacy/mobile lanes' equivalent of the draft
|
|
1478
|
-
// lane's idempotency conflict (media-store requestId dedupe) — same 409 semantic
|
|
1479
|
-
// (WP-9 lane-parity: distinguishable from a malformed 400 without inspecting `code`).
|
|
1480
|
-
if (error.code === 'CTM_DRAFT_IDEMPOTENCY_CONFLICT' || error.code === 'CTM_IMAGE_IDEMPOTENCY_CONFLICT' ||
|
|
1481
|
-
error.code === 'CTM_DRAFT_DELIVERY_SUPERSEDED' ||
|
|
1482
|
-
error.code === 'CTM_DRAFT_DELIVERY_STATE') return 409;
|
|
1483
|
-
if (error.code === 'CTM_DRAFT_FROZEN' || error.code === 'CTM_DRAFT_REQUEST_CANCELLED') return 409;
|
|
1484
|
-
if (error.code === 'CTM_DRAFT_IMAGE_INVALID' || error.code === 'CTM_DRAFT_SESSION_REQUIRED' ||
|
|
1485
|
-
error.code === 'CTM_DRAFT_IDENTITY_INVALID' || error.code === 'CTM_DRAFT_DELIVERY_OUTCOME_INVALID') return 400;
|
|
1486
|
-
return 500;
|
|
1487
|
-
}
|
|
1488
|
-
|
|
1489
1495
|
function _imageFailureStatus(error, fallbackStatus = 500) {
|
|
1490
1496
|
const terminalStatus = _terminalDraftStatus(error);
|
|
1491
1497
|
if (terminalStatus !== 500 || fallbackStatus === 500) return terminalStatus;
|
|
@@ -1836,7 +1842,7 @@ async function handleUploadMobileAttachment(req, res, url) {
|
|
|
1836
1842
|
}
|
|
1837
1843
|
}
|
|
1838
1844
|
|
|
1839
|
-
async function handleSessionImageRefs(req, res) {
|
|
1845
|
+
async function handleSessionImageRefs(req, res, pathSessionId) {
|
|
1840
1846
|
try {
|
|
1841
1847
|
const body = await readBody(req, 256 * 1024);
|
|
1842
1848
|
// The media-write-behind draft store keeps terminal image drafts in its own
|
|
@@ -1847,7 +1853,13 @@ async function handleSessionImageRefs(req, res) {
|
|
|
1847
1853
|
// survive) and hand over a plain, pre-resolved Map so the resolver can bridge to it.
|
|
1848
1854
|
// Best-effort: falls through to the legacy SQL path unchanged when the draft service
|
|
1849
1855
|
// is unavailable (e.g. write-behind off) or a given attachment isn't a terminal draft.
|
|
1850
|
-
|
|
1856
|
+
// R-1: the PATH is the routing key; a body naming a different session is refused.
|
|
1857
|
+
const bodySessionId = String((body && (body.sessionId || body.session_id)) || '').trim();
|
|
1858
|
+
const routeSessionId = String(pathSessionId || '').trim();
|
|
1859
|
+
if (routeSessionId && bodySessionId && bodySessionId !== routeSessionId) {
|
|
1860
|
+
throw tagRouteValidationError(new Error('Session id in body does not match the route'), { status: 400, code: 'CTM_SESSION_IMAGE_REF_SESSION_MISMATCH' });
|
|
1861
|
+
}
|
|
1862
|
+
const sessionId = bodySessionId || routeSessionId;
|
|
1851
1863
|
const images = Array.isArray(body && body.images) ? body.images
|
|
1852
1864
|
: Array.isArray(body && body.attachments) ? body.attachments : [];
|
|
1853
1865
|
const mediaDrafts = new Map();
|
|
@@ -6891,7 +6903,9 @@ function mergeQueueDraftItemsByStatusTimestamp(existingItems, incomingItems) {
|
|
|
6891
6903
|
function handleGetQueueDraft(req, res, sessionId) {
|
|
6892
6904
|
const key = 'queue_draft_' + sessionId;
|
|
6893
6905
|
const draft = _getPublishedSetting(key, { items: [], mode: 'manual' });
|
|
6894
|
-
|
|
6906
|
+
// R-1 (§5): read-only projection. The engine is the authority for an item's
|
|
6907
|
+
// durable status; the stored snapshot is never rewritten on this route.
|
|
6908
|
+
jsonResponse(res, 200, overlayQueueDraftStatuses(draft, queueEngine.getItemStatusMap(sessionId)));
|
|
6895
6909
|
}
|
|
6896
6910
|
|
|
6897
6911
|
async function handleSaveQueueDraft(req, res, sessionId) {
|
|
@@ -8064,7 +8078,19 @@ async function handleSkillAutocomplete(req, res, url) {
|
|
|
8064
8078
|
const { rows } = await _readRequestControl('skillAutocomplete', {
|
|
8065
8079
|
cwd, agent, includeSessionSeen, query,
|
|
8066
8080
|
});
|
|
8067
|
-
|
|
8081
|
+
// WP-9 (§9 S-9, AC-9d): a session that runs on a REMOTE machine has its own skill list — the hub
|
|
8082
|
+
// drops what that box held back and adds what only that box has. A local/absent session reads a
|
|
8083
|
+
// null view and the rows cross untouched.
|
|
8084
|
+
// The box-only names it adds go back through the SAME query match and ranking a local request
|
|
8085
|
+
// gets, and the same 20-row cap, so a box name never appears for a query it does not match.
|
|
8086
|
+
const sessionId = url.searchParams.get('sessionId') || url.searchParams.get('session') || '';
|
|
8087
|
+
const view = skillAutocompleteQuery.machineSkillViewFor(sessionId);
|
|
8088
|
+
const list = Array.isArray(rows) ? rows : [];
|
|
8089
|
+
jsonResponse(res, 200, view
|
|
8090
|
+
? skillAutocomplete.filterAndSortSkillAutocompleteItems(
|
|
8091
|
+
skillAutocompleteQuery.applyMachineSkillView(list, view), query, agent || 'all',
|
|
8092
|
+
).slice(0, 20)
|
|
8093
|
+
: list);
|
|
8068
8094
|
} catch (e) { promptRouteError(res, e); }
|
|
8069
8095
|
}
|
|
8070
8096
|
|
|
@@ -13,21 +13,63 @@
|
|
|
13
13
|
|
|
14
14
|
const http = require('http');
|
|
15
15
|
const crypto = require('crypto');
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
16
18
|
const modelGeneration = require('../lib/env-flags').strFlag('CTM_MODEL_PROCESS_GENERATION', '');
|
|
17
19
|
|
|
18
|
-
// Only these routes can carry a notice back to the model (Claude hook stdout JSON).
|
|
19
|
-
|
|
20
|
+
// Only these routes can carry a notice back to the model (Claude hook stdout JSON). `stop` is
|
|
21
|
+
// here for RC-1 (docs/session-stops-mid-job-2026-10-24.html D-1): the Stop hook is answered
|
|
22
|
+
// synchronously so a lead that still owns a live worker is told to keep waiting.
|
|
23
|
+
const NOTICE_ROUTES = new Set(['PostToolUse', 'start', 'stop']);
|
|
20
24
|
|
|
21
25
|
// The hook stdout for a CTM response body: one JSON object when it carries notices, else ''.
|
|
26
|
+
// Against an OLD server that answers {"matched":true} there is no `notices` array, so nothing is
|
|
27
|
+
// printed (D-8, safe in either rollout order).
|
|
22
28
|
function formatHookOutput(responseText, hookEventName) {
|
|
23
29
|
let parsed;
|
|
24
30
|
try { parsed = JSON.parse(responseText); } catch { return ''; }
|
|
25
31
|
const notices = parsed && Array.isArray(parsed.notices) ? parsed.notices : [];
|
|
26
32
|
const texts = notices.map((n) => (n && typeof n.text === 'string' ? n.text : '')).filter(Boolean);
|
|
27
|
-
if (!texts.length ||
|
|
33
|
+
if (!texts.length || !['PostToolUse', 'UserPromptSubmit', 'Stop'].includes(hookEventName)) return '';
|
|
28
34
|
return JSON.stringify({ hookSpecificOutput: { hookEventName, additionalContext: texts.join('\n') } });
|
|
29
35
|
}
|
|
30
36
|
|
|
37
|
+
// A command that already declares its own lifetime somewhere on the line: an absolute, relative or
|
|
38
|
+
// quoted path to bounded.js followed by `--deadline-ms N` (whitespace or `=`). This is guidance for
|
|
39
|
+
// honest agents, not a security boundary — a command can always spell its way around a regex.
|
|
40
|
+
const BOUNDED_DEADLINE_RE = /bounded\.js['"]?\s+--deadline-ms(?:\s+|=)\d+/;
|
|
41
|
+
// Session-host/durable-jobs design D-8 (§6.4): bounded.js dies with the agent session, so a declared lifetime past
|
|
42
|
+
// 2 h belongs to bin/durable-job.js instead (its job is owned by the service manager, not by this session).
|
|
43
|
+
const DURABLE_THRESHOLD_MS = 7_200_000;
|
|
44
|
+
const BOUNDED_DEADLINE_VALUE_RE = /bounded\.js['"]?\s+--deadline-ms(?:\s+|=)(\d+)/;
|
|
45
|
+
|
|
46
|
+
// L1 declare (docs/background-gate-watchers-bounded-observation-2026-10-26.html §5 R1-R2, §6.3, §8
|
|
47
|
+
// WP-2): a Bash command launched with `run_in_background: true` must name its own lifetime, so there is
|
|
48
|
+
// always a clock its launcher chose. The decision is made here in the bridge rather than in CTM: it
|
|
49
|
+
// takes effect on the next hook invocation (no restart), it can name the absolute path of bounded.js
|
|
50
|
+
// for an agent whose cwd is another repo, and it fails open when bounded.js was never installed.
|
|
51
|
+
// Returns the deny reason, or null to allow (and print nothing).
|
|
52
|
+
function backgroundDeadlineDenial(hook, { boundedPath, boundedExists, durablePath, durableExists } = {}) {
|
|
53
|
+
if (!hook || typeof hook !== 'object' || Array.isArray(hook)) return null;
|
|
54
|
+
if (hook.hook_event_name !== 'PreToolUse' || hook.tool_name !== 'Bash') return null;
|
|
55
|
+
const input = hook.tool_input;
|
|
56
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return null;
|
|
57
|
+
if (input.run_in_background !== true) return null;
|
|
58
|
+
if (boundedExists !== true) return null;
|
|
59
|
+
if (BOUNDED_DEADLINE_RE.test(String(input.command || ''))) {
|
|
60
|
+
const long = BOUNDED_DEADLINE_VALUE_RE.exec(String(input.command || ''));
|
|
61
|
+
if (long && Number(long[1]) > DURABLE_THRESHOLD_MS && durableExists === true && durablePath) {
|
|
62
|
+
const durableShown = /\s/.test(String(durablePath)) ? `'${durablePath}'` : String(durablePath);
|
|
63
|
+
return 'A background job longer than 2 h must not live inside this agent session (a CTM restart or the agent process exiting kills it). '
|
|
64
|
+
+ `Launch it with: node ${durableShown} start --name <slug> --deadline-ms ${long[1]} -- <command> `
|
|
65
|
+
+ 'then wait with Monitor until the printed receipt= file exists.';
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const shown = /\s/.test(String(boundedPath)) ? `'${boundedPath}'` : String(boundedPath);
|
|
70
|
+
return `Background Bash commands must declare their own lifetime. Re-run it as: node ${shown} --deadline-ms <N> -- <command> (N = its honest worst case in ms, at most 86400000 = 24 h; e.g. 5400000 for a commit gate; use -- sh -c '<…>' for a compound command). Foreground commands are not affected.`;
|
|
71
|
+
}
|
|
72
|
+
|
|
31
73
|
function post(port, route, body, onResponse) {
|
|
32
74
|
const req = http.request({
|
|
33
75
|
hostname: 'localhost',
|
|
@@ -52,7 +94,7 @@ function post(port, route, body, onResponse) {
|
|
|
52
94
|
return req;
|
|
53
95
|
}
|
|
54
96
|
|
|
55
|
-
module.exports = { post, formatHookOutput };
|
|
97
|
+
module.exports = { post, formatHookOutput, backgroundDeadlineDenial };
|
|
56
98
|
|
|
57
99
|
if (require.main === module) {
|
|
58
100
|
const port = parseInt(process.argv[2], 10) || parseInt(process.env.CTM_PORT, 10);
|
|
@@ -128,6 +170,22 @@ if (require.main === module) {
|
|
|
128
170
|
prompt_head: hook.prompt == null ? undefined : String(hook.prompt).slice(0, 1024),
|
|
129
171
|
payload: parsed ? forwardedPayload(hook, stdin) : (stdin.trim() || undefined),
|
|
130
172
|
});
|
|
173
|
+
// The menu route (the `.*` PreToolUse matcher) refuses an explicit background Bash launch with no
|
|
174
|
+
// declared lifetime. The POST below is unchanged — still sent, its response still ignored.
|
|
175
|
+
if (route === 'menu') {
|
|
176
|
+
const boundedPath = path.resolve(__dirname, '..', '..', 'bin', 'bounded.js');
|
|
177
|
+
let boundedExists = false;
|
|
178
|
+
try { boundedExists = fs.existsSync(boundedPath); } catch { /* expected: a path we cannot stat means no wrapper to name, so the gate stays open */ }
|
|
179
|
+
const durablePath = path.resolve(__dirname, '..', '..', 'bin', 'durable-job.js');
|
|
180
|
+
let durableExists = false;
|
|
181
|
+
try { durableExists = fs.existsSync(durablePath); } catch { /* expected: an unstat-able durable-job.js means nothing to name, so the long-deadline gate stays open */ }
|
|
182
|
+
const reason = parsed ? backgroundDeadlineDenial(hook, { boundedPath, boundedExists, durablePath, durableExists }) : null;
|
|
183
|
+
if (reason) {
|
|
184
|
+
process.stdout.write(JSON.stringify({
|
|
185
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: reason },
|
|
186
|
+
}) + '\n');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
131
189
|
if (!NOTICE_ROUTES.has(route)) { post(port, route, body); return; }
|
|
132
190
|
post(port, route, body, (text) => {
|
|
133
191
|
const out = formatHookOutput(text, str(hook.hook_event_name));
|