@adhdev/daemon-core 0.9.82-rc.38 → 0.9.82-rc.381
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 +55 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +121 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +63 -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 +14 -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 +7 -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 +15 -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 +60 -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 +2 -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 +116 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router.d.ts +227 -2
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +9 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +77 -1
- package/dist/daemon/dev-server.d.ts +0 -2
- 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 +11 -1
- 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 +23 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/index.d.ts +2 -0
- package/dist/index.d.ts +57 -13
- package/dist/index.js +47417 -19860
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +45865 -18449
- 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/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 +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +89 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +174 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
- package/dist/mesh/mesh-event-classify.d.ts +5 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +18 -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 +55 -0
- package/dist/mesh/mesh-events-stale.d.ts +52 -0
- package/dist/mesh/mesh-events-utils.d.ts +64 -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 +9 -0
- package/dist/mesh/mesh-init.d.ts +86 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +77 -1
- package/dist/mesh/mesh-missions.d.ts +164 -0
- package/dist/mesh/mesh-node-identity.d.ts +289 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +86 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +8 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +428 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -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 +439 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +247 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +20 -0
- package/dist/providers/chat-message-normalization.d.ts +13 -1
- package/dist/providers/cli-provider-instance.d.ts +111 -3
- package/dist/providers/contracts.d.ts +139 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +63 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -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 +27 -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 +14 -0
- package/dist/providers/provider-instance.d.ts +23 -1
- package/dist/providers/provider-loader.d.ts +26 -4
- 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 +91 -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 +397 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +174 -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 +222 -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 +376 -13
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/sessions/registry.d.ts +6 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +59 -2
- 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 +26 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -3
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +63 -12
- 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 +1 -0
- package/src/cli-adapter-types.ts +56 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1221 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +836 -1141
- package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
- package/src/cli-adapters/provider-cli-parse.ts +13 -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 +110 -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 +90 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2327 -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 +880 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.ts +513 -26
- package/src/commands/handler.ts +841 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +657 -0
- package/src/commands/high-family/mesh-events.ts +47 -0
- package/src/commands/high-family/mesh-status.ts +642 -0
- package/src/commands/high-family/types.ts +76 -0
- package/src/commands/low-family/coordinator-prompt.ts +72 -0
- package/src/commands/low-family/daemon-lifecycle.ts +107 -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 +274 -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 +230 -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 +825 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +131 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +120 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router.ts +2395 -3206
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +483 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +353 -22
- package/src/config/recent-activity.ts +8 -2
- 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 +28 -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 +55 -14
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +574 -43
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +8 -1
- package/src/git/index.ts +16 -0
- package/src/index.ts +171 -12
- 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/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 +338 -0
- package/src/mesh/coordinator-prompt.ts +381 -33
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +645 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +315 -0
- package/src/mesh/mesh-event-classify.ts +51 -0
- package/src/mesh/mesh-event-forwarding.ts +1575 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +30 -0
- package/src/mesh/mesh-events-pending.ts +590 -0
- package/src/mesh/mesh-events-stale.ts +363 -0
- package/src/mesh/mesh-events-utils.ts +425 -0
- package/src/mesh/mesh-events.ts +30 -1035
- package/src/mesh/mesh-fast-forward.ts +839 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-init.ts +260 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +596 -102
- package/src/mesh/mesh-missions.ts +322 -0
- package/src/mesh/mesh-node-identity.ts +1887 -0
- package/src/mesh/mesh-queue-assignment.ts +1491 -0
- package/src/mesh/mesh-reconcile-loop.ts +1332 -0
- package/src/mesh/mesh-refine-batch.ts +197 -0
- package/src/mesh/mesh-refine-gates.ts +1652 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-review-inbox.ts +307 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +1708 -0
- package/src/mesh/mesh-scheduling-runtime.ts +199 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +997 -141
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +331 -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 +57 -5
- package/src/providers/chat-message-normalization.ts +46 -6
- package/src/providers/cli-provider-instance.ts +1416 -101
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +150 -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 +85 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +643 -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 +339 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +30 -0
- package/src/providers/provider-instance.ts +19 -1
- package/src/providers/provider-loader.ts +668 -50
- package/src/providers/provider-schema.ts +87 -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 +250 -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 +504 -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 +235 -0
- package/src/providers/spec/cli-adapter.ts +1051 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1292 -0
- package/src/providers/spec/fsm-evaluator.ts +272 -0
- package/src/providers/spec/fsm-loader.ts +120 -0
- package/src/providers/spec/fsm-types.ts +273 -0
- package/src/providers/spec/native-history-executor.ts +1128 -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 +262 -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 +542 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/sessions/registry.ts +6 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +64 -1
- package/src/status/builders.ts +26 -6
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- 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 +5 -0
- 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
|
@@ -15,6 +15,7 @@ export declare function buildCliParseInput(options: {
|
|
|
15
15
|
accumulatedRawBuffer: string;
|
|
16
16
|
recentOutputBuffer: string;
|
|
17
17
|
terminalScreenText: string;
|
|
18
|
+
workingDir?: string;
|
|
18
19
|
baseMessages: CliChatMessage[];
|
|
19
20
|
partialResponse: string;
|
|
20
21
|
isWaitingForResponse?: boolean;
|
|
@@ -35,22 +35,30 @@ export function buildCliParseInput(options: {
|
|
|
35
35
|
accumulatedRawBuffer: string;
|
|
36
36
|
recentOutputBuffer: string;
|
|
37
37
|
terminalScreenText: string;
|
|
38
|
+
workingDir?: string;
|
|
39
|
+
providerSessionId?: string;
|
|
40
|
+
historySessionId?: string;
|
|
38
41
|
baseMessages: CliChatMessage[];
|
|
39
42
|
partialResponse: string;
|
|
40
43
|
isWaitingForResponse?: boolean;
|
|
41
44
|
scope?: TurnParseScope | null;
|
|
42
45
|
runtimeSettings: Record<string, any>;
|
|
46
|
+
spawnAt?: number;
|
|
43
47
|
}): CliScriptInput {
|
|
44
48
|
const {
|
|
45
49
|
accumulatedBuffer,
|
|
46
50
|
accumulatedRawBuffer,
|
|
47
51
|
recentOutputBuffer,
|
|
48
52
|
terminalScreenText,
|
|
53
|
+
workingDir,
|
|
54
|
+
providerSessionId,
|
|
55
|
+
historySessionId,
|
|
49
56
|
baseMessages,
|
|
50
57
|
partialResponse,
|
|
51
58
|
isWaitingForResponse,
|
|
52
59
|
scope,
|
|
53
60
|
runtimeSettings,
|
|
61
|
+
spawnAt,
|
|
54
62
|
} = options;
|
|
55
63
|
const buffer = scope
|
|
56
64
|
? sliceFromOffset(accumulatedBuffer, scope.bufferStart)
|
|
@@ -66,6 +74,10 @@ export function buildCliParseInput(options: {
|
|
|
66
74
|
rawBuffer,
|
|
67
75
|
recentBuffer,
|
|
68
76
|
screenText,
|
|
77
|
+
workspace: workingDir,
|
|
78
|
+
workingDir,
|
|
79
|
+
providerSessionId,
|
|
80
|
+
historySessionId,
|
|
69
81
|
screen: buildCliScreenSnapshot(screenText),
|
|
70
82
|
bufferScreen: buildCliScreenSnapshot(buffer),
|
|
71
83
|
recentScreen: buildCliScreenSnapshot(recentBuffer),
|
|
@@ -74,6 +86,7 @@ export function buildCliParseInput(options: {
|
|
|
74
86
|
isWaitingForResponse,
|
|
75
87
|
promptText: scope?.prompt || '',
|
|
76
88
|
settings: { ...runtimeSettings },
|
|
89
|
+
...(typeof spawnAt === 'number' && spawnAt > 0 ? { spawnAt } : {}),
|
|
77
90
|
};
|
|
78
91
|
}
|
|
79
92
|
|
|
@@ -34,20 +34,69 @@ export function resolveCliSpawnPlan(options: {
|
|
|
34
34
|
const configuredCommand = typeof runtimeSettings.executablePath === 'string' && runtimeSettings.executablePath.trim()
|
|
35
35
|
? runtimeSettings.executablePath.trim()
|
|
36
36
|
: spawnConfig.command;
|
|
37
|
-
|
|
37
|
+
return resolveCliSpawnPlanFromParts({
|
|
38
|
+
command: configuredCommand,
|
|
39
|
+
baseArgs: spawnConfig.args,
|
|
40
|
+
shell: spawnConfig.shell,
|
|
41
|
+
baseEnv: spawnConfig.env,
|
|
42
|
+
workingDir,
|
|
43
|
+
extraArgs,
|
|
44
|
+
extraEnv,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Cols/rows for a PTY spawn. Defaults to the session-host terminal size; the
|
|
50
|
+
* spec driver may override per-instance.
|
|
51
|
+
*/
|
|
52
|
+
export interface CliSpawnGeometry {
|
|
53
|
+
cols?: number;
|
|
54
|
+
rows?: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Core spawn-plan resolution from already-flattened spawn parts — the single
|
|
59
|
+
* source of truth for binary resolution (findBinary: PATH + npm-global / Node
|
|
60
|
+
* dir fallback), `{{workingDir}}` token substitution, shell wrapping
|
|
61
|
+
* (script-shims / non-absolute / non-native binaries), and env sanitization +
|
|
62
|
+
* TERMINAL_CWD. Both the legacy provider-module path (resolveCliSpawnPlan) and
|
|
63
|
+
* the spec/FSM path (FsmDriver.buildAdapterOpts) feed into this so the two
|
|
64
|
+
* spawn paths can never diverge.
|
|
65
|
+
*/
|
|
66
|
+
export function resolveCliSpawnPlanFromParts(options: {
|
|
67
|
+
/** Raw command from the spec/provider (`binary` / `spawn.command`), or an
|
|
68
|
+
* operator-configured executable path override. */
|
|
69
|
+
command: string;
|
|
70
|
+
/** Base launch args declared by the spec/provider (`spawn_args` /
|
|
71
|
+
* `spawn.args`). */
|
|
72
|
+
baseArgs?: string[];
|
|
73
|
+
/** When true, always wrap the launch in a login shell. */
|
|
74
|
+
shell?: boolean;
|
|
75
|
+
/** Base env declared by the spec/provider (`env` / `spawn.env`). */
|
|
76
|
+
baseEnv?: Record<string, string>;
|
|
77
|
+
workingDir: string;
|
|
78
|
+
/** Per-launch extra args (e.g. resume session id) appended after baseArgs. */
|
|
79
|
+
extraArgs?: string[];
|
|
80
|
+
extraEnv?: Record<string, string>;
|
|
81
|
+
geometry?: CliSpawnGeometry;
|
|
82
|
+
}): CliSpawnPlan {
|
|
83
|
+
const { command, baseArgs, shell, baseEnv, workingDir, extraArgs, extraEnv, geometry } = options;
|
|
84
|
+
const binaryPath = findBinary(command);
|
|
38
85
|
const isWin = os.platform() === 'win32';
|
|
39
|
-
const allArgs = [...
|
|
86
|
+
const allArgs = [...(baseArgs ?? []), ...(extraArgs ?? [])].map((arg) =>
|
|
87
|
+
typeof arg === 'string' ? arg.replace(/\{\{workingDir\}\}/g, workingDir) : arg,
|
|
88
|
+
);
|
|
40
89
|
|
|
41
90
|
let shellCmd: string;
|
|
42
91
|
let shellArgs: string[];
|
|
43
92
|
const useShellUnix = !isWin && (
|
|
44
|
-
!!
|
|
93
|
+
!!shell
|
|
45
94
|
|| !path.isAbsolute(binaryPath)
|
|
46
95
|
|| isScriptBinary(binaryPath)
|
|
47
96
|
|| !looksLikeMachOOrElf(binaryPath)
|
|
48
97
|
);
|
|
49
98
|
const isCmdShim = isWin && /\.(cmd|bat)$/i.test(binaryPath);
|
|
50
|
-
const useShellWin = !!
|
|
99
|
+
const useShellWin = !!shell
|
|
51
100
|
|| isCmdShim
|
|
52
101
|
|| !path.isAbsolute(binaryPath)
|
|
53
102
|
|| isScriptBinary(binaryPath);
|
|
@@ -66,7 +115,7 @@ export function resolveCliSpawnPlan(options: {
|
|
|
66
115
|
shellArgs = allArgs;
|
|
67
116
|
}
|
|
68
117
|
|
|
69
|
-
const env = buildCliSpawnEnv(process.env, { ...(
|
|
118
|
+
const env = buildCliSpawnEnv(process.env, { ...(baseEnv || {}), ...(extraEnv || {}) });
|
|
70
119
|
// Some CLI agents, notably Hermes, route their tools through TERMINAL_CWD
|
|
71
120
|
// rather than process.cwd(). Keep the generic ADHDev launch workspace as
|
|
72
121
|
// the single source of truth so PTY cwd and tool cwd cannot diverge.
|
|
@@ -80,8 +129,8 @@ export function resolveCliSpawnPlan(options: {
|
|
|
80
129
|
isWin,
|
|
81
130
|
useShell,
|
|
82
131
|
ptyOptions: {
|
|
83
|
-
cols: DEFAULT_SESSION_HOST_COLS,
|
|
84
|
-
rows: DEFAULT_SESSION_HOST_ROWS,
|
|
132
|
+
cols: geometry?.cols ?? DEFAULT_SESSION_HOST_COLS,
|
|
133
|
+
rows: geometry?.rows ?? DEFAULT_SESSION_HOST_ROWS,
|
|
85
134
|
cwd: workingDir,
|
|
86
135
|
env,
|
|
87
136
|
},
|
|
@@ -18,6 +18,8 @@ export interface CliSessionStatus {
|
|
|
18
18
|
activeModal: { message: string; buttons: string[] } | null;
|
|
19
19
|
errorMessage?: string;
|
|
20
20
|
errorReason?: string;
|
|
21
|
+
lastOutputAt?: number;
|
|
22
|
+
lastScreenChangeAt?: number;
|
|
21
23
|
}
|
|
22
24
|
export interface CliScripts {
|
|
23
25
|
detectStatus?: (input: CliStatusInput) => string | null;
|
|
@@ -55,6 +57,8 @@ export interface CliScriptInput {
|
|
|
55
57
|
rawBuffer: string;
|
|
56
58
|
recentBuffer: string;
|
|
57
59
|
screenText: string;
|
|
60
|
+
workspace?: string;
|
|
61
|
+
workingDir?: string;
|
|
58
62
|
screen: CliScreenSnapshot;
|
|
59
63
|
bufferScreen: CliScreenSnapshot;
|
|
60
64
|
recentScreen: CliScreenSnapshot;
|
|
@@ -4,6 +4,7 @@ import { execSync } from 'child_process';
|
|
|
4
4
|
import type { ProviderResumeCapability } from '../providers/contracts.js';
|
|
5
5
|
import type { ChatMessageKind } from '../providers/chat-message-normalization.js';
|
|
6
6
|
import type { ChatBubbleState } from '../types.js';
|
|
7
|
+
import type { InteractivePrompt } from '../providers/types/interactive-prompt.js';
|
|
7
8
|
import { sanitizeSpawnEnv } from './spawn-env.js';
|
|
8
9
|
|
|
9
10
|
export interface CliChatMessage {
|
|
@@ -28,8 +29,52 @@ export interface CliSessionStatus {
|
|
|
28
29
|
messages: CliChatMessage[];
|
|
29
30
|
workingDir: string;
|
|
30
31
|
activeModal: { message: string; buttons: string[] } | null;
|
|
32
|
+
/**
|
|
33
|
+
* Monotonic counter identifying which approval *entry* the current modal
|
|
34
|
+
* belongs to. Bumped by the FSM on every fresh waiting_approval entry.
|
|
35
|
+
* Consumers (e.g. auto-approval) use it to distinguish a genuinely new
|
|
36
|
+
* approval from the same approval re-observed across TUI paint flaps —
|
|
37
|
+
* two distinct approvals can carry identical message/button text, so the
|
|
38
|
+
* seq is the only reliable discriminator.
|
|
39
|
+
*/
|
|
40
|
+
approvalEntrySeq?: number;
|
|
41
|
+
/**
|
|
42
|
+
* The approval entry seq that the engine's last resolveModal() handled. When
|
|
43
|
+
* `lastResolvedEntrySeq >= approvalEntrySeq` (and approvalEntrySeq > 0) it is positive
|
|
44
|
+
* evidence that the current/latest approval entry was resolved through ADHDev (auto-approve
|
|
45
|
+
* fire, dashboard / mesh_approve, or dev-cli-debug — all route through resolveModal). The
|
|
46
|
+
* completion finalization gate uses this to avoid confirming a waiting_approval→idle
|
|
47
|
+
* transition for which no resolution actually occurred (a false idle: the spec's text-based
|
|
48
|
+
* approval→idle rule tripped while the modal is still on screen).
|
|
49
|
+
*/
|
|
50
|
+
lastResolvedEntrySeq?: number;
|
|
51
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
52
|
+
pendingOutboundCount?: number;
|
|
53
|
+
pendingOutboundMessages?: Array<{
|
|
54
|
+
id: string;
|
|
55
|
+
role: 'user';
|
|
56
|
+
content: string;
|
|
57
|
+
queuedAt: number;
|
|
58
|
+
source: string;
|
|
59
|
+
}>;
|
|
31
60
|
errorMessage?: string;
|
|
32
61
|
errorReason?: string;
|
|
62
|
+
providerSessionId?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Timestamp (ms) of the most recent raw PTY output chunk. Advances on every
|
|
65
|
+
* byte the process emits, including tool/build output that produces no
|
|
66
|
+
* parsed assistant text. Liveness watchdogs use this to distinguish a real
|
|
67
|
+
* stall (no output at all) from an active turn whose assistant buffer is
|
|
68
|
+
* momentarily static while a tool runs.
|
|
69
|
+
*/
|
|
70
|
+
lastOutputAt?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Timestamp (ms) of the most recent *visible* terminal screen change.
|
|
73
|
+
* Stricter than lastOutputAt — only advances when the rendered screen
|
|
74
|
+
* content actually differs, so repeated keepalive bytes do not register as
|
|
75
|
+
* progress. Preferred liveness signal for the no-progress watchdog.
|
|
76
|
+
*/
|
|
77
|
+
lastScreenChangeAt?: number;
|
|
33
78
|
bufferState?: {
|
|
34
79
|
responseBuffer?: { truncated: boolean; droppedChars: number; maxChars: number };
|
|
35
80
|
recentOutputBuffer?: { truncated: boolean; droppedChars: number; maxChars: number };
|
|
@@ -43,6 +88,9 @@ export interface ParsedSession {
|
|
|
43
88
|
messages: any[];
|
|
44
89
|
modal: { message: string; buttons: string[] } | null;
|
|
45
90
|
parsedStatus: string | null;
|
|
91
|
+
errorMessage?: string;
|
|
92
|
+
errorReason?: string;
|
|
93
|
+
providerSessionId?: string;
|
|
46
94
|
transcriptAuthority?: 'provider' | 'daemon';
|
|
47
95
|
coverage?: 'full' | 'tail' | 'current-turn';
|
|
48
96
|
}
|
|
@@ -94,6 +142,10 @@ export interface CliScriptInput {
|
|
|
94
142
|
rawBuffer: string;
|
|
95
143
|
recentBuffer: string;
|
|
96
144
|
screenText: string;
|
|
145
|
+
workspace?: string;
|
|
146
|
+
workingDir?: string;
|
|
147
|
+
providerSessionId?: string;
|
|
148
|
+
historySessionId?: string;
|
|
97
149
|
screen: CliScreenSnapshot;
|
|
98
150
|
bufferScreen: CliScreenSnapshot;
|
|
99
151
|
recentScreen: CliScreenSnapshot;
|
|
@@ -103,6 +155,7 @@ export interface CliScriptInput {
|
|
|
103
155
|
promptText?: string;
|
|
104
156
|
settings?: Record<string, any>;
|
|
105
157
|
args?: Record<string, any>;
|
|
158
|
+
spawnAt?: number;
|
|
106
159
|
}
|
|
107
160
|
|
|
108
161
|
export interface CliStatusInput {
|
|
@@ -141,16 +194,26 @@ export interface CliProviderModule {
|
|
|
141
194
|
binary: string;
|
|
142
195
|
approvalKeys?: Record<number, string>;
|
|
143
196
|
sendDelayMs?: number;
|
|
197
|
+
/** Wall-clock budget (ms) for a single provider script invocation. Default 50. Range 1..5000.
|
|
198
|
+
* Exceeding the budget records `timedOut: true` on the invocation trace and emits a
|
|
199
|
+
* throttled WARN — it does NOT abort the script (Node CJS can't interrupt sync code). */
|
|
200
|
+
scriptCallBudgetMs?: number;
|
|
144
201
|
sendKey?: string;
|
|
145
202
|
submitStrategy?: 'wait_for_echo' | 'immediate';
|
|
146
203
|
/** Require the typed prompt to be visible on the PTY screen before sending Enter. */
|
|
147
204
|
requirePromptEchoBeforeSubmit?: boolean;
|
|
148
205
|
/** Allow sending another prompt while the CLI is still generating so users can intervene mid-turn. */
|
|
149
206
|
allowInputDuringGeneration?: boolean;
|
|
207
|
+
/** When true, only transition to idle after the parsed transcript includes a final standard assistant message. */
|
|
208
|
+
requiresFinalAssistantBeforeIdle?: boolean;
|
|
209
|
+
/** When true, allow providers to augment stale snapshot data before parse. Reserved for future use. */
|
|
210
|
+
augmentStaleSnapshot?: boolean;
|
|
150
211
|
/** When provider-owned, daemon treats provider parser output as canonical transcript authority. */
|
|
151
212
|
transcriptAuthority?: 'provider' | 'daemon';
|
|
152
213
|
/** Full context lets provider-owned parsers canonicalize retained history instead of daemon prefix stitching. */
|
|
153
214
|
transcriptContext?: 'full' | 'tail';
|
|
215
|
+
/** v1 declarative tui block — used by CliScriptRunner to synthesize SDK helpers (declarativeDetectStatus, declarativeParseApproval). */
|
|
216
|
+
tui?: Record<string, unknown>;
|
|
154
217
|
scripts?: CliScripts;
|
|
155
218
|
spawn: {
|
|
156
219
|
command: string;
|
|
@@ -342,7 +405,18 @@ export class TerminalTranscriptAccumulator {
|
|
|
342
405
|
this.ensureRow();
|
|
343
406
|
if (final === 'A') this.row = Math.max(0, this.row - count);
|
|
344
407
|
else if (final === 'B') this.row += count;
|
|
345
|
-
else if (final === 'C')
|
|
408
|
+
else if (final === 'C') {
|
|
409
|
+
// (fix) Cursor-forward must materialize spaces in the cells it
|
|
410
|
+
// skips, otherwise rendered transcripts collapse "Do you" written
|
|
411
|
+
// as "Do\x1b[1Cyou" into "Doyou". That mis-rendering broke
|
|
412
|
+
// Claude Code's approval-prompt and prompt-line detection
|
|
413
|
+
// (parseApproval saw "Doyouwanttoproceed?" and returned null).
|
|
414
|
+
const line = this.lines[this.row];
|
|
415
|
+
for (let c = this.col; c < this.col + count; c += 1) {
|
|
416
|
+
if (line[c] === undefined) line[c] = ' ';
|
|
417
|
+
}
|
|
418
|
+
this.col += count;
|
|
419
|
+
}
|
|
346
420
|
else if (final === 'D') this.col = Math.max(0, this.col - count);
|
|
347
421
|
else if (final === 'G') this.col = Math.max(0, count - 1);
|
|
348
422
|
else if (final === 'H' || final === 'f') {
|
|
@@ -484,17 +558,42 @@ export function findBinary(name: string): string {
|
|
|
484
558
|
return path.isAbsolute(expanded) ? expanded : path.resolve(expanded);
|
|
485
559
|
}
|
|
486
560
|
const isWin = os.platform() === 'win32';
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
561
|
+
const paths = (process.env.PATH || '').split(path.delimiter);
|
|
562
|
+
// Also search well-known global-bin directories that are frequently NOT on
|
|
563
|
+
// the daemon's inherited PATH. A daemon running under one Node install (e.g.
|
|
564
|
+
// nvm) never sees another npm prefix's bin dir — notably npm's Windows
|
|
565
|
+
// default prefix at %APPDATA%\npm, where `npm i -g @openai/codex` lands. We
|
|
566
|
+
// append these after PATH (so explicit PATH entries still win) so that an
|
|
567
|
+
// npm-global CLI resolves to an absolute path; the spawn layer's .cmd-shim
|
|
568
|
+
// handling then launches it correctly regardless of PATH.
|
|
569
|
+
const extraDirs: string[] = [];
|
|
570
|
+
if (isWin) {
|
|
571
|
+
if (process.env.APPDATA) extraDirs.push(path.join(process.env.APPDATA, 'npm'));
|
|
572
|
+
try { extraDirs.push(path.dirname(process.execPath)); } catch { /* best-effort */ }
|
|
573
|
+
} else {
|
|
574
|
+
extraDirs.push(path.join(os.homedir(), '.npm-global', 'bin'));
|
|
575
|
+
extraDirs.push('/usr/local/bin', '/opt/homebrew/bin');
|
|
576
|
+
try { extraDirs.push(path.dirname(process.execPath)); } catch { /* best-effort */ }
|
|
577
|
+
}
|
|
578
|
+
const searchDirs = [...paths, ...extraDirs];
|
|
579
|
+
const exes = isWin ? ['.exe', '.cmd', '.bat', ''] : [''];
|
|
580
|
+
|
|
581
|
+
for (const p of searchDirs) {
|
|
582
|
+
if (!p) continue;
|
|
583
|
+
for (const ext of exes) {
|
|
584
|
+
const fullPath = path.join(p, trimmed + ext);
|
|
585
|
+
try {
|
|
586
|
+
const fs = require('fs');
|
|
587
|
+
if (fs.existsSync(fullPath)) {
|
|
588
|
+
const stat = fs.statSync(fullPath);
|
|
589
|
+
if (stat.isFile() && (isWin || (stat.mode & 0o111))) {
|
|
590
|
+
return fullPath;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
} catch { }
|
|
594
|
+
}
|
|
497
595
|
}
|
|
596
|
+
return isWin ? `${trimmed}.cmd` : trimmed;
|
|
498
597
|
}
|
|
499
598
|
|
|
500
599
|
export function isScriptBinary(binaryPath: string): boolean {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as os from 'os';
|
|
2
2
|
import { ensureNodePtySpawnHelperPermissions } from './spawn-env.js';
|
|
3
|
+
import { resolveWin32Executable } from './resolve-executable.js';
|
|
3
4
|
|
|
4
5
|
let cachedPty: any | null | undefined;
|
|
5
6
|
|
|
@@ -119,7 +120,7 @@ export class NodePtyTransportFactory implements PtyTransportFactory {
|
|
|
119
120
|
cwd = os.homedir();
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
const handle = pty.spawn(command, args, {
|
|
123
|
+
const handle = pty.spawn(resolveWin32Executable(command), args, {
|
|
123
124
|
name: 'xterm-256color',
|
|
124
125
|
cols: options.cols,
|
|
125
126
|
rows: options.rows,
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared win32 ConPTY paced-write chunking.
|
|
3
|
+
*
|
|
4
|
+
* A single unbounded ConPTY `write()` can overflow the console input pipe and
|
|
5
|
+
* drop LEADING bytes once the payload exceeds ~1KB — the "long task message gets
|
|
6
|
+
* truncated (head lost, tail kept)" failure. The fix is to split a large body
|
|
7
|
+
* into bounded chunks written with a short inter-chunk gap so the console input
|
|
8
|
+
* buffer keeps up. Small bodies still go out in a single write.
|
|
9
|
+
*
|
|
10
|
+
* This module is the SINGLE source of truth for the chunk size / gap / surrogate-
|
|
11
|
+
* safe split so the two write paths that need it — the spec FsmDriver
|
|
12
|
+
* (writeWin32Body) and the legacy ProviderCliAdapter (writeToPty / submit paths)
|
|
13
|
+
* — cannot drift apart and regress on one side (the original bug: "one branch
|
|
14
|
+
* patched, the other not").
|
|
15
|
+
*/
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
// Defensive paced PTY write tuning. 1024 chars per chunk stays comfortably under
|
|
19
|
+
// the ConPTY input-pipe threshold; an 8ms gap lets the console reader drain
|
|
20
|
+
// between chunks without adding meaningful latency to a normal-sized prompt.
|
|
21
|
+
export const WIN32_PTY_WRITE_CHUNK_CHARS = 1024;
|
|
22
|
+
export const WIN32_PTY_WRITE_CHUNK_GAP_MS = 8;
|
|
23
|
+
|
|
24
|
+
/** Split `text` into chunks of at most `size` UTF-16 units without ever cutting
|
|
25
|
+
* between a high and low surrogate (which would corrupt an astral char — emoji,
|
|
26
|
+
* etc. — on the UTF-8 PTY write). */
|
|
27
|
+
export function chunkPreservingSurrogates(text: string, size: number): string[] {
|
|
28
|
+
const chunks: string[] = [];
|
|
29
|
+
let offset = 0;
|
|
30
|
+
while (offset < text.length) {
|
|
31
|
+
let end = Math.min(text.length, offset + size);
|
|
32
|
+
if (end < text.length) {
|
|
33
|
+
const code = text.charCodeAt(end - 1);
|
|
34
|
+
// Boundary lands on a high surrogate → pull back one so the pair stays
|
|
35
|
+
// together in the next chunk.
|
|
36
|
+
if (code >= 0xd800 && code <= 0xdbff) end -= 1;
|
|
37
|
+
}
|
|
38
|
+
if (end <= offset) end = Math.min(text.length, offset + size); // size 1 on a lone surrogate
|
|
39
|
+
chunks.push(text.slice(offset, end));
|
|
40
|
+
offset = end;
|
|
41
|
+
}
|
|
42
|
+
return chunks;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** True when a body of `length` UTF-16 units should be paced into multiple
|
|
46
|
+
* chunks on win32 rather than written in a single PTY write. */
|
|
47
|
+
export function shouldChunkWin32Write(length: number): boolean {
|
|
48
|
+
return length > WIN32_PTY_WRITE_CHUNK_CHARS;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Drive a paced, surrogate-safe chunked write of `text` over a `write(chunk)`
|
|
53
|
+
* sink, calling `onChunkWritten` after each chunk (e.g. to advance an input-
|
|
54
|
+
* activity timestamp) and `onDone` once the final chunk is out. The optional
|
|
55
|
+
* `setTimer` lets the caller own the timer handle (so it can be cleared on
|
|
56
|
+
* shutdown) and supply a custom scheduler in tests; it defaults to setTimeout.
|
|
57
|
+
*
|
|
58
|
+
* Bodies at or below the chunk threshold are written in a SINGLE write — the
|
|
59
|
+
* common case — so this is a no-op pacing wrapper for normal-sized prompts.
|
|
60
|
+
*
|
|
61
|
+
* Returns the chunks that will be written (useful for assertions/logging).
|
|
62
|
+
*/
|
|
63
|
+
export interface PacedWin32WriteOptions {
|
|
64
|
+
write: (chunk: string) => void;
|
|
65
|
+
onChunkWritten?: () => void;
|
|
66
|
+
onDone?: () => void;
|
|
67
|
+
/** Schedule the next chunk; must return a handle the caller can clear.
|
|
68
|
+
* Defaults to setTimeout. */
|
|
69
|
+
setTimer?: (fn: () => void, delayMs: number) => ReturnType<typeof setTimeout>;
|
|
70
|
+
/** Store the pending timer handle so the caller can clear it on shutdown. */
|
|
71
|
+
onTimer?: (handle: ReturnType<typeof setTimeout> | null) => void;
|
|
72
|
+
chunkChars?: number;
|
|
73
|
+
gapMs?: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function writeWin32Paced(text: string, opts: PacedWin32WriteOptions): string[] {
|
|
77
|
+
const chunkChars = opts.chunkChars ?? WIN32_PTY_WRITE_CHUNK_CHARS;
|
|
78
|
+
const gapMs = opts.gapMs ?? WIN32_PTY_WRITE_CHUNK_GAP_MS;
|
|
79
|
+
const setTimer = opts.setTimer ?? ((fn, delayMs) => setTimeout(fn, delayMs));
|
|
80
|
+
|
|
81
|
+
if (text.length <= chunkChars) {
|
|
82
|
+
opts.onTimer?.(null);
|
|
83
|
+
opts.write(text);
|
|
84
|
+
opts.onChunkWritten?.();
|
|
85
|
+
opts.onDone?.();
|
|
86
|
+
return [text];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const chunks = chunkPreservingSurrogates(text, chunkChars);
|
|
90
|
+
let idx = 0;
|
|
91
|
+
const writeNext = (): void => {
|
|
92
|
+
opts.onTimer?.(null);
|
|
93
|
+
if (idx >= chunks.length) { opts.onDone?.(); return; }
|
|
94
|
+
opts.write(chunks[idx]);
|
|
95
|
+
opts.onChunkWritten?.();
|
|
96
|
+
idx += 1;
|
|
97
|
+
if (idx < chunks.length) {
|
|
98
|
+
const handle = setTimer(writeNext, gapMs);
|
|
99
|
+
opts.onTimer?.(handle);
|
|
100
|
+
} else {
|
|
101
|
+
opts.onDone?.();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
writeNext();
|
|
105
|
+
return chunks;
|
|
106
|
+
}
|