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,403 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// WP-3 (docs/local-landing-queue-multi-session-integration-2026-10-26.html §6.3, §8 WP-3): the
|
|
4
|
+
// landing-queue HTTP surface.
|
|
5
|
+
//
|
|
6
|
+
// GET /api/landing/status?repo=<path>&session=<id> -> { ok, repo, queue, runner, jobs, radar,
|
|
7
|
+
// forSession }
|
|
8
|
+
// GET /api/landing/status?session=<id>&cached=1 -> { ok, cached:true, repo, forSession } (no CLI)
|
|
9
|
+
// POST /api/landing/run { repo } -> 202 { ok, started:true, pid }
|
|
10
|
+
// | 409 { ok:false, error:'runner_live', runner }
|
|
11
|
+
// POST /api/landing/submit { session, -> 200 <the CLI's own --json payload>
|
|
12
|
+
// priority?, reason? } | 409 (CLI exit 1) | 400 (CLI exit 2)
|
|
13
|
+
// (WP-4 §6.4: `priority`/`reason` are optional passthrough flags — a non-string value is 400
|
|
14
|
+
// `priority_invalid` / `reason_invalid`; the level and the reason requirement are the CLI's own
|
|
15
|
+
// call, and its exit 2 is the 400 above.)
|
|
16
|
+
//
|
|
17
|
+
// D-1: the CLI is the single source of truth and the server never requires `lib/landing/*` on its
|
|
18
|
+
// thread — those modules are synchronous (a radar sweep is N merge-trees) and this loop is the same
|
|
19
|
+
// one that relays terminals. Every fact here comes from `process.execPath <...>/bin/land.js --json`
|
|
20
|
+
// run as an ASYNC child, with a timeout and a maxBuffer. The parsing helpers are exported so the
|
|
21
|
+
// probe can be exercised against a real scratch repository.
|
|
22
|
+
//
|
|
23
|
+
// `run` is the ONE detached launch: `land submit` starts its own runner when it wins the lease, but
|
|
24
|
+
// a queue whose runner died with nothing to submit needs a way to be restarted, and that way must
|
|
25
|
+
// never be "run the drain loop inside the server".
|
|
26
|
+
//
|
|
27
|
+
// Like lib/api/host-stats.js this is NEW surface: the handler bodies live here, so there is no
|
|
28
|
+
// legacy handleApi branch to delete and tests-integration/api-router-parity.test.js's no-dual-
|
|
29
|
+
// dispatch rule is satisfied by construction. Auth is NOT evaluated here: lib/auth-rules.js carries
|
|
30
|
+
// the three rows (all `{ loopbackOnly: true }`) and a route with no rule is 403 auth_rule_missing by
|
|
31
|
+
// design, so the rule rows and this registration must land together.
|
|
32
|
+
|
|
33
|
+
const path = require('node:path');
|
|
34
|
+
const { execFile, spawn } = require('node:child_process');
|
|
35
|
+
const { registerApiRoutes } = require('../api-router');
|
|
36
|
+
const { landingStatusForRepo } = require('../landing/ctm-view');
|
|
37
|
+
|
|
38
|
+
// Resolved from THIS file: lib/api/ -> coding-task-manager/bin/land.js.
|
|
39
|
+
const CLI_PATH = path.join(__dirname, '..', '..', 'bin', 'land.js');
|
|
40
|
+
// A radar probe is merge-base + merge-tree per uncached pair; a submit does a handful of git reads.
|
|
41
|
+
// Both are bounded, and the bound is what makes an async child safe to hold on the request path.
|
|
42
|
+
const PROBE_TIMEOUT_MS = 30000;
|
|
43
|
+
const SUBMIT_TIMEOUT_MS = 60000;
|
|
44
|
+
const MAX_BUFFER = 8 * 1024 * 1024;
|
|
45
|
+
|
|
46
|
+
// §4 / bin/git-test-env.js GIT_CONTEXT_ENV_KEYS. COPIED, not required: lib/ must not depend on bin/
|
|
47
|
+
// (its files are pinned by the test-broker protocol manifest). A test in
|
|
48
|
+
// tests-integration/landing-ctm-api.test.js asserts this list still equals the CLI's own scrub list,
|
|
49
|
+
// so drift is caught instead of assumed.
|
|
50
|
+
const GIT_CONTEXT_ENV_KEYS = Object.freeze([
|
|
51
|
+
'GIT_DIR',
|
|
52
|
+
'GIT_WORK_TREE',
|
|
53
|
+
'GIT_INDEX_FILE',
|
|
54
|
+
'GIT_PREFIX',
|
|
55
|
+
'GIT_OBJECT_DIRECTORY',
|
|
56
|
+
'GIT_COMMON_DIR',
|
|
57
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
let _deps = null;
|
|
61
|
+
|
|
62
|
+
function configure({
|
|
63
|
+
probeLanding,
|
|
64
|
+
liveSessions,
|
|
65
|
+
sessionById,
|
|
66
|
+
worktreePathForSession,
|
|
67
|
+
runLandSubmit,
|
|
68
|
+
spawnRunner,
|
|
69
|
+
sendJsonResponse,
|
|
70
|
+
readJsonRequestBody,
|
|
71
|
+
onRunnerError,
|
|
72
|
+
cachedLandingForSession,
|
|
73
|
+
} = {}) {
|
|
74
|
+
_deps = {
|
|
75
|
+
probeLanding, liveSessions, sessionById, worktreePathForSession,
|
|
76
|
+
runLandSubmit, spawnRunner, sendJsonResponse, readJsonRequestBody, onRunnerError, cachedLandingForSession,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function _dep(name) {
|
|
81
|
+
return _deps ? _deps[name] : null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function _send(res, status, payload) {
|
|
85
|
+
const send = _dep('sendJsonResponse');
|
|
86
|
+
if (typeof send === 'function') return send(res, status, payload);
|
|
87
|
+
const body = JSON.stringify(payload || {});
|
|
88
|
+
res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) });
|
|
89
|
+
res.end(body);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function _query(url, name) {
|
|
93
|
+
const value = url && url.searchParams ? url.searchParams.get(name) : null;
|
|
94
|
+
return typeof value === 'string' && value.trim() ? value.trim() : null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function _readBody(req) {
|
|
98
|
+
const read = _dep('readJsonRequestBody');
|
|
99
|
+
if (typeof read !== 'function') return {};
|
|
100
|
+
const body = await read(req);
|
|
101
|
+
return body && typeof body === 'object' ? body : {};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// --- the CLI child ------------------------------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
// process.env minus the §4 GIT_* list. The CLI scrubs again for its own git children
|
|
107
|
+
// (lib/landing/git.js#childEnv); this scrub is for the CLI process itself, whose `cwd` is the
|
|
108
|
+
// repository we were asked about and whose inherited GIT_DIR would otherwise point somewhere else.
|
|
109
|
+
function cliEnv(extra) {
|
|
110
|
+
const env = { ...process.env };
|
|
111
|
+
for (const key of GIT_CONTEXT_ENV_KEYS) delete env[key];
|
|
112
|
+
if (extra) Object.assign(env, extra);
|
|
113
|
+
return env;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// One result shape for every exit path, so no caller parses stdout or stderr itself. Exit codes are
|
|
117
|
+
// the CLI's own contract (§6.2): 0 ok · 1 typed refusal (JSON `error.code`) · 2 usage · 75 timeout.
|
|
118
|
+
function interpretCliResult(error, stdout, stderr) {
|
|
119
|
+
const out = typeof stdout === 'string' ? stdout : String(stdout || '');
|
|
120
|
+
const err = (typeof stderr === 'string' ? stderr : String(stderr || '')).trim();
|
|
121
|
+
let payload = null;
|
|
122
|
+
try {
|
|
123
|
+
payload = JSON.parse(out);
|
|
124
|
+
} catch {
|
|
125
|
+
// expected: a non-JSON stdout. The CLI writes USAGE to stderr and nothing to stdout on a usage
|
|
126
|
+
// error, and a killed child may write nothing at all; the exit code and stderr below carry the
|
|
127
|
+
// answer in both cases.
|
|
128
|
+
payload = null;
|
|
129
|
+
}
|
|
130
|
+
if (error) {
|
|
131
|
+
if (error.killed === true || error.signal || error.code === 'ETIMEDOUT') {
|
|
132
|
+
return { ok: false, exitCode: null, error: { code: 'cli_timeout', message: err || 'the land CLI did not finish in time' } };
|
|
133
|
+
}
|
|
134
|
+
if (typeof error.code === 'number') {
|
|
135
|
+
const failure = payload && payload.ok === false && payload.error && typeof payload.error.code === 'string'
|
|
136
|
+
? payload.error
|
|
137
|
+
: { code: 'cli_refused', message: err || `land exited ${error.code}` };
|
|
138
|
+
return { ok: false, exitCode: error.code, error: { code: failure.code, message: failure.message || '' } };
|
|
139
|
+
}
|
|
140
|
+
return { ok: false, exitCode: null, error: { code: 'cli_spawn_failed', message: err || error.message } };
|
|
141
|
+
}
|
|
142
|
+
if (!payload || typeof payload !== 'object') {
|
|
143
|
+
return { ok: false, exitCode: null, error: { code: 'cli_output_invalid', message: out.trim().slice(0, 500) } };
|
|
144
|
+
}
|
|
145
|
+
if (payload.ok === false && payload.error && typeof payload.error.code === 'string') {
|
|
146
|
+
return { ok: false, exitCode: 1, error: payload.error };
|
|
147
|
+
}
|
|
148
|
+
return { ok: true, exitCode: 0, payload };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// The async child (D-1). `execFile`'s callback is the only exit path — the promise never rejects —
|
|
152
|
+
// so every caller gets the same result object without a try/catch of its own.
|
|
153
|
+
function runCli(args, options = {}) {
|
|
154
|
+
return new Promise((resolve) => {
|
|
155
|
+
execFile(process.execPath, [CLI_PATH, ...args], {
|
|
156
|
+
cwd: options.cwd || CLI_PATH,
|
|
157
|
+
env: cliEnv(options.env),
|
|
158
|
+
timeout: options.timeoutMs || PROBE_TIMEOUT_MS,
|
|
159
|
+
maxBuffer: MAX_BUFFER,
|
|
160
|
+
encoding: 'utf8',
|
|
161
|
+
}, (error, stdout, stderr) => resolve(interpretCliResult(error, stdout, stderr)));
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* A full (non-cache-only) `land status --json` for one repository, restricted to the given branches
|
|
167
|
+
* (§8 WP-3). The flag is always passed: plain `land status` carries no radar, and `branches`
|
|
168
|
+
* empty/absent is an empty restriction — no worktree swept, no pair — which is the honest answer
|
|
169
|
+
* for a repository with no live session on any branch: there is no pair to join to a session.
|
|
170
|
+
*/
|
|
171
|
+
function probeRepoWithCli({ repo, branches }) {
|
|
172
|
+
const names = Array.isArray(branches) ? branches : [];
|
|
173
|
+
const args = ['status', '--json', '--repo', repo, '--radar-for', names.join(',')];
|
|
174
|
+
return runCli(args, { cwd: repo, timeoutMs: PROBE_TIMEOUT_MS });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* §6.4 (WP-4): the two optional passthrough flags, built in ONE pure place so the exact argv is
|
|
179
|
+
* assertable without a child process. Only non-empty strings count — and with neither flag the array
|
|
180
|
+
* is the historical `['submit', '--json']` byte-for-byte, so no existing caller's CLI invocation
|
|
181
|
+
* changes. The server does NOT validate the level or the reason: the CLI is the one validator, and
|
|
182
|
+
* its exit 2 already maps to HTTP 400 below.
|
|
183
|
+
*/
|
|
184
|
+
function landSubmitArgv({ priority, reason } = {}) {
|
|
185
|
+
const optional = (name, value) => (typeof value === 'string' && value ? [`--${name}`, value] : []);
|
|
186
|
+
return ['submit', '--json', ...optional('priority', priority), ...optional('reason', reason)];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function submitWithCli({ cwd, sessionId, priority, reason }) {
|
|
190
|
+
return runCli(landSubmitArgv({ priority, reason }), {
|
|
191
|
+
cwd,
|
|
192
|
+
timeoutMs: SUBMIT_TIMEOUT_MS,
|
|
193
|
+
env: sessionId ? { CTM_SESSION_ID: String(sessionId) } : null,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* The detached runner (§6.3 / the "Run queue" button): `land run --once` in its own process group,
|
|
199
|
+
* unref'd, stdio ignored — it claims the per-repository lease itself, so a racing second child
|
|
200
|
+
* simply exits. Never in-process: the drain loop runs gates for as long as they take.
|
|
201
|
+
*/
|
|
202
|
+
function spawnDetachedRunner({ repo }) {
|
|
203
|
+
const child = spawn(process.execPath, [CLI_PATH, 'run', '--once'], {
|
|
204
|
+
cwd: repo,
|
|
205
|
+
env: cliEnv(),
|
|
206
|
+
detached: true,
|
|
207
|
+
stdio: 'ignore',
|
|
208
|
+
});
|
|
209
|
+
// A detached child reports a bad cwd/executable as an 'error' EVENT, not a throw; without a
|
|
210
|
+
// listener it would be an uncaught exception in the server. The caller has already answered 202,
|
|
211
|
+
// so this path can only report.
|
|
212
|
+
child.on('error', (error) => {
|
|
213
|
+
const report = _dep('onRunnerError');
|
|
214
|
+
if (typeof report === 'function') report(error);
|
|
215
|
+
});
|
|
216
|
+
child.unref();
|
|
217
|
+
return { pid: typeof child.pid === 'number' ? child.pid : null };
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// --- handlers -----------------------------------------------------------------------------------
|
|
221
|
+
|
|
222
|
+
function _probe(args) {
|
|
223
|
+
const probe = _dep('probeLanding');
|
|
224
|
+
return (typeof probe === 'function' ? probe : probeRepoWithCli)(args);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function _describedSessions() {
|
|
228
|
+
const list = _dep('liveSessions');
|
|
229
|
+
const entries = typeof list === 'function' ? list() : null;
|
|
230
|
+
return (Array.isArray(entries) ? entries : [])
|
|
231
|
+
.filter((entry) => entry && entry.id !== undefined && entry.id !== null && entry.repo)
|
|
232
|
+
.map((entry) => ({
|
|
233
|
+
id: String(entry.id),
|
|
234
|
+
repo: entry.repo,
|
|
235
|
+
branch: typeof entry.branch === 'string' ? entry.branch : null,
|
|
236
|
+
// The session's WORK TREE (`describeSession().path`). A caller may name either the repository's
|
|
237
|
+
// common dir or one of its worktree paths (`?repo=` accepts both), and the two must resolve to
|
|
238
|
+
// the same session set for the chip to be attributable.
|
|
239
|
+
path: typeof entry.path === 'string' && entry.path ? entry.path : null,
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// The sessions CTM will say are "on" this repository — the ones a landing chip can be attributed to.
|
|
244
|
+
// A caller may name the repository by its common dir OR by one of its worktree paths, and the probe
|
|
245
|
+
// echoes the repository's real common dir back, so the caller's names and the probe's answer are both
|
|
246
|
+
// consulted: only one of them has to line up for every session of that repository to be included.
|
|
247
|
+
// Comparison is textual first (the runtime keys its own cache the same way) with a resolved-path
|
|
248
|
+
// fallback for the caller's own spelling.
|
|
249
|
+
function _sessionsForRepo(...repos) {
|
|
250
|
+
const wanted = repos.filter((value) => typeof value === 'string' && value);
|
|
251
|
+
if (!wanted.length) return [];
|
|
252
|
+
const sessions = _describedSessions();
|
|
253
|
+
const names = (entry) => [entry.repo, entry.path].filter((value) => typeof value === 'string' && value);
|
|
254
|
+
const exact = sessions.filter((entry) => names(entry).some((value) => wanted.includes(value)));
|
|
255
|
+
const matching = exact.length
|
|
256
|
+
? exact
|
|
257
|
+
: sessions.filter((entry) => names(entry).some((value) => wanted.some((repo) => path.resolve(value) === path.resolve(repo))));
|
|
258
|
+
return matching.map((entry) => ({ id: entry.id, branch: entry.branch }));
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// `?session=<id>` with no `?repo=`: the repository comes from the session's own git snapshot. A
|
|
262
|
+
// session CTM cannot describe yet falls back to its worktree path, which the CLI resolves itself
|
|
263
|
+
// (`git rev-parse --show-toplevel`) — the same arm as an explicit `?repo=` path.
|
|
264
|
+
function _repoForSession(sessionId) {
|
|
265
|
+
if (!sessionId) return null;
|
|
266
|
+
const described = _describedSessions().find((entry) => entry.id === String(sessionId));
|
|
267
|
+
if (described) return described.repo;
|
|
268
|
+
const lookup = _dep('sessionById');
|
|
269
|
+
const session = typeof lookup === 'function' ? lookup(sessionId) : null;
|
|
270
|
+
if (!session) return null;
|
|
271
|
+
const dir = _dep('worktreePathForSession');
|
|
272
|
+
const candidate = typeof dir === 'function' ? dir(session) : (session.worktree_path || session.cwd);
|
|
273
|
+
return typeof candidate === 'string' && candidate ? candidate : null;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async function handleLandingStatus(req, res, url) {
|
|
277
|
+
// `?session=<id>&cached=1` (the Wall-E context hint): the session's view exactly as the last sweep
|
|
278
|
+
// left it, with no CLI child — a preflight on every agent turn must not start a radar probe.
|
|
279
|
+
if (_query(url, 'cached') === '1') return _sendCachedLanding(res, _query(url, 'session'));
|
|
280
|
+
const repo = _query(url, 'repo') || _repoForSession(_query(url, 'session'));
|
|
281
|
+
if (!repo) return _send(res, 404, { ok: false, error: 'repo_unknown' });
|
|
282
|
+
const probe = await _probe({ repo, sessions: _describedSessions() });
|
|
283
|
+
if (!probe || probe.ok !== true) {
|
|
284
|
+
const code = probe && probe.error ? probe.error.code : 'landing_probe_failed';
|
|
285
|
+
// `not_a_repo` is the CLI's own refusal for a path git cannot resolve — the one case the caller
|
|
286
|
+
// can fix by naming a different repository, so it is a 404 and not a server fault.
|
|
287
|
+
if (code === 'not_a_repo') return _send(res, 404, { ok: false, error: 'repo_unknown', detail: probe.error });
|
|
288
|
+
return _send(res, 502, { ok: false, error: 'landing_probe_failed', detail: (probe && probe.error) || null });
|
|
289
|
+
}
|
|
290
|
+
const payload = probe.payload || {};
|
|
291
|
+
// The probe answers with the repository's real common dir, which is how every session description
|
|
292
|
+
// names it; the caller's own spelling is consulted too, so `?repo=<worktree path>` attributes the
|
|
293
|
+
// whole repository rather than only the worktree it happened to name.
|
|
294
|
+
const body = landingStatusForRepo(payload, _sessionsForRepo(repo, payload.repo));
|
|
295
|
+
return _send(res, 200, { ok: true, repo: payload.repo || repo, ...body });
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function _sendCachedLanding(res, sessionId) {
|
|
299
|
+
if (!sessionId) return _send(res, 400, { ok: false, error: 'session_required' });
|
|
300
|
+
const read = _dep('cachedLandingForSession');
|
|
301
|
+
const cached = typeof read === 'function' ? read(String(sessionId)) : null;
|
|
302
|
+
if (!cached) return _send(res, 404, { ok: false, error: 'session_unknown' });
|
|
303
|
+
const forSession = cached.view ? { [String(sessionId)]: cached.view } : {};
|
|
304
|
+
return _send(res, 200, { ok: true, cached: true, repo: cached.repo || null, forSession });
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
async function handleLandingRun(req, res) {
|
|
308
|
+
let body;
|
|
309
|
+
try {
|
|
310
|
+
body = await _readBody(req);
|
|
311
|
+
} catch {
|
|
312
|
+
return _send(res, 400, { ok: false, error: 'invalid_json' });
|
|
313
|
+
}
|
|
314
|
+
const repo = typeof body.repo === 'string' && body.repo
|
|
315
|
+
? body.repo
|
|
316
|
+
: (body.session ? _repoForSession(String(body.session)) : null);
|
|
317
|
+
if (!repo) return _send(res, 404, { ok: false, error: 'repo_unknown' });
|
|
318
|
+
// The lease is the queue's own truth, and it is read from the same probe the status route uses:
|
|
319
|
+
// one runner per repository means "is one live?" is answered by the record holder, not by a guess.
|
|
320
|
+
const probe = await _probe({ repo, sessions: _describedSessions() });
|
|
321
|
+
if (!probe || probe.ok !== true) {
|
|
322
|
+
const code = probe && probe.error ? probe.error.code : 'landing_probe_failed';
|
|
323
|
+
if (code === 'not_a_repo') return _send(res, 404, { ok: false, error: 'repo_unknown', detail: probe.error });
|
|
324
|
+
return _send(res, 502, { ok: false, error: 'landing_probe_failed', detail: (probe && probe.error) || null });
|
|
325
|
+
}
|
|
326
|
+
const runner = probe.payload && probe.payload.runner ? probe.payload.runner : null;
|
|
327
|
+
if (runner && runner.alive === true) return _send(res, 409, { ok: false, error: 'runner_live', runner });
|
|
328
|
+
const spawnRunner = _dep('spawnRunner');
|
|
329
|
+
const started = (typeof spawnRunner === 'function' ? spawnRunner : spawnDetachedRunner)({ repo });
|
|
330
|
+
return _send(res, 202, { ok: true, started: true, pid: started ? started.pid : null });
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// §6.4 (WP-4): `priority` / `reason` are optional and unvalidated here (the CLI owns level-validity
|
|
334
|
+
// and the reason requirement). A key that is absent (or null, how JSON spells "not sent") is simply
|
|
335
|
+
// left out of the call, so a request without them reaches the run dependency — and the CLI argv —
|
|
336
|
+
// exactly as it did before this WP. A key that is present with a non-string value is the one thing
|
|
337
|
+
// the server can answer itself: the CLI would see a coerced `[object Object]`, so it is a 400 here.
|
|
338
|
+
function _optionalSubmitField(body, name) {
|
|
339
|
+
const value = body[name];
|
|
340
|
+
if (value === undefined || value === null) return { invalid: false, present: false };
|
|
341
|
+
if (typeof value !== 'string') return { invalid: true, present: true };
|
|
342
|
+
return { invalid: false, present: true, value };
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
async function handleLandingSubmit(req, res) {
|
|
346
|
+
let body;
|
|
347
|
+
try {
|
|
348
|
+
body = await _readBody(req);
|
|
349
|
+
} catch {
|
|
350
|
+
return _send(res, 400, { ok: false, error: 'invalid_json' });
|
|
351
|
+
}
|
|
352
|
+
const fields = {};
|
|
353
|
+
for (const name of ['priority', 'reason']) {
|
|
354
|
+
const field = _optionalSubmitField(body, name);
|
|
355
|
+
if (field.invalid) return _send(res, 400, { ok: false, error: `${name}_invalid` });
|
|
356
|
+
if (field.present) fields[name] = field.value;
|
|
357
|
+
}
|
|
358
|
+
const sessionId = body.session === undefined || body.session === null ? null : String(body.session);
|
|
359
|
+
if (!sessionId) return _send(res, 400, { ok: false, error: 'session_required' });
|
|
360
|
+
const lookup = _dep('sessionById');
|
|
361
|
+
const session = typeof lookup === 'function' ? lookup(sessionId) : null;
|
|
362
|
+
if (!session) return _send(res, 404, { ok: false, error: 'session_unknown' });
|
|
363
|
+
const dir = _dep('worktreePathForSession');
|
|
364
|
+
const cwd = typeof dir === 'function' ? dir(session) : (session.worktree_path || session.cwd);
|
|
365
|
+
if (typeof cwd !== 'string' || !cwd) return _send(res, 409, { ok: false, error: 'session_has_no_worktree' });
|
|
366
|
+
const run = _dep('runLandSubmit');
|
|
367
|
+
const result = await (typeof run === 'function' ? run : submitWithCli)({ cwd, sessionId, ...fields });
|
|
368
|
+
if (result && result.ok === true) return _send(res, 200, result.payload);
|
|
369
|
+
const exitCode = result ? result.exitCode : null;
|
|
370
|
+
const payload = { ok: false, error: result && result.error ? result.error : { code: 'cli_failed', message: '' } };
|
|
371
|
+
// The CLI's two refusal classes are genuinely different: 1 = a typed refusal the caller can read
|
|
372
|
+
// and act on (duplicate submitter, unmerged paths, missing gates), 2 = a usage error in what we
|
|
373
|
+
// asked for. Anything else (the child timed out, could not be started) is our fault, not theirs.
|
|
374
|
+
if (exitCode === 2) return _send(res, 400, payload);
|
|
375
|
+
if (exitCode === 1) return _send(res, 409, payload);
|
|
376
|
+
return _send(res, 502, payload);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function register() {
|
|
380
|
+
registerApiRoutes('landing', [
|
|
381
|
+
{ method: 'GET', path: '/api/landing/status', handler: (req, res, url) => handleLandingStatus(req, res, url) },
|
|
382
|
+
{ method: 'POST', path: '/api/landing/run', handler: (req, res) => handleLandingRun(req, res) },
|
|
383
|
+
{ method: 'POST', path: '/api/landing/submit', handler: (req, res) => handleLandingSubmit(req, res) },
|
|
384
|
+
]);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
module.exports = {
|
|
388
|
+
configure,
|
|
389
|
+
register,
|
|
390
|
+
handleLandingStatus,
|
|
391
|
+
handleLandingRun,
|
|
392
|
+
handleLandingSubmit,
|
|
393
|
+
probeRepoWithCli,
|
|
394
|
+
submitWithCli,
|
|
395
|
+
landSubmitArgv,
|
|
396
|
+
spawnDetachedRunner,
|
|
397
|
+
interpretCliResult,
|
|
398
|
+
cliEnv,
|
|
399
|
+
GIT_CONTEXT_ENV_KEYS,
|
|
400
|
+
CLI_PATH,
|
|
401
|
+
PROBE_TIMEOUT_MS,
|
|
402
|
+
SUBMIT_TIMEOUT_MS,
|
|
403
|
+
};
|