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,563 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Landing-throughput WP-6 shard S10 (design doc §5 D-10 "move-only", §6 "Shard module
|
|
4
|
+
// seam"): the terminal-input-prepared cluster moves out of server.js VERBATIM into this
|
|
5
|
+
// module behind the same configure(deps) seam as lib/api/session-attach.js and
|
|
6
|
+
// lib/terminal-attach-geometry.js (S6), lib/walle-history-serve.js (S8) and
|
|
7
|
+
// lib/codex-rollout-history.js (S9). It registers NO route and NO socket handler: server.js
|
|
8
|
+
// keeps the two pass-through callers (handleInput, _executeTerminalInputPlan) as
|
|
9
|
+
// terminalInputPrepared._handleInputPrepared(...), plus this configure() seam.
|
|
10
|
+
// Bodies are identical to server.js's declarations except for the `_deps.` prefix on every
|
|
11
|
+
// identifier that used to resolve to a server.js top-level binding (D-10 rule 1), proven by
|
|
12
|
+
// `node bin/move-only-check.js`. No moved body contains an inline `require(...)`, so there
|
|
13
|
+
// is no require rebase here (unlike S1/S3/S6/S8).
|
|
14
|
+
//
|
|
15
|
+
// The module deliberately lives at lib/terminal-input-prepared.js and NOT under lib/ws/:
|
|
16
|
+
// _handleInputPrepared is the keystroke admission/prepare seam, not a ws-router handler.
|
|
17
|
+
//
|
|
18
|
+
// Injected deps, per function:
|
|
19
|
+
// _wakeDeferredOnInput: _lifecycleClientKind, _recordRuntimeInputOutcome,
|
|
20
|
+
// _scheduleDeferredRestoreStart, _sendWsJsonBounded, promptSubmissionContract
|
|
21
|
+
// _runtimeInputMetadataForDeferredMessage: agentSessionKernel
|
|
22
|
+
// _recordAcceptedInteractiveInputForAnalysis: _analysisWorkerCoordinator,
|
|
23
|
+
// _lastUserInteractiveInputAt (get/set pair -- the moved body WRITES it)
|
|
24
|
+
// _handleInputPrepared: CODEX_BULK_INPUT_REDRAW_COALESCE_MS,
|
|
25
|
+
// CODEX_BULK_INPUT_REDRAW_WINDOW_MS, CTM_CLASSIFY_TAIL_BOUND, INPUT_READY_GATE_ENABLED,
|
|
26
|
+
// STATUS_EVIDENCE, _approverState, _clearManualApprovalReview, _clearRestoreInterruption,
|
|
27
|
+
// _clearTerminalInputEchoSuppression, _codexComposerBulkInputData,
|
|
28
|
+
// _emitOwnerMismatchDiagnostic, _impliedView, _inputMayResolveWaiting,
|
|
29
|
+
// _isServerWaitingForInput, _markMeaningfulActivity, _markServerSessionTurnOpen,
|
|
30
|
+
// _markSessionUserPromptInput, _markTerminalNonResolvingInputEcho,
|
|
31
|
+
// _maybeHandoffPrimaryOnInteract, _ownerDecisionInvalidRequest, _ownerRecovery,
|
|
32
|
+
// _prepareRestoreReplaySuppressionForInput, _recordInputAbortKeyDiagnostic,
|
|
33
|
+
// _recordRuntimeInputAcceptedForSession, _recordRuntimeInputOutcome,
|
|
34
|
+
// _recordRuntimeInputResultForSession, _recordStatusEvidence, _resendBlockedByParkQueue,
|
|
35
|
+
// _resumePromptNavigationDigits, _runtimeAdapterForSession,
|
|
36
|
+
// _runtimeAgentSessionIdForSession, _runtimeInputBaseForSession, _sendWsJsonBounded,
|
|
37
|
+
// _serverRawTerminalInputDecision, _sessionOwnerDecision,
|
|
38
|
+
// _standupIsBlockingWaitingReason, _standupWaitingReason, _terminalInputEchoTextFromInput,
|
|
39
|
+
// _terminalProcessGeneration, _updateCodexComposerInputState, _writeInputWithEchoTracking,
|
|
40
|
+
// _writeLifecyclePty, agentSessionKernel, approvalAgent, approvalSelfAdapt,
|
|
41
|
+
// approverDebugRings, autoApprovalBuffers, dbModule, detectAgentType, emitHumanSubmit,
|
|
42
|
+
// enqueueDeferredInput, evaluateResumeGateInput, idleNotifyState, isPureMouseReportInput,
|
|
43
|
+
// promptSubmissionContract, recordSessionDiagnostic, remoteTerminalTarget, restoreRuntime,
|
|
44
|
+
// resumePolicyForAttempt, runtimeInputPhaseCache, sessionInputAuthority, sessions,
|
|
45
|
+
// shouldWakeDeferredOnRawInput, terminalFirstPromptInputMatches,
|
|
46
|
+
// terminalInputAdmissionFacts
|
|
47
|
+
//
|
|
48
|
+
// Mutable module state (D-10 rule 2 / S9 lesson 7): _lastUserInteractiveInputAt is the ONE
|
|
49
|
+
// server.js binding a moved body WRITES (_recordAcceptedInteractiveInputForAnalysis), so it
|
|
50
|
+
// is injected as a getter/setter pair (S3/S9 precedent, lib/api/session-messages.js) -- never
|
|
51
|
+
// a copy. _ownerRecovery is a server.js `let` reassigned once during boot (server.js:7907),
|
|
52
|
+
// so it is injected as a getter too. Every other dep is a by-value reference; calls between
|
|
53
|
+
// the four moved functions stay direct (no _deps.).
|
|
54
|
+
//
|
|
55
|
+
// One syntax-forced deviation from rule 1 (reported): `dbModule` appears twice as an
|
|
56
|
+
// object-literal SHORTHAND property inside _handleInputPrepared
|
|
57
|
+
// (`{ sessionId: msg.id, dbModule }`). `_deps.dbModule` cannot be written in shorthand
|
|
58
|
+
// position, so those two sites keep the bare identifier, resolved by the module-scope alias
|
|
59
|
+
// below (assigned by configure()). Expanding the shorthand to `dbModule: _deps.dbModule`
|
|
60
|
+
// instead would make move-only-check report `DIFF at ...properties[N].shorthand` (the AST
|
|
61
|
+
// comparison includes the shorthand flag) for a change that is not semantic. dbModule is a
|
|
62
|
+
// server.js `const` (never rebound), so the by-value alias is behaviour-identical.
|
|
63
|
+
|
|
64
|
+
let _deps = null;
|
|
65
|
+
let dbModule = null; // bare alias for the two shorthand sites above -- see the header note
|
|
66
|
+
|
|
67
|
+
function configure(deps = {}) {
|
|
68
|
+
_deps = deps;
|
|
69
|
+
dbModule = deps.dbModule;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// WP-1 (live-defer-wake-adopted-host-death-2026-10-28.html §5 R-1/R-2): the ONE deferred-wake
|
|
73
|
+
// block -- a raw keystroke on a session whose process died under an open tab (_restoreDeferred,
|
|
74
|
+
// ptyProcess null) schedules the revive and is answered with the existing
|
|
75
|
+
// session_resume_not_ready drop payload, exactly like the non-raw wake site below.
|
|
76
|
+
function _wakeDeferredOnInput(session, ws, msg) {
|
|
77
|
+
_deps._scheduleDeferredRestoreStart(session, { source: 'input', clientKind: _deps._lifecycleClientKind(ws, msg),
|
|
78
|
+
cols: msg.cols || session._ptyCols || 120, rows: msg.rows || session._ptyRows || 30,
|
|
79
|
+
terminalDimsMeasured: msg.terminalDimsMeasured === true,
|
|
80
|
+
});
|
|
81
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
82
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session_resume_not_ready'));
|
|
83
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'session_resume_not_ready');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function _runtimeInputMetadataForDeferredMessage(msg, source = 'composer') {
|
|
87
|
+
const clientMessageId = _deps.agentSessionKernel.normalizeClientMessageId(msg?.clientMessageId);
|
|
88
|
+
return clientMessageId ? {
|
|
89
|
+
clientMessageId,
|
|
90
|
+
source: String(msg?.source || source),
|
|
91
|
+
recordText: String(msg?.recordText !== undefined ? msg.recordText : msg?.data || ''),
|
|
92
|
+
} : {};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function _recordAcceptedInteractiveInputForAnalysis(now = Date.now()) {
|
|
96
|
+
_deps._lastUserInteractiveInputAt = now;
|
|
97
|
+
_deps._analysisWorkerCoordinator.recordAcceptedInput();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function _handleInputPrepared(ws, msg, existingInput, options = {}) {
|
|
101
|
+
const recoveryBlock = _deps._ownerRecovery.rejectRequest(ws, msg); if (recoveryBlock) return recoveryBlock;
|
|
102
|
+
const initialTargetRefusal = _deps.remoteTerminalTarget.terminalInputRefusal(options);
|
|
103
|
+
if (initialTargetRefusal) return initialTargetRefusal;
|
|
104
|
+
let session = _deps.sessions.get(msg.id);
|
|
105
|
+
if (session) {
|
|
106
|
+
// D-3: a keystroke for a session this socket is not viewing is a client bug -- implied-view
|
|
107
|
+
// it (see _impliedView) so frames start flowing, but never refuse the keystroke on this
|
|
108
|
+
// account (that is WP-2's admission concern, unchanged here).
|
|
109
|
+
if (ws && options.trustedInternal !== true) _deps._impliedView(ws, msg.id, 'input');
|
|
110
|
+
const rawTerminalInput = options.trustedInternal !== true;
|
|
111
|
+
const ownerDecision = _deps._sessionOwnerDecision(msg.id);
|
|
112
|
+
if (!ownerDecision.ok) {
|
|
113
|
+
if (_deps._ownerDecisionInvalidRequest(ownerDecision)) return;
|
|
114
|
+
_deps._emitOwnerMismatchDiagnostic(ownerDecision);
|
|
115
|
+
}
|
|
116
|
+
// User-input priority: mark the session as human-driven so the auto-approver backs off
|
|
117
|
+
// (its y/Enter/backspace must not interleave with the user's arrow navigation at a prompt).
|
|
118
|
+
_deps.approvalAgent.markUserActive(msg.id); if (rawTerminalInput && options.authenticatedRemote !== true && String(msg.data).includes('\r')) _deps.emitHumanSubmit(msg.id); // WP-5 D-13: an Enter keystroke is a human submit
|
|
119
|
+
if (session._resumeBlocked && !rawTerminalInput) {
|
|
120
|
+
if (ws?.readyState === 1) {
|
|
121
|
+
_deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload({
|
|
122
|
+
id: session.id,
|
|
123
|
+
clientMessageId: _deps.agentSessionKernel.normalizeClientMessageId(msg?.clientMessageId),
|
|
124
|
+
}, 'session_resume_blocked'));
|
|
125
|
+
}
|
|
126
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'session_resume_blocked');
|
|
127
|
+
}
|
|
128
|
+
// Every WebSocket `input` message is a raw PTY attempt, including legacy messages that omit
|
|
129
|
+
// inputChannel. Only a server-internal caller can supply this out-of-band option; a message
|
|
130
|
+
// field must never grant a client a semantic-channel bypass.
|
|
131
|
+
const admissionMessage = options.authenticatedRemote === true
|
|
132
|
+
? {
|
|
133
|
+
...msg,
|
|
134
|
+
resumeGeneration: Number(session._launchPlanGeneration || 0),
|
|
135
|
+
processGeneration: _deps._terminalProcessGeneration(session),
|
|
136
|
+
}
|
|
137
|
+
: msg;
|
|
138
|
+
const terminalAdmissionFacts = _deps.terminalInputAdmissionFacts(
|
|
139
|
+
session, { ...admissionMessage, inputChannel: rawTerminalInput ? 'terminal' : msg.inputChannel },
|
|
140
|
+
_deps._terminalProcessGeneration,
|
|
141
|
+
);
|
|
142
|
+
const rawDecision = rawTerminalInput
|
|
143
|
+
? _deps._serverRawTerminalInputDecision(session, ws, options, msg)
|
|
144
|
+
: null;
|
|
145
|
+
const terminalAdmission = rawTerminalInput
|
|
146
|
+
? (rawDecision.allowed
|
|
147
|
+
? { outcome: 'allowed', allowed: true, reason: 'route_live', complete: true, advisory: [] }
|
|
148
|
+
: {
|
|
149
|
+
outcome: 'rejected', allowed: false,
|
|
150
|
+
reason: rawDecision.reason.replaceAll('-', '_'),
|
|
151
|
+
complete: true, advisory: [],
|
|
152
|
+
})
|
|
153
|
+
: _deps.sessionInputAuthority.admit(session.id, ws, terminalAdmissionFacts);
|
|
154
|
+
// C-1: a granted-but-stale lease no longer holds the keystroke -- re-seed the owner instead.
|
|
155
|
+
// Item B: only reseed on an actually-admitted keystroke -- a rejected admission carries no
|
|
156
|
+
// baseline-stale advisory of its own worth re-arming a reprojection for.
|
|
157
|
+
if (terminalAdmission.outcome === 'rejected') {
|
|
158
|
+
// WP-1 (R-1): a raw keystroke to a deferred session wakes it instead of being refused
|
|
159
|
+
// pty_unavailable -- the raw refusal below would otherwise return before the wake. Only a
|
|
160
|
+
// genuine pty_unavailable rejection on a writable socket wakes (a read-only secondary
|
|
161
|
+
// viewer's keystroke must never respawn the session).
|
|
162
|
+
if (_deps.shouldWakeDeferredOnRawInput({
|
|
163
|
+
rawTerminalInput,
|
|
164
|
+
rejectionReason: terminalAdmission.reason,
|
|
165
|
+
readOnly: rawDecision?.readOnly === true,
|
|
166
|
+
restoreDeferred: session._restoreDeferred === true,
|
|
167
|
+
parking: !!session._parking,
|
|
168
|
+
})) return _wakeDeferredOnInput(session, ws, msg);
|
|
169
|
+
if (terminalAdmission.complete !== true) {
|
|
170
|
+
_deps.recordSessionDiagnostic(session.id, 'terminal-input-authority-incomplete', {
|
|
171
|
+
reason: terminalAdmission.reason,
|
|
172
|
+
socketGeneration: Number(ws?.socketGeneration || 0),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
_deps.recordSessionDiagnostic(session.id, 'terminal-input-refused', {
|
|
176
|
+
reason: terminalAdmission.reason,
|
|
177
|
+
generation: Number(msg.resumeGeneration || 0),
|
|
178
|
+
processGeneration: Number(msg.processGeneration || 0),
|
|
179
|
+
expectedGeneration: Number(terminalAdmissionFacts.expectedResumeGeneration || 0),
|
|
180
|
+
expectedProcessGeneration: Number(terminalAdmissionFacts.expectedProcessGeneration || 0),
|
|
181
|
+
});
|
|
182
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
183
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, `terminal_input_${terminalAdmission.reason}`));
|
|
184
|
+
return _deps._recordRuntimeInputOutcome(
|
|
185
|
+
session, msg, 'refused', `terminal_input_${terminalAdmission.reason}`,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
if (session._parking) {
|
|
189
|
+
if (rawTerminalInput) {
|
|
190
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
191
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'terminal_input_pty_unavailable'));
|
|
192
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'terminal_input_pty_unavailable');
|
|
193
|
+
}
|
|
194
|
+
_deps._markMeaningfulActivity(session, 'input', Date.now());
|
|
195
|
+
const inputGeneration = session._parkingInputGeneration
|
|
196
|
+
|| Math.max(1, Number(session._terminalLifecycleCounter || 0) + 1);
|
|
197
|
+
session._parkingInputGeneration = inputGeneration;
|
|
198
|
+
session._lifecycleInputInFlight = true;
|
|
199
|
+
session._parkingInputQueue = _deps.enqueueDeferredInput(
|
|
200
|
+
session._parkingInputQueue,
|
|
201
|
+
msg.data,
|
|
202
|
+
inputGeneration,
|
|
203
|
+
_runtimeInputMetadataForDeferredMessage(msg),
|
|
204
|
+
);
|
|
205
|
+
if (!session._parkingSignalSent) session._parkingAbortRequested = true;
|
|
206
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'parked');
|
|
207
|
+
}
|
|
208
|
+
if (session._restoreDeferred) {
|
|
209
|
+
return _wakeDeferredOnInput(session, ws, msg);
|
|
210
|
+
}
|
|
211
|
+
const resumePolicy = _deps.resumePolicyForAttempt(session._resumeAttemptState);
|
|
212
|
+
const terminalHandoffReady = terminalAdmission.allowed && rawTerminalInput;
|
|
213
|
+
if (_deps.INPUT_READY_GATE_ENABLED
|
|
214
|
+
&& !terminalHandoffReady
|
|
215
|
+
&& ['prompt-navigation', 'blocked'].includes(resumePolicy.inputChannel)) {
|
|
216
|
+
const terminalFirstInput = resumePolicy.inputChannel === 'prompt-navigation'
|
|
217
|
+
&& _deps.terminalFirstPromptInputMatches(
|
|
218
|
+
session._resumeAttemptState,
|
|
219
|
+
session._launchPlanGeneration,
|
|
220
|
+
msg,
|
|
221
|
+
);
|
|
222
|
+
const gateChannel = terminalFirstInput ? 'prompt-terminal' : resumePolicy.inputChannel;
|
|
223
|
+
const channel = resumePolicy.inputChannel === 'prompt-navigation' ? 'prompt-navigation' : 'readiness';
|
|
224
|
+
const gate = _deps.evaluateResumeGateInput(msg.data, {
|
|
225
|
+
channel: gateChannel,
|
|
226
|
+
digits: _deps._resumePromptNavigationDigits(session._resumeAttemptState),
|
|
227
|
+
});
|
|
228
|
+
if (gate.droppedMouse > 0) {
|
|
229
|
+
_deps.recordSessionDiagnostic(session.id, 'input-dropped-mouse', {
|
|
230
|
+
generation: Number(session._launchPlanGeneration || 0),
|
|
231
|
+
reports: gate.droppedMouse,
|
|
232
|
+
chars: String(msg.data || '').length - gate.data.length,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (gate.droppedControl > 0) {
|
|
236
|
+
_deps.recordSessionDiagnostic(session.id, 'input-dropped-control', {
|
|
237
|
+
generation: Number(session._launchPlanGeneration || 0),
|
|
238
|
+
sequences: gate.droppedControl,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (gate.action === 'drop') {
|
|
242
|
+
const reason = gate.droppedMouse > 0 ? 'resume_mouse_report' : 'resume_control_sequence';
|
|
243
|
+
_deps.recordSessionDiagnostic(session.id, 'resume-input-dropped', {
|
|
244
|
+
chars: String(msg.data || '').length,
|
|
245
|
+
reason,
|
|
246
|
+
generation: Number(session._launchPlanGeneration || 0),
|
|
247
|
+
});
|
|
248
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
249
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, reason));
|
|
250
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', reason);
|
|
251
|
+
}
|
|
252
|
+
if (gate.data !== String(msg.data || '')) msg = { ...msg, data: gate.data, recordText: gate.data };
|
|
253
|
+
if (gate.action === 'hold') {
|
|
254
|
+
_deps.recordSessionDiagnostic(session.id, 'terminal-input-refused', {
|
|
255
|
+
reason: channel,
|
|
256
|
+
generation: Number(session._launchPlanGeneration || 0),
|
|
257
|
+
phase: String(session._resumeAttemptState?.phase || ''),
|
|
258
|
+
chars: gate.data.length,
|
|
259
|
+
});
|
|
260
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
261
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session_resume_not_ready'));
|
|
262
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', channel);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (!session.ptyProcess) {
|
|
266
|
+
if (session._resumeAttemptState && _deps.INPUT_READY_GATE_ENABLED) {
|
|
267
|
+
const gate = _deps.evaluateResumeGateInput(msg.data, { channel: 'blocked' });
|
|
268
|
+
if (gate.droppedMouse > 0) _deps.recordSessionDiagnostic(session.id, 'input-dropped-mouse', {
|
|
269
|
+
generation: Number(session._launchPlanGeneration || 0),
|
|
270
|
+
reports: gate.droppedMouse,
|
|
271
|
+
chars: String(msg.data || '').length - gate.data.length,
|
|
272
|
+
});
|
|
273
|
+
if (!gate.data) {
|
|
274
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
275
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'resume_mouse_report'));
|
|
276
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'resume_mouse_report');
|
|
277
|
+
}
|
|
278
|
+
if (ws?.readyState === 1) _deps._sendWsJsonBounded(ws,
|
|
279
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'pty-missing'));
|
|
280
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'pty-missing');
|
|
281
|
+
}
|
|
282
|
+
_deps.recordSessionDiagnostic(session.id, 'input-dropped', {
|
|
283
|
+
reason: 'pty-missing',
|
|
284
|
+
chars: String(msg.data || '').length,
|
|
285
|
+
});
|
|
286
|
+
if (ws && ws.readyState === 1) {
|
|
287
|
+
_deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'pty-missing'));
|
|
288
|
+
}
|
|
289
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'pty-missing');
|
|
290
|
+
}
|
|
291
|
+
// Width arbitration (Phase 3): typing makes THIS client the active device —
|
|
292
|
+
// hand it the primary role (drive the PTY at its width, get the raw stream) if
|
|
293
|
+
// the current primary has gone idle, so the device you're using renders
|
|
294
|
+
// natively. No-op for single-viewer sessions and HTTP-route callers.
|
|
295
|
+
// Geometry ownership only affects viewport presentation. A failed best-effort handoff must
|
|
296
|
+
// never invalidate a raw byte already admitted on transport/route/PTY authority.
|
|
297
|
+
try { _deps._maybeHandoffPrimaryOnInteract(ws, msg.id); } catch {}
|
|
298
|
+
// Input dedup: macOS IME can cause the browser to send the same keystroke twice
|
|
299
|
+
// (keydown + composition path). Skip identical input within 10ms.
|
|
300
|
+
// Keep single printable characters out of dedup entirely: adjacent repeated
|
|
301
|
+
// letters such as the "ss" in "session" are real input even when browser
|
|
302
|
+
// scheduling compresses them into the same 10ms window.
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
_deps._markMeaningfulActivity(session, 'input', now);
|
|
305
|
+
const inputData = String(msg.data || '');
|
|
306
|
+
let durableInputPhase = '';
|
|
307
|
+
const clientMessageId = _deps.agentSessionKernel.normalizeClientMessageId(msg.clientMessageId);
|
|
308
|
+
if (clientMessageId) {
|
|
309
|
+
const durableInputId = `web:${clientMessageId}`;
|
|
310
|
+
// WP-2 (D-16, S-4): a refused-but-never-queued earlier attempt kept no bytes -- this is a
|
|
311
|
+
// fresh one (unless it is still sitting in the park queue -- see _resendBlockedByParkQueue).
|
|
312
|
+
if (existingInput && existingInput.result === 'refused' && !_deps._resendBlockedByParkQueue(session, clientMessageId)) {
|
|
313
|
+
existingInput = null;
|
|
314
|
+
}
|
|
315
|
+
const existingResult = String(existingInput?.result || '');
|
|
316
|
+
const duplicatePhase = msg.commit === true
|
|
317
|
+
? existingResult === 'delivered'
|
|
318
|
+
: !!existingInput;
|
|
319
|
+
if (duplicatePhase) {
|
|
320
|
+
const phase = existingResult === 'delivered'
|
|
321
|
+
? 'delivered'
|
|
322
|
+
: existingResult === 'deferred'
|
|
323
|
+
? 'held'
|
|
324
|
+
: existingResult === 'rejected' || existingResult === 'refused' || existingResult === 'dedup'
|
|
325
|
+
? 'refused'
|
|
326
|
+
: 'accepted';
|
|
327
|
+
const ack = _deps.agentSessionKernel.recordCanonicalEvent(_deps.dbModule, msg.id, {
|
|
328
|
+
id: `input:${clientMessageId}:${phase}`, type: `input.${phase}`, role: 'event',
|
|
329
|
+
data: { clientMessageId, fidelity: msg.fidelity || 'pty', duplicate: true },
|
|
330
|
+
}, { adapter: _deps._runtimeAdapterForSession(session), agentSessionId: _deps._runtimeAgentSessionIdForSession(session) });
|
|
331
|
+
if (ack && ws && ws.readyState === 1) _deps._sendWsJsonBounded(ws, {
|
|
332
|
+
...ack, type: 'stream-event', eventType: ack.type, ctmSessionId: msg.id,
|
|
333
|
+
data: { type: ack.type, ...(ack.data || {}), duplicate: true },
|
|
334
|
+
});
|
|
335
|
+
return { durableInputPhase: phase };
|
|
336
|
+
}
|
|
337
|
+
const runtimeInput = _deps._runtimeInputBaseForSession(msg.id, session, {
|
|
338
|
+
inputId: durableInputId,
|
|
339
|
+
source: 'composer', mode: 'inline', action: 'agent-web-input',
|
|
340
|
+
text: msg.commit === true ? '' : String(msg.recordText !== undefined ? msg.recordText : inputData),
|
|
341
|
+
attachments: Array.isArray(msg.attachments) ? msg.attachments : [],
|
|
342
|
+
metadata: { clientMessageId, fidelity: msg.fidelity || 'pty' },
|
|
343
|
+
appendUserInputEvent: msg.commit !== true,
|
|
344
|
+
});
|
|
345
|
+
const phase = msg.commit === true ? 'delivered' : 'accepted';
|
|
346
|
+
durableInputPhase = phase;
|
|
347
|
+
if (phase === 'accepted') _deps._recordRuntimeInputAcceptedForSession(msg.id, session, runtimeInput);
|
|
348
|
+
else _deps._recordRuntimeInputResultForSession(msg.id, session, runtimeInput, 'delivered', 'pty_commit');
|
|
349
|
+
const ack = _deps.agentSessionKernel.recordCanonicalEvent(_deps.dbModule, msg.id, {
|
|
350
|
+
id: `input:${clientMessageId}:${phase}`,
|
|
351
|
+
type: `input.${phase}`,
|
|
352
|
+
role: 'event',
|
|
353
|
+
data: { clientMessageId, fidelity: msg.fidelity || 'pty' },
|
|
354
|
+
}, { adapter: _deps._runtimeAdapterForSession(session), agentSessionId: _deps._runtimeAgentSessionIdForSession(session) });
|
|
355
|
+
if (ack && ws && ws.readyState === 1) {
|
|
356
|
+
_deps._sendWsJsonBounded(ws, { ...ack, type: 'stream-event', eventType: ack.type, ctmSessionId: msg.id,
|
|
357
|
+
data: { type: ack.type, ...(ack.data || {}) } });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
const singlePrintableInput = inputData.length === 1 && inputData >= ' ' && inputData !== '\x7f';
|
|
361
|
+
if (!singlePrintableInput && !_deps.isPureMouseReportInput(inputData) && msg.data === session._lastInputData && (now - session._lastInputTs) < 10) {
|
|
362
|
+
// S-16 (WP-3): net-zero at the ceiling -- one diagnostic per session per 10s (sibling
|
|
363
|
+
// shape: the pty-missing site above pairs recordSessionDiagnostic with
|
|
364
|
+
// _recordRuntimeInputOutcome too), never per keystroke.
|
|
365
|
+
if (!session._lastInputDedupDiagAt || now - session._lastInputDedupDiagAt >= 10000) {
|
|
366
|
+
session._lastInputDedupDiagAt = now;
|
|
367
|
+
_deps.recordSessionDiagnostic(session.id, 'input-dropped', { reason: 'dedup', chars: inputData.length });
|
|
368
|
+
}
|
|
369
|
+
_deps._recordRuntimeInputOutcome(session, msg, 'dedup');
|
|
370
|
+
return { durableInputPhase };
|
|
371
|
+
}
|
|
372
|
+
const prevInputTs = session._lastInputTs || 0;
|
|
373
|
+
session._lastInputData = msg.data;
|
|
374
|
+
session._lastInputTs = now;
|
|
375
|
+
_recordAcceptedInteractiveInputForAnalysis(now);
|
|
376
|
+
_deps.restoreRuntime.markUserInput(session, now);
|
|
377
|
+
if (_deps.detectAgentType(session.cmd || '') === 'codex' && _deps._codexComposerBulkInputData(inputData)) {
|
|
378
|
+
session._codexComposerBulkInputUntil = now + _deps.CODEX_BULK_INPUT_REDRAW_COALESCE_MS;
|
|
379
|
+
session._codexComposerBulkInputRedrawUntil = now + _deps.CODEX_BULK_INPUT_REDRAW_WINDOW_MS;
|
|
380
|
+
}
|
|
381
|
+
_deps._updateCodexComposerInputState(session, msg.data, now);
|
|
382
|
+
const waitingBeforeInput = _deps._isServerWaitingForInput(msg.id, session);
|
|
383
|
+
const waitingReasonBeforeInput = _deps._standupWaitingReason(msg.id, session);
|
|
384
|
+
const promptDismissResetEligible = waitingBeforeInput && !_deps._standupIsBlockingWaitingReason(waitingReasonBeforeInput);
|
|
385
|
+
const inputEchoText = _deps._terminalInputEchoTextFromInput(inputData).trim();
|
|
386
|
+
const inputSubmitsPrompt = inputData.includes('\r') || inputData.includes('\n');
|
|
387
|
+
if (inputSubmitsPrompt || inputData.includes('\x03') || inputData.includes('\x04')) {
|
|
388
|
+
_deps._clearRestoreInterruption(session, now, inputSubmitsPrompt ? 'terminal-submit' : 'terminal-control');
|
|
389
|
+
}
|
|
390
|
+
if (inputSubmitsPrompt) {
|
|
391
|
+
_deps._markServerSessionTurnOpen(session, now, 'terminal-submit');
|
|
392
|
+
}
|
|
393
|
+
if (promptDismissResetEligible && inputEchoText) {
|
|
394
|
+
session._attentionPendingUserPromptAt = now;
|
|
395
|
+
}
|
|
396
|
+
const submittedPromptAfterDismissal = promptDismissResetEligible && inputSubmitsPrompt && (
|
|
397
|
+
!!inputEchoText ||
|
|
398
|
+
!!(session._attentionPendingUserPromptAt && (now - session._attentionPendingUserPromptAt) < 10 * 60 * 1000)
|
|
399
|
+
);
|
|
400
|
+
const suppression = _deps._prepareRestoreReplaySuppressionForInput(
|
|
401
|
+
session,
|
|
402
|
+
msg.id,
|
|
403
|
+
inputData,
|
|
404
|
+
{
|
|
405
|
+
write: _deps.remoteTerminalTarget.guardTargetWrite(
|
|
406
|
+
options.isTerminalTargetCurrent,
|
|
407
|
+
data => _deps._writeLifecyclePty(session, data, 'restore-suppressed-input'),
|
|
408
|
+
),
|
|
409
|
+
isTerminalTargetCurrent: options.isTerminalTargetCurrent,
|
|
410
|
+
isTerminalAttemptCurrent: options.isTerminalAttemptCurrent,
|
|
411
|
+
metadata: _runtimeInputMetadataForDeferredMessage(msg),
|
|
412
|
+
},
|
|
413
|
+
);
|
|
414
|
+
const suppressionReady = suppression && typeof suppression.then === 'function'
|
|
415
|
+
? await suppression
|
|
416
|
+
: suppression;
|
|
417
|
+
const postSuppressionRefusal = _deps.remoteTerminalTarget.terminalInputRefusal(options);
|
|
418
|
+
if (postSuppressionRefusal) return postSuppressionRefusal;
|
|
419
|
+
if (!suppressionReady) {
|
|
420
|
+
if (ws?.readyState === 1) {
|
|
421
|
+
_deps._sendWsJsonBounded(ws,
|
|
422
|
+
_deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'restore_replay_suppression'));
|
|
423
|
+
}
|
|
424
|
+
return _deps._recordRuntimeInputOutcome(session, msg, 'refused', 'restore_replay_suppression');
|
|
425
|
+
}
|
|
426
|
+
const resolvesWaiting = _deps._inputMayResolveWaiting(msg.data, session);
|
|
427
|
+
// User evidence never changes a verdict (D-2); only a submit with echoed text opens a short
|
|
428
|
+
// probable turn, and an input that answers a wait releases the ledger's wait.
|
|
429
|
+
_deps._recordStatusEvidence(
|
|
430
|
+
session,
|
|
431
|
+
inputSubmitsPrompt
|
|
432
|
+
? (inputEchoText ? _deps.STATUS_EVIDENCE.USER_SUBMIT : _deps.STATUS_EVIDENCE.USER_INPUT)
|
|
433
|
+
: ((inputData === '\x1b' || inputData.includes('\x03')) ? _deps.STATUS_EVIDENCE.USER_INTERRUPT : _deps.STATUS_EVIDENCE.USER_INPUT),
|
|
434
|
+
Date.now(), // R-11: stamped at record time; `now` predates the suppression await, so a wait raised meanwhile would outlive the keystroke
|
|
435
|
+
'terminal-input',
|
|
436
|
+
resolvesWaiting ? { resolvesWait: true } : {},
|
|
437
|
+
);
|
|
438
|
+
if (resolvesWaiting) {
|
|
439
|
+
_deps._clearTerminalInputEchoSuppression(session);
|
|
440
|
+
session.lastActivity = now;
|
|
441
|
+
session._waitingForInput = false;
|
|
442
|
+
session._waitingForInputReason = '';
|
|
443
|
+
session._waitingForInputMessage = '';
|
|
444
|
+
session._waitingForInputAt = 0;
|
|
445
|
+
session._waitFieldsFromHook = false; // N-5
|
|
446
|
+
session._lastWaitingResolveInputAt = now;
|
|
447
|
+
session._lastNonResolvingWaitingInputAt = 0;
|
|
448
|
+
if (submittedPromptAfterDismissal) {
|
|
449
|
+
_deps._markSessionUserPromptInput(session, now, 'terminal-submit');
|
|
450
|
+
session._attentionPendingUserPromptAt = 0;
|
|
451
|
+
}
|
|
452
|
+
// The user picked a plan option (digit/Esc/Enter) — stop convergence so a
|
|
453
|
+
// pending re-probe can't re-broadcast the dismissed card.
|
|
454
|
+
if (typeof session._clearPlanDecisionPending === 'function') session._clearPlanDecisionPending('input-resolved');
|
|
455
|
+
} else {
|
|
456
|
+
_deps._markTerminalNonResolvingInputEcho(session, msg.data, now);
|
|
457
|
+
if (_deps._isServerWaitingForInput(msg.id, session)) {
|
|
458
|
+
session._lastNonResolvingWaitingInputAt = now;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
const idleState = _deps.idleNotifyState.get(msg.id);
|
|
462
|
+
if (idleState && resolvesWaiting) {
|
|
463
|
+
idleState.notified = false;
|
|
464
|
+
idleState.reason = '';
|
|
465
|
+
idleState.notifiedAt = 0;
|
|
466
|
+
}
|
|
467
|
+
session._inputFrame = (session._inputFrame || 0) + 1;
|
|
468
|
+
let deferApproveAfterEscalation = false;
|
|
469
|
+
let deferInterruptSelfAdapt = false;
|
|
470
|
+
|
|
471
|
+
// Miss detection: if user manually types "1" or "2" while the approver is in
|
|
472
|
+
// 'watching' state (not reviewing/cooldown), it MIGHT mean the prompt was missed.
|
|
473
|
+
// But "1" and "2" appear all the time inside normal typing ("step 1...", "phase 2"),
|
|
474
|
+
// so we filter out mid-typing bursts. Only log when the keystroke looks SOLO:
|
|
475
|
+
// - more than 800ms since the previous keystroke (clean response, not in a flurry)
|
|
476
|
+
// - last VTerm snapshot is recent and shows no approval prompt
|
|
477
|
+
if ((msg.data === '1' || msg.data === '2') && _deps.autoApprovalBuffers.has(msg.id)) {
|
|
478
|
+
const isSoloKeystroke = (now - prevInputTs) > 800;
|
|
479
|
+
const buf = _deps.autoApprovalBuffers.get(msg.id);
|
|
480
|
+
if (isSoloKeystroke && buf && _deps._approverState(buf) === 'watching') {
|
|
481
|
+
const ring = _deps.approverDebugRings.get(msg.id) || [];
|
|
482
|
+
const lastSnap = ring[ring.length - 1];
|
|
483
|
+
if (lastSnap && !lastSnap.hasApproval && (now - lastSnap.ts) < 5000) {
|
|
484
|
+
console.log(`[shadow-approver:miss] User manually sent "${msg.data}" in session ${msg.id.slice(0, 8)} ` +
|
|
485
|
+
`— approver didn't detect prompt. Last screen: ${JSON.stringify(lastSnap.debugLines)}`);
|
|
486
|
+
}
|
|
487
|
+
// Self-adapt: user manually approved — if we had just escalated this
|
|
488
|
+
// session, record a positive signal so the maintenance loop / history
|
|
489
|
+
// scan can promote a narrow auto-approve rule for this class.
|
|
490
|
+
deferApproveAfterEscalation = true;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Self-adapt: user interrupted (Ctrl-C) right after we auto-approved via a
|
|
495
|
+
// learned rule → retire that over-broad rule.
|
|
496
|
+
if (msg.data === '\x03' && _deps.autoApprovalBuffers.has(msg.id)) {
|
|
497
|
+
deferInterruptSelfAdapt = true;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
const selfAdaptActions = [];
|
|
501
|
+
if (deferApproveAfterEscalation) {
|
|
502
|
+
selfAdaptActions.push(() => {
|
|
503
|
+
try {
|
|
504
|
+
const learned = _deps.approvalSelfAdapt.learnFromApproveAfterEscalation({ sessionId: msg.id, dbModule });
|
|
505
|
+
if (learned.action === 'rule_created') {
|
|
506
|
+
console.log(`[shadow-approver:self-adapt] learned auto-approve rule from approve-after-escalation in session ${msg.id.slice(0, 8)} (${learned.label || ''}, risk=${learned.riskLevel})`);
|
|
507
|
+
} else if (learned.action === 'signal_recorded') {
|
|
508
|
+
console.log(`[shadow-approver:self-adapt] recorded approve-after-escalation signal for session ${msg.id.slice(0, 8)} (${learned.reason || ''})`);
|
|
509
|
+
}
|
|
510
|
+
} catch (e) { console.error('[shadow-approver:self-adapt] approve-signal error:', e.message); }
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
if (deferInterruptSelfAdapt) {
|
|
514
|
+
selfAdaptActions.push(() => {
|
|
515
|
+
try {
|
|
516
|
+
const retired = _deps.approvalSelfAdapt.learnFromInterrupt({ sessionId: msg.id, dbModule });
|
|
517
|
+
if (retired.action === 'disabled') {
|
|
518
|
+
console.log(`[shadow-approver:self-adapt] retired learned rule ${retired.ruleId} after user interrupt in session ${msg.id.slice(0, 8)} (${retired.label || ''})`);
|
|
519
|
+
}
|
|
520
|
+
} catch (e) { console.error('[shadow-approver:self-adapt] interrupt-signal error:', e.message); }
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
_deps.runtimeInputPhaseCache.runInputSelfAdaptActions({
|
|
524
|
+
optimized: _deps.CTM_CLASSIFY_TAIL_BOUND,
|
|
525
|
+
actions: selfAdaptActions,
|
|
526
|
+
schedule: setImmediate,
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
// Attribution trail for turn-aborting control bytes (bare ESC / Ctrl-C) —
|
|
530
|
+
// see lib/turn-abort-key-detect.js. Cheap on every keystroke (two string
|
|
531
|
+
// equality checks) and only ever records for those two exact payloads,
|
|
532
|
+
// never for escape-prefixed sequences (arrows, mouse reports, bracketed
|
|
533
|
+
// paste) and never with the input text itself.
|
|
534
|
+
try { _deps._recordInputAbortKeyDiagnostic(session, msg.id, ws, inputData, now); } catch {}
|
|
535
|
+
|
|
536
|
+
// Only an input that passed every activation/resume/geometry gate may release
|
|
537
|
+
// the manual-review hold. Clearing it at function entry made a rejected key
|
|
538
|
+
// look like a provider decision and could strand the still-visible prompt.
|
|
539
|
+
_deps._clearManualApprovalReview(msg.id, 'terminal input accepted');
|
|
540
|
+
_deps.approvalAgent.clearSessionDedup(msg.id);
|
|
541
|
+
_deps._writeInputWithEchoTracking(session, msg.data, 'input', {
|
|
542
|
+
interactionId: msg.interactionId,
|
|
543
|
+
interactionStartedAt: msg.interactionStartedAt,
|
|
544
|
+
serverReceivedAt: Number(msg._typingWsReceivedAt || now),
|
|
545
|
+
clientId: ws?.clientId || '',
|
|
546
|
+
socketGeneration: Number(ws?.socketGeneration || 0),
|
|
547
|
+
agentType: msg.agentType || _deps.detectAgentType(session.cmd || ''),
|
|
548
|
+
});
|
|
549
|
+
return { durableInputPhase };
|
|
550
|
+
}
|
|
551
|
+
if (ws && ws.readyState === 1) {
|
|
552
|
+
_deps._sendWsJsonBounded(ws, _deps.promptSubmissionContract.buildInputDroppedPayload(msg, 'session-not-found'));
|
|
553
|
+
}
|
|
554
|
+
console.warn(`[input] dropped missing session id=${String(msg?.id || '').slice(0, 8)}`);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
module.exports = {
|
|
558
|
+
configure,
|
|
559
|
+
_wakeDeferredOnInput,
|
|
560
|
+
_runtimeInputMetadataForDeferredMessage,
|
|
561
|
+
_recordAcceptedInteractiveInputForAnalysis,
|
|
562
|
+
_handleInputPrepared,
|
|
563
|
+
};
|