@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +23 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +71 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +64 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +48 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +152 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router-aggregate-status.d.ts +24 -0
- package/dist/commands/router-mesh-session-owner.d.ts +59 -0
- package/dist/commands/router-refine.d.ts +151 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +203 -15
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +11 -0
- package/dist/config/config.d.ts +19 -0
- package/dist/config/mesh-config.d.ts +65 -0
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/registry-resolver.d.ts +54 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/config/state-store.d.ts +30 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/cli-detector.d.ts +17 -0
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +26 -2
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +80 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +70 -17
- package/dist/index.js +53532 -19073
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53283 -18989
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/debug-config.d.ts +16 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +256 -0
- package/dist/mesh/coordinator-prompt.d.ts +76 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +203 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
- package/dist/mesh/mesh-event-classify.d.ts +7 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +258 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +21 -1
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +139 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +281 -0
- package/dist/mesh/mesh-node-identity.d.ts +310 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
- package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
- package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
- package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +457 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +567 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +392 -1
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +97 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +46 -0
- package/dist/providers/chat-message-normalization.d.ts +58 -1
- package/dist/providers/cli-provider-effect-format.d.ts +30 -0
- package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
- package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
- package/dist/providers/cli-provider-instance-types.d.ts +45 -0
- package/dist/providers/cli-provider-instance.d.ts +426 -30
- package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
- package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
- package/dist/providers/contracts.d.ts +196 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +79 -0
- package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +44 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +30 -0
- package/dist/providers/provider-instance.d.ts +31 -1
- package/dist/providers/provider-loader.d.ts +42 -5
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +98 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +449 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +202 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +244 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +616 -12
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/session-host/managed-host.d.ts +64 -0
- package/dist/session-host/runtime-surface.d.ts +10 -16
- package/dist/sessions/registry.d.ts +26 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +110 -55
- package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +27 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +20 -6
- package/package.json +11 -4
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +80 -14
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1282 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2788 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.d.ts +2 -0
- package/src/commands/cli-manager.ts +724 -27
- package/src/commands/handler.ts +865 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +857 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +125 -0
- package/src/commands/low-family/daemon-lifecycle.ts +120 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +282 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +270 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1268 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +153 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router-aggregate-status.ts +209 -0
- package/src/commands/router-mesh-session-owner.ts +114 -0
- package/src/commands/router-refine.ts +1794 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +567 -4149
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +517 -24
- package/src/config/config.ts +30 -0
- package/src/config/mesh-config.ts +300 -24
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/registry-resolver.ts +100 -0
- package/src/config/repo-settings.ts +111 -0
- package/src/config/state-store.ts +55 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +94 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +112 -16
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +822 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +190 -13
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/debug-config.ts +25 -0
- package/src/logging/debug-trace.ts +7 -2
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +510 -0
- package/src/mesh/coordinator-prompt.ts +627 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +706 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-completion-synthesis.ts +416 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +284 -0
- package/src/mesh/mesh-event-classify.ts +78 -0
- package/src/mesh/mesh-event-forwarding.ts +2030 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +1548 -0
- package/src/mesh/mesh-events-stale.ts +452 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +43 -1035
- package/src/mesh/mesh-fast-forward.ts +856 -0
- package/src/mesh/mesh-host-ownership.ts +41 -3
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +897 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +695 -0
- package/src/mesh/mesh-node-identity.ts +2065 -0
- package/src/mesh/mesh-queue-assignment.ts +2498 -0
- package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
- package/src/mesh/mesh-reconcile-config.ts +66 -0
- package/src/mesh/mesh-reconcile-identity.ts +103 -0
- package/src/mesh/mesh-reconcile-loop.ts +1696 -0
- package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1792 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-remote-event-pull.ts +279 -0
- package/src/mesh/mesh-review-inbox.ts +308 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +2292 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1489 -145
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +129 -12
- package/src/mesh/worktree-bootstrap-config.ts +599 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +100 -6
- package/src/providers/chat-message-normalization.ts +126 -4
- package/src/providers/cli-provider-effect-format.ts +53 -0
- package/src/providers/cli-provider-history-dedup.ts +75 -0
- package/src/providers/cli-provider-input-prompt.ts +133 -0
- package/src/providers/cli-provider-instance-types.ts +131 -0
- package/src/providers/cli-provider-instance.ts +2771 -499
- package/src/providers/cli-provider-status-helpers.ts +123 -0
- package/src/providers/cli-provider-transcript-merge.ts +114 -0
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +207 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +105 -0
- package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +617 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +24 -1
- package/src/providers/provider-loader.ts +700 -55
- package/src/providers/provider-schema.ts +93 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +246 -0
- package/src/providers/spec/cli-adapter.ts +1064 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1528 -0
- package/src/providers/spec/fsm-evaluator.ts +290 -0
- package/src/providers/spec/fsm-loader.ts +128 -0
- package/src/providers/spec/fsm-types.ts +301 -0
- package/src/providers/spec/native-history-executor.ts +1241 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +284 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +861 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/session-host/managed-host.ts +218 -0
- package/src/session-host/runtime-surface.ts +20 -80
- package/src/sessions/registry.ts +44 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +148 -55
- package/src/status/builders.ts +69 -6
- package/src/status/chat-tail-hot-sessions.ts +117 -2
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +100 -27
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +26 -6
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildDetectStatusFromTui
|
|
3
|
+
*
|
|
4
|
+
* Turns a manifest's declarative TUI block into a runtime
|
|
5
|
+
* `(input: CliStatusInput) => CliStatus | null` function.
|
|
6
|
+
*
|
|
7
|
+
* Inputs handled (all optional except spinner):
|
|
8
|
+
* - tui/spinner@1 → contributes `generating`
|
|
9
|
+
* - tui/settled-prompt@1 → contributes `idle`
|
|
10
|
+
* - tui/modal@1 → contributes `waiting_approval`
|
|
11
|
+
*
|
|
12
|
+
* Dispatch order (sprint-2026-06 contract):
|
|
13
|
+
* 1. Active generation cues win over idle prompt — checked first.
|
|
14
|
+
* Reason: codex/claude keep model footer visible during `Working` and
|
|
15
|
+
* `hasReadyPrompt` falsely fired idle. Audit §4.2 introduces
|
|
16
|
+
* `tui/cue-ordering` as the named primitive for this rule.
|
|
17
|
+
* 2. Modal cue (if present) is checked next — `waiting_approval`.
|
|
18
|
+
* 3. Settled-prompt cue — `idle`.
|
|
19
|
+
* 4. Default: `null` (no change).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type {
|
|
23
|
+
CliStatusInput,
|
|
24
|
+
CliStatus,
|
|
25
|
+
CliDetectStatusFn,
|
|
26
|
+
} from '../../types/cli/index.js';
|
|
27
|
+
import {
|
|
28
|
+
applyVisibleRegion,
|
|
29
|
+
type VisibleRegionSpec,
|
|
30
|
+
} from './visible-region.js';
|
|
31
|
+
import {
|
|
32
|
+
pickApprovalButton,
|
|
33
|
+
hasNegativeApprovalOption,
|
|
34
|
+
} from '../../../../approval-utils.js';
|
|
35
|
+
|
|
36
|
+
// ─── Primitive spec shapes (mirror the JSON schemas) ───────────────────
|
|
37
|
+
|
|
38
|
+
interface RegexLikeSpec {
|
|
39
|
+
regex: string;
|
|
40
|
+
flags?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface SpinnerPatternSpec extends RegexLikeSpec {
|
|
44
|
+
description?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface SpinnerSpec {
|
|
48
|
+
$schema: 'adhdev:tui/spinner@1';
|
|
49
|
+
patterns: SpinnerPatternSpec[];
|
|
50
|
+
scope?: 'live-frame-tail' | 'whole-screen' | 'recent-buffer';
|
|
51
|
+
scopeWindowLines?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface SettledPromptFooterSpec {
|
|
55
|
+
pattern: string;
|
|
56
|
+
kind?: 'substring' | 'regex';
|
|
57
|
+
flags?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface SettledPromptSpec {
|
|
61
|
+
$schema: 'adhdev:tui/settled-prompt@1';
|
|
62
|
+
regex: string;
|
|
63
|
+
flags?: string;
|
|
64
|
+
withFooter?: SettledPromptFooterSpec[];
|
|
65
|
+
scope?: 'last-n-lines' | 'whole-screen';
|
|
66
|
+
scopeWindowLines?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface ModalSpec {
|
|
70
|
+
$schema: 'adhdev:tui/modal@1';
|
|
71
|
+
questionPattern: string;
|
|
72
|
+
questionFlags?: string;
|
|
73
|
+
questionVariants?: Array<{ regex: string; flags?: string; label?: string }>;
|
|
74
|
+
buttonPattern: string;
|
|
75
|
+
buttonFlags?: string;
|
|
76
|
+
buttonLabelGroup?: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type DispatchGroup =
|
|
80
|
+
| 'spinner'
|
|
81
|
+
| 'modal'
|
|
82
|
+
| 'settled-prompt'
|
|
83
|
+
| 'cue-ordering'
|
|
84
|
+
| 'error-detection'
|
|
85
|
+
| 'approval-stitching';
|
|
86
|
+
|
|
87
|
+
export interface DispatchOrderSpec {
|
|
88
|
+
$schema: 'adhdev:tui/dispatch-order@1';
|
|
89
|
+
order: DispatchGroup[];
|
|
90
|
+
onNoMatch?: 'idle' | 'unknown' | 'preserve-last';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface DetectStatusTuiSpec {
|
|
94
|
+
spinner?: SpinnerSpec;
|
|
95
|
+
settledPrompt?: SettledPromptSpec;
|
|
96
|
+
modal?: ModalSpec;
|
|
97
|
+
dispatchOrder?: DispatchOrderSpec;
|
|
98
|
+
visibleRegion?: VisibleRegionSpec;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ─── Helpers ───────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
function compile(re: string, flags?: string): RegExp {
|
|
104
|
+
try {
|
|
105
|
+
return new RegExp(re, flags ?? '');
|
|
106
|
+
} catch (e) {
|
|
107
|
+
throw new Error(`Invalid regex /${re}/${flags ?? ''}: ${(e as Error).message}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function takeTail(text: string, lines: number): string {
|
|
112
|
+
if (!text) return '';
|
|
113
|
+
const split = text.split('\n');
|
|
114
|
+
if (split.length <= lines) return text;
|
|
115
|
+
return split.slice(-lines).join('\n');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function scopeText(
|
|
119
|
+
input: CliStatusInput,
|
|
120
|
+
scope: SpinnerSpec['scope'] | SettledPromptSpec['scope'],
|
|
121
|
+
windowLines: number | undefined,
|
|
122
|
+
): string {
|
|
123
|
+
const lines = windowLines && windowLines > 0 ? windowLines : 8;
|
|
124
|
+
switch (scope) {
|
|
125
|
+
case 'whole-screen':
|
|
126
|
+
return input.screenText ?? '';
|
|
127
|
+
case 'recent-buffer':
|
|
128
|
+
return input.tail ?? '';
|
|
129
|
+
case 'last-n-lines':
|
|
130
|
+
case 'live-frame-tail':
|
|
131
|
+
case undefined:
|
|
132
|
+
default:
|
|
133
|
+
return takeTail(input.screenText ?? '', lines);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function compileSpinnerMatchers(spec: SpinnerSpec): RegExp[] {
|
|
138
|
+
return spec.patterns.map((p) => compile(p.regex, p.flags ?? 'i'));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function spinnerMatches(spec: SpinnerSpec, input: CliStatusInput): boolean {
|
|
142
|
+
const matchers = compileSpinnerMatchers(spec);
|
|
143
|
+
const text = scopeText(input, spec.scope, spec.scopeWindowLines);
|
|
144
|
+
return matchers.some((re) => re.test(text));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function compileSettledPromptMatchers(spec: SettledPromptSpec): {
|
|
148
|
+
prompt: RegExp;
|
|
149
|
+
footers: Array<{ test: (s: string) => boolean }>;
|
|
150
|
+
} {
|
|
151
|
+
const prompt = compile(spec.regex, spec.flags ?? 'm');
|
|
152
|
+
const footers = (spec.withFooter ?? []).map((f) => {
|
|
153
|
+
if (f.kind === 'regex') {
|
|
154
|
+
const re = compile(f.pattern, f.flags ?? 'i');
|
|
155
|
+
return { test: (s: string) => re.test(s) };
|
|
156
|
+
}
|
|
157
|
+
const needle = f.pattern.toLowerCase();
|
|
158
|
+
return { test: (s: string) => s.toLowerCase().includes(needle) };
|
|
159
|
+
});
|
|
160
|
+
return { prompt, footers };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function settledPromptMatches(spec: SettledPromptSpec, input: CliStatusInput): boolean {
|
|
164
|
+
const { prompt, footers } = compileSettledPromptMatchers(spec);
|
|
165
|
+
const text = scopeText(input, spec.scope, spec.scopeWindowLines);
|
|
166
|
+
if (!prompt.test(text)) return false;
|
|
167
|
+
if (footers.length === 0) return true;
|
|
168
|
+
return footers.every((f) => f.test(text));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Extract approval-button labels from every line matching the modal spec's
|
|
173
|
+
* `buttonPattern`. Mirrors buildParseApprovalFromTui's per-line extraction but
|
|
174
|
+
* scans the whole screen with no question-line anchor, so the cue survives the
|
|
175
|
+
* question line scrolling out of the captured frame during long runs of
|
|
176
|
+
* consecutive approvals.
|
|
177
|
+
*/
|
|
178
|
+
function extractButtonLabels(spec: ModalSpec, text: string): string[] {
|
|
179
|
+
if (!text) return [];
|
|
180
|
+
const flags = spec.buttonFlags && spec.buttonFlags.includes('m')
|
|
181
|
+
? spec.buttonFlags
|
|
182
|
+
: `${spec.buttonFlags ?? ''}m`;
|
|
183
|
+
const buttonRe = compile(spec.buttonPattern, flags);
|
|
184
|
+
const labelGroup = Number.isInteger(spec.buttonLabelGroup) && (spec.buttonLabelGroup ?? 0) > 0
|
|
185
|
+
? spec.buttonLabelGroup!
|
|
186
|
+
: 1;
|
|
187
|
+
const out: string[] = [];
|
|
188
|
+
for (const line of text.split('\n')) {
|
|
189
|
+
buttonRe.lastIndex = 0;
|
|
190
|
+
const m = buttonRe.exec(line);
|
|
191
|
+
if (!m) continue;
|
|
192
|
+
const captured = m[labelGroup] ?? (labelGroup === 1 && m.length > 2 ? m[m.length - 1] : undefined);
|
|
193
|
+
if (captured && captured.trim()) out.push(captured.trim());
|
|
194
|
+
}
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* (fixB ①) The approval's selectable button block is itself a modal cue.
|
|
200
|
+
* Anchored on approval *verbs* so it generalizes across CLIs without trusting
|
|
201
|
+
* any single spec's `buttonPattern` specificity: a real approval modal offers
|
|
202
|
+
* BOTH an affirmative option (Yes/Allow/Continue/…) and a decline (No/Deny/
|
|
203
|
+
* Cancel/Skip/…). A generic numbered menu, a single prose "1. Yes …" line, or
|
|
204
|
+
* an assistant enumeration lacks that pair and does not fire the cue.
|
|
205
|
+
*/
|
|
206
|
+
function buttonBlockApprovalCue(spec: ModalSpec, text: string): boolean {
|
|
207
|
+
const labels = extractButtonLabels(spec, text);
|
|
208
|
+
if (labels.length < 2) return false;
|
|
209
|
+
if (pickApprovalButton(labels).index < 0) return false;
|
|
210
|
+
return hasNegativeApprovalOption(labels);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function modalMatches(spec: ModalSpec, input: CliStatusInput): boolean {
|
|
214
|
+
// Status-level modal detection is cue-only — does the question appear at all?
|
|
215
|
+
// Button extraction lives in buildParseApprovalFromTui.
|
|
216
|
+
const text = input.screenText ?? '';
|
|
217
|
+
const question = compile(spec.questionPattern, spec.questionFlags ?? 'i');
|
|
218
|
+
if (question.test(text)) return true;
|
|
219
|
+
for (const variant of spec.questionVariants ?? []) {
|
|
220
|
+
const re = compile(variant.regex, variant.flags ?? 'i');
|
|
221
|
+
if (re.test(text)) return true;
|
|
222
|
+
}
|
|
223
|
+
// The question line can scroll out of the captured frame while the button
|
|
224
|
+
// block (and a residual spinner) remain. Hold the modal cue on the button
|
|
225
|
+
// block alone so waiting_approval does not flap to generating mid-approval.
|
|
226
|
+
if (buttonBlockApprovalCue(spec, text)) return true;
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ─── Public builder ────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
const DEFAULT_ORDER: DispatchGroup[] = ['spinner', 'modal', 'settled-prompt'];
|
|
233
|
+
|
|
234
|
+
function evaluateGroup(
|
|
235
|
+
group: DispatchGroup,
|
|
236
|
+
spec: DetectStatusTuiSpec,
|
|
237
|
+
input: CliStatusInput,
|
|
238
|
+
compiled: {
|
|
239
|
+
spinner: RegExp[] | null;
|
|
240
|
+
settled: ReturnType<typeof compileSettledPromptMatchers> | null;
|
|
241
|
+
},
|
|
242
|
+
): CliStatus | null {
|
|
243
|
+
switch (group) {
|
|
244
|
+
case 'spinner': {
|
|
245
|
+
if (!spec.spinner || !compiled.spinner) return null;
|
|
246
|
+
const text = scopeText(input, spec.spinner.scope, spec.spinner.scopeWindowLines);
|
|
247
|
+
return compiled.spinner.some((re) => re.test(text)) ? 'generating' : null;
|
|
248
|
+
}
|
|
249
|
+
case 'modal': {
|
|
250
|
+
if (!spec.modal) return null;
|
|
251
|
+
return modalMatches(spec.modal, input) ? 'waiting_approval' : null;
|
|
252
|
+
}
|
|
253
|
+
case 'settled-prompt': {
|
|
254
|
+
if (!spec.settledPrompt || !compiled.settled) return null;
|
|
255
|
+
const text = scopeText(input, spec.settledPrompt.scope, spec.settledPrompt.scopeWindowLines);
|
|
256
|
+
if (!compiled.settled.prompt.test(text)) return null;
|
|
257
|
+
if (compiled.settled.footers.length === 0) return 'idle';
|
|
258
|
+
return compiled.settled.footers.every((f) => f.test(text)) ? 'idle' : null;
|
|
259
|
+
}
|
|
260
|
+
// Groups declared in the catalog but not yet implemented as builder steps
|
|
261
|
+
// return null so they are no-ops in dispatch — declaring them in `order`
|
|
262
|
+
// is forward-compatible. Phase 2 Week 8+ will wire them.
|
|
263
|
+
case 'cue-ordering':
|
|
264
|
+
case 'error-detection':
|
|
265
|
+
case 'approval-stitching':
|
|
266
|
+
return null;
|
|
267
|
+
default:
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function buildDetectStatusFromTui(spec: DetectStatusTuiSpec): CliDetectStatusFn {
|
|
273
|
+
const compiledSpinner = spec.spinner ? compileSpinnerMatchers(spec.spinner) : null;
|
|
274
|
+
const compiledSettled = spec.settledPrompt
|
|
275
|
+
? compileSettledPromptMatchers(spec.settledPrompt)
|
|
276
|
+
: null;
|
|
277
|
+
const compiled = { spinner: compiledSpinner, settled: compiledSettled };
|
|
278
|
+
const order = spec.dispatchOrder?.order && spec.dispatchOrder.order.length > 0
|
|
279
|
+
? spec.dispatchOrder.order
|
|
280
|
+
: DEFAULT_ORDER;
|
|
281
|
+
|
|
282
|
+
return function detectStatus(input: CliStatusInput): CliStatus | null {
|
|
283
|
+
// Apply visible-region scoping before running any matchers.
|
|
284
|
+
const effectiveInput: CliStatusInput = spec.visibleRegion
|
|
285
|
+
? {
|
|
286
|
+
...input,
|
|
287
|
+
screenText: applyVisibleRegion(spec.visibleRegion, input.screenText ?? ''),
|
|
288
|
+
tail: applyVisibleRegion(spec.visibleRegion, input.tail),
|
|
289
|
+
}
|
|
290
|
+
: input;
|
|
291
|
+
|
|
292
|
+
for (const group of order) {
|
|
293
|
+
const verdict = evaluateGroup(group, spec, effectiveInput, compiled);
|
|
294
|
+
if (verdict !== null) return verdict;
|
|
295
|
+
}
|
|
296
|
+
// onNoMatch policy: the builder always returns null when nothing matched.
|
|
297
|
+
// The daemon's outer state machine maps null per the policy below:
|
|
298
|
+
// 'idle' → caller treats null as idle (default)
|
|
299
|
+
// 'unknown' → caller keeps status unknown / shows last
|
|
300
|
+
// 'preserve-last' → caller preserves the last reported verdict
|
|
301
|
+
// Encoding this here would require call-site state; instead the daemon
|
|
302
|
+
// reads `dispatchOrder.onNoMatch` from the manifest directly.
|
|
303
|
+
return null;
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Internal exports for builder reuse + tests.
|
|
308
|
+
export const __internal = {
|
|
309
|
+
scopeText,
|
|
310
|
+
spinnerMatches,
|
|
311
|
+
settledPromptMatches,
|
|
312
|
+
modalMatches,
|
|
313
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildParseApprovalFromSquash
|
|
3
|
+
*
|
|
4
|
+
* Companion to buildParseApprovalFromTui. Handles the squashed-modal case:
|
|
5
|
+
* the terminal has re-flowed the approval frame so the rendered text is a
|
|
6
|
+
* single run of lowercase-alnum bytes (e.g. `doyoutrustthecontentsofthisdirectory…1yescontinue2noquit`).
|
|
7
|
+
*
|
|
8
|
+
* Author declares:
|
|
9
|
+
* - `cues` — compact substrings/regexes that identify the modal
|
|
10
|
+
* - `footers` — optional compact substrings that must also be present
|
|
11
|
+
* - `buttonRules` — compact→labels mappings used to recover button labels
|
|
12
|
+
*
|
|
13
|
+
* Returns the same shape as buildParseApprovalFromTui — a CliApprovalModal
|
|
14
|
+
* (message + buttons) or null when no rule matches. Caller composes the two
|
|
15
|
+
* builders: try the regular modal first, then fall back to squash. Codex
|
|
16
|
+
* needs both because at narrow widths the terminal renders the squash form,
|
|
17
|
+
* and at wider widths it renders the regular framed form.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type {
|
|
21
|
+
CliApprovalInput,
|
|
22
|
+
CliApprovalModal,
|
|
23
|
+
CliParseApprovalFn,
|
|
24
|
+
} from '../../types/cli/index.js';
|
|
25
|
+
|
|
26
|
+
// ─── Spec mirrors the JSON schema ─────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
interface SquashCueSpec {
|
|
29
|
+
compact: string;
|
|
30
|
+
kind?: 'substring' | 'regex';
|
|
31
|
+
label?: string;
|
|
32
|
+
messageWhenMatched?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface SquashFooterSpec {
|
|
36
|
+
compact: string;
|
|
37
|
+
kind?: 'substring' | 'regex';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface SquashButtonRuleSpec {
|
|
41
|
+
compact: string;
|
|
42
|
+
kind?: 'substring' | 'regex';
|
|
43
|
+
labels: string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ApprovalSquashSpec {
|
|
47
|
+
$schema: 'adhdev:tui/approval-squash@1';
|
|
48
|
+
cues: SquashCueSpec[];
|
|
49
|
+
footers?: SquashFooterSpec[];
|
|
50
|
+
buttonRules: SquashButtonRuleSpec[];
|
|
51
|
+
scope?: 'tail-window' | 'whole-screen';
|
|
52
|
+
tailWindowLines?: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ─── Internals ────────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
const COMPACT_RE = /[^a-z0-9]+/g;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The canonical normalisation. Identical to codex-cli's `compactText`:
|
|
61
|
+
* lowercase, then strip everything that is not a-z or 0-9.
|
|
62
|
+
*
|
|
63
|
+
* Exported for tests and for the (rare) provider that wants to compose this
|
|
64
|
+
* with extra normalisation steps.
|
|
65
|
+
*/
|
|
66
|
+
export function compactText(value: string): string {
|
|
67
|
+
return String(value || '').toLowerCase().replace(COMPACT_RE, '');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function compileRegex(source: string, flags = 'i'): RegExp {
|
|
71
|
+
try { return new RegExp(source, flags); }
|
|
72
|
+
catch (e) { throw new Error(`Invalid regex /${source}/${flags}: ${(e as Error).message}`); }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function matchSubstringOrRegex(
|
|
76
|
+
needle: string,
|
|
77
|
+
kind: 'substring' | 'regex' | undefined,
|
|
78
|
+
haystack: string,
|
|
79
|
+
): boolean {
|
|
80
|
+
if (kind === 'regex') return compileRegex(needle).test(haystack);
|
|
81
|
+
return haystack.includes(needle);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function scopeText(spec: ApprovalSquashSpec, input: CliApprovalInput): string {
|
|
85
|
+
const scope = spec.scope ?? 'tail-window';
|
|
86
|
+
const candidates = [
|
|
87
|
+
String(input.screenText || ''),
|
|
88
|
+
String(input.rawBuffer || ''),
|
|
89
|
+
String(input.buffer || ''),
|
|
90
|
+
String(input.tail || ''),
|
|
91
|
+
].filter(Boolean);
|
|
92
|
+
const joined = candidates.join('\n');
|
|
93
|
+
if (scope === 'whole-screen') return joined;
|
|
94
|
+
const tailLines = spec.tailWindowLines ?? 24;
|
|
95
|
+
return joined.split('\n').slice(-tailLines).join('\n');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ─── Public builder ───────────────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
export function buildParseApprovalFromSquash(spec: ApprovalSquashSpec): CliParseApprovalFn {
|
|
101
|
+
if (!Array.isArray(spec.cues) || spec.cues.length === 0) {
|
|
102
|
+
throw new Error('approval-squash spec must declare at least one cue.');
|
|
103
|
+
}
|
|
104
|
+
if (!Array.isArray(spec.buttonRules) || spec.buttonRules.length === 0) {
|
|
105
|
+
throw new Error('approval-squash spec must declare at least one button rule.');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return function parseApproval(input: CliApprovalInput): CliApprovalModal | null {
|
|
109
|
+
const text = scopeText(spec, input);
|
|
110
|
+
if (!text) return null;
|
|
111
|
+
const compact = compactText(text);
|
|
112
|
+
if (!compact) return null;
|
|
113
|
+
|
|
114
|
+
// 1) Find the first matching cue. Its messageWhenMatched (if present) is
|
|
115
|
+
// the human-readable modal message; otherwise we fall back to a label
|
|
116
|
+
// or empty string.
|
|
117
|
+
let matchedCue: SquashCueSpec | null = null;
|
|
118
|
+
for (const cue of spec.cues) {
|
|
119
|
+
if (matchSubstringOrRegex(cue.compact, cue.kind, compact)) {
|
|
120
|
+
matchedCue = cue;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!matchedCue) return null;
|
|
125
|
+
|
|
126
|
+
// 2) If footers are declared, at least one must also match.
|
|
127
|
+
if (spec.footers && spec.footers.length > 0) {
|
|
128
|
+
const anyFooter = spec.footers.some((f) =>
|
|
129
|
+
matchSubstringOrRegex(f.compact, f.kind, compact),
|
|
130
|
+
);
|
|
131
|
+
if (!anyFooter) return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// 3) Find a button rule whose compact pattern is present in the compacted
|
|
135
|
+
// text. First match wins.
|
|
136
|
+
let labels: string[] | null = null;
|
|
137
|
+
for (const rule of spec.buttonRules) {
|
|
138
|
+
if (matchSubstringOrRegex(rule.compact, rule.kind, compact)) {
|
|
139
|
+
labels = rule.labels;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!labels || labels.length === 0) return null;
|
|
144
|
+
|
|
145
|
+
const message = matchedCue.messageWhenMatched
|
|
146
|
+
|| matchedCue.label
|
|
147
|
+
|| '';
|
|
148
|
+
|
|
149
|
+
return { message, buttons: [...labels] };
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Internal exports for tests.
|
|
154
|
+
export const __internal = {
|
|
155
|
+
compactText,
|
|
156
|
+
matchSubstringOrRegex,
|
|
157
|
+
scopeText,
|
|
158
|
+
};
|