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
|
@@ -34,6 +34,10 @@ const { ensureApprovalDecisionColumns } = require('./lib/approval-decision-colum
|
|
|
34
34
|
// workers/read-pool-worker.js's 'wallePermissionReconcileRead' case.
|
|
35
35
|
const { queryNonTerminalPtyRuntimeApprovals, queryForwardingWallePermissionResolutions } = require('./lib/walle-permission-reconcile-query');
|
|
36
36
|
const fs = require('fs');
|
|
37
|
+
// D-5 (docs/temp-file-leaks-disk-full-2026-10-25.html §5): one SQLite destination is a file SET —
|
|
38
|
+
// the base plus its -journal/-wal/-shm sidecars. Every backup and live-copy writer reclaims the
|
|
39
|
+
// whole set when it throws, so no orphan sidecar (or base) survives a failed write.
|
|
40
|
+
const { removeSqliteFileSet } = require('./lib/sqlite-file-set');
|
|
37
41
|
const crypto = require('crypto');
|
|
38
42
|
const os = require('os');
|
|
39
43
|
const zlib = require('zlib');
|
|
@@ -43,6 +47,10 @@ const { reapGhostRows, agentRowGhostVerdict } = require('./lib/session-identity-
|
|
|
43
47
|
const conversationSourceRegistry = require('./lib/conversation-source-registry');
|
|
44
48
|
const conversationCommitKernel = require('./lib/conversation-commit-kernel');
|
|
45
49
|
const conversationStoreV2 = require('./lib/conversation-store-v2');
|
|
50
|
+
// join-sync-followups-2 WP-4: the clock's identity seam (it cannot import instance-identity-access; see its header).
|
|
51
|
+
require('./lib/conversation-item-clock').setConversationInstanceIdResolver(() => {
|
|
52
|
+
try { return getCurrentHostedInstanceIdStrict(); } catch { /* expected: identity not readable yet (pre-initDb / bare fixture) — the clock keeps origin '' rather than mislabelling */ return ''; }
|
|
53
|
+
});
|
|
46
54
|
const walleHistoryCutoverV2 = require('./lib/walle-history-cutover-v2');
|
|
47
55
|
const { createReviewReposStore } = require('./lib/storage/review-repos-store');
|
|
48
56
|
const { insertResumeLineage } = require('./lib/storage/resume-lineage-store');
|
|
@@ -172,6 +180,8 @@ const {
|
|
|
172
180
|
} = require('../shared/db-migration-runner');
|
|
173
181
|
// WP-3a (§6.15): pure release schema authority — data + pure functions, no app/native dependency.
|
|
174
182
|
const { assertMigrationRegistry } = require('../shared/release-contract');
|
|
183
|
+
// Backup retention policy shared with Wall-E (design: docs/backup-retention-days-setting-2026-10-31.html).
|
|
184
|
+
const backupRetention = require('../shared/backup-retention');
|
|
175
185
|
|
|
176
186
|
let dbErrorSink = createErrorSink({ name: 'db' });
|
|
177
187
|
function setErrorSink(sink) {
|
|
@@ -300,13 +310,17 @@ function _pathIsWithin(candidate, parent) {
|
|
|
300
310
|
}
|
|
301
311
|
|
|
302
312
|
function _assertDevDbPathIsNotPrimary(dbPath) {
|
|
303
|
-
if (
|
|
313
|
+
if (require('./lib/env-flags').boolFlag('CTM_ALLOW_PRIMARY_DB', false)) return;
|
|
314
|
+
// 2026-10-31: unmerged branch code (a linked git worktree) must never open -- and so never migrate --
|
|
315
|
+
// the primary DB; see shared/linked-worktree.js. A primary or npm install is never a linked worktree.
|
|
316
|
+
const linkedWorktree = require('../shared/linked-worktree').isLinkedWorktreeCheckout(__dirname);
|
|
317
|
+
if (!process.env.DEV_CTM_PORT && !linkedWorktree) return;
|
|
304
318
|
const defaultPrimaryDir = require('./lib/data-dir').getDefaultDataDir();
|
|
305
319
|
const configuredPrimaryDir = process.env.CTM_PRIMARY_DATA_DIR || process.env.CTM_PRODUCTION_DATA_DIR;
|
|
306
320
|
const primaryDirs = [defaultPrimaryDir, configuredPrimaryDir].filter(Boolean);
|
|
307
321
|
if (!primaryDirs.some((primaryDir) => _pathIsWithin(dbPath, primaryDir))) return;
|
|
308
322
|
|
|
309
|
-
const error = new Error(`CTM_PRIMARY_DB_REFUSED_IN_DEV: refusing ${path.resolve(dbPath)} while DEV_CTM_PORT is set`);
|
|
323
|
+
const error = new Error(`CTM_PRIMARY_DB_REFUSED_IN_DEV: refusing ${path.resolve(dbPath)} while ${linkedWorktree ? 'running from a linked git worktree (unmerged branch code); set CTM_DATA_DIR to a scratch dir' : 'DEV_CTM_PORT is set'}`);
|
|
310
324
|
error.code = 'CTM_PRIMARY_DB_REFUSED_IN_DEV';
|
|
311
325
|
throw error;
|
|
312
326
|
}
|
|
@@ -316,6 +330,8 @@ function _assertDevDbPathIsNotPrimary(dbPath) {
|
|
|
316
330
|
// keep all backup call sites reading this module-level value instead of capturing it.
|
|
317
331
|
const DEFAULT_BACKUP_DIR = _normalizeUserPath(process.env.CTM_BACKUP_DIR || path.join(DATA_DIR, 'backups'));
|
|
318
332
|
let BACKUP_DIR = DEFAULT_BACKUP_DIR;
|
|
333
|
+
// Retention is a module value read at prune time (design §5 R-8); the default is 3.
|
|
334
|
+
let BACKUP_RETENTION_DAYS = backupRetention.DEFAULT_BACKUP_RETENTION_DAYS;
|
|
319
335
|
const IMAGE_HASH_CHUNK_BYTES = Math.max(
|
|
320
336
|
16 * 1024,
|
|
321
337
|
Number(process.env.CTM_IMAGE_HASH_CHUNK_BYTES || 512 * 1024) || 512 * 1024
|
|
@@ -551,6 +567,22 @@ function _applyPersistedBackupDirSetting() {
|
|
|
551
567
|
}
|
|
552
568
|
}
|
|
553
569
|
|
|
570
|
+
// Backup retention (design §5 R-5/R-8): a plain module value; the setter validates but never
|
|
571
|
+
// persists, so writing the setting is the caller's job (api/backup-retention.js PUT).
|
|
572
|
+
function getBackupRetentionDays() { return BACKUP_RETENTION_DAYS; }
|
|
573
|
+
function setBackupRetentionDays(days) {
|
|
574
|
+
BACKUP_RETENTION_DAYS = backupRetention.normalizeRetentionDays(days);
|
|
575
|
+
return BACKUP_RETENTION_DAYS;
|
|
576
|
+
}
|
|
577
|
+
function _applyPersistedBackupRetentionSetting() {
|
|
578
|
+
try {
|
|
579
|
+
if (!db || !_tableExists('settings')) return;
|
|
580
|
+
setBackupRetentionDays(getSetting(backupRetention.BACKUP_RETENTION_SETTING_KEY, null));
|
|
581
|
+
} catch (e) {
|
|
582
|
+
console.error('[db] Backup retention setting ignored:', e.message);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
554
586
|
// Cache for resolveGitRoot — avoids repeated git calls for the same path
|
|
555
587
|
const _gitRootCache = new Map();
|
|
556
588
|
|
|
@@ -743,6 +775,7 @@ function _baseResidentDb() {
|
|
|
743
775
|
return _baseFileHandle;
|
|
744
776
|
}
|
|
745
777
|
function _isDomainFlippedInSettings(domain) {
|
|
778
|
+
if (domain !== 'core' && domain !== 'telemetry') return false; // only EXTRACTABLE_DOMAINS (lib/domain-split-migration.js) flip; never read settings for firehose in a request zone
|
|
746
779
|
if (_domainFlipStickyCache.get(domain)) return true;
|
|
747
780
|
try {
|
|
748
781
|
const row = _baseResidentDb().prepare('SELECT value FROM settings WHERE key = ?').get(`domain_routing_flip:${domain}`);
|
|
@@ -4951,6 +4984,7 @@ function initDb(dbPath) {
|
|
|
4951
4984
|
_resetHostedPrimarySchemaMemo();
|
|
4952
4985
|
_ensureHostedPrimarySchema(db);
|
|
4953
4986
|
_applyPersistedBackupDirSetting();
|
|
4987
|
+
_applyPersistedBackupRetentionSetting();
|
|
4954
4988
|
cleanupScrollbackChunkSeqIntegrity();
|
|
4955
4989
|
return db;
|
|
4956
4990
|
} catch (err) {
|
|
@@ -7569,6 +7603,31 @@ function _defaultMigrationSteps() {
|
|
|
7569
7603
|
53: () => _migrateToV53Impl({ getDb: () => dbFor('session_model_intent'), setSchemaVersion }),
|
|
7570
7604
|
// v54 (WP-0) the per-session lead model pin — an explicit model choice replayed on resume; v55 (WP-2, multi-machine) stamps blank agent_sessions.origin_instance_id rows with this database's identity (one idempotent UPDATE, sharing this line because db.js is at its size ceiling); v56 (WP-1, machine pool) is host_samples + machine_self + machine_pairing_offers + machines.urls_json, all domain 'core'.
|
|
7571
7605
|
54: () => _migrateToV54Impl({ getDb: () => dbFor('session_lead_model'), setSchemaVersion }), 55: () => require('./lib/migrations/v55-agent-origin-backfill').migrateToV55({ getDb: () => dbFor('agent_sessions'), getIdentityDb: () => dbFor('instance_identity'), setSchemaVersion }), 56: () => require('./lib/migrations/v56-host-samples-and-machine-pool').migrateToV56({ getDb: () => dbFor('machines'), setSchemaVersion }),
|
|
7606
|
+
// v57 (opencode-lead-and-delegate-model-selection-2026-10-28.html §6.4, §8 WP-4, S-17/S-18):
|
|
7607
|
+
// both delegate-preference tables admit agent='opencode'. SQLite cannot ALTER a CHECK, so the
|
|
7608
|
+
// migration REBUILDS them from their own stored DDL (one transaction, every row and column);
|
|
7609
|
+
// v48 is untouched. Idempotent by inspection of sqlite_master, so a re-run is a no-op.
|
|
7610
|
+
57: () => require('./lib/migrations/v57-delegate-pref-mirror-opencode').migrateToV57({ getDb: () => dbFor('delegate_pref_mirror'), setSchemaVersion }),
|
|
7611
|
+
// v58 (WP-1, codex-native-subagent-pick-enforcement-2026-10-28.html §6): the launch row gains
|
|
7612
|
+
// the native-sub-agents deny fact (nullable TEXT, no default), so the UI states what a launch
|
|
7613
|
+
// DID instead of re-deriving the rule. One ALTER on the v48 launch table; core domain, like v48/v50.
|
|
7614
|
+
58: () => require('./lib/migrations/v58-subagent-launch-native-subagents').migrateToV58({ getDb: () => dbFor('session_subagent_pick_launch'), setSchemaVersion }),
|
|
7615
|
+
// v59 (WP-8, ctm-deepseek-harness-acp-agent-design §9b): coding_session_model_state admits the
|
|
7616
|
+
// DeepSeek Harness agent 'dsh'. SQLite cannot ALTER a CHECK, so v59 REBUILDS the table from its
|
|
7617
|
+
// own stored DDL in one transaction; v42 is untouched and a re-run is a no-op.
|
|
7618
|
+
59: () => require('./lib/migrations/v59-coding-session-model-state-dsh').migrateToV59({ getDb: () => dbFor('coding_session_model_state'), setSchemaVersion }),
|
|
7619
|
+
// v60 (WP-10 step C, ctm-deepseek-harness-acp-agent-design §9b): the delegate pref mirror admits
|
|
7620
|
+
// agent 'dsh', the CTM half of the brain's migration 103 widening of `default:dsh'. SQLite cannot
|
|
7621
|
+
// ALTER a CHECK, so v60 REBUILDS the table from its own stored DDL in one transaction; v48 is
|
|
7622
|
+
// untouched and a re-run is a no-op. session_subagent_pick_launch is deliberately NOT widened:
|
|
7623
|
+
// no writer can reach it with 'dsh' (see the module header).
|
|
7624
|
+
60: () => require('./lib/migrations/v60-delegate-pref-mirror-dsh').migrateToV60({ getDb: () => dbFor('delegate_pref_mirror'), setSchemaVersion }),
|
|
7625
|
+
// v61 (WP-5, shared-memory-every-machine-2026-10-31.html §5 D-3, §6.8): the conversation-item
|
|
7626
|
+
// change clock — three additive tables + one index, declared by the migration instead of the
|
|
7627
|
+
// store's own DDL (the store is a ratcheted lazy store; lib/migrations/** is sanctioned). The
|
|
7628
|
+
// clock is stamped in the same transaction as conversation_text_items_v2, a 'firehose' table, so
|
|
7629
|
+
// this migration hands the same handle/file as the text table.
|
|
7630
|
+
61: () => require('./lib/migrations/v61-conversation-item-clock').migrateToV61({ getDb: () => dbFor('conversation_text_items_v2'), setSchemaVersion }),
|
|
7572
7631
|
}, { reservedVersions: [18] });
|
|
7573
7632
|
}
|
|
7574
7633
|
let _migrationSteps = _defaultMigrationSteps();
|
|
@@ -12969,6 +13028,17 @@ function _discardPartialBackupSet(names) {
|
|
|
12969
13028
|
}
|
|
12970
13029
|
}
|
|
12971
13030
|
|
|
13031
|
+
// D-5: a writer that throws reclaims the destination's whole file set (base + sidecars, via
|
|
13032
|
+
// lib/sqlite-file-set.js) — including the .db.gz companion when the function writes one.
|
|
13033
|
+
// Best-effort by construction: the caller rethrows the ORIGINAL error, so a reclaim failure
|
|
13034
|
+
// must never replace it.
|
|
13035
|
+
function _reclaimBackupDestinationSet(...paths) {
|
|
13036
|
+
for (const target of paths) {
|
|
13037
|
+
if (!target) continue;
|
|
13038
|
+
try { removeSqliteFileSet(target); } catch { /* expected: the reclaim is best-effort and must never mask the original writer error, which the caller rethrows */ }
|
|
13039
|
+
}
|
|
13040
|
+
}
|
|
13041
|
+
|
|
12972
13042
|
function _finalizeBackup(tmpPath, gzPath, now, tag, basePath) {
|
|
12973
13043
|
const ts = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
12974
13044
|
const check = _quickCheckFile(tmpPath);
|
|
@@ -13010,8 +13080,13 @@ async function createBackup(label) {
|
|
|
13010
13080
|
const { now, tmpPath, gzPath, tag } = _backupPaths(label);
|
|
13011
13081
|
fs.rmSync(tmpPath, { force: true });
|
|
13012
13082
|
fs.rmSync(gzPath, { force: true });
|
|
13013
|
-
|
|
13014
|
-
|
|
13083
|
+
try {
|
|
13084
|
+
await db.backup(tmpPath);
|
|
13085
|
+
return await _finalizeBackupAsync(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
|
|
13086
|
+
} catch (err) {
|
|
13087
|
+
_reclaimBackupDestinationSet(tmpPath, gzPath);
|
|
13088
|
+
throw err;
|
|
13089
|
+
}
|
|
13015
13090
|
}
|
|
13016
13091
|
|
|
13017
13092
|
// Live-snapshot entry point for the dedicated backup worker. It intentionally does not call
|
|
@@ -13023,6 +13098,7 @@ async function createBackupFromPath(sourcePath, label, options = {}) {
|
|
|
13023
13098
|
if (!requestedSource) throw new Error('Backup source database path required');
|
|
13024
13099
|
const resolvedSource = path.resolve(requestedSource);
|
|
13025
13100
|
if (options.backupDir) setBackupDir(options.backupDir, { persist: false });
|
|
13101
|
+
if (options.retentionDays != null) setBackupRetentionDays(options.retentionDays);
|
|
13026
13102
|
|
|
13027
13103
|
const { now, tmpPath, gzPath, tag } = _backupPaths(label);
|
|
13028
13104
|
fs.rmSync(tmpPath, { force: true });
|
|
@@ -13036,12 +13112,15 @@ async function createBackupFromPath(sourcePath, label, options = {}) {
|
|
|
13036
13112
|
});
|
|
13037
13113
|
try {
|
|
13038
13114
|
source.prepare('VACUUM INTO ?').run(tmpPath);
|
|
13115
|
+
// The worker is handed the BASE path, so its siblings resolve from the same directory —
|
|
13116
|
+
// this is the path the daily backup actually takes (setBackupRunner -> online-backup-worker).
|
|
13117
|
+
return await _finalizeBackupAsync(tmpPath, gzPath, now, tag, resolvedSource);
|
|
13118
|
+
} catch (err) {
|
|
13119
|
+
_reclaimBackupDestinationSet(tmpPath, gzPath);
|
|
13120
|
+
throw err;
|
|
13039
13121
|
} finally {
|
|
13040
13122
|
try { source.close(); } catch {}
|
|
13041
13123
|
}
|
|
13042
|
-
// The worker is handed the BASE path, so its siblings resolve from the same directory —
|
|
13043
|
-
// this is the path the daily backup actually takes (setBackupRunner -> online-backup-worker).
|
|
13044
|
-
return _finalizeBackupAsync(tmpPath, gzPath, now, tag, resolvedSource);
|
|
13045
13124
|
}
|
|
13046
13125
|
|
|
13047
13126
|
async function copyLiveDatabaseTo(destPath) {
|
|
@@ -13059,22 +13138,16 @@ async function copyLiveDatabaseTo(destPath) {
|
|
|
13059
13138
|
}
|
|
13060
13139
|
const tmpPath = path.join(destDir, `.${path.basename(resolved)}.${process.pid}.${Date.now()}.tmp`);
|
|
13061
13140
|
fs.mkdirSync(destDir, { recursive: true });
|
|
13062
|
-
|
|
13063
|
-
try { fs.rmSync(p, { force: true }); } catch {}
|
|
13064
|
-
}
|
|
13141
|
+
_reclaimBackupDestinationSet(tmpPath);
|
|
13065
13142
|
try {
|
|
13066
13143
|
await db.backup(tmpPath);
|
|
13067
13144
|
const check = _quickCheckFile(tmpPath);
|
|
13068
13145
|
if (!check.ok) throw new Error(`Live database copy quick_check failed: ${check.error}`);
|
|
13069
|
-
|
|
13070
|
-
try { fs.rmSync(p, { force: true }); } catch {}
|
|
13071
|
-
}
|
|
13146
|
+
_reclaimBackupDestinationSet(resolved);
|
|
13072
13147
|
fs.renameSync(tmpPath, resolved);
|
|
13073
13148
|
return { path: resolved, size: fs.statSync(resolved).size };
|
|
13074
13149
|
} catch (err) {
|
|
13075
|
-
|
|
13076
|
-
try { fs.rmSync(p, { force: true }); } catch {}
|
|
13077
|
-
}
|
|
13150
|
+
_reclaimBackupDestinationSet(tmpPath);
|
|
13078
13151
|
throw err;
|
|
13079
13152
|
}
|
|
13080
13153
|
}
|
|
@@ -13084,8 +13157,13 @@ function createBackupSync(label) {
|
|
|
13084
13157
|
const { now, tmpPath, gzPath, tag } = _backupPaths(label);
|
|
13085
13158
|
fs.rmSync(tmpPath, { force: true });
|
|
13086
13159
|
fs.rmSync(gzPath, { force: true });
|
|
13087
|
-
|
|
13088
|
-
|
|
13160
|
+
try {
|
|
13161
|
+
db.exec(`VACUUM INTO ${_quoteSqlString(tmpPath)}`);
|
|
13162
|
+
return _finalizeBackup(tmpPath, gzPath, now, tag, getBaseDbPath() || currentDbPath);
|
|
13163
|
+
} catch (err) {
|
|
13164
|
+
_reclaimBackupDestinationSet(tmpPath, gzPath);
|
|
13165
|
+
throw err;
|
|
13166
|
+
}
|
|
13089
13167
|
}
|
|
13090
13168
|
|
|
13091
13169
|
function listBackups() {
|
|
@@ -13412,16 +13490,9 @@ async function restoreAndVerifyPromptPurgeBackupAbsent(baseline = {}, closure =
|
|
|
13412
13490
|
}
|
|
13413
13491
|
}
|
|
13414
13492
|
|
|
13415
|
-
|
|
13416
|
-
|
|
13417
|
-
const
|
|
13418
|
-
if (backups.length <= 5) return;
|
|
13419
|
-
|
|
13420
|
-
const cutoff = Date.now() - (maxAge * 24 * 60 * 60 * 1000);
|
|
13421
|
-
const toDelete = backups.slice(5).filter(b => new Date(b.createdAt).getTime() < cutoff);
|
|
13422
|
-
for (const b of toDelete) {
|
|
13423
|
-
deleteBackup(b.name);
|
|
13424
|
-
}
|
|
13493
|
+
// Design §5 R-1: keep every backup from the N most recent UTC days that have one (shared policy).
|
|
13494
|
+
function cleanOldBackups(retentionDays = BACKUP_RETENTION_DAYS) {
|
|
13495
|
+
for (const b of backupRetention.selectExpiredBackups(listBackups(), retentionDays)) deleteBackup(b.name);
|
|
13425
13496
|
}
|
|
13426
13497
|
|
|
13427
13498
|
// Optional hook (registered by server.js via setBackupRunner) that dispatches a backup to a
|
|
@@ -16052,11 +16123,36 @@ function listStartupTasks(opts = {}) {
|
|
|
16052
16123
|
// listStartupTasks() above drops exited rows — so "does this hub's ledger know the id, and who owns
|
|
16053
16124
|
// it" is answered here. Deliberately throw-through: the catalog's per-clause guard counts the fault
|
|
16054
16125
|
// and fails OPEN, which a silent empty answer here would hide.
|
|
16126
|
+
//
|
|
16127
|
+
// D-5 (docs/remote-session-rename-forward-and-empty-rows-2026-10-30.html §5 D-5, §6, §9 S-7): a NAME
|
|
16128
|
+
// is not ownership. The pre-WP-1 hub rename/star of a box-owned id wrote a TITLE-ONLY stub into this
|
|
16129
|
+
// table — provider/project_path/cwd/origin_instance_id/current_owner_instance_id all '' and no
|
|
16130
|
+
// agent_sessions row — and this read then reported it as an owned ledger row, so clause (d) fenced the
|
|
16131
|
+
// box's REAL row out and the session vanished from the hub. Such a stub is not ownership: it answers
|
|
16132
|
+
// `{ exists: false, currentOwner: '', titleOnlyStub: true }` and the box row is kept. Every other row
|
|
16133
|
+
// answers exactly what it always did. Nothing is deleted (R-143).
|
|
16055
16134
|
function getCtmSessionOwnerRow(ctmSessionId) {
|
|
16056
16135
|
const id = String(ctmSessionId || '').trim();
|
|
16057
16136
|
if (!id) return { exists: false, currentOwner: '' };
|
|
16058
|
-
|
|
16137
|
+
// current_owner_instance_id is selected unconditionally: a schema without it already threw here
|
|
16138
|
+
// (throw-through, per the comment above). The four D-5 columns and agent_sessions may be absent on
|
|
16139
|
+
// an older schema — a missing one is selected as NULL and `evaluable` then refuses to call the row
|
|
16140
|
+
// a stub, so a shape this read cannot fully evaluate never newly fences a box row out.
|
|
16141
|
+
const d5 = ['provider', 'project_path', 'cwd', 'origin_instance_id'];
|
|
16142
|
+
const missing = d5.filter((c) => !_tableHasColumn('ctm_sessions', c));
|
|
16143
|
+
const hasAgent = _tableExists('agent_sessions') && _tableHasColumn('agent_sessions', 'ctm_session_id');
|
|
16144
|
+
const row = getDomainDb('core').prepare(`
|
|
16145
|
+
SELECT current_owner_instance_id, ${d5.map((c) => (missing.includes(c) ? `NULL AS ${c}` : c)).join(', ')},
|
|
16146
|
+
${hasAgent ? 'EXISTS(SELECT 1 FROM agent_sessions a WHERE a.ctm_session_id = ctm_sessions.id)' : '0'} AS has_agent
|
|
16147
|
+
FROM ctm_sessions WHERE id = ?
|
|
16148
|
+
`).get(id);
|
|
16059
16149
|
if (!row) return { exists: false, currentOwner: '' };
|
|
16150
|
+
const blank = (v) => String(v == null ? '' : v).trim() === '';
|
|
16151
|
+
const evaluable = !missing.length;
|
|
16152
|
+
if (evaluable && !Number(row.has_agent) && blank(row.provider) && blank(row.project_path)
|
|
16153
|
+
&& blank(row.cwd) && blank(row.origin_instance_id) && blank(row.current_owner_instance_id)) {
|
|
16154
|
+
return { exists: false, currentOwner: '', titleOnlyStub: true };
|
|
16155
|
+
}
|
|
16060
16156
|
return { exists: true, currentOwner: String(row.current_owner_instance_id || '').trim() };
|
|
16061
16157
|
}
|
|
16062
16158
|
|
|
@@ -19983,7 +20079,29 @@ const _WORKER_SESSION_PATCHABLE_COLUMNS = new Set([
|
|
|
19983
20079
|
'failure_json', 'consumed_at', 'acknowledged_at', 'hidden_at', 'hide_at', 'launch_json', 'runtime_json', 'generation',
|
|
19984
20080
|
]);
|
|
19985
20081
|
|
|
19986
|
-
|
|
20082
|
+
// C7-B1 (worker-terminal-retry-generation-fence-2026-10-27.html §3.1): the optional third
|
|
20083
|
+
// argument is an INTERNAL storage fence, not a patch field and not a general predicate engine.
|
|
20084
|
+
// `options === undefined` (or omitted) is the unchanged legacy two-argument call; a PROVIDED
|
|
20085
|
+
// options object must carry EXACTLY the own key expectedGeneration, a positive safe integer, and
|
|
20086
|
+
// is validated BEFORE any DB access -- a present-but-malformed guard is a programming error, never
|
|
20087
|
+
// a silent unfenced write. A valid guard appends one bound predicate (never an interpolated
|
|
20088
|
+
// value) so a stale generation matches zero rows and the existing boolean result already reports
|
|
20089
|
+
// the refusal. Generation stays a SETtable column: the guard never writes it.
|
|
20090
|
+
function updateWorkerSession(ctmSessionId, patch = {}, options) {
|
|
20091
|
+
let expectedGeneration;
|
|
20092
|
+
if (options !== undefined) {
|
|
20093
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
20094
|
+
throw new TypeError('updateWorkerSession: options must be an object carrying exactly { expectedGeneration }');
|
|
20095
|
+
}
|
|
20096
|
+
const guardKeys = Reflect.ownKeys(options);
|
|
20097
|
+
if (guardKeys.length !== 1 || guardKeys[0] !== 'expectedGeneration') {
|
|
20098
|
+
throw new TypeError('updateWorkerSession: options must carry exactly one own key, expectedGeneration');
|
|
20099
|
+
}
|
|
20100
|
+
expectedGeneration = options.expectedGeneration;
|
|
20101
|
+
if (!Number.isSafeInteger(expectedGeneration) || expectedGeneration <= 0) {
|
|
20102
|
+
throw new TypeError('updateWorkerSession: expectedGeneration must be a positive safe integer');
|
|
20103
|
+
}
|
|
20104
|
+
}
|
|
19987
20105
|
const id = String(ctmSessionId || '').trim();
|
|
19988
20106
|
if (!id) return false;
|
|
19989
20107
|
const columns = Object.keys(patch || {}).filter((k) => _WORKER_SESSION_PATCHABLE_COLUMNS.has(k));
|
|
@@ -19991,8 +20109,10 @@ function updateWorkerSession(ctmSessionId, patch = {}) {
|
|
|
19991
20109
|
const setClause = columns.map((c) => `${c} = @${c}`).join(', ');
|
|
19992
20110
|
const params = { id };
|
|
19993
20111
|
for (const c of columns) params[c] = patch[c];
|
|
20112
|
+
const generationPredicate = options === undefined ? '' : ' AND generation = @expectedGeneration';
|
|
20113
|
+
if (options !== undefined) params.expectedGeneration = expectedGeneration;
|
|
19994
20114
|
const result = dbFor('worker_sessions').prepare(
|
|
19995
|
-
`UPDATE worker_sessions SET ${setClause} WHERE ctm_session_id = @id`
|
|
20115
|
+
`UPDATE worker_sessions SET ${setClause} WHERE ctm_session_id = @id${generationPredicate}`
|
|
19996
20116
|
).run(params);
|
|
19997
20117
|
return result.changes > 0;
|
|
19998
20118
|
}
|
|
@@ -20515,6 +20635,10 @@ const DB_OWNER_MUTATION_ACTIONS = Object.freeze({
|
|
|
20515
20635
|
ackConversationChanges: (payload) => conversationChangeFeed.ackConversationChanges(
|
|
20516
20636
|
dbFor('conversation_projection_outbox_v2'), payload,
|
|
20517
20637
|
),
|
|
20638
|
+
// join-sync-followups-2 WP-3: /api/sync/conversation/v2/* run here, never in the request zone.
|
|
20639
|
+
conversationSyncVector: (opts) => require('./lib/conversation-sync').ownerVector(dbFor('conversation_text_items_v2'), opts),
|
|
20640
|
+
conversationSyncChanges: (opts) => require('./lib/conversation-sync').ownerChanges(dbFor('conversation_text_items_v2'), opts),
|
|
20641
|
+
conversationSyncApply: (opts) => require('./lib/conversation-sync').ownerApply(dbFor('conversation_text_items_v2'), opts),
|
|
20518
20642
|
});
|
|
20519
20643
|
|
|
20520
20644
|
function runDbOwnerMutationAction(action, args = []) {
|
|
@@ -20547,7 +20671,7 @@ module.exports = {
|
|
|
20547
20671
|
_getMigrationLadderInfo,
|
|
20548
20672
|
// Canonical filename for bin/migrate.js; avoids a second DEFAULT_DB_PATH basename.
|
|
20549
20673
|
CTM_DB_FILENAME: path.basename(DEFAULT_DB_PATH),
|
|
20550
|
-
initDb, connectDb, getDb, closeDb, getDbPath: () => currentDbPath, getBackupDir: () => BACKUP_DIR, getBackupDirInfo, getHostedBackupStatus, setBackupDir, moveBackupsToDir, flushWal, resolveGitRoot,
|
|
20674
|
+
initDb, connectDb, getDb, closeDb, getDbPath: () => currentDbPath, getBackupDir: () => BACKUP_DIR, getBackupDirInfo, getHostedBackupStatus, setBackupDir, moveBackupsToDir, flushWal, resolveGitRoot, getBackupRetentionDays, setBackupRetentionDays, cleanOldBackups,
|
|
20551
20675
|
getDomainDb,
|
|
20552
20676
|
getBaseDbPath,
|
|
20553
20677
|
setBaseDbPath,
|