@adhdev/daemon-core 0.9.82-rc.44 → 0.9.82-rc.441
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 +200 -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 +7 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +15 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +60 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +29 -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 +142 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router.d.ts +276 -2
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +9 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +120 -1
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +11 -1
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +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 +64 -14
- package/dist/index.js +50719 -20120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50317 -19882
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +89 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +174 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
- package/dist/mesh/mesh-event-classify.d.ts +5 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +41 -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 +69 -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 +77 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +189 -0
- package/dist/mesh/mesh-node-identity.d.ts +289 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +65 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +428 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +450 -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 +300 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +20 -0
- package/dist/providers/chat-message-normalization.d.ts +31 -1
- package/dist/providers/cli-provider-instance.d.ts +252 -3
- package/dist/providers/contracts.d.ts +149 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +63 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +27 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +29 -0
- package/dist/providers/provider-instance.d.ts +23 -1
- package/dist/providers/provider-loader.d.ts +26 -4
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +91 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +422 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +174 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +222 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +509 -13
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/sessions/registry.d.ts +6 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +59 -2
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +26 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -3
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +63 -12
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +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 +1246 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +914 -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/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2447 -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.ts +572 -27
- package/src/commands/handler.ts +841 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +678 -0
- package/src/commands/high-family/mesh-events.ts +80 -0
- package/src/commands/high-family/mesh-status.ts +714 -0
- package/src/commands/high-family/types.ts +76 -0
- package/src/commands/low-family/coordinator-prompt.ts +72 -0
- package/src/commands/low-family/daemon-lifecycle.ts +107 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +274 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +238 -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 +1242 -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 +143 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router.ts +2846 -3484
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +493 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +593 -22
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/repo-settings.ts +111 -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 +28 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +59 -15
- 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 +196 -12
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +338 -0
- package/src/mesh/coordinator-prompt.ts +415 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +645 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +315 -0
- package/src/mesh/mesh-event-classify.ts +51 -0
- package/src/mesh/mesh-event-forwarding.ts +1897 -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 +656 -0
- package/src/mesh/mesh-events-stale.ts +389 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +33 -1035
- package/src/mesh/mesh-fast-forward.ts +843 -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 +656 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +449 -0
- package/src/mesh/mesh-node-identity.ts +1887 -0
- package/src/mesh/mesh-queue-assignment.ts +1924 -0
- package/src/mesh/mesh-reconcile-loop.ts +1997 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1673 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-review-inbox.ts +307 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +1853 -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 +1254 -141
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +450 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +57 -5
- package/src/providers/chat-message-normalization.ts +92 -4
- package/src/providers/cli-provider-instance.ts +2001 -106
- 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 +85 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +345 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +260 -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 +19 -1
- package/src/providers/provider-loader.ts +668 -50
- package/src/providers/provider-schema.ts +87 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +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 +235 -0
- package/src/providers/spec/cli-adapter.ts +1056 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1410 -0
- package/src/providers/spec/fsm-evaluator.ts +272 -0
- package/src/providers/spec/fsm-loader.ts +120 -0
- package/src/providers/spec/fsm-types.ts +273 -0
- package/src/providers/spec/native-history-executor.ts +1143 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +262 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +748 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/sessions/registry.ts +6 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +64 -1
- package/src/status/builders.ts +26 -6
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +5 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -401,7 +401,62 @@ export interface ProviderModule {
|
|
|
401
401
|
spawnArgBuilder?: (config: Record<string, string>) => string[];
|
|
402
402
|
/** ACP agent auth methods (multiple supported — in priority order) */
|
|
403
403
|
auth?: AcpAuthMethod[];
|
|
404
|
+
/**
|
|
405
|
+
* Repo Mesh coordinator capability and MCP ingestion behavior.
|
|
406
|
+
* Providers must declare this rather than relying on daemon hardcoded CLI quirks.
|
|
407
|
+
*/
|
|
408
|
+
meshCoordinator?: ProviderMeshCoordinatorConfig;
|
|
409
|
+
}
|
|
410
|
+
export type MeshCoordinatorMcpConfigMode = 'auto_import' | 'manual' | 'none';
|
|
411
|
+
export type MeshCoordinatorMcpConfigFormat = 'claude_mcp_json' | 'hermes_config_yaml';
|
|
412
|
+
export interface ProviderMeshCoordinatorConfig {
|
|
413
|
+
supported: boolean;
|
|
414
|
+
reason?: string;
|
|
415
|
+
mcpConfig?: {
|
|
416
|
+
mode: MeshCoordinatorMcpConfigMode;
|
|
417
|
+
format?: MeshCoordinatorMcpConfigFormat;
|
|
418
|
+
path?: string;
|
|
419
|
+
serverName?: string;
|
|
420
|
+
configPathCommand?: string;
|
|
421
|
+
requiresRestart?: boolean;
|
|
422
|
+
instructions?: string;
|
|
423
|
+
template?: string;
|
|
424
|
+
};
|
|
425
|
+
systemPromptInjection?: MeshCoordinatorSystemPromptInjection;
|
|
426
|
+
delegatedWorkerIsolation?: MeshCoordinatorDelegatedWorkerIsolation;
|
|
404
427
|
}
|
|
428
|
+
export type MeshCoordinatorSystemPromptInjection = {
|
|
429
|
+
mode: 'cli_arg';
|
|
430
|
+
flag: string;
|
|
431
|
+
} | {
|
|
432
|
+
mode: 'config_override';
|
|
433
|
+
flag: string;
|
|
434
|
+
template: string;
|
|
435
|
+
} | {
|
|
436
|
+
mode: 'context_file';
|
|
437
|
+
path: string;
|
|
438
|
+
wrapper?: string;
|
|
439
|
+
} | {
|
|
440
|
+
mode: 'env_var';
|
|
441
|
+
name: string;
|
|
442
|
+
};
|
|
443
|
+
export interface MeshCoordinatorDelegatedWorkerIsolation {
|
|
444
|
+
env?: {
|
|
445
|
+
unset?: string[];
|
|
446
|
+
};
|
|
447
|
+
args?: MeshCoordinatorDelegatedWorkerArgRule[];
|
|
448
|
+
}
|
|
449
|
+
export type MeshCoordinatorDelegatedWorkerArgRule = {
|
|
450
|
+
mode: 'empty_mcp_config';
|
|
451
|
+
flag: string;
|
|
452
|
+
strictFlag?: string;
|
|
453
|
+
} | {
|
|
454
|
+
mode: 'config_override';
|
|
455
|
+
flag: string;
|
|
456
|
+
key: string;
|
|
457
|
+
value: string;
|
|
458
|
+
dedupeKey?: string;
|
|
459
|
+
};
|
|
405
460
|
export interface ProviderResumeCapability {
|
|
406
461
|
supported: boolean;
|
|
407
462
|
stopStrategy?: 'command' | 'ctrl_c';
|
|
@@ -15,6 +15,14 @@ import type { ChatMessageKind } from './chat-message-normalization.js';
|
|
|
15
15
|
export type ReadChatTurnStatus = 'open' | 'waiting_approval' | 'complete' | 'error';
|
|
16
16
|
|
|
17
17
|
export interface ReadChatResult {
|
|
18
|
+
/**
|
|
19
|
+
* Declared chat contract version. Absent or `'1.0'` → legacy v1 payload
|
|
20
|
+
* (current shape). `'2.0'` → v2 payload conforming to transcript-v2.ts
|
|
21
|
+
* (ReadChatResultV2). Validators in read-chat-contract.ts route on this
|
|
22
|
+
* field. A1 only adds the field; A2 will make v2 the daemon-internal
|
|
23
|
+
* canonical form and reject unrecognised versions at provider load time.
|
|
24
|
+
*/
|
|
25
|
+
contractVersion?: import('./transcript-v2.js').ChatContractVersion;
|
|
18
26
|
messages: ChatMessage[];
|
|
19
27
|
status: AgentStatus;
|
|
20
28
|
activeModal?: ModalInfo | null;
|
|
@@ -382,11 +390,99 @@ export interface ProviderMeshCoordinatorConfig {
|
|
|
382
390
|
requiresRestart?: boolean;
|
|
383
391
|
/** User-facing setup explanation for manual modes. */
|
|
384
392
|
instructions?: string;
|
|
385
|
-
/** Copyable setup template. Supports {{meshId}}, {{adhdevMcpCommand}}, {{workspace}}, {{serverName}}. */
|
|
393
|
+
/** Copyable setup template. Supports {{meshId}}, {{adhdevMcpCommand}}, {{adhdevMcpArgs}}, {{workspace}}, {{serverName}}. */
|
|
386
394
|
template?: string;
|
|
387
395
|
};
|
|
396
|
+
/**
|
|
397
|
+
* How the coordinator system prompt reaches the launched CLI. Replaces the
|
|
398
|
+
* old hard-coded `if (cliType === 'claude-cli') push --append-system-prompt`
|
|
399
|
+
* branches in router.ts: a new CLI now ships its injection rule in its
|
|
400
|
+
* provider.v1.json, no daemon code change needed. Users can override the
|
|
401
|
+
* rendered prompt or the injection mechanism per-provider; if omitted, no
|
|
402
|
+
* system prompt is injected (safe default — won't crash spawn with a flag
|
|
403
|
+
* the CLI doesn't recognize).
|
|
404
|
+
*/
|
|
405
|
+
systemPromptInjection?: MeshCoordinatorSystemPromptInjection;
|
|
406
|
+
/**
|
|
407
|
+
* How coordinator-launched worker sessions are isolated from coordinator-only
|
|
408
|
+
* MCP/tools/config. Provider-specific CLI quirks belong here, not in daemon
|
|
409
|
+
* launch code.
|
|
410
|
+
*/
|
|
411
|
+
delegatedWorkerIsolation?: MeshCoordinatorDelegatedWorkerIsolation;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export interface MeshCoordinatorDelegatedWorkerIsolation {
|
|
415
|
+
/** Environment variables to unset for delegated worker sessions. */
|
|
416
|
+
env?: {
|
|
417
|
+
unset?: string[];
|
|
418
|
+
};
|
|
419
|
+
/** Spawn-argument rules applied before launching a delegated worker. */
|
|
420
|
+
args?: MeshCoordinatorDelegatedWorkerArgRule[];
|
|
388
421
|
}
|
|
389
422
|
|
|
423
|
+
export type MeshCoordinatorDelegatedWorkerArgRule =
|
|
424
|
+
| {
|
|
425
|
+
mode: 'empty_mcp_config';
|
|
426
|
+
/** CLI flag that points at an MCP config file, e.g. '--mcp-config'. */
|
|
427
|
+
flag: string;
|
|
428
|
+
/** Optional CLI flag that forces only the provided MCP config to be used. */
|
|
429
|
+
strictFlag?: string;
|
|
430
|
+
}
|
|
431
|
+
| {
|
|
432
|
+
mode: 'config_override';
|
|
433
|
+
/** CLI config flag, e.g. '-c' or '--config'. */
|
|
434
|
+
flag: string;
|
|
435
|
+
/** Config key to set for worker isolation. */
|
|
436
|
+
key: string;
|
|
437
|
+
/** Config value to set. */
|
|
438
|
+
value: string;
|
|
439
|
+
/** Optional broader key prefix used for duplicate detection. */
|
|
440
|
+
dedupeKey?: string;
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Declarative description of how a CLI accepts a session-scoped system prompt.
|
|
445
|
+
*
|
|
446
|
+
* Modes:
|
|
447
|
+
* - cli_arg → push `flag` + prompt onto spawn args (Claude)
|
|
448
|
+
* - config_override → push `flag` + a templated key=value config override (Codex)
|
|
449
|
+
* - context_file → write prompt into a workspace markdown the CLI
|
|
450
|
+
* auto-loads as project context (Gemini, Antigravity)
|
|
451
|
+
* - env_var → expose prompt to the spawned process as $name (Hermes)
|
|
452
|
+
*
|
|
453
|
+
* The prompt text is templated with `{prompt}` (raw) or `{prompt_json}`
|
|
454
|
+
* (JSON-encoded for embedding inside config-override strings).
|
|
455
|
+
*/
|
|
456
|
+
export type MeshCoordinatorSystemPromptInjection =
|
|
457
|
+
| {
|
|
458
|
+
mode: 'cli_arg';
|
|
459
|
+
/** Spawn-args flag, e.g. '--append-system-prompt'. The prompt becomes the next argv. */
|
|
460
|
+
flag: string;
|
|
461
|
+
}
|
|
462
|
+
| {
|
|
463
|
+
mode: 'config_override';
|
|
464
|
+
/** Spawn-args flag, e.g. '-c'. Followed by `template` with placeholders rendered. */
|
|
465
|
+
flag: string;
|
|
466
|
+
/** Template using {prompt} or {prompt_json}, e.g. 'developer_instructions={prompt_json}'. */
|
|
467
|
+
template: string;
|
|
468
|
+
}
|
|
469
|
+
| {
|
|
470
|
+
mode: 'context_file';
|
|
471
|
+
/** Workspace-relative file path the CLI auto-loads, e.g. 'AGENTS.md' or 'GEMINI.md'. */
|
|
472
|
+
path: string;
|
|
473
|
+
/**
|
|
474
|
+
* Optional wrapper around the prompt. Use `{prompt}` placeholder. Existing
|
|
475
|
+
* wrapper-delimited blocks are replaced rather than duplicated, so re-launching
|
|
476
|
+
* a coordinator doesn't pile up copies. If omitted, the prompt is appended raw.
|
|
477
|
+
*/
|
|
478
|
+
wrapper?: string;
|
|
479
|
+
}
|
|
480
|
+
| {
|
|
481
|
+
mode: 'env_var';
|
|
482
|
+
/** Env-var name, e.g. 'HERMES_EPHEMERAL_SYSTEM_PROMPT'. */
|
|
483
|
+
name: string;
|
|
484
|
+
};
|
|
485
|
+
|
|
390
486
|
export interface ProviderCompatibilityEntry {
|
|
391
487
|
ideVersion: string;
|
|
392
488
|
scriptDir: string;
|
|
@@ -472,6 +568,14 @@ export interface ProviderModule {
|
|
|
472
568
|
extensionIdPattern_flags?: string;
|
|
473
569
|
compatibility?: ProviderCompatibilityEntry[];
|
|
474
570
|
defaultScriptDir?: string;
|
|
571
|
+
/**
|
|
572
|
+
* v1 declarative tui block (spinner/settledPrompt/modal/dispatchOrder/etc).
|
|
573
|
+
* When present, the daemon's CliScriptRunner builds canonical
|
|
574
|
+
* (input → verdict) functions from this and injects them into provider
|
|
575
|
+
* scripts as `sdk.declarativeDetectStatus` and `sdk.declarativeParseApproval`.
|
|
576
|
+
* v0 / verified-tier providers can omit this entirely.
|
|
577
|
+
*/
|
|
578
|
+
tui?: Record<string, unknown>;
|
|
475
579
|
/**
|
|
476
580
|
* Scripts that can run at the IDE main-page level (not just inside the extension webview session frame).
|
|
477
581
|
* Default: ['listModes', 'setMode', 'listModels', 'setModel'].
|
|
@@ -490,6 +594,16 @@ export interface ProviderModule {
|
|
|
490
594
|
/** Auto-implement spawn config — controls how this provider is invoked for autonomous script generation */
|
|
491
595
|
autoImpl?: ProviderAutoImplSpawnConfig;
|
|
492
596
|
};
|
|
597
|
+
/**
|
|
598
|
+
* MAGI-KIND-PANEL (model axis): template for expanding an `initialModel` selection
|
|
599
|
+
* into launch args for a CLI provider. `{{model}}` is substituted with the model
|
|
600
|
+
* string; e.g. `['--model', '{{model}}']` for claude-cli → `--model opus`. Applied
|
|
601
|
+
* at session launch when `initialModel` is passed AND this provider is a plain CLI
|
|
602
|
+
* (ACP providers instead route the model through setConfigOption). A CLI provider
|
|
603
|
+
* with no template silently ignores `initialModel` at launch (best-effort; a model
|
|
604
|
+
* request never fails a launch). Absent → no launch-time model selection for CLI.
|
|
605
|
+
*/
|
|
606
|
+
modelLaunchArgs?: string[];
|
|
493
607
|
/** Delay before submitting typed CLI input (provider-specific TUI tuning) */
|
|
494
608
|
sendDelayMs?: number;
|
|
495
609
|
/** Submit key used after typing into CLI PTY (default: carriage return) */
|
|
@@ -525,8 +639,16 @@ export interface ProviderModule {
|
|
|
525
639
|
/** History behavior config — controls message filtering and collapse during replay */
|
|
526
640
|
historyBehavior?: ProviderHistoryBehavior;
|
|
527
641
|
/**
|
|
528
|
-
*
|
|
529
|
-
* When set, daemon
|
|
642
|
+
* Native history config — for providers that maintain native history files.
|
|
643
|
+
* When set, daemon reads/lists provider-native transcripts directly. This is
|
|
644
|
+
* the canonical v1 field name; the legacy `canonicalHistory` field name is
|
|
645
|
+
* still accepted by the loader and aliased onto this field at load time.
|
|
646
|
+
*/
|
|
647
|
+
nativeHistory?: NativeHistoryConfig;
|
|
648
|
+
/**
|
|
649
|
+
* @deprecated Legacy v0 alias for {@link ProviderModule.nativeHistory}.
|
|
650
|
+
* Loader populates this from `nativeHistory` so existing internal readers
|
|
651
|
+
* keep working during the transition. Remove after one release.
|
|
530
652
|
*/
|
|
531
653
|
canonicalHistory?: ProviderCanonicalHistoryConfig;
|
|
532
654
|
/**
|
|
@@ -672,7 +794,7 @@ export interface ProviderHistoryBehavior {
|
|
|
672
794
|
* daemon-core. They let each provider own native transcript file discovery and
|
|
673
795
|
* parsing while daemon-core only validates/pages the normalized result.
|
|
674
796
|
*/
|
|
675
|
-
export interface
|
|
797
|
+
export interface NativeHistoryScriptsConfig {
|
|
676
798
|
/** Reads one native session. Default: 'readNativeHistory'. */
|
|
677
799
|
readSession?: string;
|
|
678
800
|
/** Lists native sessions with summary metadata. Default: 'listNativeHistory'. */
|
|
@@ -680,13 +802,19 @@ export interface ProviderCanonicalHistoryScriptsConfig {
|
|
|
680
802
|
}
|
|
681
803
|
|
|
682
804
|
/**
|
|
683
|
-
*
|
|
805
|
+
* @deprecated Use {@link NativeHistoryScriptsConfig}. Retained as an alias for
|
|
806
|
+
* one release so external consumers that referenced the old name keep compiling.
|
|
807
|
+
*/
|
|
808
|
+
export type ProviderCanonicalHistoryScriptsConfig = NativeHistoryScriptsConfig;
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Native history config — for providers that maintain their own native history files.
|
|
684
812
|
*
|
|
685
813
|
* Preferred mode is provider-owned scripts via `scripts`. `format` is now an
|
|
686
814
|
* opaque provider label retained for diagnostics/backward compatibility; daemon
|
|
687
815
|
* live paths must not branch on provider-specific format values.
|
|
688
816
|
*/
|
|
689
|
-
export interface
|
|
817
|
+
export interface NativeHistoryConfig {
|
|
690
818
|
/** Opaque provider-owned history format label. */
|
|
691
819
|
format?: string;
|
|
692
820
|
/** Optional native history glob/template for diagnostics only. */
|
|
@@ -702,8 +830,25 @@ export interface ProviderCanonicalHistoryConfig {
|
|
|
702
830
|
* Omitted mode defaults to 'native-source'.
|
|
703
831
|
*/
|
|
704
832
|
mode?: 'native-source' | 'materialized-mirror' | 'disabled';
|
|
833
|
+
/**
|
|
834
|
+
* Chat transcript contract version this provider's read_chat output
|
|
835
|
+
* conforms to. See transcript-v2.ts for the v2 invariants. Absent or `'1.0'`
|
|
836
|
+
* → legacy v1 payload (current behaviour). `'2.0'` → strict v2 payload
|
|
837
|
+
* (stable providerUnitKey/bubbleId/sequence, strict enums, honest coverage).
|
|
838
|
+
*
|
|
839
|
+
* A1 only surfaces this field; validators in read-chat-contract.ts route
|
|
840
|
+
* on it. A2 makes v2 the daemon-internal canonical form and rejects
|
|
841
|
+
* unrecognised values at provider load time.
|
|
842
|
+
*/
|
|
843
|
+
contractVersion?: import('./transcript-v2.js').ChatContractVersion;
|
|
705
844
|
}
|
|
706
845
|
|
|
846
|
+
/**
|
|
847
|
+
* @deprecated Use {@link NativeHistoryConfig}. Retained as an alias for one
|
|
848
|
+
* release so external consumers that referenced the old name keep compiling.
|
|
849
|
+
*/
|
|
850
|
+
export type ProviderCanonicalHistoryConfig = NativeHistoryConfig;
|
|
851
|
+
|
|
707
852
|
/**
|
|
708
853
|
* Auto-implement spawn config — controls how the provider is spawned for autonomous AI-driven
|
|
709
854
|
* provider script implementation (dev-auto-implement.ts).
|
|
@@ -1021,4 +1166,13 @@ export interface ProviderControlDef {
|
|
|
1021
1166
|
order?: number;
|
|
1022
1167
|
/** Hide this control when condition not met */
|
|
1023
1168
|
hidden?: boolean;
|
|
1169
|
+
/**
|
|
1170
|
+
* FSM state ids in which this control should be visible (mirrors the spec's
|
|
1171
|
+
* `control_bar[].visible_when_state`). When omitted the control is always
|
|
1172
|
+
* visible. The daemon enforces this on click (FsmDriver.handleClickControl),
|
|
1173
|
+
* so the web bar must mirror the same gating to avoid showing a button that
|
|
1174
|
+
* the daemon would silently drop. Uses raw FSM state ids (e.g. 'idle',
|
|
1175
|
+
* 'busy'), not the derived dashboard status.
|
|
1176
|
+
*/
|
|
1177
|
+
visibleWhenState?: string[];
|
|
1024
1178
|
}
|
|
@@ -63,8 +63,8 @@ export class ExtensionProviderInstance implements ProviderInstance {
|
|
|
63
63
|
this.settings = context.settings || {};
|
|
64
64
|
this.monitor.updateConfig({
|
|
65
65
|
approvalAlert: this.settings.approvalAlert !== false,
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
|
|
67
|
+
noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -171,11 +171,15 @@ export class ExtensionProviderInstance implements ProviderInstance {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
updateSettings(newSettings: Record<string, any>): void {
|
|
174
|
-
|
|
174
|
+
// Merge (not replace): a key omitted from newSettings preserves its existing
|
|
175
|
+
// value, a key present (even false) overrides. Mirrors cli/ide-provider-instance
|
|
176
|
+
// so partial updates do not wipe launch-time settings (e.g. autoApprove) while a
|
|
177
|
+
// full settings object still applies explicit values.
|
|
178
|
+
this.settings = { ...this.settings, ...newSettings };
|
|
175
179
|
this.monitor.updateConfig({
|
|
176
180
|
approvalAlert: this.settings.approvalAlert !== false,
|
|
177
|
-
|
|
178
|
-
|
|
181
|
+
noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
|
|
182
|
+
noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
|
|
179
183
|
});
|
|
180
184
|
}
|
|
181
185
|
|
|
@@ -247,9 +251,10 @@ export class ExtensionProviderInstance implements ProviderInstance {
|
|
|
247
251
|
: 'immediate',
|
|
248
252
|
});
|
|
249
253
|
|
|
250
|
-
// Monitor check (cooldown based notification) — keep monitor events (
|
|
254
|
+
// Monitor check (cooldown based notification) — keep monitor events (no_progress etc)
|
|
251
255
|
const agentKey = `${this.type}:ext`;
|
|
252
|
-
const
|
|
256
|
+
const approvalPending = agentStatus === 'waiting_approval';
|
|
257
|
+
const monitorEvents = this.monitor.check(agentKey, agentStatus, now, progressFingerprint, approvalPending);
|
|
253
258
|
for (const me of monitorEvents) {
|
|
254
259
|
this.pushEvent({ event: me.type, agentKey: me.agentKey, message: me.message, elapsedSec: me.elapsedSec, timestamp: me.timestamp });
|
|
255
260
|
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External provider sources — registry + active-selection state.
|
|
3
|
+
*
|
|
4
|
+
* A user can register one or more 3rd-party git URLs as provider sources.
|
|
5
|
+
* Each source clones into ~/.adhdev/external/<source-name>/, namespaced so
|
|
6
|
+
* that two sources can disk-coexist providing the same provider type.
|
|
7
|
+
*
|
|
8
|
+
* When two sources expose the same type, only one is "active" at a time.
|
|
9
|
+
* The active selection is persisted so a user's choice survives daemon
|
|
10
|
+
* restarts. When only one source provides a type, no explicit selection
|
|
11
|
+
* is needed and the loader falls through to that source.
|
|
12
|
+
*/
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
|
|
19
|
+
export interface ExternalSource {
|
|
20
|
+
/** Unique short identifier, e.g. "@vendor-x". User-supplied or derived from the URL. */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Full git URL (https://, git@, …). */
|
|
23
|
+
url: string;
|
|
24
|
+
/** Branch / tag / commit-ish to track. Defaults to `main`. */
|
|
25
|
+
ref: string;
|
|
26
|
+
/** ISO timestamp when first registered. */
|
|
27
|
+
addedAt: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ExternalSourcesFile {
|
|
31
|
+
/** Schema version — bump if shape changes. */
|
|
32
|
+
schema: 1;
|
|
33
|
+
sources: ExternalSource[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Per-type active source selection. Only types reachable from more than
|
|
38
|
+
* one source need an entry — single-source types have no ambiguity.
|
|
39
|
+
*
|
|
40
|
+
* Shape: { active: { "<type>": "<source-name>" } }
|
|
41
|
+
*/
|
|
42
|
+
export interface ProvidersActiveFile {
|
|
43
|
+
schema: 1;
|
|
44
|
+
active: Record<string, string>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const SOURCES_FILENAME = 'providers-sources.json';
|
|
48
|
+
const ACTIVE_FILENAME = 'providers-active.json';
|
|
49
|
+
|
|
50
|
+
function adhdevDir(): string {
|
|
51
|
+
return path.join(os.homedir(), '.adhdev');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function externalRoot(): string {
|
|
55
|
+
return path.join(adhdevDir(), 'external');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function sourcesFilePath(): string {
|
|
59
|
+
return path.join(adhdevDir(), SOURCES_FILENAME);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function activeFilePath(): string {
|
|
63
|
+
return path.join(adhdevDir(), ACTIVE_FILENAME);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function ensureAdhdevDir(): void {
|
|
67
|
+
const d = adhdevDir();
|
|
68
|
+
if (!fs.existsSync(d)) fs.mkdirSync(d, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function loadExternalSources(): ExternalSourcesFile {
|
|
72
|
+
const p = sourcesFilePath();
|
|
73
|
+
if (!fs.existsSync(p)) return { schema: 1, sources: [] };
|
|
74
|
+
try {
|
|
75
|
+
const raw = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
76
|
+
if (!raw || typeof raw !== 'object') return { schema: 1, sources: [] };
|
|
77
|
+
const sources = Array.isArray(raw.sources) ? raw.sources.filter(isValidSource) : [];
|
|
78
|
+
return { schema: 1, sources };
|
|
79
|
+
} catch {
|
|
80
|
+
return { schema: 1, sources: [] };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function saveExternalSources(file: ExternalSourcesFile): void {
|
|
85
|
+
ensureAdhdevDir();
|
|
86
|
+
const tmp = sourcesFilePath() + '.tmp';
|
|
87
|
+
fs.writeFileSync(tmp, JSON.stringify(file, null, 2) + '\n', 'utf-8');
|
|
88
|
+
fs.renameSync(tmp, sourcesFilePath());
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function loadProvidersActive(): ProvidersActiveFile {
|
|
92
|
+
const p = activeFilePath();
|
|
93
|
+
if (!fs.existsSync(p)) return { schema: 1, active: {} };
|
|
94
|
+
try {
|
|
95
|
+
const raw = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
96
|
+
if (!raw || typeof raw !== 'object') return { schema: 1, active: {} };
|
|
97
|
+
const active = raw.active && typeof raw.active === 'object' ? raw.active : {};
|
|
98
|
+
return { schema: 1, active };
|
|
99
|
+
} catch {
|
|
100
|
+
return { schema: 1, active: {} };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function saveProvidersActive(file: ProvidersActiveFile): void {
|
|
105
|
+
ensureAdhdevDir();
|
|
106
|
+
const tmp = activeFilePath() + '.tmp';
|
|
107
|
+
fs.writeFileSync(tmp, JSON.stringify(file, null, 2) + '\n', 'utf-8');
|
|
108
|
+
fs.renameSync(tmp, activeFilePath());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function isValidSource(x: unknown): x is ExternalSource {
|
|
112
|
+
if (!x || typeof x !== 'object') return false;
|
|
113
|
+
const s = x as Record<string, unknown>;
|
|
114
|
+
return typeof s.name === 'string' && s.name.length > 0
|
|
115
|
+
&& typeof s.url === 'string' && s.url.length > 0
|
|
116
|
+
&& typeof s.ref === 'string' && s.ref.length > 0
|
|
117
|
+
&& typeof s.addedAt === 'string';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Derive a short identifier from a git URL when the user didn't supply one.
|
|
122
|
+
* https://github.com/vendor/extra-providers.git → "@vendor-extra-providers"
|
|
123
|
+
* git@github.com:vendor/extra-providers → "@vendor-extra-providers"
|
|
124
|
+
*
|
|
125
|
+
* Idempotent; safe to call before validation since it produces a string
|
|
126
|
+
* regardless of input shape.
|
|
127
|
+
*/
|
|
128
|
+
export function deriveSourceName(url: string): string {
|
|
129
|
+
const m = url.match(/[/:]([^/:]+)\/([^/]+?)(?:\.git)?$/);
|
|
130
|
+
if (!m) return '@source';
|
|
131
|
+
const owner = m[1].toLowerCase().replace(/[^a-z0-9_-]/g, '-');
|
|
132
|
+
const repo = m[2].toLowerCase().replace(/[^a-z0-9_-]/g, '-');
|
|
133
|
+
return `@${owner}-${repo}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Return the per-source category/type tree currently on disk under
|
|
138
|
+
* ~/.adhdev/external/<source>/. Used by the conflict detector and by
|
|
139
|
+
* list_provider_sources.
|
|
140
|
+
*/
|
|
141
|
+
export interface SourceInventoryEntry {
|
|
142
|
+
sourceName: string;
|
|
143
|
+
/** Map: category → list of provider types. */
|
|
144
|
+
providers: Record<string, string[]>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function inventoryExternalSources(): SourceInventoryEntry[] {
|
|
148
|
+
const root = externalRoot();
|
|
149
|
+
if (!fs.existsSync(root)) return [];
|
|
150
|
+
const out: SourceInventoryEntry[] = [];
|
|
151
|
+
let entries: fs.Dirent[];
|
|
152
|
+
try { entries = fs.readdirSync(root, { withFileTypes: true }); }
|
|
153
|
+
catch { return []; }
|
|
154
|
+
for (const sourceEntry of entries) {
|
|
155
|
+
if (!sourceEntry.isDirectory()) continue;
|
|
156
|
+
const sourceName = sourceEntry.name;
|
|
157
|
+
const sourceDir = path.join(root, sourceName);
|
|
158
|
+
const providers: Record<string, string[]> = {};
|
|
159
|
+
let categoryEntries: fs.Dirent[];
|
|
160
|
+
try { categoryEntries = fs.readdirSync(sourceDir, { withFileTypes: true }); }
|
|
161
|
+
catch { continue; }
|
|
162
|
+
for (const categoryEntry of categoryEntries) {
|
|
163
|
+
if (!categoryEntry.isDirectory()) continue;
|
|
164
|
+
const category = categoryEntry.name;
|
|
165
|
+
const categoryDir = path.join(sourceDir, category);
|
|
166
|
+
let typeEntries: fs.Dirent[];
|
|
167
|
+
try { typeEntries = fs.readdirSync(categoryDir, { withFileTypes: true }); }
|
|
168
|
+
catch { continue; }
|
|
169
|
+
const types: string[] = [];
|
|
170
|
+
for (const typeEntry of typeEntries) {
|
|
171
|
+
if (!typeEntry.isDirectory()) continue;
|
|
172
|
+
// Only count it as a provider if a manifest file exists
|
|
173
|
+
const typeDir = path.join(categoryDir, typeEntry.name);
|
|
174
|
+
const hasV1 = fs.existsSync(path.join(typeDir, 'provider.v1.json'));
|
|
175
|
+
const hasV0 = fs.existsSync(path.join(typeDir, 'provider.json'));
|
|
176
|
+
if (hasV1 || hasV0) types.push(typeEntry.name);
|
|
177
|
+
}
|
|
178
|
+
if (types.length > 0) providers[category] = types;
|
|
179
|
+
}
|
|
180
|
+
out.push({ sourceName, providers });
|
|
181
|
+
}
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* For a given category+type, list every source that currently exposes it.
|
|
187
|
+
* Returns source names in disk-walk order; callers can use the first one
|
|
188
|
+
* when no explicit active selection exists.
|
|
189
|
+
*/
|
|
190
|
+
export function sourcesProviding(category: string, type: string): string[] {
|
|
191
|
+
const inventory = inventoryExternalSources();
|
|
192
|
+
return inventory
|
|
193
|
+
.filter(s => (s.providers[category] || []).includes(type))
|
|
194
|
+
.map(s => s.sourceName);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Resolve which source should be active for a given category+type.
|
|
199
|
+
* - If exactly one source provides it → that source.
|
|
200
|
+
* - If multiple sources provide it → the one named in providers-active.json
|
|
201
|
+
* (when present) or null (ambiguous; loader should warn and pick
|
|
202
|
+
* the first deterministically so daemon doesn't refuse to boot).
|
|
203
|
+
* - If none → null.
|
|
204
|
+
*/
|
|
205
|
+
export function resolveActiveSource(
|
|
206
|
+
category: string,
|
|
207
|
+
type: string,
|
|
208
|
+
activeFile?: ProvidersActiveFile,
|
|
209
|
+
): { source: string | null; ambiguous: boolean; candidates: string[] } {
|
|
210
|
+
const candidates = sourcesProviding(category, type);
|
|
211
|
+
if (candidates.length === 0) return { source: null, ambiguous: false, candidates };
|
|
212
|
+
if (candidates.length === 1) return { source: candidates[0], ambiguous: false, candidates };
|
|
213
|
+
const explicit = (activeFile ?? loadProvidersActive()).active[type];
|
|
214
|
+
if (explicit && candidates.includes(explicit)) {
|
|
215
|
+
return { source: explicit, ambiguous: false, candidates };
|
|
216
|
+
}
|
|
217
|
+
return { source: candidates[0], ambiguous: true, candidates };
|
|
218
|
+
}
|
|
@@ -20,7 +20,7 @@ import { LOG } from '../logging/logger.js';
|
|
|
20
20
|
import { buildPersistedProviderEffectMessage, normalizeProviderEffects } from './control-effects.js';
|
|
21
21
|
import { validateReadChatResultPayload } from './read-chat-contract.js';
|
|
22
22
|
import type { ChatMessage } from '../types.js';
|
|
23
|
-
import { formatAutoApprovalMessage,
|
|
23
|
+
import { formatAutoApprovalMessage, pickAutoApprovalButton } from './approval-utils.js';
|
|
24
24
|
import { mergeProviderPatchState, resolveProviderStateSurface } from './provider-patch-state.js';
|
|
25
25
|
import { buildChatMessage, buildRuntimeSystemChatMessage, normalizeChatMessages, extractFinalSummaryFromMessages } from './chat-message-normalization.js';
|
|
26
26
|
import { getProviderSessionCapabilities, IDE_PROVIDER_SESSION_CAPABILITIES_BASE } from './open-panel-support.js';
|
|
@@ -43,6 +43,20 @@ type ReadChatPayload = {
|
|
|
43
43
|
[key: string]: unknown;
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
+
async function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {
|
|
47
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
48
|
+
try {
|
|
49
|
+
return await Promise.race([
|
|
50
|
+
promise,
|
|
51
|
+
new Promise<never>((_, reject) => {
|
|
52
|
+
timer = setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
53
|
+
}),
|
|
54
|
+
]);
|
|
55
|
+
} finally {
|
|
56
|
+
if (timer) clearTimeout(timer);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
46
60
|
export class IdeProviderInstance implements ProviderInstance {
|
|
47
61
|
readonly type: string;
|
|
48
62
|
readonly category = 'ide' as const;
|
|
@@ -91,8 +105,8 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
91
105
|
// Sync Monitor config
|
|
92
106
|
this.monitor.updateConfig({
|
|
93
107
|
approvalAlert: this.settings.approvalAlert !== false,
|
|
94
|
-
|
|
95
|
-
|
|
108
|
+
noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
|
|
109
|
+
noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
|
|
96
110
|
});
|
|
97
111
|
}
|
|
98
112
|
|
|
@@ -245,11 +259,16 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
245
259
|
}
|
|
246
260
|
|
|
247
261
|
updateSettings(newSettings: Record<string, any>): void {
|
|
248
|
-
|
|
262
|
+
// Merge (not replace): a key omitted from newSettings preserves its existing
|
|
263
|
+
// value, a key present (even false) overrides. Mirrors cli-provider-instance —
|
|
264
|
+
// a partial mesh relay-stamp must not wipe launch-time settings such as
|
|
265
|
+
// autoApprove, while the dashboard toggle's full settings object still applies
|
|
266
|
+
// an explicit autoApprove:false. See cli-provider-instance.updateSettings.
|
|
267
|
+
this.settings = { ...this.settings, ...newSettings };
|
|
249
268
|
this.monitor.updateConfig({
|
|
250
269
|
approvalAlert: this.settings.approvalAlert !== false,
|
|
251
|
-
|
|
252
|
-
|
|
270
|
+
noProgressAlert: (this.settings.noProgressAlert ?? this.settings.longGeneratingAlert) !== false,
|
|
271
|
+
noProgressThresholdSec: this.settings.noProgressThresholdSec ?? this.settings.longGeneratingThresholdSec ?? 180,
|
|
253
272
|
});
|
|
254
273
|
}
|
|
255
274
|
|
|
@@ -320,7 +339,7 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
320
339
|
if (webviewScript) {
|
|
321
340
|
const matchText = this.provider.webviewMatchText;
|
|
322
341
|
const matchFn = matchText ? (body: string) => body.includes(matchText) : undefined;
|
|
323
|
-
const webviewRaw = await cdp.evaluateInWebviewFrame(webviewScript, matchFn);
|
|
342
|
+
const webviewRaw = await withTimeout(cdp.evaluateInWebviewFrame(webviewScript, matchFn), 30000, 'evaluateInWebviewFrame');
|
|
324
343
|
if (webviewRaw) {
|
|
325
344
|
raw = typeof webviewRaw === 'string' ? (() => { try { return JSON.parse(webviewRaw); } catch { return null; } })() : webviewRaw;
|
|
326
345
|
}
|
|
@@ -331,7 +350,7 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
331
350
|
if (!raw) {
|
|
332
351
|
const readChatScript = this.getReadChatScript();
|
|
333
352
|
if (!readChatScript) return;
|
|
334
|
-
raw = await cdp.evaluate(readChatScript, 30000);
|
|
353
|
+
raw = await withTimeout(cdp.evaluate(readChatScript, 30000), 30000, 'evaluate.readChatScript');
|
|
335
354
|
if (typeof raw === 'string') {
|
|
336
355
|
try { raw = JSON.parse(raw); } catch { return; }
|
|
337
356
|
}
|
|
@@ -398,7 +417,7 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
398
417
|
const persistedMessages = chat.messages || messages;
|
|
399
418
|
if (persistedMessages.length > 0) {
|
|
400
419
|
let toSave = persistedMessages;
|
|
401
|
-
if (chat.status === 'generating' || chat.status === 'long_generating') {
|
|
420
|
+
if (chat.status === 'generating' || chat.status === 'no_progress' || chat.status === 'long_generating') {
|
|
402
421
|
// Find and exclude last assistant message
|
|
403
422
|
const lastIdx = toSave.length - 1;
|
|
404
423
|
if (lastIdx >= 0 && toSave[lastIdx].role === 'assistant') {
|
|
@@ -489,7 +508,11 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
489
508
|
}
|
|
490
509
|
|
|
491
510
|
// Monitor check (cooldown based notification)
|
|
492
|
-
|
|
511
|
+
// Approval pending is detected from the raw status: auto-approve synthesizes
|
|
512
|
+
// `waiting_approval` → 'generating', so the no-progress watchdog must be told
|
|
513
|
+
// to hold its timer during the wait rather than count it as a stall.
|
|
514
|
+
const approvalPending = rawAgentStatus === 'waiting_approval';
|
|
515
|
+
const monitorEvents = this.monitor.check(agentKey, agentStatus, now, progressFingerprint, approvalPending);
|
|
493
516
|
for (const me of monitorEvents) {
|
|
494
517
|
this.pushEvent({ event: me.type, agentKey: me.agentKey, message: me.message, elapsedSec: me.elapsedSec, timestamp: me.timestamp });
|
|
495
518
|
}
|
|
@@ -694,7 +717,7 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
694
717
|
|
|
695
718
|
this.autoApproveBusy = true;
|
|
696
719
|
try {
|
|
697
|
-
const { label: targetButton } =
|
|
720
|
+
const { label: targetButton } = pickAutoApprovalButton(_chatData?.activeModal?.buttons);
|
|
698
721
|
|
|
699
722
|
const script = scriptFn({ action: 'approve', button: targetButton, buttonText: targetButton });
|
|
700
723
|
if (!script) return;
|
|
@@ -706,7 +729,7 @@ export class IdeProviderInstance implements ProviderInstance {
|
|
|
706
729
|
);
|
|
707
730
|
|
|
708
731
|
LOG.info('IdeInstance', `[IdeInstance:${this.type}] autoApprove: executing resolveAction for "${targetButton}"`);
|
|
709
|
-
let rawResult = await cdp.evaluate(script, 10000);
|
|
732
|
+
let rawResult = await withTimeout(cdp.evaluate(script, 10000), 10000, 'evaluate.autoApprove');
|
|
710
733
|
if (typeof rawResult === 'string') {
|
|
711
734
|
try { rawResult = JSON.parse(rawResult); } catch { }
|
|
712
735
|
}
|