@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +23 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +71 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +64 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +48 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +152 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router-aggregate-status.d.ts +24 -0
- package/dist/commands/router-mesh-session-owner.d.ts +59 -0
- package/dist/commands/router-refine.d.ts +151 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +203 -15
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +11 -0
- package/dist/config/config.d.ts +19 -0
- package/dist/config/mesh-config.d.ts +65 -0
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/registry-resolver.d.ts +54 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/config/state-store.d.ts +30 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/cli-detector.d.ts +17 -0
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +26 -2
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +80 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +70 -17
- package/dist/index.js +53532 -19073
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53283 -18989
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/debug-config.d.ts +16 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +256 -0
- package/dist/mesh/coordinator-prompt.d.ts +76 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +203 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
- package/dist/mesh/mesh-event-classify.d.ts +7 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +258 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +21 -1
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +139 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +281 -0
- package/dist/mesh/mesh-node-identity.d.ts +310 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
- package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
- package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
- package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +457 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +567 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +392 -1
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +97 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +46 -0
- package/dist/providers/chat-message-normalization.d.ts +58 -1
- package/dist/providers/cli-provider-effect-format.d.ts +30 -0
- package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
- package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
- package/dist/providers/cli-provider-instance-types.d.ts +45 -0
- package/dist/providers/cli-provider-instance.d.ts +426 -30
- package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
- package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
- package/dist/providers/contracts.d.ts +196 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +79 -0
- package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +44 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +30 -0
- package/dist/providers/provider-instance.d.ts +31 -1
- package/dist/providers/provider-loader.d.ts +42 -5
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +98 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +449 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +202 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +244 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +616 -12
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/session-host/managed-host.d.ts +64 -0
- package/dist/session-host/runtime-surface.d.ts +10 -16
- package/dist/sessions/registry.d.ts +26 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +110 -55
- package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +27 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +20 -6
- package/package.json +11 -4
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +80 -14
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1282 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2788 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.d.ts +2 -0
- package/src/commands/cli-manager.ts +724 -27
- package/src/commands/handler.ts +865 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +857 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +125 -0
- package/src/commands/low-family/daemon-lifecycle.ts +120 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +282 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +270 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1268 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +153 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router-aggregate-status.ts +209 -0
- package/src/commands/router-mesh-session-owner.ts +114 -0
- package/src/commands/router-refine.ts +1794 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +567 -4149
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +517 -24
- package/src/config/config.ts +30 -0
- package/src/config/mesh-config.ts +300 -24
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/registry-resolver.ts +100 -0
- package/src/config/repo-settings.ts +111 -0
- package/src/config/state-store.ts +55 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +94 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +112 -16
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +822 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +190 -13
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/debug-config.ts +25 -0
- package/src/logging/debug-trace.ts +7 -2
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +510 -0
- package/src/mesh/coordinator-prompt.ts +627 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +706 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-completion-synthesis.ts +416 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +284 -0
- package/src/mesh/mesh-event-classify.ts +78 -0
- package/src/mesh/mesh-event-forwarding.ts +2030 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +1548 -0
- package/src/mesh/mesh-events-stale.ts +452 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +43 -1035
- package/src/mesh/mesh-fast-forward.ts +856 -0
- package/src/mesh/mesh-host-ownership.ts +41 -3
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +897 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +695 -0
- package/src/mesh/mesh-node-identity.ts +2065 -0
- package/src/mesh/mesh-queue-assignment.ts +2498 -0
- package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
- package/src/mesh/mesh-reconcile-config.ts +66 -0
- package/src/mesh/mesh-reconcile-identity.ts +103 -0
- package/src/mesh/mesh-reconcile-loop.ts +1696 -0
- package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1792 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-remote-event-pull.ts +279 -0
- package/src/mesh/mesh-review-inbox.ts +308 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +2292 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1489 -145
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +129 -12
- package/src/mesh/worktree-bootstrap-config.ts +599 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +100 -6
- package/src/providers/chat-message-normalization.ts +126 -4
- package/src/providers/cli-provider-effect-format.ts +53 -0
- package/src/providers/cli-provider-history-dedup.ts +75 -0
- package/src/providers/cli-provider-input-prompt.ts +133 -0
- package/src/providers/cli-provider-instance-types.ts +131 -0
- package/src/providers/cli-provider-instance.ts +2771 -499
- package/src/providers/cli-provider-status-helpers.ts +123 -0
- package/src/providers/cli-provider-transcript-merge.ts +114 -0
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +207 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +105 -0
- package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +617 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +24 -1
- package/src/providers/provider-loader.ts +700 -55
- package/src/providers/provider-schema.ts +93 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +246 -0
- package/src/providers/spec/cli-adapter.ts +1064 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1528 -0
- package/src/providers/spec/fsm-evaluator.ts +290 -0
- package/src/providers/spec/fsm-loader.ts +128 -0
- package/src/providers/spec/fsm-types.ts +301 -0
- package/src/providers/spec/native-history-executor.ts +1241 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +284 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +861 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/session-host/managed-host.ts +218 -0
- package/src/session-host/runtime-surface.ts +20 -80
- package/src/sessions/registry.ts +44 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +148 -55
- package/src/status/builders.ts +69 -6
- package/src/status/chat-tail-hot-sessions.ts +117 -2
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +100 -27
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +26 -6
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,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
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ManualAttendanceTracker — provider-agnostic "is a human driving this session
|
|
3
|
+
* right now" signal, used to suppress auto-approve while the user is taking
|
|
4
|
+
* manual control of a session from the dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists
|
|
7
|
+
* ---------------
|
|
8
|
+
* When `autoApprove` is on, an approval modal is auto-dismissed within a few
|
|
9
|
+
* hundred ms of appearing. For a background mesh worker that is exactly the
|
|
10
|
+
* desired delegated behavior. But for a session the user is actively watching
|
|
11
|
+
* and operating (a base-node / foreground session), the auto-fire closes the
|
|
12
|
+
* modal before the human can pick a button — and likewise fights their use of
|
|
13
|
+
* the controlbar. The fix is to give the human a short quiet window: while they
|
|
14
|
+
* are attending the session by hand, auto-approve holds; once they go idle it
|
|
15
|
+
* resumes.
|
|
16
|
+
*
|
|
17
|
+
* The tracker holds only a timestamp. The *signal* — which commands count as
|
|
18
|
+
* "a human attending" — is decided by the caller (the command handler), and is
|
|
19
|
+
* the same set for every provider: foreground tab selection (select_session /
|
|
20
|
+
* open_panel), controlbar use (invoke_provider_script / set_mode / change_model
|
|
21
|
+
* / set_thought_level), manual approval (resolve_action) and manual terminal
|
|
22
|
+
* input (pty_input). Notably NOT send_chat, which is also how a coordinator
|
|
23
|
+
* delegates a task to a worker — counting it would wrongly suppress the
|
|
24
|
+
* worker's delegated auto-approve.
|
|
25
|
+
*
|
|
26
|
+
* Because a background worker never receives any of those attending commands,
|
|
27
|
+
* it is never "attended", so its delegated auto-approve is unaffected. The
|
|
28
|
+
* mechanism is therefore provider-common AND preserves worker auto-approve
|
|
29
|
+
* without any per-provider branching.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* How long after the last manual interaction auto-approve stays suppressed.
|
|
34
|
+
*
|
|
35
|
+
* Trade-off: long enough that after foregrounding a session's tab the user has
|
|
36
|
+
* a realistic chance to act on an incoming approval (the auto-approve settle
|
|
37
|
+
* window is only ~600ms, so a human cannot out-race it), yet short enough that
|
|
38
|
+
* a session left unattended — e.g. a worker tab the user briefly peeked at —
|
|
39
|
+
* resumes auto-approving within about a minute. Re-armed on every attending
|
|
40
|
+
* command, so a user who keeps interacting keeps the window fresh.
|
|
41
|
+
*/
|
|
42
|
+
export const AUTO_APPROVE_MANUAL_ATTENDANCE_SUPPRESS_MS = 60_000;
|
|
43
|
+
|
|
44
|
+
export class ManualAttendanceTracker {
|
|
45
|
+
private lastInteractionAt = 0;
|
|
46
|
+
|
|
47
|
+
constructor(private readonly suppressMs: number = AUTO_APPROVE_MANUAL_ATTENDANCE_SUPPRESS_MS) {}
|
|
48
|
+
|
|
49
|
+
/** Record that a human just drove this session by hand. */
|
|
50
|
+
note(now = Date.now()): void {
|
|
51
|
+
this.lastInteractionAt = now;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** True while a manual interaction is recent enough to suppress auto-approve. */
|
|
55
|
+
isAttended(now = Date.now()): boolean {
|
|
56
|
+
return this.lastInteractionAt > 0 && (now - this.lastInteractionAt) < this.suppressMs;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Milliseconds remaining in the current suppression window, or 0 when not
|
|
61
|
+
* attended. Used to re-arm a re-check timer so auto-approve fires the moment
|
|
62
|
+
* the window lapses even if the PTY/agent has since gone silent.
|
|
63
|
+
*/
|
|
64
|
+
remainingMs(now = Date.now()): number {
|
|
65
|
+
if (this.lastInteractionAt <= 0) return 0;
|
|
66
|
+
return Math.max(0, this.suppressMs - (now - this.lastInteractionAt));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The session-scoped commands that count as "a human is attending this session
|
|
72
|
+
* by hand". Shared so the command handler and any forward path agree on one
|
|
73
|
+
* definition. Deliberately excludes send_chat (coordinator task delegation) and
|
|
74
|
+
* pure read commands (read_chat / list_chats — passive polling, not driving).
|
|
75
|
+
*/
|
|
76
|
+
export const MANUAL_ATTENDANCE_COMMANDS: ReadonlySet<string> = new Set([
|
|
77
|
+
'select_session',
|
|
78
|
+
'open_panel',
|
|
79
|
+
'invoke_provider_script',
|
|
80
|
+
'set_mode',
|
|
81
|
+
'change_model',
|
|
82
|
+
'set_thought_level',
|
|
83
|
+
'resolve_action',
|
|
84
|
+
'pty_input',
|
|
85
|
+
]);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The subset of {@link MANUAL_ATTENDANCE_COMMANDS} that are PASSIVE view-only
|
|
89
|
+
* actions — foregrounding a session's tab / opening its panel. They convey "I am
|
|
90
|
+
* looking at this session", not "I am driving it", and carry no user input.
|
|
91
|
+
*
|
|
92
|
+
* For a foreground (base-node) session these still attend: a user who
|
|
93
|
+
* foregrounds their own session should get the quiet window so an incoming
|
|
94
|
+
* approval stays visible for them to act on. But for a DELEGATED worker session
|
|
95
|
+
* a passive peek must NOT attend — a coordinator merely opening a worker's panel
|
|
96
|
+
* to watch progress would otherwise suppress that worker's delegated
|
|
97
|
+
* auto-approve for the whole window (secondary cause, #137). The per-instance
|
|
98
|
+
* hook decides: it drops a passive stamp only when the session is a delegated
|
|
99
|
+
* worker, so explicit input (controlbar / resolve_action / pty_input) still
|
|
100
|
+
* attends a worker and a foreground session is unaffected.
|
|
101
|
+
*/
|
|
102
|
+
export const MANUAL_ATTENDANCE_PASSIVE_VIEW_COMMANDS: ReadonlySet<string> = new Set([
|
|
103
|
+
'select_session',
|
|
104
|
+
'open_panel',
|
|
105
|
+
]);
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* antigravity-claim-registry — daemon-local conversation ownership map.
|
|
3
|
+
*
|
|
4
|
+
* Antigravity CLI writes each conversation into its own per-session SQLite db
|
|
5
|
+
* at ~/.gemini/antigravity-cli/conversations/<uuid>.db. But before a daemon
|
|
6
|
+
* session has resolved its provider session id, the discovery resolver used to
|
|
7
|
+
* fall back to "the newest .db on disk by mtime". Two sessions started within a
|
|
8
|
+
* few ms of each other on ONE daemon therefore both grabbed the SAME newest
|
|
9
|
+
* store — so one session's injected prompt and the other's assistant completion
|
|
10
|
+
* cross-routed, and an unrelated turn completed the wrong task (RCA: a
|
|
11
|
+
* coordinator session ended up reading the owner's conversation .db, and the
|
|
12
|
+
* coordinator's own injected instruction was absent from the bound store).
|
|
13
|
+
*
|
|
14
|
+
* This registry records which live daemon session currently owns a given
|
|
15
|
+
* conversation uuid. The discovery resolver (dispatcher.resolveAntigravityPath)
|
|
16
|
+
* consults it to:
|
|
17
|
+
* (1) never hand a conversation already owned by a DIFFERENT live session to
|
|
18
|
+
* an as-yet-unbound one — two sessions can never resolve to the same .db;
|
|
19
|
+
* (2) LOCK a session to the first conversation it binds, so a later, newer
|
|
20
|
+
* .db on disk cannot re-bind an already-bound session on a subsequent
|
|
21
|
+
* mtime-ordered read.
|
|
22
|
+
*
|
|
23
|
+
* Ownership is keyed by a per-session owner token (see antigravityOwnerToken)
|
|
24
|
+
* that BOTH the resolver and the provider instance derive identically from the
|
|
25
|
+
* same inputs (workspace + spawn time, or the instance id), so the instance can
|
|
26
|
+
* release its claims deterministically on shutdown.
|
|
27
|
+
*
|
|
28
|
+
* A claim not refreshed within CLAIM_STALE_MS is treated as abandoned — a
|
|
29
|
+
* safety net for a session that died without an explicit release. Live sessions
|
|
30
|
+
* poll native history far more frequently than this window, so an active owner
|
|
31
|
+
* never lapses; only a crashed/leaked owner's claim ages out.
|
|
32
|
+
*
|
|
33
|
+
* OSS code (AGPL-3.0). Must not import from packages/ (proprietary).
|
|
34
|
+
*/
|
|
35
|
+
'use strict';
|
|
36
|
+
|
|
37
|
+
interface ConversationClaim {
|
|
38
|
+
owner: string;
|
|
39
|
+
/** Last time this owner (re)confirmed the claim. Only consulted by the
|
|
40
|
+
* stale-claim safety net; an active owner refreshes it on every resolve. */
|
|
41
|
+
refreshedAtMs: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const claimsByUuid = new Map<string, ConversationClaim>();
|
|
45
|
+
|
|
46
|
+
/** A claim older than this with no refresh is reclaimable (owner presumed dead). */
|
|
47
|
+
export const CLAIM_STALE_MS = 10 * 60 * 1000;
|
|
48
|
+
|
|
49
|
+
function normalizeUuid(uuid: string): string {
|
|
50
|
+
return String(uuid || '').trim().toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Derive the per-session owner token, keyed ONLY on the stable instanceId
|
|
55
|
+
* (== the session registry sessionId == the read path's targetSessionId). Both
|
|
56
|
+
* the dispatcher (read side) and the provider instance (claim/release side) pass
|
|
57
|
+
* this same id, so their tokens always agree and the claim isolation holds.
|
|
58
|
+
*
|
|
59
|
+
* Returns '' when no instanceId is available — the caller then skips claiming
|
|
60
|
+
* (the exclusion checks still run against existing claims). This is the SSOT
|
|
61
|
+
* rule: there is exactly ONE token form. The removed legacy fallback derived a
|
|
62
|
+
* `spawn:<workspace>:<sessionStartedAtMs>` token from the spawn timestamp when
|
|
63
|
+
* the instanceId was missing; because one session's spawn time is sampled
|
|
64
|
+
* independently at three sites (instance startedAt, adapter spawnedAtMs, registry
|
|
65
|
+
* spawnedAtMs) those never matched, so the SAME session's instance-side and
|
|
66
|
+
* read-side tokens silently diverged and the claim mutual-exclusion collapsed
|
|
67
|
+
* (the antigravity conversation crosswire). An empty token (skip-claim) is
|
|
68
|
+
* strictly safer than a token that disagrees with the same session's other
|
|
69
|
+
* token. workspace/sessionStartedAtMs are kept in the signature for call-site
|
|
70
|
+
* compatibility but no longer affect the token.
|
|
71
|
+
*/
|
|
72
|
+
export function antigravityOwnerToken(
|
|
73
|
+
workspace: string,
|
|
74
|
+
sessionStartedAtMs: number,
|
|
75
|
+
instanceId?: string,
|
|
76
|
+
): string {
|
|
77
|
+
void workspace; void sessionStartedAtMs;
|
|
78
|
+
const iid = typeof instanceId === 'string' ? instanceId.trim() : '';
|
|
79
|
+
return iid ? `iid:${iid}` : '';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Claim `uuid` for `owner`. Succeeds (and refreshes) when the conversation is
|
|
84
|
+
* unclaimed, already owned by this owner, or held by a stale (abandoned) owner.
|
|
85
|
+
* Fails when a DIFFERENT live owner holds it. Returns whether `owner` holds the
|
|
86
|
+
* claim after the call.
|
|
87
|
+
*/
|
|
88
|
+
export function claimAntigravityConversation(uuid: string, owner: string, now: number = Date.now()): boolean {
|
|
89
|
+
const key = normalizeUuid(uuid);
|
|
90
|
+
if (!key || !owner) return false;
|
|
91
|
+
const existing = claimsByUuid.get(key);
|
|
92
|
+
if (existing && existing.owner !== owner && (now - existing.refreshedAtMs) < CLAIM_STALE_MS) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
claimsByUuid.set(key, { owner, refreshedAtMs: now });
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** True when `uuid` is held by a live owner OTHER than `owner`. */
|
|
100
|
+
export function isAntigravityConversationClaimedByOther(uuid: string, owner: string, now: number = Date.now()): boolean {
|
|
101
|
+
const key = normalizeUuid(uuid);
|
|
102
|
+
if (!key) return false;
|
|
103
|
+
const existing = claimsByUuid.get(key);
|
|
104
|
+
if (!existing) return false;
|
|
105
|
+
if (existing.owner === owner) return false;
|
|
106
|
+
return (now - existing.refreshedAtMs) < CLAIM_STALE_MS;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The live owner of `uuid`, or undefined when unclaimed or stale. */
|
|
110
|
+
export function antigravityConversationOwner(uuid: string, now: number = Date.now()): string | undefined {
|
|
111
|
+
const key = normalizeUuid(uuid);
|
|
112
|
+
if (!key) return undefined;
|
|
113
|
+
const existing = claimsByUuid.get(key);
|
|
114
|
+
if (!existing) return undefined;
|
|
115
|
+
if ((now - existing.refreshedAtMs) >= CLAIM_STALE_MS) return undefined;
|
|
116
|
+
return existing.owner;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Release a single conversation, only if held by `owner` (or `owner` empty). */
|
|
120
|
+
export function releaseAntigravityConversation(uuid: string, owner?: string): void {
|
|
121
|
+
const key = normalizeUuid(uuid);
|
|
122
|
+
if (!key) return;
|
|
123
|
+
const existing = claimsByUuid.get(key);
|
|
124
|
+
if (existing && (!owner || existing.owner === owner)) claimsByUuid.delete(key);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Release every conversation held by `owner` (called on session shutdown). */
|
|
128
|
+
export function releaseAntigravityOwner(owner: string): void {
|
|
129
|
+
if (!owner) return;
|
|
130
|
+
for (const [key, claim] of claimsByUuid) {
|
|
131
|
+
if (claim.owner === owner) claimsByUuid.delete(key);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Test-only: wipe all claims so each test starts from a clean registry. */
|
|
136
|
+
export function __resetAntigravityClaimRegistry(): void {
|
|
137
|
+
claimsByUuid.clear();
|
|
138
|
+
}
|