@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490
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/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +23 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +71 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +64 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +48 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +152 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router-aggregate-status.d.ts +24 -0
- package/dist/commands/router-mesh-session-owner.d.ts +59 -0
- package/dist/commands/router-refine.d.ts +151 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +203 -15
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +11 -0
- package/dist/config/config.d.ts +19 -0
- package/dist/config/mesh-config.d.ts +65 -0
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/registry-resolver.d.ts +54 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/config/state-store.d.ts +30 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/cli-detector.d.ts +17 -0
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +26 -2
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +80 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +70 -17
- package/dist/index.js +53532 -19073
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53283 -18989
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/debug-config.d.ts +16 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +256 -0
- package/dist/mesh/coordinator-prompt.d.ts +76 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +203 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
- package/dist/mesh/mesh-event-classify.d.ts +7 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +258 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +21 -1
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +139 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +281 -0
- package/dist/mesh/mesh-node-identity.d.ts +310 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
- package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
- package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
- package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +457 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +567 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +392 -1
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +97 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +46 -0
- package/dist/providers/chat-message-normalization.d.ts +58 -1
- package/dist/providers/cli-provider-effect-format.d.ts +30 -0
- package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
- package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
- package/dist/providers/cli-provider-instance-types.d.ts +45 -0
- package/dist/providers/cli-provider-instance.d.ts +426 -30
- package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
- package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
- package/dist/providers/contracts.d.ts +196 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +79 -0
- package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +44 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +30 -0
- package/dist/providers/provider-instance.d.ts +31 -1
- package/dist/providers/provider-loader.d.ts +42 -5
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +98 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +449 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +202 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +244 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +616 -12
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/session-host/managed-host.d.ts +64 -0
- package/dist/session-host/runtime-surface.d.ts +10 -16
- package/dist/sessions/registry.d.ts +26 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +110 -55
- package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +27 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +20 -6
- package/package.json +11 -4
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +80 -14
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1282 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2788 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.d.ts +2 -0
- package/src/commands/cli-manager.ts +724 -27
- package/src/commands/handler.ts +865 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +857 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +125 -0
- package/src/commands/low-family/daemon-lifecycle.ts +120 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +282 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +270 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1268 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +153 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router-aggregate-status.ts +209 -0
- package/src/commands/router-mesh-session-owner.ts +114 -0
- package/src/commands/router-refine.ts +1794 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +567 -4149
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +517 -24
- package/src/config/config.ts +30 -0
- package/src/config/mesh-config.ts +300 -24
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/registry-resolver.ts +100 -0
- package/src/config/repo-settings.ts +111 -0
- package/src/config/state-store.ts +55 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +94 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +112 -16
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +822 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +190 -13
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/debug-config.ts +25 -0
- package/src/logging/debug-trace.ts +7 -2
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +510 -0
- package/src/mesh/coordinator-prompt.ts +627 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +706 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-completion-synthesis.ts +416 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +284 -0
- package/src/mesh/mesh-event-classify.ts +78 -0
- package/src/mesh/mesh-event-forwarding.ts +2030 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +1548 -0
- package/src/mesh/mesh-events-stale.ts +452 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +43 -1035
- package/src/mesh/mesh-fast-forward.ts +856 -0
- package/src/mesh/mesh-host-ownership.ts +41 -3
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +897 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +695 -0
- package/src/mesh/mesh-node-identity.ts +2065 -0
- package/src/mesh/mesh-queue-assignment.ts +2498 -0
- package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
- package/src/mesh/mesh-reconcile-config.ts +66 -0
- package/src/mesh/mesh-reconcile-identity.ts +103 -0
- package/src/mesh/mesh-reconcile-loop.ts +1696 -0
- package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1792 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-remote-event-pull.ts +279 -0
- package/src/mesh/mesh-review-inbox.ts +308 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +2292 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1489 -145
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +129 -12
- package/src/mesh/worktree-bootstrap-config.ts +599 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +100 -6
- package/src/providers/chat-message-normalization.ts +126 -4
- package/src/providers/cli-provider-effect-format.ts +53 -0
- package/src/providers/cli-provider-history-dedup.ts +75 -0
- package/src/providers/cli-provider-input-prompt.ts +133 -0
- package/src/providers/cli-provider-instance-types.ts +131 -0
- package/src/providers/cli-provider-instance.ts +2771 -499
- package/src/providers/cli-provider-status-helpers.ts +123 -0
- package/src/providers/cli-provider-transcript-merge.ts +114 -0
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +207 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +105 -0
- package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +617 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +24 -1
- package/src/providers/provider-loader.ts +700 -55
- package/src/providers/provider-schema.ts +93 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +246 -0
- package/src/providers/spec/cli-adapter.ts +1064 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1528 -0
- package/src/providers/spec/fsm-evaluator.ts +290 -0
- package/src/providers/spec/fsm-loader.ts +128 -0
- package/src/providers/spec/fsm-types.ts +301 -0
- package/src/providers/spec/native-history-executor.ts +1241 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +284 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +861 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/session-host/managed-host.ts +218 -0
- package/src/session-host/runtime-surface.ts +20 -80
- package/src/sessions/registry.ts +44 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +148 -55
- package/src/status/builders.ts +69 -6
- package/src/status/chat-tail-hot-sessions.ts +117 -2
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +100 -27
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +26 -6
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
package/src/cli-adapter-types.ts
CHANGED
|
@@ -5,14 +5,41 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ChatMessage } from './types.js';
|
|
8
|
+
import type { InteractivePrompt, InteractivePromptResponse } from './providers/types/interactive-prompt.js';
|
|
8
9
|
|
|
9
10
|
export interface CliAdapterStatus {
|
|
10
11
|
status?: string;
|
|
12
|
+
parsedStatus?: string;
|
|
11
13
|
messages?: ChatMessage[];
|
|
12
14
|
activeModal?: {
|
|
13
15
|
message: string;
|
|
14
16
|
buttons: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Semantic modal class, when the adapter knows it (spec/FSM path):
|
|
19
|
+
* 'approval' = tool/command/trust consent (auto-approve may fire);
|
|
20
|
+
* 'picker' = a selection menu the user opened (/model, /mode — must NOT
|
|
21
|
+
* be auto-answered); 'confirm' = a yes/no left to the user. Absent/null
|
|
22
|
+
* for adapters that don't classify modals — the auto-approve gate then
|
|
23
|
+
* falls back to its structural heuristic.
|
|
24
|
+
*/
|
|
25
|
+
kind?: 'approval' | 'picker' | 'confirm' | null;
|
|
15
26
|
} | null;
|
|
27
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
28
|
+
providerSessionId?: string;
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
errorReason?: string;
|
|
31
|
+
/**
|
|
32
|
+
* FSM-spec adapters only: true once the driver has observed its first
|
|
33
|
+
* non-initial idle state (the prompt is genuinely drawn — see
|
|
34
|
+
* FsmDriver.maybeMarkReady / readySeenOnce). Used by CliProviderInstance to
|
|
35
|
+
* re-arm the queue-claim `agent:ready` event on the first genuine ready,
|
|
36
|
+
* independent of the boot-time starting→idle one-shot. That one-shot is
|
|
37
|
+
* consumed too early for providers whose INITIAL FSM state already reports
|
|
38
|
+
* status 'idle' (e.g. antigravity-cli), so without this re-arm the worker
|
|
39
|
+
* never claims its queued task and the coordinator relaunch-loops. Absent
|
|
40
|
+
* (undefined) for non-FSM adapters — they keep the boot one-shot behavior.
|
|
41
|
+
*/
|
|
42
|
+
fsmReadySeen?: boolean;
|
|
16
43
|
}
|
|
17
44
|
|
|
18
45
|
export interface AcpAdapterHandle {
|
|
@@ -32,14 +59,38 @@ export interface AcpAdapterHandle {
|
|
|
32
59
|
resolvePermission?(approved: boolean): Promise<void>;
|
|
33
60
|
}
|
|
34
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Launch metadata for a CLI session, surfaced by the dashboard Session info panel.
|
|
64
|
+
* Derived from the live adapter's spawn plan — the resolved binary, the full
|
|
65
|
+
* argument vector (provider base args + per-launch extra args), the cwd, and the
|
|
66
|
+
* set of per-launch extra-env KEYS (values are intentionally omitted so secrets in
|
|
67
|
+
* extraEnv are never sent to the dashboard). providerSessionId is the upstream
|
|
68
|
+
* agent's own session id once the CLI reports it.
|
|
69
|
+
*/
|
|
70
|
+
export interface CliLaunchInfo {
|
|
71
|
+
/** Resolved executable path the PTY actually spawns. */
|
|
72
|
+
command?: string;
|
|
73
|
+
/** Full argument vector (provider spawn.args + extraArgs, {{workingDir}} expanded). */
|
|
74
|
+
args: string[];
|
|
75
|
+
/** Per-launch extra args only (subset of args), for attribution. */
|
|
76
|
+
extraArgs: string[];
|
|
77
|
+
/** Working directory the session was spawned in. */
|
|
78
|
+
cwd: string;
|
|
79
|
+
/** KEYS of per-launch extra env (values omitted — may contain secrets). */
|
|
80
|
+
extraEnvKeys: string[];
|
|
81
|
+
/** Upstream agent session id, once the CLI reports one. */
|
|
82
|
+
providerSessionId?: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
35
85
|
export interface CliAdapter {
|
|
36
86
|
cliType: string;
|
|
37
87
|
cliName: string;
|
|
38
88
|
workingDir: string;
|
|
39
89
|
_acpInstance?: AcpAdapterHandle;
|
|
40
90
|
spawn(): Promise<void>;
|
|
41
|
-
sendMessage(text: string): Promise<void>;
|
|
42
|
-
|
|
91
|
+
sendMessage(text: string, options?: { force?: boolean; meshTaskId?: string }): Promise<void>;
|
|
92
|
+
forceSendMessage?(text: string, meshTaskId?: string): Promise<void>;
|
|
93
|
+
getStatus(options?: { allowParse?: boolean }): CliAdapterStatus;
|
|
43
94
|
getScriptParsedStatus?(): unknown;
|
|
44
95
|
getDebugSnapshot?(): unknown;
|
|
45
96
|
invokeScript?(scriptName: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
@@ -56,9 +107,24 @@ export interface CliAdapter {
|
|
|
56
107
|
setServerConn?(serverConn: unknown): void;
|
|
57
108
|
clearHistory?(): void;
|
|
58
109
|
resolveAction?(data: unknown): Promise<void>;
|
|
110
|
+
setInteractivePromptResponse?(response: InteractivePromptResponse): Promise<void>;
|
|
59
111
|
resolveModal?(buttonIndex: number): void;
|
|
112
|
+
isApprovalRecentlyResolved?(): boolean;
|
|
60
113
|
// Raw PTY I/O (for terminal view)
|
|
61
114
|
setOnPtyData?(callback: (data: string) => void): void;
|
|
62
115
|
writeRaw?(data: string): void;
|
|
63
116
|
resize?(cols: number, rows: number): void;
|
|
117
|
+
// ── Launch metadata for the dashboard Session info panel (args/cwd/env keys) ──
|
|
118
|
+
getLaunchInfo?(): CliLaunchInfo;
|
|
119
|
+
// ── Runtime metadata used by CliProviderInstance for session tracking ──
|
|
120
|
+
getRuntimeMetadata?(): unknown;
|
|
121
|
+
updateRuntimeMeta?(meta: Record<string, unknown>): void;
|
|
122
|
+
refreshProviderDefinition?(provider: unknown): void;
|
|
123
|
+
// ── Optional auxiliary fields some daemon paths read off the status ──
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface CliAdapterStatusOptional {
|
|
127
|
+
providerSessionId?: string;
|
|
128
|
+
errorMessage?: string;
|
|
129
|
+
errorReason?: string;
|
|
64
130
|
}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CliScriptRunner — isolated execution of provider CLI scripts
|
|
3
|
+
*
|
|
4
|
+
* Responsible solely for invoking provider-supplied JavaScript functions
|
|
5
|
+
* (detectStatus, parseApproval, parseSession, etc.) and managing the
|
|
6
|
+
* per-session script state created by createState().
|
|
7
|
+
*
|
|
8
|
+
* The runner is stateless with respect to PTY / buffer content — all
|
|
9
|
+
* input data is passed explicitly by the caller so that the adapter can
|
|
10
|
+
* remain a pure transport layer without embedding parsing logic.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { LOG } from '../logging/logger.js';
|
|
14
|
+
import {
|
|
15
|
+
listCliScriptNames,
|
|
16
|
+
type CliApprovalInput,
|
|
17
|
+
type CliScripts,
|
|
18
|
+
type CliScriptInput,
|
|
19
|
+
type CliScreenSnapshot,
|
|
20
|
+
type CliStatusInput,
|
|
21
|
+
type ParsedSession,
|
|
22
|
+
} from './provider-cli-shared.js';
|
|
23
|
+
import { buildDetectStatusFromTui } from '../providers/sdk/v1/builders/cli/detect-status.js';
|
|
24
|
+
import { buildParseApprovalFromTui } from '../providers/sdk/v1/builders/cli/parse-approval.js';
|
|
25
|
+
import { buildParseSessionFromTui, normalizeMessageIdentity } from '../providers/sdk/v1/builders/cli/parse-session.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Capability bag injected into provider scripts as the third argument.
|
|
29
|
+
*
|
|
30
|
+
* v1 manifests declare line-shape recognition in their `tui` block — for
|
|
31
|
+
* those providers, the daemon builds the canonical (input → verdict)
|
|
32
|
+
* functions from the manifest and hands them to the script via `sdk`. The
|
|
33
|
+
* script's job is then only to wrap that verdict with stateful logic
|
|
34
|
+
* (idle-hold timers, frame counting, etc.) that can't be expressed
|
|
35
|
+
* declaratively.
|
|
36
|
+
*
|
|
37
|
+
* Without these, the extended-tier overrides bail with `return 'idle'`
|
|
38
|
+
* and the session sticks in generating forever. That's the regression
|
|
39
|
+
* we hit on codex-cli during the registry-install path.
|
|
40
|
+
*/
|
|
41
|
+
interface CliScriptSdk {
|
|
42
|
+
declarativeDetectStatus?: (input: CliStatusInput) => string | null;
|
|
43
|
+
declarativeParseApproval?: (input: CliApprovalInput) => { message: string; buttons: string[] } | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* One entry per script invocation, kept in a ring buffer so debug
|
|
48
|
+
* tooling can answer "what did the script see, and what did it return?"
|
|
49
|
+
* without having to re-run the daemon with custom logs. This is the
|
|
50
|
+
* trace that would have answered the codex-cli #102 regression in one
|
|
51
|
+
* pass instead of a dozen guesses.
|
|
52
|
+
*
|
|
53
|
+
* Body fields are bounded: input is reduced to a small summary (sizes
|
|
54
|
+
* + a salted hash + the first few normalized chars of screenText), and
|
|
55
|
+
* result is JSON-serialized then capped. Full PTY frames are NOT
|
|
56
|
+
* captured here — they live in CliBufferSnapshot and are exposed by
|
|
57
|
+
* the chat debug bundle separately.
|
|
58
|
+
*/
|
|
59
|
+
export interface CliScriptInvocationTrace {
|
|
60
|
+
at: number; // Date.now()
|
|
61
|
+
scriptName: string;
|
|
62
|
+
arity: number;
|
|
63
|
+
inputSummary: {
|
|
64
|
+
screenTextLen: number;
|
|
65
|
+
rawBufferLen: number;
|
|
66
|
+
tailLen: number;
|
|
67
|
+
isWaitingForResponse?: boolean;
|
|
68
|
+
screenTextHead?: string; // first 200 chars of screenText (post-strip)
|
|
69
|
+
};
|
|
70
|
+
ok: boolean;
|
|
71
|
+
elapsedUs: number;
|
|
72
|
+
resultSummary?: string; // JSON.stringify(result).slice(0, 400)
|
|
73
|
+
error?: string;
|
|
74
|
+
/**
|
|
75
|
+
* True when the invocation's elapsed time exceeded the runner's
|
|
76
|
+
* `scriptCallBudgetMs`. The script is NOT aborted (Node CJS can't
|
|
77
|
+
* interrupt sync code without a worker thread) — this flag plus the
|
|
78
|
+
* trace ring lets an operator identify which provider is hanging the
|
|
79
|
+
* settle loop. A throttled WARN is emitted alongside.
|
|
80
|
+
*/
|
|
81
|
+
timedOut?: boolean;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const TRACE_RING_CAPACITY = 64;
|
|
85
|
+
|
|
86
|
+
/** Default per-invocation wall-clock budget (ms) when the manifest omits one. */
|
|
87
|
+
const DEFAULT_SCRIPT_CALL_BUDGET_MS = 50;
|
|
88
|
+
|
|
89
|
+
/** Minimum interval between repeated budget-violation WARNs per script. */
|
|
90
|
+
const BUDGET_WARN_THROTTLE_MS = 30_000;
|
|
91
|
+
|
|
92
|
+
function summarizeInput(input: any): CliScriptInvocationTrace['inputSummary'] {
|
|
93
|
+
const screenText = typeof input?.screenText === 'string' ? input.screenText : '';
|
|
94
|
+
const rawBuffer = typeof input?.rawBuffer === 'string' ? input.rawBuffer : '';
|
|
95
|
+
const tail = typeof input?.tail === 'string' ? input.tail : '';
|
|
96
|
+
return {
|
|
97
|
+
screenTextLen: screenText.length,
|
|
98
|
+
rawBufferLen: rawBuffer.length,
|
|
99
|
+
tailLen: tail.length,
|
|
100
|
+
isWaitingForResponse: typeof input?.isWaitingForResponse === 'boolean' ? input.isWaitingForResponse : undefined,
|
|
101
|
+
screenTextHead: screenText ? screenText.slice(0, 200) : undefined,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function summarizeResult(result: unknown): string {
|
|
106
|
+
try {
|
|
107
|
+
const json = JSON.stringify(result);
|
|
108
|
+
return json && json.length > 400 ? `${json.slice(0, 400)}…[truncated ${json.length - 400}]` : (json ?? 'undefined');
|
|
109
|
+
} catch (e: any) {
|
|
110
|
+
return `<unserializable: ${e?.message || e}>`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export class CliScriptRunner {
|
|
115
|
+
private scripts: CliScripts = {};
|
|
116
|
+
private scriptState: unknown = null;
|
|
117
|
+
private _parseErrorMessage: string | null = null;
|
|
118
|
+
private readonly cliType: string;
|
|
119
|
+
private sdk: CliScriptSdk = {};
|
|
120
|
+
private invocationTrace: CliScriptInvocationTrace[] = [];
|
|
121
|
+
/** Per-invocation wall-clock budget (ms). Configurable via setScriptCallBudget. */
|
|
122
|
+
private scriptCallBudgetMs = DEFAULT_SCRIPT_CALL_BUDGET_MS;
|
|
123
|
+
/** Last WARN emit time per scriptName, used to throttle repeated budget violations. */
|
|
124
|
+
private lastBudgetWarnAt = new Map<string, number>();
|
|
125
|
+
|
|
126
|
+
constructor(cliType: string) {
|
|
127
|
+
this.cliType = cliType;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Returns the most-recent script invocation traces (oldest → newest). */
|
|
131
|
+
getInvocationTrace(): CliScriptInvocationTrace[] {
|
|
132
|
+
return this.invocationTrace.slice();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Clear the trace ring — used by tests and after PTY reset. */
|
|
136
|
+
clearInvocationTrace(): void {
|
|
137
|
+
this.invocationTrace = [];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Configure the wall-clock budget (ms) applied to every script invocation.
|
|
142
|
+
*
|
|
143
|
+
* Out-of-range or non-finite values are clamped to [1, 5000] and the
|
|
144
|
+
* default (50ms) is used as a fallback. The budget is enforced per-call,
|
|
145
|
+
* not aggregated — it does not abort a runaway script (Node CJS cannot
|
|
146
|
+
* interrupt synchronous code without a worker thread). Instead, an
|
|
147
|
+
* exceeded budget flags the trace entry with `timedOut: true` and emits
|
|
148
|
+
* a throttled WARN naming the script and elapsed time so an operator
|
|
149
|
+
* can identify which provider is hanging the settle loop.
|
|
150
|
+
*/
|
|
151
|
+
setScriptCallBudget(ms: number): void {
|
|
152
|
+
if (typeof ms !== 'number' || !Number.isFinite(ms)) {
|
|
153
|
+
this.scriptCallBudgetMs = DEFAULT_SCRIPT_CALL_BUDGET_MS;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const clamped = Math.max(1, Math.min(5000, Math.floor(ms)));
|
|
157
|
+
this.scriptCallBudgetMs = clamped;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Test/debug accessor — current effective budget in ms. */
|
|
161
|
+
getScriptCallBudgetMs(): number {
|
|
162
|
+
return this.scriptCallBudgetMs;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private recordTrace(entry: CliScriptInvocationTrace): void {
|
|
166
|
+
this.invocationTrace.push(entry);
|
|
167
|
+
if (this.invocationTrace.length > TRACE_RING_CAPACITY) {
|
|
168
|
+
this.invocationTrace.splice(0, this.invocationTrace.length - TRACE_RING_CAPACITY);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ─── Script lifecycle ─────────────────────────────
|
|
173
|
+
|
|
174
|
+
setScripts(scripts: CliScripts, providerTui?: Record<string, unknown> | undefined): void {
|
|
175
|
+
// SDK is built first so the synth functions below have access to it.
|
|
176
|
+
this.sdk = this.buildSdk(providerTui);
|
|
177
|
+
|
|
178
|
+
// Fill missing scripts from the SDK synth. This is the heart of the
|
|
179
|
+
// declarative model: a v1 manifest with a complete tui block (spinner
|
|
180
|
+
// + modal + settledPrompt + transcriptPty) gets working detectStatus
|
|
181
|
+
// / parseApproval / parseSession functions for free, no provider .js
|
|
182
|
+
// required. Providers that supply their own override always win
|
|
183
|
+
// because we don't overwrite when scripts[name] is already a function.
|
|
184
|
+
const tui = providerTui as Record<string, unknown> | undefined;
|
|
185
|
+
const enriched: CliScripts = { ...scripts };
|
|
186
|
+
|
|
187
|
+
if (typeof enriched.detectStatus !== 'function' && this.sdk.declarativeDetectStatus) {
|
|
188
|
+
enriched.detectStatus = this.sdk.declarativeDetectStatus as any;
|
|
189
|
+
}
|
|
190
|
+
if (typeof enriched.parseApproval !== 'function' && this.sdk.declarativeParseApproval) {
|
|
191
|
+
enriched.parseApproval = this.sdk.declarativeParseApproval as any;
|
|
192
|
+
}
|
|
193
|
+
if (typeof enriched.parseSession !== 'function' && tui?.transcriptPty) {
|
|
194
|
+
try {
|
|
195
|
+
const synth = buildParseSessionFromTui({
|
|
196
|
+
spinner: tui.spinner,
|
|
197
|
+
settledPrompt: tui.settledPrompt,
|
|
198
|
+
modal: tui.modal as any,
|
|
199
|
+
dispatchOrder: tui.dispatchOrder,
|
|
200
|
+
transcriptPty: tui.transcriptPty as any,
|
|
201
|
+
});
|
|
202
|
+
// Wrap to apply identity stamps the daemon downstream expects.
|
|
203
|
+
enriched.parseSession = ((input: any) => {
|
|
204
|
+
const out = synth(input);
|
|
205
|
+
return {
|
|
206
|
+
...out,
|
|
207
|
+
messages: normalizeMessageIdentity(out.messages, out.status ?? 'idle'),
|
|
208
|
+
};
|
|
209
|
+
}) as any;
|
|
210
|
+
} catch (e: any) {
|
|
211
|
+
LOG.warn('CLI', `[${this.cliType}] buildParseSessionFromTui failed: ${e?.message || e}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
this.scripts = enriched;
|
|
216
|
+
this._parseErrorMessage = null;
|
|
217
|
+
this.scriptState = typeof enriched.createState === 'function'
|
|
218
|
+
? (enriched.createState() ?? null)
|
|
219
|
+
: null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private buildSdk(providerTui: Record<string, unknown> | undefined): CliScriptSdk {
|
|
223
|
+
const tui = providerTui as Record<string, unknown> | undefined;
|
|
224
|
+
if (!tui) return {};
|
|
225
|
+
const sdk: CliScriptSdk = {};
|
|
226
|
+
// Build declarativeDetectStatus from the manifest tui block. The
|
|
227
|
+
// builder requires at least spinner OR settledPrompt OR modal; if
|
|
228
|
+
// none are present we skip silently so a non-tui manifest doesn't
|
|
229
|
+
// throw at boot time.
|
|
230
|
+
if (tui.spinner || tui.settledPrompt || tui.modal || tui.dispatchOrder) {
|
|
231
|
+
try {
|
|
232
|
+
sdk.declarativeDetectStatus = buildDetectStatusFromTui({
|
|
233
|
+
spinner: tui.spinner as any,
|
|
234
|
+
settledPrompt: tui.settledPrompt as any,
|
|
235
|
+
modal: tui.modal as any,
|
|
236
|
+
dispatchOrder: tui.dispatchOrder as any,
|
|
237
|
+
}) as unknown as (input: CliStatusInput) => string | null;
|
|
238
|
+
} catch (e: any) {
|
|
239
|
+
LOG.warn('CLI', `[${this.cliType}] buildDetectStatusFromTui failed: ${e?.message || e}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (tui.modal) {
|
|
243
|
+
try {
|
|
244
|
+
sdk.declarativeParseApproval = buildParseApprovalFromTui(tui.modal as any) as unknown as (input: CliApprovalInput) => { message: string; buttons: string[] } | null;
|
|
245
|
+
} catch (e: any) {
|
|
246
|
+
LOG.warn('CLI', `[${this.cliType}] buildParseApprovalFromTui failed: ${e?.message || e}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return sdk;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Reset per-session state — called when the PTY process exits. */
|
|
253
|
+
resetSessionState(): void {
|
|
254
|
+
this.scriptState = null;
|
|
255
|
+
this.invocationTrace = [];
|
|
256
|
+
this.lastBudgetWarnAt.clear();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ─── Script access (for reflection and test patching) ────────────────────
|
|
260
|
+
|
|
261
|
+
/** Returns the live scripts object. Direct property assignment on this object
|
|
262
|
+
* patches individual scripts without replacing others (used in tests). */
|
|
263
|
+
get cliScripts(): CliScripts { return this.scripts; }
|
|
264
|
+
|
|
265
|
+
// ─── Capability checks ────────────────────────────
|
|
266
|
+
|
|
267
|
+
hasDetectStatus(): boolean {
|
|
268
|
+
return typeof this.scripts.detectStatus === 'function';
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
hasParseSession(): boolean {
|
|
272
|
+
return typeof this.scripts.parseSession === 'function';
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
getScriptNames(): string[] {
|
|
276
|
+
return listCliScriptNames(this.scripts);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ─── Error state ──────────────────────────────────
|
|
280
|
+
|
|
281
|
+
get parseErrorMessage(): string | null {
|
|
282
|
+
return this._parseErrorMessage;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
clearParseError(): void {
|
|
286
|
+
this._parseErrorMessage = null;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// ─── Script invocation ────────────────────────────
|
|
290
|
+
|
|
291
|
+
detectStatus(input: CliStatusInput): string | null {
|
|
292
|
+
if (!this.scripts.detectStatus) return null;
|
|
293
|
+
try {
|
|
294
|
+
return this.invoke<string | null>('detectStatus', this.scripts.detectStatus, input);
|
|
295
|
+
} catch (e: any) {
|
|
296
|
+
LOG.warn('CLI', `[${this.cliType}] detectStatus error: ${e?.message || e}`);
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
parseApproval(
|
|
302
|
+
input: CliApprovalInput,
|
|
303
|
+
): { message: string; buttons: string[] } | null {
|
|
304
|
+
if (!this.scripts.parseApproval) return null;
|
|
305
|
+
try {
|
|
306
|
+
return this.invoke<{ message: string; buttons: string[] } | null>(
|
|
307
|
+
'parseApproval',
|
|
308
|
+
this.scripts.parseApproval,
|
|
309
|
+
input,
|
|
310
|
+
);
|
|
311
|
+
} catch (e: any) {
|
|
312
|
+
LOG.warn('CLI', `[${this.cliType}] parseApproval error: ${e?.message || e}`);
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
parseSession(
|
|
318
|
+
input: CliScriptInput & { tail?: string; tailScreen?: CliScreenSnapshot },
|
|
319
|
+
): ParsedSession | null {
|
|
320
|
+
if (!this.scripts.parseSession) {
|
|
321
|
+
this._parseErrorMessage = `${this.cliType} parseSession unavailable`;
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
const result = this.invoke<ParsedSession | null>('parseSession', this.scripts.parseSession, input);
|
|
326
|
+
this._parseErrorMessage = null;
|
|
327
|
+
return result && typeof result === 'object' ? result : null;
|
|
328
|
+
} catch (e: any) {
|
|
329
|
+
this._parseErrorMessage = e?.message || String(e);
|
|
330
|
+
LOG.warn('CLI', `[${this.cliType}] parseSession error: ${this._parseErrorMessage}`);
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Invoke an arbitrary named script (e.g. setModel, openModelPicker).
|
|
337
|
+
* Throws if the script is not available.
|
|
338
|
+
*/
|
|
339
|
+
invokeByName(name: string, input: any): any {
|
|
340
|
+
const fn = this.scripts[name];
|
|
341
|
+
if (typeof fn !== 'function') {
|
|
342
|
+
throw new Error(`CLI script '${name}' not available`);
|
|
343
|
+
}
|
|
344
|
+
return this.invoke(name, fn, input);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// ─── Internal ─────────────────────────────────────
|
|
348
|
+
|
|
349
|
+
private invoke<T>(scriptName: string, fn: Function, input: any): T {
|
|
350
|
+
// Pick the call shape from fn.length so each script gets exactly the
|
|
351
|
+
// args its signature declares:
|
|
352
|
+
// (input) — v0 single-arg scripts
|
|
353
|
+
// (state, input) — v0 stateful scripts that opt in via createState()
|
|
354
|
+
// (state, input, sdk) — v1 extended-tier overrides that consume the SDK
|
|
355
|
+
const arity = fn.length;
|
|
356
|
+
const startedAt = Date.now();
|
|
357
|
+
const startedHr = typeof process !== 'undefined' && typeof process.hrtime === 'function'
|
|
358
|
+
? process.hrtime.bigint()
|
|
359
|
+
: null;
|
|
360
|
+
let result: T;
|
|
361
|
+
try {
|
|
362
|
+
if (arity >= 3) {
|
|
363
|
+
result = (fn as (state: unknown, input: any, sdk: CliScriptSdk) => T)(this.scriptState, input, this.sdk);
|
|
364
|
+
} else if (arity === 2) {
|
|
365
|
+
result = (fn as (state: unknown, input: any) => T)(this.scriptState, input);
|
|
366
|
+
} else {
|
|
367
|
+
result = (fn as (input: any) => T)(input);
|
|
368
|
+
}
|
|
369
|
+
const elapsedUs = startedHr ? Number((process.hrtime.bigint() - startedHr) / 1000n) : 0;
|
|
370
|
+
const timedOut = this.checkBudget(scriptName, elapsedUs);
|
|
371
|
+
this.recordTrace({
|
|
372
|
+
at: startedAt,
|
|
373
|
+
scriptName,
|
|
374
|
+
arity,
|
|
375
|
+
inputSummary: summarizeInput(input),
|
|
376
|
+
ok: true,
|
|
377
|
+
elapsedUs,
|
|
378
|
+
resultSummary: summarizeResult(result),
|
|
379
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
380
|
+
});
|
|
381
|
+
return result;
|
|
382
|
+
} catch (e: any) {
|
|
383
|
+
const elapsedUs = startedHr ? Number((process.hrtime.bigint() - startedHr) / 1000n) : 0;
|
|
384
|
+
const timedOut = this.checkBudget(scriptName, elapsedUs);
|
|
385
|
+
this.recordTrace({
|
|
386
|
+
at: startedAt,
|
|
387
|
+
scriptName,
|
|
388
|
+
arity,
|
|
389
|
+
inputSummary: summarizeInput(input),
|
|
390
|
+
ok: false,
|
|
391
|
+
elapsedUs,
|
|
392
|
+
error: e?.message ? String(e.message).slice(0, 400) : String(e).slice(0, 400),
|
|
393
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
394
|
+
});
|
|
395
|
+
throw e;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Returns true when `elapsedUs` exceeded the configured budget. On the
|
|
401
|
+
* first violation per script (or after the throttle window expires) we
|
|
402
|
+
* emit a single WARN so the operator learns which provider is slow.
|
|
403
|
+
*
|
|
404
|
+
* We deliberately throttle per-scriptName so a chronically-slow
|
|
405
|
+
* detectStatus doesn't spam the log on every PTY frame settle.
|
|
406
|
+
*/
|
|
407
|
+
private checkBudget(scriptName: string, elapsedUs: number): boolean {
|
|
408
|
+
const budgetUs = this.scriptCallBudgetMs * 1000;
|
|
409
|
+
if (elapsedUs <= budgetUs) return false;
|
|
410
|
+
const now = Date.now();
|
|
411
|
+
const last = this.lastBudgetWarnAt.get(scriptName) ?? 0;
|
|
412
|
+
if (now - last >= BUDGET_WARN_THROTTLE_MS) {
|
|
413
|
+
this.lastBudgetWarnAt.set(scriptName, now);
|
|
414
|
+
LOG.warn(
|
|
415
|
+
'CLI',
|
|
416
|
+
`[${this.cliType}] script ${scriptName} took ${elapsedUs}us, budget ${budgetUs}us`,
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
return true;
|
|
420
|
+
}
|
|
421
|
+
}
|