create-walle 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/release-schema.json +2 -2
- package/lib/runtime-closure-policy.json +8 -7
- package/package.json +1 -1
- package/template/coding-task-manager/api-prompts.js +45 -7
- package/template/coding-task-manager/bin/claude-hook.js +55 -1
- package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
- package/template/coding-task-manager/bin/land.js +2069 -0
- package/template/coding-task-manager/bin/memory-census.js +4 -2
- package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
- package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
- package/template/coding-task-manager/db.js +156 -32
- package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
- package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
- package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
- package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
- package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
- package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
- package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
- package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
- package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
- package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
- package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
- package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
- package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
- package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
- package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
- package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
- package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
- package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
- package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
- package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
- package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
- package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
- package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
- package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
- package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
- package/template/coding-task-manager/lib/agent-definitions.js +19 -0
- package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
- package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
- package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
- package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
- package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
- package/template/coding-task-manager/lib/agent-presets.js +84 -1
- package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
- package/template/coding-task-manager/lib/agent-version-service.js +74 -11
- package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
- package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
- package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
- package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
- package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
- package/template/coding-task-manager/lib/api/fleet.js +118 -0
- package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
- package/template/coding-task-manager/lib/api/ingress.js +9 -1
- package/template/coding-task-manager/lib/api/landing.js +403 -0
- package/template/coding-task-manager/lib/api/machines.js +691 -2
- package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
- package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
- package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
- package/template/coding-task-manager/lib/api/session-attach.js +623 -0
- package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
- package/template/coding-task-manager/lib/api/sessions.js +77 -51
- package/template/coding-task-manager/lib/api/setup-network.js +544 -16
- package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
- package/template/coding-task-manager/lib/api/setup.js +829 -10
- package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
- package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
- package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
- package/template/coding-task-manager/lib/auth-rules.js +292 -21
- package/template/coding-task-manager/lib/background-stop.js +369 -0
- package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
- package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
- package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
- package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
- package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
- package/template/coding-task-manager/lib/build-info.js +4 -2
- package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
- package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
- package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
- package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
- package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
- package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
- package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
- package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
- package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
- package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
- package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
- package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
- package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
- package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
- package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
- package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
- package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
- package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
- package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
- package/template/coding-task-manager/lib/conversation-sync.js +355 -0
- package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
- package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
- package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
- package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
- package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
- package/template/coding-task-manager/lib/db-domains.js +1 -0
- package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
- package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
- package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
- package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
- package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
- package/template/coding-task-manager/lib/feature-manifest.js +4 -0
- package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
- package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
- package/template/coding-task-manager/lib/fleet-hub.js +762 -0
- package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
- package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
- package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
- package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
- package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
- package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
- package/template/coding-task-manager/lib/fleet-update.js +798 -0
- package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
- package/template/coding-task-manager/lib/fs-watcher.js +58 -42
- package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
- package/template/coding-task-manager/lib/headless-term-service.js +84 -8
- package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
- package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
- package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
- package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
- package/template/coding-task-manager/lib/host-handoff.js +16 -19
- package/template/coding-task-manager/lib/host-stats.js +150 -3
- package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
- package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
- package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
- package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
- package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
- package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
- package/template/coding-task-manager/lib/hub-bridge.js +398 -0
- package/template/coding-task-manager/lib/idle-notify.js +491 -0
- package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
- package/template/coding-task-manager/lib/instance-manifest.js +5 -1
- package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
- package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
- package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
- package/template/coding-task-manager/lib/landing/config.js +536 -0
- package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
- package/template/coding-task-manager/lib/landing/gate.js +360 -0
- package/template/coding-task-manager/lib/landing/git.js +344 -0
- package/template/coding-task-manager/lib/landing/lease.js +247 -0
- package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
- package/template/coding-task-manager/lib/landing/proof.js +223 -0
- package/template/coding-task-manager/lib/landing/queue.js +998 -0
- package/template/coding-task-manager/lib/landing/radar.js +489 -0
- package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
- package/template/coding-task-manager/lib/landing/state.js +263 -0
- package/template/coding-task-manager/lib/landing/stop.js +49 -0
- package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
- package/template/coding-task-manager/lib/landing/sync.js +456 -0
- package/template/coding-task-manager/lib/landing/train.js +885 -0
- package/template/coding-task-manager/lib/landing/window.js +57 -0
- package/template/coding-task-manager/lib/launch-environment.js +121 -0
- package/template/coding-task-manager/lib/launch-model-override.js +36 -10
- package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
- package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
- package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
- package/template/coding-task-manager/lib/lead-model-options.js +160 -3
- package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
- package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
- package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
- package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
- package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
- package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
- package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
- package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
- package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
- package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
- package/template/coding-task-manager/lib/machine-registry.js +750 -5
- package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
- package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
- package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
- package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
- package/template/coding-task-manager/lib/memory-join.js +337 -0
- package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
- package/template/coding-task-manager/lib/memory-sync.js +565 -0
- package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
- package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
- package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
- package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
- package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
- package/template/coding-task-manager/lib/model-availability.js +727 -0
- package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
- package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
- package/template/coding-task-manager/lib/model-id-rule.js +19 -0
- package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
- package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
- package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
- package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
- package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
- package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
- package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
- package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
- package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
- package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
- package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
- package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
- package/template/coding-task-manager/lib/native-history-control.js +6 -4
- package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
- package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
- package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
- package/template/coding-task-manager/lib/opencode-cli.js +480 -0
- package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
- package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
- package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
- package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
- package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
- package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
- package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
- package/template/coding-task-manager/lib/perf-summary.js +7 -0
- package/template/coding-task-manager/lib/perf-tracker.js +63 -2
- package/template/coding-task-manager/lib/project-config.js +7 -0
- package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
- package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
- package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
- package/template/coding-task-manager/lib/read-pool-client.js +89 -2
- package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
- package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
- package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
- package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
- package/template/coding-task-manager/lib/relay-client.js +57 -3
- package/template/coding-task-manager/lib/relink-audit.js +34 -5
- package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
- package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
- package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
- package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
- package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
- package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
- package/template/coding-task-manager/lib/restart-guard.js +18 -6
- package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
- package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
- package/template/coding-task-manager/lib/resume-admission.js +17 -3
- package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
- package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
- package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
- package/template/coding-task-manager/lib/runtime-contract.js +3 -1
- package/template/coding-task-manager/lib/schema-indexes.js +1 -0
- package/template/coding-task-manager/lib/session-context-locator.js +742 -0
- package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
- package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
- package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
- package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
- package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
- package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
- package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
- package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
- package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
- package/template/coding-task-manager/lib/session-create/response.js +7 -7
- package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
- package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
- package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
- package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
- package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
- package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
- package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
- package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
- package/template/coding-task-manager/lib/session-empty.js +13 -10
- package/template/coding-task-manager/lib/session-host-manager.js +60 -0
- package/template/coding-task-manager/lib/session-jobs.js +3 -1
- package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
- package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
- package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
- package/template/coding-task-manager/lib/session-park.js +738 -0
- package/template/coding-task-manager/lib/session-path-grant.js +13 -4
- package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
- package/template/coding-task-manager/lib/session-transport.js +17 -0
- package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
- package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
- package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
- package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
- package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
- package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
- package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
- package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
- package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
- package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
- package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
- package/template/coding-task-manager/lib/submission-ack.js +90 -2
- package/template/coding-task-manager/lib/systemd-scope.js +115 -0
- package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
- package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
- package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
- package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
- package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
- package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
- package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
- package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
- package/template/coding-task-manager/lib/transcript-source.js +36 -4
- package/template/coding-task-manager/lib/transcript-store.js +9 -0
- package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
- package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
- package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
- package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
- package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
- package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
- package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
- package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
- package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
- package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
- package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
- package/template/coding-task-manager/lib/walle/turn.js +1 -1
- package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
- package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
- package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
- package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
- package/template/coding-task-manager/lib/walle-row-history.js +495 -0
- package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
- package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
- package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
- package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
- package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
- package/template/coding-task-manager/lib/ws/misc.js +1 -1
- package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
- package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
- package/template/coding-task-manager/oauth-proxy.js +112 -115
- package/template/coding-task-manager/package-lock.json +10 -94
- package/template/coding-task-manager/package.json +4 -3
- package/template/coding-task-manager/protocol/message-table.json +10 -0
- package/template/coding-task-manager/protocol/messages.js +10 -0
- package/template/coding-task-manager/protocol/ws-schema.json +20 -0
- package/template/coding-task-manager/protocol/ws-schema.md +2 -0
- package/template/coding-task-manager/public/css/app.css +170 -0
- package/template/coding-task-manager/public/css/walle-session.css +4 -0
- package/template/coding-task-manager/public/index.html +473 -243
- package/template/coding-task-manager/public/js/agent-command.js +86 -0
- package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
- package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
- package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
- package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
- package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
- package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
- package/template/coding-task-manager/public/js/background-work.js +196 -27
- package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
- package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
- package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
- package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
- package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
- package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
- package/template/coding-task-manager/public/js/document-review-links.js +9 -1
- package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
- package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
- package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
- package/template/coding-task-manager/public/js/message-renderer.js +4 -3
- package/template/coding-task-manager/public/js/model-picker.js +3 -1
- package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
- package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
- package/template/coding-task-manager/public/js/pasted-content.js +236 -0
- package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
- package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
- package/template/coding-task-manager/public/js/prompts.js +11 -10
- package/template/coding-task-manager/public/js/protocol.js +10 -0
- package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
- package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
- package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
- package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
- package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
- package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
- package/template/coding-task-manager/public/js/stream-view.js +6 -5
- package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
- package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
- package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
- package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
- package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
- package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
- package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
- package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
- package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
- package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
- package/template/coding-task-manager/public/js/walle.js +6 -0
- package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
- package/template/coding-task-manager/public/m/app.css +140 -0
- package/template/coding-task-manager/public/m/app.js +507 -68
- package/template/coding-task-manager/public/m/index.html +17 -0
- package/template/coding-task-manager/public/m/machines.js +838 -4
- package/template/coding-task-manager/public/m/private-api.js +31 -1
- package/template/coding-task-manager/public/usage.html +1 -0
- package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
- package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
- package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
- package/template/coding-task-manager/server.js +1950 -11679
- package/template/coding-task-manager/session-integrity.js +64 -4
- package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
- package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
- package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
- package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
- package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
- package/template/coding-task-manager/workers/session-host-process.js +5 -5
- package/template/coding-task-manager/workers/watch-worker.js +105 -0
- package/template/coding-task-manager/workers/worktree-worker.js +168 -33
- package/template/ctm-relay/lib/protocol.js +14 -1
- package/template/package-lock.json +2 -2
- package/template/package.json +1 -1
- package/template/shared/backup-retention.js +82 -0
- package/template/shared/conversation-admission.js +2 -0
- package/template/shared/conversation-provenance.js +3 -7
- package/template/shared/conversation-storage-v2-contract.js +5 -0
- package/template/shared/linked-worktree.js +51 -0
- package/template/shared/macos-fda-target.js +57 -0
- package/template/shared/orphan-parents.js +55 -0
- package/template/shared/release-schema.json +2 -2
- package/template/shared/storage/contract.js +3 -0
- package/template/wall-e/adapters/imessage.js +12 -0
- package/template/wall-e/agent.js +71 -4
- package/template/wall-e/api-walle.js +21 -1
- package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
- package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
- package/template/wall-e/brain/brain-join.js +859 -0
- package/template/wall-e/brain/brain-sync-membership.js +20 -0
- package/template/wall-e/brain/brain-sync-store.js +131 -77
- package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
- package/template/wall-e/brain/brain-sync-v2.js +578 -0
- package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
- package/template/wall-e/brain/deterministic-id.js +51 -0
- package/template/wall-e/brain/memories.js +2 -2
- package/template/wall-e/brain/migrations.js +40 -6
- package/template/wall-e/brain/model-identity-migration.js +1 -1
- package/template/wall-e/brain/owner-call-whitelist.js +23 -7
- package/template/wall-e/brain/schema.js +45 -85
- package/template/wall-e/brain.js +171 -35
- package/template/wall-e/chat.js +3 -3
- package/template/wall-e/coding/agent-shell-env.js +7 -2
- package/template/wall-e/coding/prompt-bundle.js +66 -21
- package/template/wall-e/config/main-loop-exemptions.json +2 -2
- package/template/wall-e/http/admin-api.js +37 -0
- package/template/wall-e/http/gws-api.js +4 -0
- package/template/wall-e/http/helper-rules-api.js +7 -1
- package/template/wall-e/http/model-admin.js +8 -1
- package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
- package/template/wall-e/http/model-proxy-providers.js +174 -1
- package/template/wall-e/http/model-route-health.js +157 -0
- package/template/wall-e/http/sync-api.js +278 -464
- package/template/wall-e/jobs/job-runner.js +28 -1
- package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
- package/template/wall-e/lib/ctm-data-dir.js +26 -0
- package/template/wall-e/lib/derivation-home.js +147 -0
- package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
- package/template/wall-e/lib/helper-rules/grade.js +51 -8
- package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
- package/template/wall-e/lib/helper-rules/store.js +4 -2
- package/template/wall-e/lib/landing-mcp-tools.js +170 -0
- package/template/wall-e/lib/mcp-client-config.js +133 -14
- package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
- package/template/wall-e/lib/mcp-integration.js +58 -13
- package/template/wall-e/lib/parent-death.js +7 -1
- package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
- package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
- package/template/wall-e/llm/delegate-vendor-default.js +12 -5
- package/template/wall-e/llm/model-roles.js +1 -1
- package/template/wall-e/llm/native-delegate-selection.js +56 -8
- package/template/wall-e/llm/worker-delegate-args.js +72 -7
- package/template/wall-e/llm/worker-mcp-routing.js +66 -17
- package/template/wall-e/loops/brain-custom-writes.js +19 -0
- package/template/wall-e/loops/ingest.js +17 -1
- package/template/wall-e/loops/think.js +19 -4
- package/template/wall-e/mcp-contract.js +222 -6
- package/template/wall-e/mcp-protocol-contract.js +40 -5
- package/template/wall-e/mcp-server.js +128 -29
- package/template/wall-e/mcp-worker-schemas.js +5 -5
- package/template/wall-e/memory/ctm-context-client.js +85 -0
- package/template/wall-e/memory/ctm-session-context.js +9 -3
- package/template/wall-e/memory/hub-bridge-client.js +388 -0
- package/template/wall-e/memory/replica-origin.js +56 -0
- package/template/wall-e/memory/session-pool.js +135 -0
- package/template/wall-e/runtime/live-capabilities.js +8 -3
- package/template/wall-e/server.js +4 -2
- package/template/wall-e/shared/release-schema.json +2 -2
- package/template/wall-e/shared/sqlite-file-set.js +39 -0
- package/template/wall-e/shared/storage/contract.js +3 -0
- package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
- package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
- package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
- package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
- package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
- package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
- package/template/wall-e/tools/chrome-automation.js +6 -0
- package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
- package/template/wall-e/workers/brain-owner-worker.js +18 -4
- package/template/wall-e/workers/mcp-gateway-process.js +5 -5
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// WP-1 (landing pipeline design 2026-10-30 §5 D-1..D-3, §8 WP-1): the batched runner — one train,
|
|
3
|
+
// one gate, one CAS for several queued jobs, bisected on FAIL. Kept out of bin/land.js (which sits at
|
|
4
|
+
// its file-size ceiling) behind the same `configure(deps)` seam the server shards use: the runner's
|
|
5
|
+
// own helpers (`runJob`, `progress`, …) are handed in by bin/land.js, never re-implemented here.
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
const { revParse, mergeTree, isAncestor } = require('./git');
|
|
11
|
+
const queue = require('./queue');
|
|
12
|
+
const train = require('./train');
|
|
13
|
+
const gate = require('./gate');
|
|
14
|
+
const proof = require('./proof');
|
|
15
|
+
const landingWindow = require('./window');
|
|
16
|
+
const { loadTargetLandingConfig, gatesHash } = require('./config');
|
|
17
|
+
|
|
18
|
+
// D-3: how often a lone job re-checks the queue while it waits `landing.batch.waitSeconds` for company.
|
|
19
|
+
const BATCH_WAIT_POLL_MS = 2000;
|
|
20
|
+
|
|
21
|
+
// runJob, progress, submitterWorkdir, gateSelectionTelemetry, sweepConflictPreviews, branchRef, delay
|
|
22
|
+
let deps = {};
|
|
23
|
+
|
|
24
|
+
function configure(next) {
|
|
25
|
+
deps = { ...deps, ...next };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// D-1/D-3 (§9 S-8): the window for the NEXT train, decided BEFORE anything is marked `in_progress`.
|
|
29
|
+
async function chooseWindow(ctx, targetTip) {
|
|
30
|
+
const batchConfig = batchConfigOf(ctx);
|
|
31
|
+
const runnable = queue.peekRunnable(ctx.root, { targetTip });
|
|
32
|
+
// D-3: the window is persisted state, clamped to `landing.batch.max` (a config the operator
|
|
33
|
+
// lowers takes effect on the next train, never after a restart).
|
|
34
|
+
let window = Math.min(landingWindow.readWindow(ctx.root).size, batchConfig.max);
|
|
35
|
+
// D-1 last sentence (§9 S-8): a job whose tip is proven or whose tree is cached lands ALONE,
|
|
36
|
+
// exactly as today, and is never a batch member.
|
|
37
|
+
const head = runnable.length ? queue.readJob(ctx.root, runnable[0]) : null;
|
|
38
|
+
if (head && window > 1 && fastPathApplies(ctx, ctx.cwd, batchConfig.config, head)) {
|
|
39
|
+
deps.progress(`job ${head.id}: proven or cached — landing alone, never a batch member`);
|
|
40
|
+
window = 1;
|
|
41
|
+
}
|
|
42
|
+
// D-3: `landing.batch.waitSeconds` — how long a lone job waits for company before gating
|
|
43
|
+
// alone. 0 (the default) never waits.
|
|
44
|
+
if (batchConfig.waitSeconds > 0 && window > 1 && runnable.length === 1) {
|
|
45
|
+
const deadline = Date.now() + batchConfig.waitSeconds * 1000;
|
|
46
|
+
let company = runnable.length;
|
|
47
|
+
while (Date.now() < deadline && company < 2) {
|
|
48
|
+
await deps.delay(BATCH_WAIT_POLL_MS); // eslint-disable-line no-await-in-loop
|
|
49
|
+
company = queue.peekRunnable(ctx.root, { targetTip }).length;
|
|
50
|
+
}
|
|
51
|
+
if (company < 2) deps.progress(`job ${queue.peekRunnable(ctx.root, { targetTip })[0] || '?'}: waited ${batchConfig.waitSeconds}s for company; gating alone`);
|
|
52
|
+
}
|
|
53
|
+
return window;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// WP-1 D-1 (§9 S-8): the fast-path question, asked BEFORE a job can become a batch member — is this
|
|
57
|
+
// tip already proven (D-1 gate-once) or is its train tree already carrying a cached PASS? The
|
|
58
|
+
// decisions mirror `runJobInner`'s (the proof store first, then the tree-keyed verdict cache) so the
|
|
59
|
+
// fast path and the real path can never disagree about which job lands alone.
|
|
60
|
+
function fastPathApplies(ctx, workdir, config, job) {
|
|
61
|
+
if (!job || !config) return false;
|
|
62
|
+
let base;
|
|
63
|
+
try {
|
|
64
|
+
base = revParse(workdir, deps.branchRef(config.target));
|
|
65
|
+
} catch (error) {
|
|
66
|
+
/* REPORT: an unreadable target is `runJobInner`'s refusal to make, not the scheduler's */
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const merged = mergeTree(workdir, base, job.tip);
|
|
70
|
+
if (merged.conflicts.length) return false;
|
|
71
|
+
if (gate.readCachedVerdict(ctx.root, merged.tree, gatesHash(config.gates))) return true;
|
|
72
|
+
if (!isAncestor(workdir, base, job.tip)) return false;
|
|
73
|
+
return Boolean(proof.proofChain(workdir, ctx.root, {
|
|
74
|
+
base, tip: job.tip, gatesHash: gatesHash(config.gates),
|
|
75
|
+
}).ok);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// D-3 (§6): the batch configuration, read fresh each iteration so a landing that changes it is
|
|
79
|
+
// honoured on the next train. A policy this process cannot read falls back to the serial defaults —
|
|
80
|
+
// `runJobInner` refuses the job itself a moment later, with the error the operator needs to see.
|
|
81
|
+
function batchConfigOf(ctx) {
|
|
82
|
+
try {
|
|
83
|
+
const config = loadTargetLandingConfig(ctx.cwd);
|
|
84
|
+
return { max: config.batch.max, waitSeconds: config.batch.waitSeconds, config };
|
|
85
|
+
} catch (error) {
|
|
86
|
+
/* REPORT: unreadable policy — no batching this iteration; the job's own load enforces it */
|
|
87
|
+
return { max: 1, waitSeconds: 0, config: null };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// WP-1 D-1/D-2 (§5, §6, §8 WP-1, §9 S-1..S-8): the batched runner.
|
|
92
|
+
//
|
|
93
|
+
// One train, one gate, one CAS. `runTrain` owns the whole bisection sequence: a batch that FAILs is
|
|
94
|
+
// halved, the first half becomes the NEXT train immediately (same priority slot, `attempt + 1`) and
|
|
95
|
+
// the second half goes back to the queue ahead of everything else — so a batch is never re-gated as a
|
|
96
|
+
// whole and the extra gates a single culprit costs are ⌈log₂N⌉ + 1, not N.
|
|
97
|
+
//
|
|
98
|
+
// A train of one is `runJob` — literally, not approximately — so the singleton path (triage,
|
|
99
|
+
// base_broken, R-3, the exit codes) is byte-for-byte what it was before this change.
|
|
100
|
+
async function runTrain(ctx, members, token, signal) {
|
|
101
|
+
let current = members;
|
|
102
|
+
for (;;) {
|
|
103
|
+
try {
|
|
104
|
+
if (current.length <= 1) return [await runSingle(ctx, current[0], token, signal)];
|
|
105
|
+
const outcome = await runBatchOnce(ctx, current, token, signal);
|
|
106
|
+
if (!outcome.bisect) return outcome.jobs;
|
|
107
|
+
current = outcome.bisect;
|
|
108
|
+
} catch (error) {
|
|
109
|
+
const code = typeof error.code === 'string' ? error.code : 'internal_error';
|
|
110
|
+
deps.progress(`batch ${members[0].id}: ${code}: ${error.message}`);
|
|
111
|
+
return current.map((member) => failMember(ctx, member, code, error));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// D-3: a singleton that LANDS is a PASS for the window too. Without this the window could never
|
|
117
|
+
// leave 1 — at 1 every train is a singleton, and only a batch verdict would ever move it.
|
|
118
|
+
async function runSingle(ctx, job, token, signal) {
|
|
119
|
+
const result = await deps.runJob(ctx, job, token, signal);
|
|
120
|
+
if (result && result.state === 'landed') {
|
|
121
|
+
landingWindow.bumpWindow(ctx.root, 'PASS', batchConfigOf(ctx).max);
|
|
122
|
+
// WP-1 R-9 (§6.3 step 6): the SINGLE place a landing reaches the origin half — a `kind:"sync"`
|
|
123
|
+
// job pushes what it landed, an ordinary landing auto-publishes when `landing.publish.auto`.
|
|
124
|
+
await deps.afterTrainLanded(ctx, [result]);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Anything unexpected still leaves the queue decidable: every member that has not been settled is
|
|
130
|
+
// `failed` with the typed code recorded, never stuck `in_progress` for a later runner to reap.
|
|
131
|
+
function failMember(ctx, member, code, error) {
|
|
132
|
+
const fresh = queue.readJob(ctx.root, member.id);
|
|
133
|
+
if (!fresh || queue.TERMINAL_STATES.includes(fresh.state)) return fresh;
|
|
134
|
+
deps.progress(`job ${member.id}: ${code}: ${error.message}`);
|
|
135
|
+
return queue.finishJob(ctx.root, member.id, {
|
|
136
|
+
state: 'failed',
|
|
137
|
+
reason: null,
|
|
138
|
+
error: { code, message: error.message },
|
|
139
|
+
timestamps: { ...(fresh.timestamps || {}), gated: queue.nowIso() },
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// D-7 (WP-1): a stop request is honoured at a TRAIN BOUNDARY, never by aborting the others' gate. A
|
|
144
|
+
// cancel never lands; a preempt goes back to the queue, where its urgent successor sorts to the head.
|
|
145
|
+
function dropStoppedMembers(ctx, members) {
|
|
146
|
+
const live = [];
|
|
147
|
+
for (const member of members) {
|
|
148
|
+
const fresh = queue.readJob(ctx.root, member.id);
|
|
149
|
+
const request = fresh && fresh.stopRequest;
|
|
150
|
+
if (!request) {
|
|
151
|
+
if (fresh) live.push(fresh);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (request.kind === 'cancel') {
|
|
155
|
+
deps.progress(`job ${member.id}: stopped before the train was built`);
|
|
156
|
+
queue.finishJob(ctx.root, member.id, {
|
|
157
|
+
state: 'canceled',
|
|
158
|
+
reason: 'stopped',
|
|
159
|
+
canceledBy: request.by,
|
|
160
|
+
stopRequest: null,
|
|
161
|
+
timestamps: { ...(fresh.timestamps || {}), canceled: queue.nowIso() },
|
|
162
|
+
});
|
|
163
|
+
} else {
|
|
164
|
+
deps.progress(`job ${member.id}: preempted by ${request.forJob}; back to the queue`);
|
|
165
|
+
queue.requeuePreempted(ctx.root, member.id);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return live;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// The train's synthetic job record: the gate and the refresh entries are handed LAND_TIP/LAND_JOB, and
|
|
172
|
+
// for a batch both name the TRAIN (the chain head and the batch id), not whichever member happened to
|
|
173
|
+
// be first — a member id there would make one member's log the batch's identity.
|
|
174
|
+
function batchJob(batchId, built, members) {
|
|
175
|
+
return {
|
|
176
|
+
id: batchId,
|
|
177
|
+
tip: built.train,
|
|
178
|
+
branch: `batch(${batchId})`,
|
|
179
|
+
title: `${members.length} members`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function runBatchOnce(ctx, members, token, signal) {
|
|
184
|
+
const batchId = (members[0].batch && members[0].batch.id) || queue.newBatchId();
|
|
185
|
+
const attempt = (members[0].batch && members[0].batch.attempt) || 1;
|
|
186
|
+
const workdir = deps.submitterWorkdir(ctx, members[0]);
|
|
187
|
+
// D-1/I-5: the policy is the `.ctm.json` committed at the TARGET, exactly as for one job.
|
|
188
|
+
const config = loadTargetLandingConfig(workdir);
|
|
189
|
+
const trainsRoot = train.trainsRoot(workdir, ctx.common).dir;
|
|
190
|
+
const trainDir = train.trainDirFor(trainsRoot, batchId);
|
|
191
|
+
// §9 S-4: the gate log, the selection record, the shadow record and the train worktree are all keyed
|
|
192
|
+
// by the TRAIN id, so a batch has one log every member points at (`gateLog`), not N copies.
|
|
193
|
+
const logFile = path.join(queue.ensureLogsDir(ctx.root), `${batchId}.log`);
|
|
194
|
+
const targetWorktree = train.targetWorktreeFor(workdir, config.target);
|
|
195
|
+
const sourceDir = targetWorktree ? targetWorktree.path : workdir;
|
|
196
|
+
const windowBefore = landingWindow.readWindow(ctx.root).size;
|
|
197
|
+
|
|
198
|
+
const live = dropStoppedMembers(ctx, members);
|
|
199
|
+
if (!live.length) return { jobs: [], bisect: null };
|
|
200
|
+
if (live.length === 1) return { jobs: [await runSingle(ctx, live[0], token, signal)], bisect: null };
|
|
201
|
+
|
|
202
|
+
const built = train.buildBatchTrain(workdir, config.target, live, {
|
|
203
|
+
onSkip: (member, paths, head) => {
|
|
204
|
+
deps.progress(`job ${member.id}: conflicts with the train chain at ${String(head).slice(0, 12)} — skipped (${paths.join(', ')})`);
|
|
205
|
+
queue.updateJob(ctx.root, member.id, {
|
|
206
|
+
state: 'queued',
|
|
207
|
+
conflictPreview: { base: head, paths, checkedAt: queue.nowIso() },
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
const landing = built.members;
|
|
212
|
+
deps.progress(`batch ${batchId} attempt ${attempt}: ${built.kind} on ${built.base.slice(0, 12)} — ${landing.length} member(s), ${built.skipped.length} skipped`);
|
|
213
|
+
if (!landing.length) return { jobs: [], bisect: null };
|
|
214
|
+
|
|
215
|
+
let finalBuilt = built;
|
|
216
|
+
const refreshEntries = train.matchingRefreshEntries(config);
|
|
217
|
+
if (built.kind === 'train' && refreshEntries.length) {
|
|
218
|
+
finalBuilt = await train.refreshTrain({
|
|
219
|
+
cwd: workdir, dir: trainDir, job: batchJob(batchId, built, landing), built, entries: refreshEntries, log: logFile, signal,
|
|
220
|
+
});
|
|
221
|
+
if (finalBuilt.refreshed && finalBuilt.refreshed.length) deps.progress(`batch ${batchId}: refreshed ${finalBuilt.refreshed.join(', ')}`);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
let verdict;
|
|
225
|
+
let reason = null;
|
|
226
|
+
let gateSeconds = null;
|
|
227
|
+
let gateTelemetry = null;
|
|
228
|
+
const cached = gate.readCachedVerdict(ctx.root, finalBuilt.tree, gatesHash(config.gates));
|
|
229
|
+
if (cached) {
|
|
230
|
+
verdict = cached.verdict;
|
|
231
|
+
gateSeconds = cached.seconds;
|
|
232
|
+
gateTelemetry = {
|
|
233
|
+
mode: 'cached', planBase: null, selected: null, executed: null, cached: null,
|
|
234
|
+
missReasons: null, fallbackReason: null, intersection: null,
|
|
235
|
+
};
|
|
236
|
+
deps.progress(`batch ${batchId}: verdict CACHED (${verdict})`);
|
|
237
|
+
if (fs.existsSync(trainDir)) train.removeTrainWorktree(workdir, trainDir);
|
|
238
|
+
} else {
|
|
239
|
+
const result = await gate.runGate({
|
|
240
|
+
cwd: workdir, dir: trainDir, config, job: batchJob(batchId, finalBuilt, landing), trainId: batchId,
|
|
241
|
+
built: finalBuilt, token, root: ctx.root, logFile, sourceDir, signal,
|
|
242
|
+
});
|
|
243
|
+
verdict = result.verdict;
|
|
244
|
+
reason = result.reason;
|
|
245
|
+
gateSeconds = result.seconds;
|
|
246
|
+
gateTelemetry = deps.gateSelectionTelemetry(result.selection);
|
|
247
|
+
deps.progress(`batch ${batchId}: gate ${verdict === null ? 'stopped' : verdict}${reason ? ` (${reason})` : ''} in ${result.seconds}s`);
|
|
248
|
+
if (result.verdict === 'PASS') {
|
|
249
|
+
// WP-2 (§5 D-1): the train's PASS is a proof for the NEXT train built on this tree, under the
|
|
250
|
+
// same D-1 refusals the hook's own PASS goes through. A refusal is reported, never a change of
|
|
251
|
+
// this batch's outcome.
|
|
252
|
+
try {
|
|
253
|
+
const refused = proof.proofRefusal(workdir, {
|
|
254
|
+
planBase: finalBuilt.base, tree: finalBuilt.tree, logText: fs.readFileSync(result.logPath, 'utf8'),
|
|
255
|
+
});
|
|
256
|
+
const fatal = refused && refused !== 'no_pass' ? refused : null;
|
|
257
|
+
if (fatal) deps.progress(`batch ${batchId}: proof not recorded (${fatal})`);
|
|
258
|
+
else {
|
|
259
|
+
proof.recordProof(ctx.root, {
|
|
260
|
+
tree: finalBuilt.tree,
|
|
261
|
+
planBaseTree: revParse(workdir, `${finalBuilt.base}^{tree}`),
|
|
262
|
+
gatesHash: gatesHash(config.gates),
|
|
263
|
+
verdict: 'PASS',
|
|
264
|
+
source: 'train',
|
|
265
|
+
commit: finalBuilt.train,
|
|
266
|
+
seconds: result.seconds,
|
|
267
|
+
at: new Date().toISOString(),
|
|
268
|
+
logPath: result.logPath,
|
|
269
|
+
selection: result.selection,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
deps.progress(`batch ${batchId}: proof not recorded (${error.code || 'error'}: ${error.message})`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// D-3/D-5 (WP-1) post-gate checkpoint: a member stopped while the gate ran is settled here and the
|
|
279
|
+
// run is VOIDED — the chain this gate judged was built from every member (train.js), so it carries
|
|
280
|
+
// code that will not land and no outcome of it can be used (P-1). The survivors go back to the queue
|
|
281
|
+
// at the SAME attempt: a withdrawal is not a bisection round, and the window is not touched (D-4).
|
|
282
|
+
const landingNow = dropStoppedMembers(ctx, landing);
|
|
283
|
+
const dropped = landing.length - landingNow.length;
|
|
284
|
+
|
|
285
|
+
if (reason === 'gate_stopped' || dropped > 0 || !landingNow.length) {
|
|
286
|
+
if (landingNow.length) queue.requeueHalf(ctx.root, landingNow, { batchId, attempt, batchMembers: landingNow.map((m) => m.id), reason: dropped > 0 ? 'withdrawn' : 'bisected' });
|
|
287
|
+
if (dropped > 0) deps.progress(`batch ${batchId}: ${dropped} member(s) withdrew — not landing; ${landingNow.length} requeued at attempt ${attempt}`);
|
|
288
|
+
return { jobs: [], bisect: null };
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (verdict !== 'PASS') {
|
|
292
|
+
// D-2: halve. The window halves FIRST (D-3), so the next train is built at the smaller window.
|
|
293
|
+
const windowAfter = landingWindow.bumpWindow(ctx.root, 'FAIL', config.batch.max).size;
|
|
294
|
+
queue.recordBatchMetric(ctx.root, {
|
|
295
|
+
batchId, members: landing.map((m) => m.id), verdict: 'FAIL', reason, gateSeconds, windowBefore, windowAfter,
|
|
296
|
+
});
|
|
297
|
+
const half = Math.ceil(landingNow.length / 2);
|
|
298
|
+
const first = landingNow.slice(0, half);
|
|
299
|
+
const second = landingNow.slice(half);
|
|
300
|
+
if (second.length) queue.requeueHalf(ctx.root, second, { batchId, attempt: attempt + 1, batchMembers: landingNow.map((m) => m.id) });
|
|
301
|
+
for (const member of first) {
|
|
302
|
+
queue.updateJob(ctx.root, member.id, {
|
|
303
|
+
batch: { id: batchId, members: landingNow.map((m) => m.id), attempt: attempt + 1, index: first.indexOf(member) },
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
deps.progress(`batch ${batchId}: FAIL (${reason || 'gate'}) — bisecting ${landingNow.length} → ${first.length} now + ${second.length} requeued`);
|
|
307
|
+
return { jobs: [], bisect: first.map((member) => queue.readJob(ctx.root, member.id)).filter(Boolean) };
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// D-1/D-11: ONE CAS for the whole chain, comparing against the commit the train was built on.
|
|
311
|
+
let landed;
|
|
312
|
+
try {
|
|
313
|
+
landed = train.landTrain(workdir, config.target, finalBuilt.train, finalBuilt.base, { env: { LAND_TOKEN: token } });
|
|
314
|
+
} catch (error) {
|
|
315
|
+
if (error && (error.code === 'cas_lost' || error.code === 'target_dirty')) {
|
|
316
|
+
// A target that moved (or is dirty) is not this batch's failure: every member goes back to the
|
|
317
|
+
// queue and the next drain iteration rebuilds the chain on the target as it is now.
|
|
318
|
+
deps.progress(`batch ${batchId}: ${error.code}; requeueing ${landingNow.length} member(s)`);
|
|
319
|
+
queue.requeueHalf(ctx.root, landingNow, { batchId, attempt: attempt + 1, batchMembers: landingNow.map((m) => m.id) });
|
|
320
|
+
return { jobs: [], bisect: null };
|
|
321
|
+
}
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
deps.progress(`batch ${batchId}: landed ${String(finalBuilt.train).slice(0, 12)} via ${landed.via} (${landingNow.length} member(s))`);
|
|
325
|
+
const windowAfter = landingWindow.bumpWindow(ctx.root, 'PASS', config.batch.max).size;
|
|
326
|
+
const results = queue.finishBatch(ctx.root, batchId, landingNow, (member) => ({
|
|
327
|
+
state: 'landed',
|
|
328
|
+
reason: null,
|
|
329
|
+
verdict: 'PASS',
|
|
330
|
+
base: finalBuilt.base,
|
|
331
|
+
tree: finalBuilt.tree,
|
|
332
|
+
train: finalBuilt.train,
|
|
333
|
+
landedVia: landed.via,
|
|
334
|
+
gateLog: logFile,
|
|
335
|
+
gate: gateTelemetry,
|
|
336
|
+
batch: member.batch,
|
|
337
|
+
timestamps: { ...(member.timestamps || {}), landed: queue.nowIso() },
|
|
338
|
+
}), {
|
|
339
|
+
gateSeconds,
|
|
340
|
+
gate: gateTelemetry,
|
|
341
|
+
// §6/D-8: the batch's ONE row rides the SAME hold as the members it describes, so a reader that
|
|
342
|
+
// can see the landing can see the verdict that produced it.
|
|
343
|
+
metric: {
|
|
344
|
+
members: landingNow.map((m) => m.id),
|
|
345
|
+
verdict: 'PASS',
|
|
346
|
+
gateSeconds,
|
|
347
|
+
windowBefore,
|
|
348
|
+
windowAfter,
|
|
349
|
+
gate: gateTelemetry,
|
|
350
|
+
},
|
|
351
|
+
});
|
|
352
|
+
deps.sweepConflictPreviews(ctx, workdir, config);
|
|
353
|
+
// WP-1 R-9: a BATCH lands N members with one gate, so it publishes once — for the train, not per
|
|
354
|
+
// member. A sync job is never a batch member in practice (it is enqueued while the queue drains),
|
|
355
|
+
// and `afterTrainLanded` reads the landed set either way.
|
|
356
|
+
await deps.afterTrainLanded(ctx, results);
|
|
357
|
+
return { jobs: results, bisect: null };
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
module.exports = {
|
|
361
|
+
configure,
|
|
362
|
+
chooseWindow,
|
|
363
|
+
runTrain,
|
|
364
|
+
fastPathApplies,
|
|
365
|
+
batchConfigOf,
|
|
366
|
+
};
|