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
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
// that produced `ansi` (one authority, one instant), reusing the exact normalizers the frame path
|
|
8
8
|
// (lib/state-sync/frame-emitter.js) already uses so both paths can only ever mint the same shape.
|
|
9
9
|
const { normalizeMouseTracking, normalizeMouseEncoding } = require('./state-sync/surface-mouse');
|
|
10
|
+
// WP-1 (remote-terminal-cursor-and-geometry-claim-relay-2026-10-27 D-1): the keyframe bootstrap
|
|
11
|
+
// body is the frame emitter's own repaint, so it is built from the SAME two modules the frame path
|
|
12
|
+
// uses -- one diff core, one empty-grid constant, no second implementation of either.
|
|
13
|
+
const { computeAnsiPatch } = require('./state-sync/cell-diff');
|
|
14
|
+
const { EMPTY_GRID } = require('./state-sync/frame-emitter');
|
|
10
15
|
|
|
11
16
|
// Cold terminal bootstrap is deliberately a standalone protocol. It neither
|
|
12
17
|
// carries activation ownership metadata nor shares the legacy keyframe shape.
|
|
@@ -251,6 +256,29 @@ function composeTerminalBootstrapResult(input) {
|
|
|
251
256
|
return _bounded(result);
|
|
252
257
|
}
|
|
253
258
|
|
|
259
|
+
// WP-1 (D-1/D-2): a repaint is not complete until the cursor is placed. This is the server-side
|
|
260
|
+
// twin of the client's frame rule (public/js/state-sync-client.js:938-942): CUP to the mirror's
|
|
261
|
+
// 1-based row/col, then DECTCEM ?25h/?25l for visibility. An absent cursor -- or a non-positive,
|
|
262
|
+
// non-integer row/col -- appends nothing, exactly the client's own guard, so a grid with no cursor
|
|
263
|
+
// mints byte-identical bytes and this can never invent a position the mirror did not state.
|
|
264
|
+
function appendBootstrapCursor(bodyAnsi, cursor) {
|
|
265
|
+
if (!cursor || typeof cursor !== 'object') return bodyAnsi;
|
|
266
|
+
const row = cursor.row;
|
|
267
|
+
const col = cursor.col;
|
|
268
|
+
if (!Number.isInteger(row) || row <= 0 || !Number.isInteger(col) || col <= 0) return bodyAnsi;
|
|
269
|
+
return bodyAnsi + '\x1b[' + row + ';' + col + 'H' + (cursor.visible === false ? '\x1b[?25l' : '\x1b[?25h');
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// The keyframe bootstrap ansi: the full-viewport repaint (CUP+SGR0+EL2 per row, no RIS/ESC[3J) with
|
|
273
|
+
// the cursor tail appended from the SAME grid object the body was computed from -- one extract, one
|
|
274
|
+
// instant (D-1), so the body and the tail can never describe two different frames.
|
|
275
|
+
function keyframeBootstrapAnsi(grid) {
|
|
276
|
+
return appendBootstrapCursor(
|
|
277
|
+
computeAnsiPatch(EMPTY_GRID, grid, { keyframe: true }).ansi,
|
|
278
|
+
grid && grid.cursor,
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
254
282
|
module.exports = {
|
|
255
283
|
MAX_TERMINAL_BOOTSTRAP_BYTES,
|
|
256
284
|
parseTerminalBootstrapRequest,
|
|
@@ -259,4 +287,6 @@ module.exports = {
|
|
|
259
287
|
parseTerminalBootstrapFlushComplete,
|
|
260
288
|
composeTerminalBootstrapResult,
|
|
261
289
|
truncateBootstrapAnsi,
|
|
290
|
+
appendBootstrapCursor,
|
|
291
|
+
keyframeBootstrapAnsi,
|
|
262
292
|
};
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Landing-throughput WP-6 shard S13 (design doc §5 D-10 "move-only", §6 "Shard module
|
|
4
|
+
// seam"): the terminal draft-operation cluster (_runTerminalDraftOperation plus its two private
|
|
5
|
+
// helpers _runLegacyTerminalDraftDbAction and _publishCommittedDraft) moves out of server.js
|
|
6
|
+
// VERBATIM into this module behind the same configure(deps) seam as lib/api/session-attach.js
|
|
7
|
+
// and lib/terminal-attach-geometry.js (S6), lib/walle-history-serve.js (S8),
|
|
8
|
+
// lib/codex-rollout-history.js (S9), lib/terminal-input-prepared.js (S10), lib/idle-notify.js
|
|
9
|
+
// (S11) and lib/session-park.js (S12). It registers NO route and NO socket handler: server.js
|
|
10
|
+
// keeps the pass-through call sites as terminalDraftOperation.<fn>(...), the module-init
|
|
11
|
+
// `setTerminalDraftRunner(terminalDraftOperation._runTerminalDraftOperation)` statement and
|
|
12
|
+
// this configure() seam. Bodies are identical to the server.js declarations except for the
|
|
13
|
+
// `_deps.` prefix on every identifier that used to resolve to a server.js top-level binding
|
|
14
|
+
// (D-10 rule 1), proven by `node bin/move-only-check.js`.
|
|
15
|
+
//
|
|
16
|
+
// The module deliberately lives at lib/terminal-draft-operation.js and NOT under lib/ws/: this is
|
|
17
|
+
// the terminal image-draft store lane, not a ws-router handler.
|
|
18
|
+
//
|
|
19
|
+
// Injected deps, per function:
|
|
20
|
+
// _runLegacyTerminalDraftDbAction: _legacyDraftCancellationRecovery, _runCtmDbWorkerOp
|
|
21
|
+
// _publishCommittedDraft: _draftPublicationAuthorityAdmits, _mediaStore, _publishDraftSnapshot, draftReceiptPublication
|
|
22
|
+
// _runTerminalDraftOperation: MUTATING_DRAFT_OPS, _assertTerminalDraftOwnerAsync, _attachmentTimeline, _imageWriteProofs, _mediaStore, _mediaWriteBehindEnabled, _notePurgedDraftsInMediaStore, _prepareMediaStore, _releaseDraftPublicationOwnership, dbModule, fs, imageDeliveryReconciler, recordSessionDiagnostic, runLegacyDraftRequestCancellation, sanitizeTerminalImageDiagnostic, submittedAttachmentReference
|
|
23
|
+
//
|
|
24
|
+
// Mutable module state (D-10 rule 2 / S9 lesson 7): _mediaStore, _imageWriteProofs and
|
|
25
|
+
// imageDeliveryReconciler are server.js `let`s reassigned during boot/restore (the reconciler is
|
|
26
|
+
// constructed near the bottom of server.js), so each is injected as a GETTER -- never copied. No
|
|
27
|
+
// moved body ASSIGNS a server.js top-level binding, so this seam carries no get/set pair. Every
|
|
28
|
+
// other dep is a by-value reference. Calls between the three moved functions stay direct (no
|
|
29
|
+
// `_deps.`).
|
|
30
|
+
|
|
31
|
+
let _deps = null;
|
|
32
|
+
|
|
33
|
+
function configure(deps = {}) {
|
|
34
|
+
_deps = deps;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function _runTerminalDraftOperation(op, payload) {
|
|
38
|
+
// WP-1 (§6.4): while a session is being retired, new deliveries/mutations for its drafts are
|
|
39
|
+
// fenced. Reads (list/content/internal/diagnostic) stay available so the client can converge.
|
|
40
|
+
if (_deps.MUTATING_DRAFT_OPS.has(op) && _deps._mediaStore?.isSessionRetiring?.(payload.sessionId)) {
|
|
41
|
+
throw Object.assign(new Error('Image drafts for this session are being retired'), {
|
|
42
|
+
code: 'CTM_DRAFT_SESSION_RETIRING', status: 409,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (op === 'purge-if-unreferenced') {
|
|
46
|
+
await _deps._assertTerminalDraftOwnerAsync(payload.sessionId);
|
|
47
|
+
const reference = await _deps.submittedAttachmentReference(
|
|
48
|
+
_deps.dbModule.SESSION_IMAGES_DIR, payload.sessionId, payload.attachmentId,
|
|
49
|
+
);
|
|
50
|
+
if (reference.referenced) return { purged: false, reason: reference.reason };
|
|
51
|
+
let result;
|
|
52
|
+
if (_deps._mediaWriteBehindEnabled) {
|
|
53
|
+
const store = await _deps._prepareMediaStore();
|
|
54
|
+
result = await store.purgeDraft(payload);
|
|
55
|
+
} else {
|
|
56
|
+
result = await _runLegacyTerminalDraftDbAction('purgeTerminalDraftImage', [
|
|
57
|
+
payload.sessionId, payload.attachmentId, payload,
|
|
58
|
+
]);
|
|
59
|
+
if (result && result.deleted !== false) _deps._notePurgedDraftsInMediaStore(payload.attachmentId);
|
|
60
|
+
}
|
|
61
|
+
// WP-2 (§6.5): a permanent deletion releases publication ownership — the hint counter, the
|
|
62
|
+
// write evidence and the pending watermark for this attachment are dropped, so a replayed
|
|
63
|
+
// older callback can neither resurrect it nor decorate a future id (ids are never reused).
|
|
64
|
+
if (result && result.deleted !== false) {
|
|
65
|
+
_deps._releaseDraftPublicationOwnership({ sessionId: payload.sessionId, attachmentId: payload.attachmentId });
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
purged: result && result.deleted !== false,
|
|
69
|
+
reason: result && result.deleted === false ? 'not_found' : 'purged',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (_deps._mediaWriteBehindEnabled) {
|
|
73
|
+
const store = await _deps._prepareMediaStore();
|
|
74
|
+
if (op === 'create') {
|
|
75
|
+
const item = await store.createDraft(payload);
|
|
76
|
+
_deps.recordSessionDiagnostic(payload.sessionId, 'image-draft-created', {
|
|
77
|
+
attachmentId: item.attachmentId,
|
|
78
|
+
provider: item.provider,
|
|
79
|
+
ordinal: item.ordinal,
|
|
80
|
+
revision: item.revision,
|
|
81
|
+
});
|
|
82
|
+
_deps._attachmentTimeline.onCreated({
|
|
83
|
+
sessionId: payload.sessionId, attachmentId: item.attachmentId, provider: item.provider, ordinal: item.ordinal,
|
|
84
|
+
});
|
|
85
|
+
// WP-2 (§9 server.js create nudge): publish the committed create receipt (complete identity +
|
|
86
|
+
// clientRequestId + lifecycle version) BEFORE the HTTP 201 can be observed, so a client that
|
|
87
|
+
// retains an early publication can correlate it with the response that identifies it.
|
|
88
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
89
|
+
if (_deps.imageDeliveryReconciler) _deps.imageDeliveryReconciler.nudge(payload.sessionId);
|
|
90
|
+
return item;
|
|
91
|
+
}
|
|
92
|
+
if (op === 'apply') {
|
|
93
|
+
const item = await store.applyDraft(payload);
|
|
94
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
95
|
+
return item;
|
|
96
|
+
}
|
|
97
|
+
if (op === 'cancel-request') return store.cancelDraftRequest(payload);
|
|
98
|
+
if (op === 'purge') {
|
|
99
|
+
const purged = await store.purgeDraft(payload);
|
|
100
|
+
// WP-2 (§6.5): a committed permanent deletion releases publication ownership for the id.
|
|
101
|
+
if (purged && purged.deleted !== false) {
|
|
102
|
+
_deps._releaseDraftPublicationOwnership({ sessionId: payload.sessionId, attachmentId: payload.attachmentId });
|
|
103
|
+
}
|
|
104
|
+
return purged;
|
|
105
|
+
}
|
|
106
|
+
if (op === 'list') {
|
|
107
|
+
const recovered = await store.reconcileStaleDrafts(payload.sessionId);
|
|
108
|
+
for (const item of recovered) {
|
|
109
|
+
_deps.recordSessionDiagnostic(payload.sessionId, 'image-orphaned', {
|
|
110
|
+
attachmentId: item.attachmentId, priorState: 'stranded', reason: item.stateReason,
|
|
111
|
+
});
|
|
112
|
+
_deps._attachmentTimeline.onTerminal({
|
|
113
|
+
sessionId: payload.sessionId, attachmentId: item.attachmentId, outcome: 'orphaned', reason: item.stateReason || 'stranded',
|
|
114
|
+
});
|
|
115
|
+
// WP-2 (§9 recovery): a recovery transition is published from its own committed receipt,
|
|
116
|
+
// like every other state change — never inferred by the client from a later list read.
|
|
117
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
118
|
+
}
|
|
119
|
+
return store.listDrafts(payload.sessionId);
|
|
120
|
+
}
|
|
121
|
+
if (op === 'internal') return store.getDraftInternal(payload.sessionId, payload.attachmentId);
|
|
122
|
+
if (op === 'state') {
|
|
123
|
+
const item = await store.setDraftState(payload);
|
|
124
|
+
const event = payload.state === 'submitted' ? 'image-submit'
|
|
125
|
+
: (payload.state === 'orphaned' ? 'image-orphaned' : 'image-client-evidence');
|
|
126
|
+
_deps.recordSessionDiagnostic(payload.sessionId, event, {
|
|
127
|
+
attachmentId: payload.attachmentId, state: payload.state, reason: item.stateReason || '',
|
|
128
|
+
});
|
|
129
|
+
if (payload.state === 'orphaned') {
|
|
130
|
+
_deps._attachmentTimeline.onTerminal({
|
|
131
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: 'orphaned', reason: item.stateReason || '',
|
|
132
|
+
});
|
|
133
|
+
} else if (payload.state === 'submitted') {
|
|
134
|
+
_deps._attachmentTimeline.onTerminal({
|
|
135
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: 'submitted', reason: 'prompt_submitted',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// WP-2 (§9): a public state mutation (freeze/submit/orphan/ready-retry) publishes the
|
|
139
|
+
// committed snapshot, so list restore and WS adoption carry the same canonical projection
|
|
140
|
+
// and real stateVersion the HTTP response carries.
|
|
141
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
142
|
+
// A retry (failed -> ready) needs its own nudge -- unlike a fresh paste, nothing else
|
|
143
|
+
// notifies the reconciler this draft became deliverable again.
|
|
144
|
+
if (payload.state === 'ready' && _deps.imageDeliveryReconciler) _deps.imageDeliveryReconciler.nudge(payload.sessionId);
|
|
145
|
+
return item;
|
|
146
|
+
}
|
|
147
|
+
if (op === 'delivery-complete') {
|
|
148
|
+
const item = await store.completeDraftDelivery(payload);
|
|
149
|
+
// The reconciler's own exhausted-retry path (lib/image-delivery-reconciler.js 'fail'
|
|
150
|
+
// action) completes with outcome:'failed', reason:'ack_timeout' -- NOT the legacy
|
|
151
|
+
// client-driven outcome:'unconfirmed' this ternary originally covered. Without the
|
|
152
|
+
// reason check, that genuine ack-timeout was silently mis-bucketed as the generic
|
|
153
|
+
// 'image-client-evidence', hiding it from anything (tests, UI) that looks for
|
|
154
|
+
// 'image-ack-timeout' specifically. Other outcome:'failed' reasons (e.g. a PTY write
|
|
155
|
+
// error starting delivery) still fall through to 'image-client-evidence'.
|
|
156
|
+
const diagnostic = _deps.sanitizeTerminalImageDiagnostic({
|
|
157
|
+
event: payload.outcome === 'attached' ? 'image-ack-confirmed'
|
|
158
|
+
: (payload.outcome === 'unconfirmed' || payload.reason === 'ack_timeout' ? 'image-ack-timeout' : 'image-client-evidence'),
|
|
159
|
+
attachmentId: payload.attachmentId,
|
|
160
|
+
details: payload,
|
|
161
|
+
});
|
|
162
|
+
_deps.recordSessionDiagnostic(payload.sessionId, diagnostic.event, {
|
|
163
|
+
attachmentId: diagnostic.attachmentId,
|
|
164
|
+
...diagnostic.details,
|
|
165
|
+
});
|
|
166
|
+
// WP-7: exactly one image-timeline row per attachment, at the FIRST terminal outcome
|
|
167
|
+
// it reaches (onTerminal is idempotent-per-attachmentId — see lib/image-attachment-timeline.js).
|
|
168
|
+
_deps._attachmentTimeline.onTerminal({
|
|
169
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: payload.outcome,
|
|
170
|
+
reason: payload.reason || '', ackSource: payload.ackSource || '',
|
|
171
|
+
});
|
|
172
|
+
// WP-2 (§9 attached/unconfirmed/failed): the completion receipt is the canonical snapshot for
|
|
173
|
+
// this transition. A rejected completion throws before this point, so a failure can never be
|
|
174
|
+
// published as a success.
|
|
175
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
176
|
+
// Unconfirmed retains its attempt and can still receive a late real-write ACK.
|
|
177
|
+
if (_deps._imageWriteProofs && item.state !== 'unconfirmed') _deps._imageWriteProofs.release(payload.sessionId, payload.attachmentId);
|
|
178
|
+
return item;
|
|
179
|
+
}
|
|
180
|
+
if (op === 'delivery-begin') return store.beginDraftDelivery(payload);
|
|
181
|
+
if (op === 'content') return store.getDraftContent(payload.sessionId, payload.attachmentId);
|
|
182
|
+
}
|
|
183
|
+
if (op === 'cancel-request') return _deps.runLegacyDraftRequestCancellation(payload.sessionId, payload.requestId, {
|
|
184
|
+
assertOwnerAsync: _deps._assertTerminalDraftOwnerAsync, runLegacyDbAction: _runLegacyTerminalDraftDbAction,
|
|
185
|
+
});
|
|
186
|
+
if (op !== 'diagnostic') await _deps._assertTerminalDraftOwnerAsync(payload.sessionId);
|
|
187
|
+
if (op === 'create') {
|
|
188
|
+
const item = await _runLegacyTerminalDraftDbAction('createTerminalDraftImage', [payload]);
|
|
189
|
+
_deps.recordSessionDiagnostic(payload.sessionId, 'image-draft-created', {
|
|
190
|
+
attachmentId: item.attachmentId,
|
|
191
|
+
provider: item.provider,
|
|
192
|
+
ordinal: item.ordinal,
|
|
193
|
+
revision: item.revision,
|
|
194
|
+
});
|
|
195
|
+
// WP-2 (§9, both lanes): the legacy per-operation lane publishes its committed receipts through
|
|
196
|
+
// the SAME publication owner as the media-store lane — same canonical projection, same
|
|
197
|
+
// stateVersion, same correlation identity.
|
|
198
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
199
|
+
_deps._attachmentTimeline.onCreated({
|
|
200
|
+
sessionId: payload.sessionId, attachmentId: item.attachmentId, provider: item.provider, ordinal: item.ordinal,
|
|
201
|
+
});
|
|
202
|
+
if (_deps.imageDeliveryReconciler) _deps.imageDeliveryReconciler.nudge(payload.sessionId);
|
|
203
|
+
return item;
|
|
204
|
+
}
|
|
205
|
+
if (op === 'apply') {
|
|
206
|
+
const item = await _runLegacyTerminalDraftDbAction('applyTerminalDraftImage', [payload]);
|
|
207
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
208
|
+
return item;
|
|
209
|
+
}
|
|
210
|
+
if (op === 'purge') {
|
|
211
|
+
const purged = await _runLegacyTerminalDraftDbAction('purgeTerminalDraftImage', [
|
|
212
|
+
payload.sessionId, payload.attachmentId, payload,
|
|
213
|
+
]);
|
|
214
|
+
if (purged && purged.deleted !== false) _deps._notePurgedDraftsInMediaStore(payload.attachmentId);
|
|
215
|
+
if (purged && purged.deleted !== false) {
|
|
216
|
+
_deps._releaseDraftPublicationOwnership({ sessionId: payload.sessionId, attachmentId: payload.attachmentId });
|
|
217
|
+
}
|
|
218
|
+
return purged;
|
|
219
|
+
}
|
|
220
|
+
if (op === 'list') {
|
|
221
|
+
const recovered = await _runLegacyTerminalDraftDbAction(
|
|
222
|
+
'reconcileStaleTerminalDraftImages', [{ sessionId: payload.sessionId }],
|
|
223
|
+
);
|
|
224
|
+
for (const item of recovered) {
|
|
225
|
+
_deps.recordSessionDiagnostic(payload.sessionId, 'image-orphaned', {
|
|
226
|
+
attachmentId: item.attachmentId, priorState: 'stranded', reason: item.stateReason,
|
|
227
|
+
});
|
|
228
|
+
_deps._attachmentTimeline.onTerminal({
|
|
229
|
+
sessionId: payload.sessionId, attachmentId: item.attachmentId, outcome: 'orphaned', reason: item.stateReason || 'stranded',
|
|
230
|
+
});
|
|
231
|
+
// WP-2 (§9 recovery, both lanes): a recovery transition publishes its own committed receipt.
|
|
232
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
233
|
+
}
|
|
234
|
+
return _runLegacyTerminalDraftDbAction('listTerminalDraftImages', [payload.sessionId]);
|
|
235
|
+
}
|
|
236
|
+
if (op === 'state') {
|
|
237
|
+
const item = await _runLegacyTerminalDraftDbAction('setTerminalDraftImageState', [
|
|
238
|
+
payload.sessionId, payload.attachmentId, payload.state, payload,
|
|
239
|
+
]);
|
|
240
|
+
const event = payload.state === 'submitted' ? 'image-submit'
|
|
241
|
+
: (payload.state === 'orphaned' ? 'image-orphaned' : 'image-client-evidence');
|
|
242
|
+
_deps.recordSessionDiagnostic(payload.sessionId, event, {
|
|
243
|
+
attachmentId: payload.attachmentId, state: payload.state, reason: item.stateReason || '',
|
|
244
|
+
});
|
|
245
|
+
if (payload.state === 'orphaned') {
|
|
246
|
+
_deps._attachmentTimeline.onTerminal({
|
|
247
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: 'orphaned', reason: item.stateReason || '',
|
|
248
|
+
});
|
|
249
|
+
} else if (payload.state === 'submitted') {
|
|
250
|
+
_deps._attachmentTimeline.onTerminal({
|
|
251
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: 'submitted', reason: 'prompt_submitted',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
// WP-2 (§9): a public state mutation (freeze/submit/orphan/ready-retry) publishes the committed
|
|
255
|
+
// snapshot in this lane too.
|
|
256
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
257
|
+
if (payload.state === 'ready' && _deps.imageDeliveryReconciler) _deps.imageDeliveryReconciler.nudge(payload.sessionId);
|
|
258
|
+
return item;
|
|
259
|
+
}
|
|
260
|
+
if (op === 'delivery-complete') {
|
|
261
|
+
const item = await _runLegacyTerminalDraftDbAction('completeTerminalDraftImageDelivery', [
|
|
262
|
+
payload.sessionId, payload.attachmentId, payload.attemptId, payload.outcome, payload,
|
|
263
|
+
]);
|
|
264
|
+
// See the matching comment in the media-write-behind branch above: the reconciler's own
|
|
265
|
+
// exhausted-retry path completes with outcome:'failed', reason:'ack_timeout', which also
|
|
266
|
+
// needs to surface as 'image-ack-timeout' here, not just the legacy 'unconfirmed' outcome.
|
|
267
|
+
const diagnostic = _deps.sanitizeTerminalImageDiagnostic({
|
|
268
|
+
event: payload.outcome === 'attached' ? 'image-ack-confirmed' :
|
|
269
|
+
(payload.outcome === 'unconfirmed' || payload.reason === 'ack_timeout' ? 'image-ack-timeout' : 'image-client-evidence'),
|
|
270
|
+
attachmentId: payload.attachmentId,
|
|
271
|
+
details: {
|
|
272
|
+
attachmentId: payload.attachmentId,
|
|
273
|
+
attemptId: payload.attemptId,
|
|
274
|
+
outcome: payload.outcome,
|
|
275
|
+
providerOrdinal: payload.providerOrdinal || 0,
|
|
276
|
+
source: payload.ackSource || '',
|
|
277
|
+
elapsedMs: Number(payload.elapsedMs || 0),
|
|
278
|
+
reason: payload.reason || '',
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
_deps.recordSessionDiagnostic(payload.sessionId, diagnostic.event, {
|
|
282
|
+
attachmentId: diagnostic.attachmentId,
|
|
283
|
+
...diagnostic.details,
|
|
284
|
+
});
|
|
285
|
+
_deps._attachmentTimeline.onTerminal({
|
|
286
|
+
sessionId: payload.sessionId, attachmentId: payload.attachmentId, outcome: payload.outcome,
|
|
287
|
+
reason: payload.reason || '', ackSource: payload.ackSource || '',
|
|
288
|
+
});
|
|
289
|
+
await _publishCommittedDraft(payload.sessionId, item);
|
|
290
|
+
// Unconfirmed retains its attempt and can still receive a late real-write ACK.
|
|
291
|
+
if (_deps._imageWriteProofs && item.state !== 'unconfirmed') _deps._imageWriteProofs.release(payload.sessionId, payload.attachmentId);
|
|
292
|
+
return item;
|
|
293
|
+
}
|
|
294
|
+
if (op === 'delivery-begin') {
|
|
295
|
+
return _runLegacyTerminalDraftDbAction('beginTerminalDraftImageDelivery', [
|
|
296
|
+
payload.sessionId, payload.attachmentId, payload.attemptId, payload,
|
|
297
|
+
]);
|
|
298
|
+
}
|
|
299
|
+
if (op === 'diagnostic') {
|
|
300
|
+
const clean = _deps.sanitizeTerminalImageDiagnostic(payload);
|
|
301
|
+
_deps.recordSessionDiagnostic(payload.sessionId, clean.event, {
|
|
302
|
+
attachmentId: clean.attachmentId,
|
|
303
|
+
...clean.details,
|
|
304
|
+
clientMetrics: clean.metrics,
|
|
305
|
+
});
|
|
306
|
+
return { accepted: true };
|
|
307
|
+
}
|
|
308
|
+
if (op === 'content') {
|
|
309
|
+
const item = await _runLegacyTerminalDraftDbAction('getTerminalDraftImageInternal', [
|
|
310
|
+
payload.sessionId, payload.attachmentId,
|
|
311
|
+
]);
|
|
312
|
+
if (!item) return null;
|
|
313
|
+
return { buffer: await _deps.fs.promises.readFile(item.workingPath), mimeType: item.mimeType, etag: item.etag };
|
|
314
|
+
}
|
|
315
|
+
if (op === 'internal') {
|
|
316
|
+
return _runLegacyTerminalDraftDbAction('getTerminalDraftImageInternal', [
|
|
317
|
+
payload.sessionId, payload.attachmentId,
|
|
318
|
+
]);
|
|
319
|
+
}
|
|
320
|
+
throw new Error(`Unknown terminal draft operation: ${String(op || '')}`);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function _runLegacyTerminalDraftDbAction(action, args) {
|
|
324
|
+
await _deps._legacyDraftCancellationRecovery.prepare();
|
|
325
|
+
return _deps._runCtmDbWorkerOp('runDbMutation', { action, args }, {
|
|
326
|
+
priority: 'urgent',
|
|
327
|
+
requestClass: 'user-blocking',
|
|
328
|
+
timeoutMs: 10_000,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// WP-2 (§6/§6.3, D8): publish one COMMITTED draft mutation receipt — the exact projection the store
|
|
333
|
+
// just returned from its own commit, never a locally re-assembled patch. A receipt that is missing
|
|
334
|
+
// identity/lifecycle version is classified and dropped by the publication owner instead of being
|
|
335
|
+
// guessed at, and a failed/rejected mutation never reaches this function (it throws instead).
|
|
336
|
+
// Called before the mutation's HTTP/WS reply so a client can correlate the publication with the
|
|
337
|
+
// response it is about to receive (D1's correlation ID travels on every publication).
|
|
338
|
+
async function _publishCommittedDraft(sessionId, receipt) {
|
|
339
|
+
// The "is this a publishable committed receipt" decision is shared with the legacy lane
|
|
340
|
+
// (draftReceiptPublication), so both lanes cannot drift apart.
|
|
341
|
+
const publication = _deps.draftReceiptPublication(receipt);
|
|
342
|
+
if (!publication) return { published: false, reason: 'no-receipt' };
|
|
343
|
+
if (!_deps._mediaStore) {
|
|
344
|
+
const admitted = await _deps._draftPublicationAuthorityAdmits({
|
|
345
|
+
sessionId, attachmentId: publication.attachmentId, snapshot: receipt,
|
|
346
|
+
});
|
|
347
|
+
if (!admitted) return { published: false, reason: 'not-admitted' };
|
|
348
|
+
}
|
|
349
|
+
return _deps._publishDraftSnapshot(sessionId, publication.attachmentId, publication.kind, receipt, publication.hint);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
module.exports = {
|
|
353
|
+
configure,
|
|
354
|
+
_runTerminalDraftOperation,
|
|
355
|
+
_runLegacyTerminalDraftDbAction,
|
|
356
|
+
_publishCommittedDraft,
|
|
357
|
+
};
|
|
@@ -8,6 +8,22 @@ function decideRawTerminalInput(facts = {}) {
|
|
|
8
8
|
return { allowed: true, reason: null };
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
// WP-1 (live-defer-wake-adopted-host-death-2026-10-28.html §5 R-1/R-2): a raw keystroke to a
|
|
12
|
+
// session whose process died under an open tab must take the deferred wake, not the raw-input
|
|
13
|
+
// pty_unavailable refusal. Pure predicate so the server's rejected-admission branch and the
|
|
14
|
+
// existing deferred-wake branch share ONE rule. It is deliberately narrow: only a genuine
|
|
15
|
+
// pty_unavailable rejection on a WRITABLE socket wakes. decideRawTerminalInput reports
|
|
16
|
+
// pty-unavailable ahead of read-only (its ptyAlive check precedes readOnly), so a read-only
|
|
17
|
+
// viewer's keystroke on a deferred session would otherwise be indistinguishable from the owner's
|
|
18
|
+
// -- and a read-only viewer must never respawn a session. Parking keeps its own hold + refusal.
|
|
19
|
+
function shouldWakeDeferredOnRawInput({ rawTerminalInput, rejectionReason, readOnly, restoreDeferred, parking }) {
|
|
20
|
+
return rawTerminalInput === true
|
|
21
|
+
&& rejectionReason === 'pty_unavailable'
|
|
22
|
+
&& readOnly !== true
|
|
23
|
+
&& restoreDeferred === true
|
|
24
|
+
&& parking !== true;
|
|
25
|
+
}
|
|
26
|
+
|
|
11
27
|
function terminalInputAdmissionFacts(session, msg, getProcessGeneration) {
|
|
12
28
|
const expectedResumeGeneration = Number(session?._launchPlanGeneration || 0);
|
|
13
29
|
const expectedProcessGeneration = typeof getProcessGeneration === 'function'
|
|
@@ -22,4 +38,4 @@ function terminalInputAdmissionFacts(session, msg, getProcessGeneration) {
|
|
|
22
38
|
};
|
|
23
39
|
}
|
|
24
40
|
|
|
25
|
-
module.exports = { decideRawTerminalInput, terminalInputAdmissionFacts };
|
|
41
|
+
module.exports = { decideRawTerminalInput, terminalInputAdmissionFacts, shouldWakeDeferredOnRawInput };
|