@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,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Section + condition evaluator — pure functions shared by the v4 FSM engine.
|
|
3
|
+
*
|
|
4
|
+
* Provides: section resolution, condition evaluation (regex/changed/all/any),
|
|
5
|
+
* title/button extraction. The v4 FSM driver and evaluator import these
|
|
6
|
+
* directly; there is no v3 SpecDriver anymore.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
SectionDef, AnchorContext, Condition, RegexCondition,
|
|
12
|
+
ChangedCondition, AllCondition, AnyCondition,
|
|
13
|
+
ExtractTitle, ExtractButtons,
|
|
14
|
+
} from './types.js';
|
|
15
|
+
|
|
16
|
+
export interface ResolvedSection {
|
|
17
|
+
id: string;
|
|
18
|
+
fromLine: number; // inclusive
|
|
19
|
+
toLine: number; // exclusive
|
|
20
|
+
text: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TraceEntry {
|
|
24
|
+
kind: 'section' | 'state_match' | 'state_skip' | 'modal' | 'control' | 'notification' | 'delegate';
|
|
25
|
+
text: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
29
|
+
// Layout — sections{} object
|
|
30
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
function resolveSize(size: number | string | undefined, total: number): number {
|
|
33
|
+
if (size === undefined) return 0;
|
|
34
|
+
if (typeof size === 'number') return Math.max(0, Math.min(total, size));
|
|
35
|
+
const m = /^(\d+(?:\.\d+)?)%$/.exec(size);
|
|
36
|
+
if (!m) return 0;
|
|
37
|
+
const pct = Number(m[1]);
|
|
38
|
+
return Math.max(0, Math.min(total, Math.round((total * pct) / 100)));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function resolveSections(
|
|
42
|
+
sectionsObj: Record<string, SectionDef>,
|
|
43
|
+
lines: string[],
|
|
44
|
+
): ResolvedSection[] {
|
|
45
|
+
const total = lines.length;
|
|
46
|
+
const anchored = new Map<string, { fromLine: number; toLine: number }>();
|
|
47
|
+
const sectionEntries = Object.entries(sectionsObj);
|
|
48
|
+
|
|
49
|
+
for (const [id, sec] of sectionEntries) {
|
|
50
|
+
let from = 0;
|
|
51
|
+
let to = total;
|
|
52
|
+
|
|
53
|
+
if (sec.anchor !== undefined) {
|
|
54
|
+
try {
|
|
55
|
+
// Normalize anchor + context into parallel candidate lists. A
|
|
56
|
+
// scalar anchor becomes a single-entry array; a single context
|
|
57
|
+
// object applies to every entry; an array context is positional.
|
|
58
|
+
// Each candidate resolves its own anchor line independently
|
|
59
|
+
// (anchor_last → that candidate's LAST matching line, else its
|
|
60
|
+
// FIRST). Across candidates we then pick the TOPMOST resolved
|
|
61
|
+
// line, because a section's anchor marks the TOP of the block:
|
|
62
|
+
// among several recognized landmark shapes, the highest one
|
|
63
|
+
// bounds the whole block. This keeps a scalar anchor identical
|
|
64
|
+
// (one candidate), preserves a genuine box-top divider (it sits
|
|
65
|
+
// ABOVE the question line, so it still wins), and — crucially —
|
|
66
|
+
// stops a stray lower landmark from clipping the block: e.g. a
|
|
67
|
+
// claude approval whose numbered choices sit ABOVE the input-box
|
|
68
|
+
// `────` rule. anchor_last on the bare-divider pattern alone
|
|
69
|
+
// would latch that LOWER chrome rule and strand the buttons
|
|
70
|
+
// above it (deriveModal sees < min_count → auto-approve never
|
|
71
|
+
// fires); preferring the topmost landmark (here the question
|
|
72
|
+
// line just above the choices, matched by the fallback context)
|
|
73
|
+
// captures the whole modal. The fallback still only contributes
|
|
74
|
+
// when its own pattern matches, so non-modal screens are
|
|
75
|
+
// unaffected.
|
|
76
|
+
const anchorPatterns = Array.isArray(sec.anchor) ? sec.anchor : [sec.anchor];
|
|
77
|
+
const sharedCtx: AnchorContext | null = Array.isArray(sec.anchor_context)
|
|
78
|
+
? null
|
|
79
|
+
: (sec.anchor_context ?? null);
|
|
80
|
+
const ctxList: (AnchorContext | null)[] = Array.isArray(sec.anchor_context)
|
|
81
|
+
? sec.anchor_context
|
|
82
|
+
: anchorPatterns.map(() => sharedCtx);
|
|
83
|
+
const candidates = anchorPatterns.map((pattern, k) => {
|
|
84
|
+
const ctx = ctxList[k] ?? null;
|
|
85
|
+
return {
|
|
86
|
+
re: new RegExp(pattern, sec.anchor_flags ?? ''),
|
|
87
|
+
prevRe: ctx?.prev !== undefined
|
|
88
|
+
? new RegExp(ctx.prev, ctx.prev_flags ?? '') : null,
|
|
89
|
+
nextRe: ctx?.next !== undefined
|
|
90
|
+
? new RegExp(ctx.next, ctx.next_flags ?? '') : null,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
const matchesCandidate = (c: typeof candidates[number], i: number) =>
|
|
94
|
+
c.re.test(lines[i])
|
|
95
|
+
&& (c.prevRe === null || (i > 0 && c.prevRe.test(lines[i - 1])))
|
|
96
|
+
&& (c.nextRe === null || (i < total - 1 && c.nextRe.test(lines[i + 1])));
|
|
97
|
+
let idx = -1;
|
|
98
|
+
for (const c of candidates) {
|
|
99
|
+
let candIdx = -1;
|
|
100
|
+
if (sec.anchor_last) {
|
|
101
|
+
for (let i = total - 1; i >= 0; i--) { if (matchesCandidate(c, i)) { candIdx = i; break; } }
|
|
102
|
+
} else {
|
|
103
|
+
for (let i = 0; i < total; i++) { if (matchesCandidate(c, i)) { candIdx = i; break; } }
|
|
104
|
+
}
|
|
105
|
+
// Topmost resolved anchor across candidates wins (see note
|
|
106
|
+
// above): keep the smallest matching line index.
|
|
107
|
+
if (candIdx !== -1 && (idx === -1 || candIdx < idx)) idx = candIdx;
|
|
108
|
+
}
|
|
109
|
+
if (idx !== -1) {
|
|
110
|
+
from = idx;
|
|
111
|
+
to = total;
|
|
112
|
+
if (sec.until_regex !== undefined) {
|
|
113
|
+
try {
|
|
114
|
+
const ure = new RegExp(sec.until_regex, sec.until_regex_flags ?? '');
|
|
115
|
+
const end = lines.findIndex((l, i) => i > idx && ure.test(l));
|
|
116
|
+
if (end !== -1) to = end;
|
|
117
|
+
} catch { /* bad until_regex */ }
|
|
118
|
+
} else if (sec.lines !== undefined) {
|
|
119
|
+
to = Math.min(total, from + sec.lines);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} catch { /* bad anchor regex */ }
|
|
123
|
+
} else if (sec.from_top !== undefined) {
|
|
124
|
+
from = resolveSize(sec.from_top, total);
|
|
125
|
+
to = total;
|
|
126
|
+
} else if (sec.from_bottom !== undefined) {
|
|
127
|
+
const sz = resolveSize(sec.from_bottom, total);
|
|
128
|
+
from = total - sz;
|
|
129
|
+
to = total;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
anchored.set(id, { fromLine: from, toLine: to });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Second pass: apply `until` references or `until` regex strings.
|
|
136
|
+
const resolved: ResolvedSection[] = [];
|
|
137
|
+
for (const [id, sec] of sectionEntries) {
|
|
138
|
+
let { fromLine, toLine } = anchored.get(id)!;
|
|
139
|
+
|
|
140
|
+
if (sec.until !== undefined) {
|
|
141
|
+
if (sec.until.startsWith('^')) {
|
|
142
|
+
try {
|
|
143
|
+
const ure = new RegExp(sec.until);
|
|
144
|
+
const end = lines.findIndex((l, i) => i > fromLine && ure.test(l));
|
|
145
|
+
if (end !== -1) toLine = end;
|
|
146
|
+
} catch { /* bad until regex */ }
|
|
147
|
+
} else {
|
|
148
|
+
const target = anchored.get(sec.until);
|
|
149
|
+
if (target) toLine = target.fromLine;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (toLine < fromLine) toLine = fromLine;
|
|
154
|
+
const text = lines.slice(fromLine, toLine).join('\n');
|
|
155
|
+
resolved.push({ id, fromLine, toLine, text });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return resolved;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function sectionText(sections: ResolvedSection[], sectionId: string | undefined, fullScreen: string): string {
|
|
162
|
+
if (!sectionId) return fullScreen;
|
|
163
|
+
const found = sections.find(s => s.id === sectionId);
|
|
164
|
+
return found ? found.text : '';
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
168
|
+
// Condition evaluation
|
|
169
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
170
|
+
|
|
171
|
+
function isRegexCondition(c: Condition): c is RegexCondition {
|
|
172
|
+
return 'matches' in c;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function isChangedCondition(c: Condition): c is ChangedCondition {
|
|
176
|
+
return 'cursor_above' in c && 'changed' in c;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function isAllCondition(c: Condition): c is AllCondition {
|
|
180
|
+
return 'all' in c;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function isAnyCondition(c: Condition): c is AnyCondition {
|
|
184
|
+
return 'any' in c;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function evaluateCondition(
|
|
188
|
+
cond: Condition,
|
|
189
|
+
sections: ResolvedSection[],
|
|
190
|
+
fullScreen: string,
|
|
191
|
+
cursor: { row: number; col: number } | undefined,
|
|
192
|
+
prevLines: string[] | undefined,
|
|
193
|
+
trace: TraceEntry[],
|
|
194
|
+
stateId: string,
|
|
195
|
+
): boolean {
|
|
196
|
+
if (isAllCondition(cond)) {
|
|
197
|
+
for (const child of cond.all) {
|
|
198
|
+
if (!evaluateCondition(child, sections, fullScreen, cursor, prevLines, trace, stateId)) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (isAnyCondition(cond)) {
|
|
206
|
+
for (const child of cond.any) {
|
|
207
|
+
if (evaluateCondition(child, sections, fullScreen, cursor, prevLines, trace, stateId)) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (isChangedCondition(cond)) {
|
|
215
|
+
if (!cursor || !prevLines || prevLines.length === 0) return false;
|
|
216
|
+
const curLines = fullScreen.split('\n');
|
|
217
|
+
const startRow = Math.max(0, cursor.row - cond.cursor_above);
|
|
218
|
+
const endRow = cursor.row;
|
|
219
|
+
const currentSlice = curLines.slice(startRow, endRow).join('\n');
|
|
220
|
+
const prevSlice = prevLines.slice(startRow, endRow).join('\n');
|
|
221
|
+
const didChange = currentSlice !== prevSlice;
|
|
222
|
+
const result = cond.changed ? didChange : !didChange;
|
|
223
|
+
const stableSuffix = cond.stable_ms != null ? ` stable_ms=${cond.stable_ms}` : '';
|
|
224
|
+
trace.push({
|
|
225
|
+
kind: result ? 'state_match' : 'state_skip',
|
|
226
|
+
text: `state[${stateId}] changed cond cursor_above=${cond.cursor_above} rows[${startRow},${endRow}) changed=${didChange} expected=${cond.changed}${stableSuffix} result=${result}`,
|
|
227
|
+
});
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (isRegexCondition(cond)) {
|
|
232
|
+
const haystack = sectionText(sections, cond.section, fullScreen);
|
|
233
|
+
let matched = false;
|
|
234
|
+
try {
|
|
235
|
+
const re = new RegExp(cond.matches, cond.flags ?? 'i');
|
|
236
|
+
matched = re.test(haystack);
|
|
237
|
+
} catch { matched = false; }
|
|
238
|
+
|
|
239
|
+
if (!matched) {
|
|
240
|
+
trace.push({ kind: 'state_skip', text: `state[${stateId}] regex cond ${cond.section ?? '*'}~/${cond.matches}/ no match` });
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (cursor !== undefined) {
|
|
245
|
+
if (cond.cursor_row_min !== undefined && cursor.row < cond.cursor_row_min) {
|
|
246
|
+
trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor row ${cursor.row} < cursor_row_min ${cond.cursor_row_min}` });
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
if (cond.cursor_row_max !== undefined && cursor.row > cond.cursor_row_max) {
|
|
250
|
+
trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor row ${cursor.row} > cursor_row_max ${cond.cursor_row_max}` });
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (cond.cursor_col_min !== undefined && cursor.col < cond.cursor_col_min) {
|
|
254
|
+
trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor col ${cursor.col} < cursor_col_min ${cond.cursor_col_min}` });
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
if (cond.cursor_col_max !== undefined && cursor.col > cond.cursor_col_max) {
|
|
258
|
+
trace.push({ kind: 'state_skip', text: `state[${stateId}] cursor col ${cursor.col} > cursor_col_max ${cond.cursor_col_max}` });
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
trace.push({ kind: 'state_match', text: `state[${stateId}] regex cond ${cond.section ?? '*'}~/${cond.matches}/ matched${cursor !== undefined ? ` cursor=(${cursor.row},${cursor.col})` : ''}` });
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
271
|
+
// Extraction helpers (used by FsmDriver for modal/title)
|
|
272
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
273
|
+
|
|
274
|
+
export function extractTitle(
|
|
275
|
+
rule: ExtractTitle,
|
|
276
|
+
sections: ResolvedSection[],
|
|
277
|
+
fullScreen: string,
|
|
278
|
+
): string | null {
|
|
279
|
+
const hay = sectionText(sections, rule.section, fullScreen);
|
|
280
|
+
if (!hay) return null;
|
|
281
|
+
|
|
282
|
+
if (rule.first_line) {
|
|
283
|
+
const lines = hay.split('\n');
|
|
284
|
+
for (const line of lines) {
|
|
285
|
+
const stripped = line.trim();
|
|
286
|
+
if (stripped && !/^[─╌═─\s]+$/.test(stripped)) {
|
|
287
|
+
return stripped;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (rule.regex) {
|
|
294
|
+
try {
|
|
295
|
+
const re = new RegExp(rule.regex, rule.flags ?? 'i');
|
|
296
|
+
const m = re.exec(hay);
|
|
297
|
+
if (m) return (m[1] ?? m[0]).trim();
|
|
298
|
+
} catch { /* bad regex */ }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function compilePattern(ref: { pattern: string; flags?: string }): RegExp {
|
|
305
|
+
const flags = ref.flags ?? 'gm';
|
|
306
|
+
return new RegExp(ref.pattern, flags.includes('g') ? flags : flags + 'g');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function compileLinePattern(ref: { pattern: string; flags?: string }): RegExp {
|
|
310
|
+
const flags = (ref.flags ?? 'm').replace(/g/g, '');
|
|
311
|
+
return new RegExp(ref.pattern, flags);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export function extractButtonsFromRule(
|
|
315
|
+
rule: ExtractButtons,
|
|
316
|
+
hay: string,
|
|
317
|
+
): { index: number; label: string; key: string; current: boolean }[] {
|
|
318
|
+
const keyTemplate = rule.key_for_index;
|
|
319
|
+
const continuationLines = rule.continuation_lines ?? false;
|
|
320
|
+
const buttons: { index: number; label: string; key: string; current: boolean }[] = [];
|
|
321
|
+
|
|
322
|
+
if (continuationLines) {
|
|
323
|
+
const re = compileLinePattern(rule);
|
|
324
|
+
const lines = hay.split('\n');
|
|
325
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
326
|
+
const m = re.exec(lines[i]);
|
|
327
|
+
if (!m) continue;
|
|
328
|
+
const idx = Number(m[1]);
|
|
329
|
+
let label = String(m[2] ?? '').trim();
|
|
330
|
+
if (!Number.isFinite(idx) || idx <= 0 || !label) continue;
|
|
331
|
+
const current = hasCursorMarker(lines[i]);
|
|
332
|
+
let j = i + 1;
|
|
333
|
+
while (j < lines.length) {
|
|
334
|
+
const next = lines[j];
|
|
335
|
+
if (!next.trim()) break;
|
|
336
|
+
if (re.test(next)) break;
|
|
337
|
+
if (!/^\s+/.test(next)) break;
|
|
338
|
+
label += ' ' + next.trim();
|
|
339
|
+
j += 1;
|
|
340
|
+
}
|
|
341
|
+
// No top-down de-dup here: a stray body "1." above the modal would
|
|
342
|
+
// otherwise claim the index and shadow the real choice. Collect
|
|
343
|
+
// every match in screen order and let lastContiguousNumberedBlock
|
|
344
|
+
// pick the bottom-most option block below.
|
|
345
|
+
const key = keyTemplate.replace(/\{index\}/g, String(idx));
|
|
346
|
+
buttons.push({ index: idx, label, key, current });
|
|
347
|
+
i = j - 1;
|
|
348
|
+
}
|
|
349
|
+
} else {
|
|
350
|
+
const re = compilePattern(rule);
|
|
351
|
+
let m: RegExpExecArray | null;
|
|
352
|
+
while ((m = re.exec(hay)) !== null) {
|
|
353
|
+
const idx = Number(m[1]);
|
|
354
|
+
const label = String(m[2] ?? '').trim();
|
|
355
|
+
if (!Number.isFinite(idx) || idx <= 0 || !label) continue;
|
|
356
|
+
const key = keyTemplate.replace(/\{index\}/g, String(idx));
|
|
357
|
+
// The matched text begins at the cursor marker (the pattern's
|
|
358
|
+
// optional `[❯›>]` prefix); flag this row as the cursor's current
|
|
359
|
+
// position so `select_mode: 'arrow_keys'` can step from it.
|
|
360
|
+
// Like the continuation path, no top-down de-dup — body numbered
|
|
361
|
+
// lines are filtered out by the bottom-block selection below.
|
|
362
|
+
buttons.push({ index: idx, label, key, current: hasCursorMarker(m[0]) });
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Buttons were collected in screen (top→bottom) order. The real choices are
|
|
367
|
+
// the bottom-most contiguous numbered block (the modal/picker always renders
|
|
368
|
+
// them last); reduce to that block so conversation-history numbered lists
|
|
369
|
+
// pulled into the modal section can never be mistaken for options.
|
|
370
|
+
const block = lastContiguousNumberedBlock(buttons);
|
|
371
|
+
block.sort((a, b) => a.index - b.index);
|
|
372
|
+
return block;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Reduce a top→bottom-ordered list of parsed numbered entries to only the
|
|
377
|
+
* bottom-most contiguous block — the run whose indices descend by exactly 1
|
|
378
|
+
* scanning upward from the last entry.
|
|
379
|
+
*
|
|
380
|
+
* Picker and approval choices always render as the LAST contiguous numbered
|
|
381
|
+
* block at the bottom of the modal section. The conversation history above can
|
|
382
|
+
* carry its own stray "1./2./3." numbered lists (and blockquote `>` lines), and
|
|
383
|
+
* because section anchoring can pull body lines into the modal section, a naive
|
|
384
|
+
* top-down scan would bind the low option indices to those body lines and drop
|
|
385
|
+
* the real choices (the dashboard would show, and an arrow-key picker would
|
|
386
|
+
* commit, the wrong row). Selecting the bottom block makes the on-screen picker
|
|
387
|
+
* win regardless of body content. Since pickers number their options 1..N
|
|
388
|
+
* contiguously and bodies use indices ≥ 1, the upward chain always breaks the
|
|
389
|
+
* moment it would need a "0." above the picker's "1." — so the picker block is
|
|
390
|
+
* isolated cleanly. Entries are assumed already in screen order; the returned
|
|
391
|
+
* slice keeps that order.
|
|
392
|
+
*/
|
|
393
|
+
export function lastContiguousNumberedBlock<T extends { index: number }>(entries: T[]): T[] {
|
|
394
|
+
if (entries.length <= 1) return entries.slice();
|
|
395
|
+
let start = entries.length - 1;
|
|
396
|
+
for (let i = entries.length - 1; i > 0; i -= 1) {
|
|
397
|
+
if (entries[i - 1].index === entries[i].index - 1) start = i - 1;
|
|
398
|
+
else break;
|
|
399
|
+
}
|
|
400
|
+
return entries.slice(start);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/** True when a button line carries a TUI cursor marker (`❯`, `›`, `>`) before
|
|
404
|
+
* its number — i.e. the cursor currently sits on that row. */
|
|
405
|
+
function hasCursorMarker(text: string): boolean {
|
|
406
|
+
return /^\s*[❯›>]/.test(text);
|
|
407
|
+
}
|