@adhdev/daemon-core 0.9.82-rc.48 → 0.9.82-rc.481
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 +126 -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 +51 -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 +137 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +204 -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 +136 -1
- 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 +57 -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 +73 -17
- package/dist/index.js +52979 -18657
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59496 -25355
- 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 +230 -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 +49 -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 +246 -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 +29 -0
- 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 +158 -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 +80 -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 +428 -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 +508 -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 +30 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +363 -5
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +216 -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 +406 -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 +149 -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 +29 -0
- package/dist/providers/provider-instance.d.ts +30 -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 +629 -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 +98 -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 +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 +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 +954 -1144
- 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 +2767 -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 +659 -27
- package/src/commands/handler.ts +845 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +849 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +72 -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 +241 -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 +1287 -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 +1711 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +795 -4143
- 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 +632 -23
- 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 +767 -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 +213 -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 +469 -0
- package/src/mesh/coordinator-prompt.ts +572 -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 +2002 -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 +1494 -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 +111 -0
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +898 -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 +2263 -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 +1473 -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 +1686 -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 +2150 -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 +185 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1437 -147
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +423 -0
- 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 +2709 -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 +160 -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 +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 +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 +509 -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 +868 -13
- 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 +136 -55
- package/src/status/builders.ts +26 -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 +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
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import {
|
|
3
|
+
SessionHostClient,
|
|
4
|
+
type SessionHostEndpoint,
|
|
5
|
+
type SessionHostRequest,
|
|
6
|
+
type SessionHostResponse,
|
|
7
|
+
type SessionTerminalSnapshot,
|
|
8
|
+
type SessionTerminalState,
|
|
9
|
+
} from '@adhdev/session-host-core';
|
|
10
|
+
|
|
11
|
+
type LowercaseLetter =
|
|
12
|
+
| 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm'
|
|
13
|
+
| 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
|
|
14
|
+
|
|
15
|
+
type FunctionKey = 'f1' | 'f2' | 'f3' | 'f4' | 'f5' | 'f6' | 'f7' | 'f8' | 'f9' | 'f10' | 'f11' | 'f12';
|
|
16
|
+
type BaseNamedKey =
|
|
17
|
+
| 'enter' | 'escape' | 'tab' | 'backspace'
|
|
18
|
+
| 'up' | 'down' | 'left' | 'right'
|
|
19
|
+
| 'home' | 'end' | 'pageup' | 'pagedown' | 'space'
|
|
20
|
+
| FunctionKey;
|
|
21
|
+
type ShiftNamedKey = BaseNamedKey | LowercaseLetter | `ctrl+${LowercaseLetter}` | `alt+${LowercaseLetter}`;
|
|
22
|
+
|
|
23
|
+
export type NamedKey =
|
|
24
|
+
| BaseNamedKey
|
|
25
|
+
| `ctrl+${LowercaseLetter}`
|
|
26
|
+
| `alt+${LowercaseLetter}`
|
|
27
|
+
| `shift+${ShiftNamedKey}`;
|
|
28
|
+
|
|
29
|
+
const BASE_KEY_SEQUENCES: Record<BaseNamedKey, string> = {
|
|
30
|
+
enter: '\r',
|
|
31
|
+
escape: '\x1b',
|
|
32
|
+
tab: '\t',
|
|
33
|
+
backspace: '\x7f',
|
|
34
|
+
up: '\x1b[A',
|
|
35
|
+
down: '\x1b[B',
|
|
36
|
+
right: '\x1b[C',
|
|
37
|
+
left: '\x1b[D',
|
|
38
|
+
home: '\x1b[H',
|
|
39
|
+
end: '\x1b[F',
|
|
40
|
+
pageup: '\x1b[5~',
|
|
41
|
+
pagedown: '\x1b[6~',
|
|
42
|
+
space: ' ',
|
|
43
|
+
f1: '\x1bOP',
|
|
44
|
+
f2: '\x1bOQ',
|
|
45
|
+
f3: '\x1bOR',
|
|
46
|
+
f4: '\x1bOS',
|
|
47
|
+
f5: '\x1b[15~',
|
|
48
|
+
f6: '\x1b[17~',
|
|
49
|
+
f7: '\x1b[18~',
|
|
50
|
+
f8: '\x1b[19~',
|
|
51
|
+
f9: '\x1b[20~',
|
|
52
|
+
f10: '\x1b[21~',
|
|
53
|
+
f11: '\x1b[23~',
|
|
54
|
+
f12: '\x1b[24~',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const SHIFTED_CSI_KEYS: Partial<Record<BaseNamedKey, string>> = {
|
|
58
|
+
up: '\x1b[1;2A',
|
|
59
|
+
down: '\x1b[1;2B',
|
|
60
|
+
right: '\x1b[1;2C',
|
|
61
|
+
left: '\x1b[1;2D',
|
|
62
|
+
home: '\x1b[1;2H',
|
|
63
|
+
end: '\x1b[1;2F',
|
|
64
|
+
pageup: '\x1b[5;2~',
|
|
65
|
+
pagedown: '\x1b[6;2~',
|
|
66
|
+
f1: '\x1b[1;2P',
|
|
67
|
+
f2: '\x1b[1;2Q',
|
|
68
|
+
f3: '\x1b[1;2R',
|
|
69
|
+
f4: '\x1b[1;2S',
|
|
70
|
+
f5: '\x1b[15;2~',
|
|
71
|
+
f6: '\x1b[17;2~',
|
|
72
|
+
f7: '\x1b[18;2~',
|
|
73
|
+
f8: '\x1b[19;2~',
|
|
74
|
+
f9: '\x1b[20;2~',
|
|
75
|
+
f10: '\x1b[21;2~',
|
|
76
|
+
f11: '\x1b[23;2~',
|
|
77
|
+
f12: '\x1b[24;2~',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
function isLowercaseLetter(value: string): value is LowercaseLetter {
|
|
81
|
+
return /^[a-z]$/.test(value);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function encodeControlLetter(letter: LowercaseLetter): string {
|
|
85
|
+
return String.fromCharCode(letter.charCodeAt(0) - 96);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function encodeShiftedKey(key: string): string {
|
|
89
|
+
if (isLowercaseLetter(key)) return key.toUpperCase();
|
|
90
|
+
if (key.startsWith('ctrl+') && isLowercaseLetter(key.slice(5))) {
|
|
91
|
+
return encodeControlLetter(key.slice(5) as LowercaseLetter);
|
|
92
|
+
}
|
|
93
|
+
if (key.startsWith('alt+') && isLowercaseLetter(key.slice(4))) {
|
|
94
|
+
return `\x1b${key.slice(4).toUpperCase()}`;
|
|
95
|
+
}
|
|
96
|
+
if (key === 'tab') return '\x1b[Z';
|
|
97
|
+
if (key in SHIFTED_CSI_KEYS) return SHIFTED_CSI_KEYS[key as BaseNamedKey]!;
|
|
98
|
+
if (key in BASE_KEY_SEQUENCES) return BASE_KEY_SEQUENCES[key as BaseNamedKey];
|
|
99
|
+
throw new Error(`Unsupported named key: shift+${key}`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function namedKeyToAnsi(key: NamedKey | string): string {
|
|
103
|
+
const normalized = String(key || '').trim().toLowerCase();
|
|
104
|
+
if (normalized in BASE_KEY_SEQUENCES) return BASE_KEY_SEQUENCES[normalized as BaseNamedKey];
|
|
105
|
+
if (normalized.startsWith('ctrl+') && isLowercaseLetter(normalized.slice(5))) {
|
|
106
|
+
return encodeControlLetter(normalized.slice(5) as LowercaseLetter);
|
|
107
|
+
}
|
|
108
|
+
if (normalized.startsWith('alt+') && isLowercaseLetter(normalized.slice(4))) {
|
|
109
|
+
return `\x1b${normalized.slice(4)}`;
|
|
110
|
+
}
|
|
111
|
+
if (normalized.startsWith('shift+')) return encodeShiftedKey(normalized.slice(6));
|
|
112
|
+
throw new Error(`Unsupported named key: ${key}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function namedKeysToAnsi(keys: readonly (NamedKey | string)[]): string {
|
|
116
|
+
if (!Array.isArray(keys)) throw new Error('keys must be an array');
|
|
117
|
+
return keys.map(namedKeyToAnsi).join('');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface RawTerminalSessionHostClient {
|
|
121
|
+
connect(): Promise<void>;
|
|
122
|
+
request<T = unknown>(request: SessionHostRequest): Promise<SessionHostResponse<T>>;
|
|
123
|
+
close(): Promise<void>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface RawTerminalAttachmentOptions {
|
|
127
|
+
endpoint?: SessionHostEndpoint;
|
|
128
|
+
sessionId: string;
|
|
129
|
+
mode?: 'read' | 'write';
|
|
130
|
+
clientId?: string;
|
|
131
|
+
client?: RawTerminalSessionHostClient;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export class RawTerminalAttachment {
|
|
135
|
+
private closed = false;
|
|
136
|
+
|
|
137
|
+
private constructor(
|
|
138
|
+
readonly sessionId: string,
|
|
139
|
+
private readonly clientId: string,
|
|
140
|
+
private readonly mode: 'read' | 'write',
|
|
141
|
+
private readonly client: RawTerminalSessionHostClient,
|
|
142
|
+
) {}
|
|
143
|
+
|
|
144
|
+
static async attach(options: RawTerminalAttachmentOptions): Promise<RawTerminalAttachment> {
|
|
145
|
+
const sessionId = String(options.sessionId || '').trim();
|
|
146
|
+
if (!sessionId) throw new Error('sessionId is required');
|
|
147
|
+
const mode = options.mode || 'read';
|
|
148
|
+
const clientId = options.clientId || `raw-terminal-${process.pid}-${randomUUID().slice(0, 8)}`;
|
|
149
|
+
const client = options.client || new SessionHostClient({ endpoint: options.endpoint });
|
|
150
|
+
await client.connect();
|
|
151
|
+
|
|
152
|
+
const attachResponse = await client.request({
|
|
153
|
+
type: 'attach_session',
|
|
154
|
+
payload: {
|
|
155
|
+
sessionId,
|
|
156
|
+
clientId,
|
|
157
|
+
clientType: 'web',
|
|
158
|
+
readOnly: mode === 'read',
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
if (!attachResponse.success) {
|
|
162
|
+
await client.close().catch(() => {});
|
|
163
|
+
throw new Error(attachResponse.error || `Failed to attach terminal session ${sessionId}`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (mode === 'write') {
|
|
167
|
+
const ownerResponse = await client.request({
|
|
168
|
+
type: 'acquire_write',
|
|
169
|
+
payload: {
|
|
170
|
+
sessionId,
|
|
171
|
+
clientId,
|
|
172
|
+
ownerType: 'user',
|
|
173
|
+
force: true,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
if (!ownerResponse.success) {
|
|
177
|
+
await client.request({
|
|
178
|
+
type: 'detach_session',
|
|
179
|
+
payload: { sessionId, clientId },
|
|
180
|
+
}).catch(() => ({ success: false }));
|
|
181
|
+
await client.close().catch(() => {});
|
|
182
|
+
throw new Error(ownerResponse.error || `Failed to acquire terminal session ${sessionId}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return new RawTerminalAttachment(sessionId, clientId, mode, client);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async readSnapshot(): Promise<SessionTerminalSnapshot> {
|
|
190
|
+
const response = await this.client.request<SessionTerminalSnapshot>({
|
|
191
|
+
type: 'get_terminal_snapshot',
|
|
192
|
+
payload: { sessionId: this.sessionId },
|
|
193
|
+
});
|
|
194
|
+
if (!response.success || !response.result) {
|
|
195
|
+
throw new Error(response.error || `Terminal screen unavailable for ${this.sessionId}`);
|
|
196
|
+
}
|
|
197
|
+
return response.result;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async readScreenText(): Promise<string> {
|
|
201
|
+
return (await this.readSnapshot()).text;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async readState(): Promise<SessionTerminalState> {
|
|
205
|
+
return (await this.readSnapshot()).state;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async writeInput(text: string): Promise<void> {
|
|
209
|
+
if (this.mode !== 'write') throw new Error('Raw terminal attachment is read-only');
|
|
210
|
+
const response = await this.client.request({
|
|
211
|
+
type: 'send_input',
|
|
212
|
+
payload: {
|
|
213
|
+
sessionId: this.sessionId,
|
|
214
|
+
clientId: this.clientId,
|
|
215
|
+
data: text,
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
if (!response.success) throw new Error(response.error || `Failed to write terminal input to ${this.sessionId}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async writeKeys(keys: readonly (NamedKey | string)[]): Promise<void> {
|
|
222
|
+
await this.writeInput(namedKeysToAnsi(keys));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async close(): Promise<void> {
|
|
226
|
+
if (this.closed) return;
|
|
227
|
+
this.closed = true;
|
|
228
|
+
if (this.mode === 'write') {
|
|
229
|
+
await this.client.request({
|
|
230
|
+
type: 'release_write',
|
|
231
|
+
payload: { sessionId: this.sessionId, clientId: this.clientId },
|
|
232
|
+
}).catch(() => ({ success: false }));
|
|
233
|
+
}
|
|
234
|
+
await this.client.request({
|
|
235
|
+
type: 'detach_session',
|
|
236
|
+
payload: { sessionId: this.sessionId, clientId: this.clientId },
|
|
237
|
+
}).catch(() => ({ success: false }));
|
|
238
|
+
await this.client.close().catch(() => {});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export async function withRawTerminalAttachment<T>(
|
|
243
|
+
options: RawTerminalAttachmentOptions,
|
|
244
|
+
operation: (attachment: RawTerminalAttachment) => Promise<T>,
|
|
245
|
+
): Promise<T> {
|
|
246
|
+
const attachment = await RawTerminalAttachment.attach(options);
|
|
247
|
+
try {
|
|
248
|
+
return await operation(attachment);
|
|
249
|
+
} finally {
|
|
250
|
+
await attachment.close();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
|
|
5
|
+
// Extensions ConPTY/CreateProcess can launch directly (not .cmd/.bat, which
|
|
6
|
+
// need a cmd.exe wrapper).
|
|
7
|
+
const DIRECT_EXEC_EXT = new Set(['.exe', '.com']);
|
|
8
|
+
|
|
9
|
+
// Batch-style shims: absolute and launchable by node-pty's ConPTY, but NOT by
|
|
10
|
+
// child_process.execFile/spawn without a cmd.exe wrapper (Node ≥18.20/20.12/22/24
|
|
11
|
+
// refuse to exec a .cmd/.bat directly — CVE-2024-27980 mitigation). Preferred
|
|
12
|
+
// over extensionless Unix wrappers, which are not win32-executable at all.
|
|
13
|
+
const SHIM_EXEC_EXT = new Set(['.cmd', '.bat']);
|
|
14
|
+
|
|
15
|
+
// Executable extensions to probe when scanning a directory ourselves, ordered
|
|
16
|
+
// most-directly-launchable first. node-pty's ConPTY backend launches an
|
|
17
|
+
// absolute `.cmd`/`.bat` shim fine (verified) — it only fails to *resolve* a
|
|
18
|
+
// bare command against an incomplete PATH — so once we hand it an absolute
|
|
19
|
+
// path, a `.cmd` shim works just as well as a real `.exe`.
|
|
20
|
+
const WIN_EXEC_EXT = ['.exe', '.com', '.cmd', '.bat'];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a bare command against well-known global-bin directories that are
|
|
24
|
+
* frequently NOT on the daemon's inherited PATH, so `where` (which only
|
|
25
|
+
* searches PATH) misses them. A daemon running under one Node install (e.g.
|
|
26
|
+
* nvm) never sees another npm prefix's bin dir — notably npm's Windows default
|
|
27
|
+
* prefix at %APPDATA%\npm, where `npm i -g @openai/codex` lands. Returns an
|
|
28
|
+
* absolute path on the first hit, or null. Mirrors findBinary()'s extraDirs in
|
|
29
|
+
* provider-cli-shared.ts; kept inline here so this lightweight module (loaded
|
|
30
|
+
* by pty-transport) need not pull in the heavier shared module.
|
|
31
|
+
*/
|
|
32
|
+
function resolveWin32GlobalBin(trimmed: string): string | null {
|
|
33
|
+
// Only resolve a bare command name — anything with a path separator is the
|
|
34
|
+
// caller's explicit location and must not be re-pointed at a global bin dir.
|
|
35
|
+
if (path.isAbsolute(trimmed) || trimmed.includes('/') || trimmed.includes('\\')) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const extraDirs: string[] = [];
|
|
39
|
+
if (process.env.APPDATA) extraDirs.push(path.join(process.env.APPDATA, 'npm'));
|
|
40
|
+
try { extraDirs.push(path.dirname(process.execPath)); } catch { /* best-effort */ }
|
|
41
|
+
for (const dir of extraDirs) {
|
|
42
|
+
if (!dir) continue;
|
|
43
|
+
for (const ext of WIN_EXEC_EXT) {
|
|
44
|
+
const full = path.join(dir, trimmed + ext);
|
|
45
|
+
if (existsSync(full)) return full;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Pick the best launch target from `where`'s match list on win32.
|
|
53
|
+
*
|
|
54
|
+
* `where npm` on a typical install returns BOTH the extensionless Unix wrapper
|
|
55
|
+
* (e.g. `C:\Program Files\nodejs\npm`, a bash shell script) AND the `npm.cmd`
|
|
56
|
+
* shim. The extensionless wrapper is NOT a win32 executable — handing it to a
|
|
57
|
+
* spawn boundary ENOENTs (errno -4058). So:
|
|
58
|
+
* 1. Prefer a directly-launchable `.exe`/`.com`.
|
|
59
|
+
* 2. Otherwise take a `.cmd`/`.bat` shim (absolute → works for ConPTY, and for
|
|
60
|
+
* execFile once wrapped via buildWin32ExecFileSpawn).
|
|
61
|
+
* 3. NEVER fall back to an extensionless match — return null so the caller can
|
|
62
|
+
* try other resolution strategies (global-bin scan) rather than emit a
|
|
63
|
+
* path that cannot be exec'd.
|
|
64
|
+
*/
|
|
65
|
+
export function selectWin32ExecutableMatch(matches: string[]): string | null {
|
|
66
|
+
const cleaned = matches.map((m) => m.trim()).filter(Boolean);
|
|
67
|
+
const direct = cleaned.find((m) => DIRECT_EXEC_EXT.has(path.extname(m).toLowerCase()));
|
|
68
|
+
if (direct) return direct;
|
|
69
|
+
const shim = cleaned.find((m) => SHIM_EXEC_EXT.has(path.extname(m).toLowerCase()));
|
|
70
|
+
if (shim) return shim;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a launch command to an absolute executable path on Windows.
|
|
76
|
+
*
|
|
77
|
+
* node-pty's ConPTY backend resolves a bare/relative command against the
|
|
78
|
+
* *calling process's* `Path` env var and — critically — does NOT apply PATHEXT.
|
|
79
|
+
* So a provider command like `claude` never matches `claude.exe` and the native
|
|
80
|
+
* layer throws `File not found:` (empty), which crashes the daemon. We resolve
|
|
81
|
+
* it to an absolute `.exe` here (in the daemon process, which has the full PATH)
|
|
82
|
+
* before the command ever reaches node-pty.
|
|
83
|
+
*
|
|
84
|
+
* No-op on non-Windows and when the command is already an existing absolute path
|
|
85
|
+
* or cannot be resolved (caller keeps the original behaviour).
|
|
86
|
+
*/
|
|
87
|
+
export function resolveWin32Executable(command: string): string {
|
|
88
|
+
if (process.platform !== 'win32') return command;
|
|
89
|
+
const trimmed = (command || '').trim();
|
|
90
|
+
if (!trimmed) return command;
|
|
91
|
+
|
|
92
|
+
// Already an absolute path that exists — keep it.
|
|
93
|
+
if (path.isAbsolute(trimmed) && existsSync(trimmed)) return trimmed;
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
const out = execFileSync('where', [trimmed], {
|
|
97
|
+
encoding: 'utf8',
|
|
98
|
+
windowsHide: true,
|
|
99
|
+
}).trim();
|
|
100
|
+
if (out) {
|
|
101
|
+
const matches = out.split(/\r?\n/).map((s) => s.trim()).filter(Boolean);
|
|
102
|
+
// Prefer .exe/.com, then a .cmd/.bat shim; never an extensionless Unix
|
|
103
|
+
// wrapper (the old `matches[0]` fallback returned exactly that and made
|
|
104
|
+
// the spawn boundary ENOENT). On no usable match, fall through to the
|
|
105
|
+
// off-PATH global-bin scan below rather than returning a dead path.
|
|
106
|
+
const selected = selectWin32ExecutableMatch(matches);
|
|
107
|
+
if (selected) return selected;
|
|
108
|
+
}
|
|
109
|
+
} catch {
|
|
110
|
+
// `where` not found / non-zero exit — fall through to the global-bin scan.
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// `where` found nothing on PATH. Before giving up (and letting node-pty crash
|
|
114
|
+
// with "File not found:" on the bare command), search npm's off-PATH global
|
|
115
|
+
// bin dir(s). This is the codex case: `npm i -g @openai/codex` installs to
|
|
116
|
+
// %APPDATA%\npm, which is absent from a nvm-launched daemon's PATH, so a spec
|
|
117
|
+
// binary of "codex" never resolved and the spawn ENOENT'd.
|
|
118
|
+
const globalBin = resolveWin32GlobalBin(trimmed);
|
|
119
|
+
if (globalBin) return globalBin;
|
|
120
|
+
|
|
121
|
+
return command;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Quote one argument for a cmd.exe command line using the standard
|
|
126
|
+
* CommandLineToArgvW rules (the same algorithm Node uses internally): wrap in
|
|
127
|
+
* double quotes only when needed, double up the backslashes that precede a
|
|
128
|
+
* quote, and escape embedded quotes. We do per-argument quoting ourselves
|
|
129
|
+
* (rather than `{ shell: true }`) because Node's shell mode joins argv with bare
|
|
130
|
+
* spaces and applies NO quoting — any argument containing a space (a path, a
|
|
131
|
+
* test name) would split. Inputs here are repo-mesh validation/bootstrap command
|
|
132
|
+
* tokens (trusted config, not network data), so argv-quoting for spaces/quotes
|
|
133
|
+
* is sufficient; we deliberately do not attempt full cmd.exe metacharacter
|
|
134
|
+
* (& | < > ^ %) escaping.
|
|
135
|
+
*/
|
|
136
|
+
export function quoteWin32CmdArg(arg: string): string {
|
|
137
|
+
if (arg.length > 0 && !/[ \t"]/.test(arg)) return arg;
|
|
138
|
+
let result = '"';
|
|
139
|
+
let backslashes = 0;
|
|
140
|
+
for (const ch of arg) {
|
|
141
|
+
if (ch === '\\') {
|
|
142
|
+
backslashes += 1;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (ch === '"') {
|
|
146
|
+
// Escape every pending backslash (they precede a quote) plus the quote.
|
|
147
|
+
result += '\\'.repeat(backslashes * 2 + 1) + '"';
|
|
148
|
+
backslashes = 0;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
result += '\\'.repeat(backslashes) + ch;
|
|
152
|
+
backslashes = 0;
|
|
153
|
+
}
|
|
154
|
+
// Trailing backslashes precede the closing quote → must be doubled.
|
|
155
|
+
result += '\\'.repeat(backslashes * 2) + '"';
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface Win32ExecFileSpawn {
|
|
160
|
+
file: string;
|
|
161
|
+
args: string[];
|
|
162
|
+
/** Set when the args are pre-quoted for cmd.exe and must not be re-quoted. */
|
|
163
|
+
windowsVerbatimArguments?: boolean;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Build child_process.execFile/spawn parameters for an already-resolved command.
|
|
168
|
+
*
|
|
169
|
+
* On win32 a `.cmd`/`.bat` shim (what `npm`/`npx`/`tsc`/`vitest` resolve to)
|
|
170
|
+
* cannot be launched by execFile directly — modern Node refuses it (CVE-2024-27980
|
|
171
|
+
* mitigation) and CreateProcess cannot exec a batch file. So wrap it in
|
|
172
|
+
* `cmd.exe /d /s /c "<quoted command line>"` with `windowsVerbatimArguments` so
|
|
173
|
+
* our own per-argument quoting is preserved. `.exe`/`.com` (and every non-win32
|
|
174
|
+
* platform, and any already-cmd.exe target) pass through unchanged — this is a
|
|
175
|
+
* strict no-op off win32, guarding against regressions on linux/macOS.
|
|
176
|
+
*/
|
|
177
|
+
export function buildWin32ExecFileSpawn(resolvedCommand: string, args: string[]): Win32ExecFileSpawn {
|
|
178
|
+
if (process.platform !== 'win32') return { file: resolvedCommand, args };
|
|
179
|
+
const ext = path.extname(resolvedCommand).toLowerCase();
|
|
180
|
+
if (!SHIM_EXEC_EXT.has(ext)) return { file: resolvedCommand, args };
|
|
181
|
+
// cmd.exe /d (skip AutoRun) /s (treat the rest, between the outer quotes, as
|
|
182
|
+
// the verbatim command) /c (run then exit). Mirrors Node's internal shell
|
|
183
|
+
// wrapping but with each token individually quoted.
|
|
184
|
+
const commandLine = [resolvedCommand, ...args].map(quoteWin32CmdArg).join(' ');
|
|
185
|
+
return {
|
|
186
|
+
file: process.env.ComSpec || 'cmd.exe',
|
|
187
|
+
args: ['/d', '/s', '/c', `"${commandLine}"`],
|
|
188
|
+
windowsVerbatimArguments: true,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Convenience: resolve a bare command to an absolute win32 path AND build the
|
|
194
|
+
* execFile spawn parameters (cmd.exe-wrapping a .cmd/.bat shim). Returns the
|
|
195
|
+
* resolved command alongside the spawn spec so callers can still surface the
|
|
196
|
+
* resolved path in diagnostics.
|
|
197
|
+
*/
|
|
198
|
+
export function resolveWin32ExecFileSpawn(
|
|
199
|
+
command: string,
|
|
200
|
+
args: string[],
|
|
201
|
+
): Win32ExecFileSpawn & { resolvedCommand: string } {
|
|
202
|
+
const resolvedCommand = resolveWin32Executable(command);
|
|
203
|
+
return { resolvedCommand, ...buildWin32ExecFileSpawn(resolvedCommand, args) };
|
|
204
|
+
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type SessionHostRecord,
|
|
7
7
|
} from '@adhdev/session-host-core';
|
|
8
8
|
import { LOG } from '../logging/logger.js';
|
|
9
|
+
import { resolveWin32Executable } from './resolve-executable.js';
|
|
9
10
|
import type { PtyRuntimeMetadata, PtyRuntimeTransport, PtySpawnOptions, PtyTransportFactory } from './pty-transport.js';
|
|
10
11
|
|
|
11
12
|
interface SessionHostPtyTransportFactoryOptions {
|
|
@@ -435,7 +436,7 @@ export class SessionHostPtyTransportFactory implements PtyTransportFactory {
|
|
|
435
436
|
spawn(command: string, args: string[], spawnOptions: PtySpawnOptions): PtyRuntimeTransport {
|
|
436
437
|
return new SessionHostRuntimeTransport({
|
|
437
438
|
...this.options,
|
|
438
|
-
command,
|
|
439
|
+
command: resolveWin32Executable(command),
|
|
439
440
|
args,
|
|
440
441
|
spawnOptions,
|
|
441
442
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
TerminalViewportBackend,
|
|
3
3
|
TerminalViewportBackendOptions,
|
|
4
|
-
TerminalViewportBackendPreference,
|
|
5
4
|
} from './types.js';
|
|
6
5
|
|
|
7
6
|
type GhosttyVtTerminal = {
|
|
@@ -30,6 +29,15 @@ function isModuleNotFoundError(error: unknown, ref: string): boolean {
|
|
|
30
29
|
return code === 'MODULE_NOT_FOUND' && message.includes(ref);
|
|
31
30
|
}
|
|
32
31
|
|
|
32
|
+
// Identifies the host runtime so a binding-load failure names the exact ABI it
|
|
33
|
+
// looked for. The underlying binding is N-API (ABI-stable), so a failure here is
|
|
34
|
+
// almost always "no prebuilt directory addressed this triplet" rather than a
|
|
35
|
+
// true ABI incompatibility — making the triplet the single most useful
|
|
36
|
+
// diagnostic to surface in an env-blocker report.
|
|
37
|
+
function runtimeTriplet(): string {
|
|
38
|
+
return `${process.platform}-${process.arch}-node${process.versions.modules}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
33
41
|
function normalizeBinding(mod: any, ref: string): GhosttyVtBinding {
|
|
34
42
|
const binding = mod?.default?.createTerminal
|
|
35
43
|
? mod.default
|
|
@@ -49,12 +57,10 @@ function getBindingCandidates(): string[] {
|
|
|
49
57
|
return explicit ? [explicit] : DEFAULT_BINDING_CANDIDATES;
|
|
50
58
|
}
|
|
51
59
|
|
|
52
|
-
function loadGhosttyVtBinding(
|
|
60
|
+
function loadGhosttyVtBinding(): GhosttyVtBinding {
|
|
53
61
|
if (cachedBinding !== undefined) {
|
|
54
|
-
if (!cachedBinding &&
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
return cachedBinding;
|
|
62
|
+
if (!cachedBinding && cachedBindingError) throw cachedBindingError;
|
|
63
|
+
return cachedBinding!;
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
const errors: string[] = [];
|
|
@@ -65,7 +71,7 @@ function loadGhosttyVtBinding(required: boolean): GhosttyVtBinding | null {
|
|
|
65
71
|
const mod = require(ref);
|
|
66
72
|
cachedBinding = normalizeBinding(mod, ref);
|
|
67
73
|
cachedBindingError = null;
|
|
68
|
-
return cachedBinding
|
|
74
|
+
return cachedBinding!;
|
|
69
75
|
} catch (error) {
|
|
70
76
|
if (isModuleNotFoundError(error, ref)) {
|
|
71
77
|
errors.push(`${ref}: module not found`);
|
|
@@ -78,57 +84,85 @@ function loadGhosttyVtBinding(required: boolean): GhosttyVtBinding | null {
|
|
|
78
84
|
|
|
79
85
|
cachedBinding = null;
|
|
80
86
|
cachedBindingError = new Error(
|
|
81
|
-
`ghostty-vt
|
|
87
|
+
`ghostty-vt binding unavailable for runtime ${runtimeTriplet()} ` +
|
|
88
|
+
`(${errors.join('; ') || 'no candidates tried'})`,
|
|
82
89
|
);
|
|
83
|
-
|
|
84
|
-
if (required) throw cachedBindingError;
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function resolveTerminalBackendPreference(): TerminalViewportBackendPreference {
|
|
89
|
-
const raw = process.env.ADHDEV_TERMINAL_BACKEND?.trim().toLowerCase();
|
|
90
|
-
if (raw === 'ghostty-vt' || raw === 'xterm' || raw === 'auto') return raw;
|
|
91
|
-
return 'auto';
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function isGhosttyVtBackendAvailable(): boolean {
|
|
95
|
-
return !!loadGhosttyVtBinding(false);
|
|
90
|
+
throw cachedBindingError;
|
|
96
91
|
}
|
|
97
92
|
|
|
98
93
|
export class GhosttyVtTerminalBackend implements TerminalViewportBackend {
|
|
99
94
|
readonly kind = 'ghostty-vt' as const;
|
|
100
95
|
private terminal: GhosttyVtTerminal;
|
|
96
|
+
private rows: number;
|
|
97
|
+
private disposed = false;
|
|
101
98
|
|
|
102
99
|
constructor(options: TerminalViewportBackendOptions) {
|
|
103
|
-
const binding = loadGhosttyVtBinding(
|
|
104
|
-
|
|
105
|
-
throw new Error('ghostty-vt backend requested but no binding is available');
|
|
106
|
-
}
|
|
100
|
+
const binding = loadGhosttyVtBinding();
|
|
101
|
+
this.rows = Math.max(1, options.rows | 0);
|
|
107
102
|
this.terminal = binding.createTerminal({
|
|
108
103
|
cols: Math.max(1, options.cols | 0),
|
|
109
|
-
rows:
|
|
104
|
+
rows: this.rows,
|
|
110
105
|
scrollback: Math.max(0, options.scrollback | 0),
|
|
111
106
|
});
|
|
112
107
|
}
|
|
113
108
|
|
|
114
109
|
resize(rows: number, cols: number): void {
|
|
115
|
-
this.
|
|
110
|
+
this.rows = Math.max(1, rows | 0);
|
|
111
|
+
this.terminal.resize(Math.max(1, cols | 0), this.rows);
|
|
116
112
|
}
|
|
117
113
|
|
|
118
114
|
write(data: string): void {
|
|
119
|
-
if (!data) return;
|
|
115
|
+
if (!data || this.disposed) return;
|
|
120
116
|
this.terminal.write(data);
|
|
121
117
|
}
|
|
122
118
|
|
|
119
|
+
private formatLines(): string[] {
|
|
120
|
+
// ghostty's `trim:true` collapses CUF-advanced cells — many TUIs including
|
|
121
|
+
// Claude Code render spaces via cursor-forward rather than literal spaces,
|
|
122
|
+
// which would break downstream regex matching. Keep per-row padding and
|
|
123
|
+
// trim trailing whitespace ourselves.
|
|
124
|
+
//
|
|
125
|
+
// formatPlainText uses a .screen pin which includes scrollback history.
|
|
126
|
+
const raw = this.terminal.formatPlainText({ trim: false }) || '';
|
|
127
|
+
if (!raw) return [];
|
|
128
|
+
return raw.split('\n').map((row) => row.replace(/\s+$/, ''));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private static trimBlankEnds(lines: string[]): string {
|
|
132
|
+
let first = 0;
|
|
133
|
+
let last = lines.length;
|
|
134
|
+
while (first < last && !lines[first]) first += 1;
|
|
135
|
+
while (last > first && !lines[last - 1]) last -= 1;
|
|
136
|
+
return lines.slice(first, last).join('\n');
|
|
137
|
+
}
|
|
138
|
+
|
|
123
139
|
getText(): string {
|
|
124
|
-
|
|
140
|
+
if (this.disposed) return '';
|
|
141
|
+
const lines = this.formatLines();
|
|
142
|
+
if (lines.length === 0) return '';
|
|
143
|
+
// Take only the viewport (last `rows` lines) to exclude scrollback history.
|
|
144
|
+
const viewport = lines.length > this.rows ? lines.slice(-this.rows) : lines;
|
|
145
|
+
return GhosttyVtTerminalBackend.trimBlankEnds(viewport);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
getTextWithScrollback(): string {
|
|
149
|
+
if (this.disposed) return '';
|
|
150
|
+
const lines = this.formatLines();
|
|
151
|
+
if (lines.length === 0) return '';
|
|
152
|
+
// Full buffer including scrollback — does NOT slice to the viewport, so a
|
|
153
|
+
// tall prompt whose top has scrolled above the visible rows is still
|
|
154
|
+
// matchable by content patterns.
|
|
155
|
+
return GhosttyVtTerminalBackend.trimBlankEnds(lines);
|
|
125
156
|
}
|
|
126
157
|
|
|
127
158
|
getCursorPosition(): { col: number; row: number } {
|
|
159
|
+
if (this.disposed) return { col: 0, row: 0 };
|
|
128
160
|
return this.terminal.getCursorPosition();
|
|
129
161
|
}
|
|
130
162
|
|
|
131
163
|
dispose(): void {
|
|
164
|
+
if (this.disposed) return;
|
|
165
|
+
this.disposed = true;
|
|
132
166
|
this.terminal.dispose();
|
|
133
167
|
}
|
|
134
168
|
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
export type TerminalViewportBackendKind = '
|
|
2
|
-
|
|
3
|
-
export type TerminalViewportBackendPreference = TerminalViewportBackendKind | 'auto';
|
|
1
|
+
export type TerminalViewportBackendKind = 'ghostty-vt';
|
|
4
2
|
|
|
5
3
|
export type TerminalViewportBackendOptions = {
|
|
6
4
|
rows: number;
|
|
@@ -13,6 +11,15 @@ export interface TerminalViewportBackend {
|
|
|
13
11
|
resize(rows: number, cols: number): void;
|
|
14
12
|
write(data: string): void;
|
|
15
13
|
getText(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Like getText() but includes scrollback history (the lines that have
|
|
16
|
+
* scrolled above the visible viewport). Used by content-pattern matching
|
|
17
|
+
* (e.g. approval/modal button extraction) that must stay correct when a
|
|
18
|
+
* tall prompt — a big diff or long explanation — pushes part of the
|
|
19
|
+
* prompt box above the viewport. NOT for cursor-relative / stable_ms
|
|
20
|
+
* conditions, whose row indices are viewport-relative.
|
|
21
|
+
*/
|
|
22
|
+
getTextWithScrollback(): string;
|
|
16
23
|
getCursorPosition(): { col: number; row: number };
|
|
17
24
|
dispose(): void;
|
|
18
25
|
}
|