@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.491
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 +66 -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 +53556 -19074
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53380 -19063
- 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 +1309 -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,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermes Agent — native history adapter.
|
|
3
|
+
*
|
|
4
|
+
* Hermes persists state in ~/.hermes/state.db (SQLite, better-sqlite3):
|
|
5
|
+
* sessions(id, source, started_at, ended_at, message_count, ...)
|
|
6
|
+
* messages(id, session_id, role, content, timestamp, ...)
|
|
7
|
+
*
|
|
8
|
+
* Earlier releases dumped per-session JSON files under ~/.hermes/sessions/;
|
|
9
|
+
* recent hermes (≥ 0.14) writes only to state.db. We read straight from
|
|
10
|
+
* the db when available and fall back to scanning legacy JSON dumps for
|
|
11
|
+
* archived sessions.
|
|
12
|
+
*
|
|
13
|
+
* The dispatcher hands us a sourcePath (the file the resolveHermesPath
|
|
14
|
+
* function picks). For the SQLite case the "path" is the db file itself
|
|
15
|
+
* and we resolve the most recent cli-source session inside readSession.
|
|
16
|
+
*/
|
|
17
|
+
'use strict';
|
|
18
|
+
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import * as os from 'node:os';
|
|
22
|
+
import { loadBetterSqlite3 } from '../../system/load-better-sqlite3.js';
|
|
23
|
+
|
|
24
|
+
export interface NativeHistoryMessage {
|
|
25
|
+
id: string;
|
|
26
|
+
role: 'user' | 'assistant' | 'system';
|
|
27
|
+
content: string;
|
|
28
|
+
receivedAt: number;
|
|
29
|
+
kind?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface NativeHistorySession {
|
|
33
|
+
messages: NativeHistoryMessage[];
|
|
34
|
+
providerSessionId: string;
|
|
35
|
+
source: 'provider-native';
|
|
36
|
+
sourcePath: string;
|
|
37
|
+
sourceMtimeMs: number;
|
|
38
|
+
nativeHistoryCoverage: 'full';
|
|
39
|
+
workspace?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface NativeHistorySessionMeta {
|
|
43
|
+
historySessionId: string;
|
|
44
|
+
sessionId: string;
|
|
45
|
+
sourcePath: string;
|
|
46
|
+
sourceMtimeMs: number;
|
|
47
|
+
messageCount: number;
|
|
48
|
+
firstMessageAt: number;
|
|
49
|
+
lastMessageAt: number;
|
|
50
|
+
sessionTitle?: string;
|
|
51
|
+
preview?: string;
|
|
52
|
+
workspace?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const HERMES_STATE_DB = path.join(os.homedir(), '.hermes', 'state.db');
|
|
56
|
+
const HERMES_LEGACY_SESSIONS_DIR = path.join(os.homedir(), '.hermes', 'sessions');
|
|
57
|
+
|
|
58
|
+
function statMtimeMs(p: string): number {
|
|
59
|
+
try { return Math.floor(fs.statSync(p).mtimeMs); } catch { return 0; }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function openDb(): any | null {
|
|
63
|
+
if (!fs.existsSync(HERMES_STATE_DB)) return null;
|
|
64
|
+
try {
|
|
65
|
+
const Database = loadBetterSqlite3();
|
|
66
|
+
return new Database(HERMES_STATE_DB, { readonly: true, fileMustExist: true });
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Expand an anchor session id to every session id in its logical cluster.
|
|
74
|
+
*
|
|
75
|
+
* hermes ≥0.14 splits a SINGLE logical turn across several `sessions` rows
|
|
76
|
+
* linked by `parent_session_id` (a 0-message intermediate row is common), and
|
|
77
|
+
* the turn's final assistant message lands in a DIFFERENT row than the one the
|
|
78
|
+
* daemon pins. A bidirectional walk — up the parent chain to the cluster root,
|
|
79
|
+
* then down through every descendant — returns the complete set from ANY anchor
|
|
80
|
+
* (root, middle, or leaf), mirroring the declarative executor's
|
|
81
|
+
* `session_cluster_query`. Falls back to the anchor alone if the schema has no
|
|
82
|
+
* `parent_session_id` column (older hermes) or the walk fails.
|
|
83
|
+
*/
|
|
84
|
+
function resolveClusterSessionIds(db: any, anchorId: string): string[] {
|
|
85
|
+
if (!anchorId) return [];
|
|
86
|
+
try {
|
|
87
|
+
const rows: any[] = db.prepare(
|
|
88
|
+
`WITH RECURSIVE
|
|
89
|
+
up(id) AS (
|
|
90
|
+
SELECT id FROM sessions WHERE id = ?
|
|
91
|
+
UNION
|
|
92
|
+
SELECT s.parent_session_id FROM sessions s JOIN up ON s.id = up.id
|
|
93
|
+
WHERE s.parent_session_id IS NOT NULL
|
|
94
|
+
),
|
|
95
|
+
cluster(id) AS (
|
|
96
|
+
SELECT id FROM up
|
|
97
|
+
UNION
|
|
98
|
+
SELECT s.id FROM sessions s JOIN cluster ON s.parent_session_id = cluster.id
|
|
99
|
+
)
|
|
100
|
+
SELECT id FROM cluster`,
|
|
101
|
+
).all(anchorId);
|
|
102
|
+
const ids = new Set<string>([anchorId]);
|
|
103
|
+
for (const r of rows) {
|
|
104
|
+
if (r && r.id != null && String(r.id)) ids.add(String(r.id));
|
|
105
|
+
}
|
|
106
|
+
return Array.from(ids);
|
|
107
|
+
} catch {
|
|
108
|
+
// No parent_session_id column (older hermes) or a walk failure — the
|
|
109
|
+
// single anchor is still a valid (degenerate) cluster.
|
|
110
|
+
return [anchorId];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function loadMessagesForSession(db: any, sessionId: string): NativeHistoryMessage[] {
|
|
115
|
+
// Read the WHOLE sub-session cluster, not just the pinned anchor. hermes
|
|
116
|
+
// ≥0.14 writes a turn's final assistant into a descendant sub-session row,
|
|
117
|
+
// so an anchor-only read misses it → read_chat shows zero assistant bubbles
|
|
118
|
+
// and the completion gate false-fires missing_final_assistant. Gather every
|
|
119
|
+
// cluster member (parent-chain walk) and merge; the SQL `ORDER BY timestamp`
|
|
120
|
+
// re-interleaves bubbles from different sub-sessions into true chronological
|
|
121
|
+
// order so the final assistant lands last.
|
|
122
|
+
const clusterIds = resolveClusterSessionIds(db, sessionId);
|
|
123
|
+
if (clusterIds.length === 0) return [];
|
|
124
|
+
const placeholders = clusterIds.map(() => '?').join(', ');
|
|
125
|
+
// Assistant turns whose finish_reason='tool_calls' persist an EMPTY
|
|
126
|
+
// `content` — their payload lives in the `tool_calls` column. Filtering on
|
|
127
|
+
// `content != ''` alone drops those rows, so a turn whose terminal message
|
|
128
|
+
// is a tool call surfaces zero assistant bubbles. Accept a row when either
|
|
129
|
+
// `content` OR `tool_calls` is non-empty, and project `tool_calls` into the
|
|
130
|
+
// content slot when `content` is empty so the bubble still carries text.
|
|
131
|
+
const rows: any[] = db.prepare(
|
|
132
|
+
`SELECT id, role, COALESCE(NULLIF(content, ''), tool_calls) AS content, timestamp
|
|
133
|
+
FROM messages
|
|
134
|
+
WHERE session_id IN (${placeholders})
|
|
135
|
+
AND ((content IS NOT NULL AND content != '') OR (tool_calls IS NOT NULL AND tool_calls != ''))
|
|
136
|
+
ORDER BY timestamp ASC, id ASC`,
|
|
137
|
+
).all(...clusterIds);
|
|
138
|
+
const out: NativeHistoryMessage[] = [];
|
|
139
|
+
for (const r of rows) {
|
|
140
|
+
const role = normalizeHermesRole(r.role);
|
|
141
|
+
// Hermes stores some tool/system rows under role='tool'; surface as
|
|
142
|
+
// 'assistant' so they don't get dropped on the daemon's chat schema
|
|
143
|
+
// validation (role must be user/assistant/system).
|
|
144
|
+
out.push({
|
|
145
|
+
id: String(r.id),
|
|
146
|
+
role,
|
|
147
|
+
content: String(r.content),
|
|
148
|
+
receivedAt: Math.floor(Number(r.timestamp) * 1000),
|
|
149
|
+
kind: 'standard',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function readSession(sessionPath: string, requestedSessionId?: string): NativeHistorySession | null {
|
|
156
|
+
if (!sessionPath) return null;
|
|
157
|
+
|
|
158
|
+
// Path mode A: SQLite — sourcePath is the state.db path.
|
|
159
|
+
if (sessionPath === HERMES_STATE_DB) {
|
|
160
|
+
const db = openDb();
|
|
161
|
+
if (!db) return null;
|
|
162
|
+
try {
|
|
163
|
+
const pinned = String(requestedSessionId || '').trim();
|
|
164
|
+
let sessionId: string;
|
|
165
|
+
if (pinned) {
|
|
166
|
+
// Session pin: the caller is already bound to a specific
|
|
167
|
+
// provider session, so read THAT session directly instead of
|
|
168
|
+
// the newest-wins pick below. hermes ≥0.14 writes a fresh
|
|
169
|
+
// `sessions` row per internal sub-session, so an unpinned
|
|
170
|
+
// `ORDER BY started_at DESC LIMIT 1` drifts to a different id
|
|
171
|
+
// on every read → re-bind churn + reading completion evidence
|
|
172
|
+
// from the wrong session. loadMessagesForSession returning
|
|
173
|
+
// rows validates the id exists.
|
|
174
|
+
sessionId = pinned;
|
|
175
|
+
} else {
|
|
176
|
+
// No bound id yet (discovery): pick the newest source='cli'
|
|
177
|
+
// session that has at least one persisted message. Use an
|
|
178
|
+
// EXISTS check against `messages` rather than the denormalized
|
|
179
|
+
// `message_count` column — a freshly-started session already
|
|
180
|
+
// has message rows while `message_count` (DEFAULT 0) can still
|
|
181
|
+
// lag at 0, and the old predicate excluded exactly that
|
|
182
|
+
// just-created session, resolving to nothing.
|
|
183
|
+
const row: any = db.prepare(
|
|
184
|
+
`SELECT id, started_at FROM sessions
|
|
185
|
+
WHERE source = 'cli'
|
|
186
|
+
AND EXISTS (SELECT 1 FROM messages m WHERE m.session_id = sessions.id)
|
|
187
|
+
ORDER BY started_at DESC LIMIT 1`,
|
|
188
|
+
).get();
|
|
189
|
+
if (!row) return null;
|
|
190
|
+
sessionId = String(row.id);
|
|
191
|
+
}
|
|
192
|
+
const messages = loadMessagesForSession(db, sessionId);
|
|
193
|
+
if (messages.length === 0) return null;
|
|
194
|
+
return {
|
|
195
|
+
messages,
|
|
196
|
+
providerSessionId: sessionId,
|
|
197
|
+
source: 'provider-native',
|
|
198
|
+
sourcePath: sessionPath,
|
|
199
|
+
sourceMtimeMs: statMtimeMs(sessionPath),
|
|
200
|
+
nativeHistoryCoverage: 'full',
|
|
201
|
+
};
|
|
202
|
+
} finally {
|
|
203
|
+
try { db.close(); } catch { /* ignore */ }
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Path mode B: legacy JSON dump — keep the old reader for archived
|
|
208
|
+
// sessions that pre-date the db format.
|
|
209
|
+
if (!path.isAbsolute(sessionPath) || !fs.existsSync(sessionPath)) return null;
|
|
210
|
+
let raw: any;
|
|
211
|
+
try { raw = JSON.parse(fs.readFileSync(sessionPath, 'utf8')); } catch { return null; }
|
|
212
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
213
|
+
const rawMessages = Array.isArray(raw.messages) ? raw.messages : [];
|
|
214
|
+
if (rawMessages.length === 0) return null;
|
|
215
|
+
const sourceMtimeMs = statMtimeMs(sessionPath);
|
|
216
|
+
const sessionStart = Number(raw.session_start) || sourceMtimeMs - rawMessages.length * 1000;
|
|
217
|
+
const messages: NativeHistoryMessage[] = [];
|
|
218
|
+
for (let i = 0; i < rawMessages.length; i += 1) {
|
|
219
|
+
const m = rawMessages[i];
|
|
220
|
+
const content = typeof m?.content === 'string' ? m.content : '';
|
|
221
|
+
if (!content) continue;
|
|
222
|
+
messages.push({
|
|
223
|
+
id: typeof m?.id === 'string' ? m.id : `msg_${i}`,
|
|
224
|
+
role: normalizeHermesRole(m?.role),
|
|
225
|
+
content,
|
|
226
|
+
receivedAt: sessionStart + i * 1000,
|
|
227
|
+
kind: 'standard',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (messages.length === 0) return null;
|
|
231
|
+
const sessionId = typeof raw.session_id === 'string' && raw.session_id
|
|
232
|
+
? raw.session_id
|
|
233
|
+
: path.basename(sessionPath, '.json').replace(/^session_/, '');
|
|
234
|
+
return {
|
|
235
|
+
messages,
|
|
236
|
+
providerSessionId: sessionId,
|
|
237
|
+
source: 'provider-native',
|
|
238
|
+
sourcePath: sessionPath,
|
|
239
|
+
sourceMtimeMs,
|
|
240
|
+
nativeHistoryCoverage: 'full',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export async function listSessions(_watchPath: string): Promise<NativeHistorySessionMeta[]> {
|
|
245
|
+
const out: NativeHistorySessionMeta[] = [];
|
|
246
|
+
|
|
247
|
+
const db = openDb();
|
|
248
|
+
if (db) {
|
|
249
|
+
try {
|
|
250
|
+
const rows: any[] = db.prepare(
|
|
251
|
+
`SELECT id, started_at, ended_at, message_count, title
|
|
252
|
+
FROM sessions
|
|
253
|
+
WHERE source = 'cli'
|
|
254
|
+
AND EXISTS (SELECT 1 FROM messages m WHERE m.session_id = sessions.id)
|
|
255
|
+
ORDER BY started_at DESC LIMIT 100`,
|
|
256
|
+
).all();
|
|
257
|
+
const mtime = statMtimeMs(HERMES_STATE_DB);
|
|
258
|
+
for (const r of rows) {
|
|
259
|
+
out.push({
|
|
260
|
+
historySessionId: String(r.id),
|
|
261
|
+
sessionId: String(r.id),
|
|
262
|
+
sourcePath: HERMES_STATE_DB,
|
|
263
|
+
sourceMtimeMs: mtime,
|
|
264
|
+
messageCount: Number(r.message_count) || 0,
|
|
265
|
+
firstMessageAt: Math.floor(Number(r.started_at) * 1000),
|
|
266
|
+
lastMessageAt: Math.floor(Number(r.ended_at || r.started_at) * 1000),
|
|
267
|
+
sessionTitle: typeof r.title === 'string' ? r.title : undefined,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
} finally {
|
|
271
|
+
try { db.close(); } catch { /* ignore */ }
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (fs.existsSync(HERMES_LEGACY_SESSIONS_DIR)) {
|
|
276
|
+
for (const name of fs.readdirSync(HERMES_LEGACY_SESSIONS_DIR)) {
|
|
277
|
+
if (!/^session_.*\.json$/.test(name)) continue;
|
|
278
|
+
const p = path.join(HERMES_LEGACY_SESSIONS_DIR, name);
|
|
279
|
+
const mtime = statMtimeMs(p);
|
|
280
|
+
if (!mtime) continue;
|
|
281
|
+
let raw: any;
|
|
282
|
+
try { raw = JSON.parse(fs.readFileSync(p, 'utf8')); } catch { continue; }
|
|
283
|
+
const msgs = Array.isArray(raw?.messages) ? raw.messages : [];
|
|
284
|
+
if (msgs.length === 0) continue;
|
|
285
|
+
const sessionId = typeof raw.session_id === 'string' && raw.session_id
|
|
286
|
+
? raw.session_id
|
|
287
|
+
: name.replace(/^session_/, '').replace(/\.json$/, '');
|
|
288
|
+
out.push({
|
|
289
|
+
historySessionId: sessionId,
|
|
290
|
+
sessionId,
|
|
291
|
+
sourcePath: p,
|
|
292
|
+
sourceMtimeMs: mtime,
|
|
293
|
+
messageCount: msgs.length,
|
|
294
|
+
firstMessageAt: Number(raw.session_start) || mtime,
|
|
295
|
+
lastMessageAt: Number(raw.last_updated) || mtime,
|
|
296
|
+
sessionTitle: typeof raw.title === 'string' ? raw.title : undefined,
|
|
297
|
+
preview: typeof msgs[0]?.content === 'string' ? String(msgs[0].content).slice(0, 80) : undefined,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
out.sort((a, b) => b.sourceMtimeMs - a.sourceMtimeMs);
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function normalizeHermesRole(r: any): 'user' | 'assistant' | 'system' {
|
|
307
|
+
const s = String(r ?? '').toLowerCase();
|
|
308
|
+
if (s === 'user' || s === 'human') return 'user';
|
|
309
|
+
if (s === 'assistant' || s === 'ai' || s === 'model') return 'assistant';
|
|
310
|
+
if (s === 'tool' || s === 'tool_result' || s === 'function') return 'assistant';
|
|
311
|
+
return 'system';
|
|
312
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* native-history — Daemon-side built-in adapters for CLI provider native history.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter reads conversation history directly from the CLI tool's on-disk
|
|
5
|
+
* storage without shelling out to a provider JS override script.
|
|
6
|
+
*
|
|
7
|
+
* OSS code (AGPL-3.0). Must not import from packages/ (proprietary).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
readSession as readClaudeCliSession,
|
|
12
|
+
listSessions as listClaudeCliSessions,
|
|
13
|
+
} from './claude-cli-transcript.js';
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
readSession as readCodexCliSession,
|
|
17
|
+
listSessions as listCodexCliSessions,
|
|
18
|
+
} from './codex-cli-transcript.js';
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
readSession as readAntigravityCliSession,
|
|
22
|
+
listSessions as listAntigravityCliSessions,
|
|
23
|
+
} from './antigravity-cli-transcript.js';
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
readSession as readHermesCliSession,
|
|
27
|
+
listSessions as listHermesCliSessions,
|
|
28
|
+
} from './hermes-cli-transcript.js';
|
|
29
|
+
|
|
30
|
+
export { createNativeHistoryDispatcher, type ReaderId } from './dispatcher.js';
|
|
@@ -306,6 +306,77 @@ export class ProviderInstanceManager {
|
|
|
306
306
|
return updated;
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
+
/** Stamp a mesh assignment on a single instance (used by mesh_send_task
|
|
310
|
+
* --direct so the worker's completion event has a coordinator routing
|
|
311
|
+
* marker in state.settings). Returns `{ stamped: true }` when the stamp was
|
|
312
|
+
* applied, or `{ stamped: false, reason }` when it was refused — the instance
|
|
313
|
+
* was missing / has no attach method, or the DOUBLE-DISPATCH idempotence guard
|
|
314
|
+
* fired (the same task is already running on another live session here). */
|
|
315
|
+
attachMeshAssignmentToInstance(instanceId: string, assignment: { meshId: string; nodeId?: string; taskId?: string; dispatchNonce?: number; coordinatorDaemonId?: string; coordinatorSessionId?: string }): { stamped: boolean; reason?: string } {
|
|
316
|
+
const inst = this.instances.get(instanceId);
|
|
317
|
+
if (!inst || typeof inst.attachMeshAssignment !== 'function') {
|
|
318
|
+
LOG.warn('MeshDispatch', `attachMeshAssignment skipped: instance ${instanceId} ${inst ? 'has no attach method' : 'not found'}`);
|
|
319
|
+
return { stamped: false, reason: inst ? 'instance_has_no_attach_method' : 'instance_not_found' };
|
|
320
|
+
}
|
|
321
|
+
// DOUBLE-DISPATCH stamp idempotence guard (defense in depth): refuse to stamp this
|
|
322
|
+
// (meshId, taskId) onto a SECOND instance when a DIFFERENT, still-live and actively
|
|
323
|
+
// working instance already holds the exact same task. Two sessions carrying one taskId
|
|
324
|
+
// double-execute the work (the auto-launch race RCA: a delayed claim by the original
|
|
325
|
+
// session plus the new session's post-boot claim sequentially stamp the same task —
|
|
326
|
+
// the atomic claim only blocks SIMULTANEOUS claims). A stale/dead/idle prior holder is
|
|
327
|
+
// NOT a conflict — a legitimate re-dispatch after a dispatch failure must still stamp.
|
|
328
|
+
if (assignment.taskId) {
|
|
329
|
+
const conflict = this.findLiveWorkingTaskHolder(assignment.meshId, assignment.taskId, instanceId);
|
|
330
|
+
if (conflict) {
|
|
331
|
+
LOG.warn('MeshDispatch', `attachMeshAssignment refused: task ${assignment.taskId} (mesh ${assignment.meshId}) is already being worked by live session ${conflict} — skipping duplicate stamp on ${instanceId}`);
|
|
332
|
+
return { stamped: false, reason: 'task_already_stamped_on_live_instance' };
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
inst.attachMeshAssignment(assignment);
|
|
336
|
+
LOG.info('MeshDispatch', `stamped mesh assignment on ${instanceId}: mesh=${assignment.meshId} node=${assignment.nodeId || ''} task=${assignment.taskId || ''} coordinator=${assignment.coordinatorDaemonId || ''}`);
|
|
337
|
+
return { stamped: true };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* DOUBLE-DISPATCH support: the id of another LIVE, actively-working instance that already
|
|
342
|
+
* holds (meshId, taskId), or null. "Live working" = stamped with this exact mesh+task AND
|
|
343
|
+
* currently mid-turn / booting toward it (generating / waiting on approval-or-choice /
|
|
344
|
+
* starting) — NOT idle, stopped, or errored. A stale/dead/idle holder is deliberately
|
|
345
|
+
* ignored so a legitimate re-dispatch (e.g. after a dispatch failure) is never blocked.
|
|
346
|
+
* The instance being stamped (excludeInstanceId) is skipped so re-stamping the same
|
|
347
|
+
* session stays idempotent. O(n) over instances — the count is small.
|
|
348
|
+
*/
|
|
349
|
+
private findLiveWorkingTaskHolder(meshId: string, taskId: string, excludeInstanceId: string): string | null {
|
|
350
|
+
// Mid-turn / booting statuses (top-level or activeChat). Anything else — idle, stopped,
|
|
351
|
+
// error — is not a live worker actively holding the task.
|
|
352
|
+
const working = new Set(['generating', 'waiting_approval', 'waiting_choice', 'starting', 'streaming', 'working', 'no_progress', 'long_generating']);
|
|
353
|
+
for (const [id, inst] of this.instances) {
|
|
354
|
+
if (id === excludeInstanceId) continue;
|
|
355
|
+
let state: ProviderState;
|
|
356
|
+
try {
|
|
357
|
+
state = inst.getState();
|
|
358
|
+
} catch {
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
const settings = (state.settings as Record<string, unknown>) || {};
|
|
362
|
+
if (settings.meshNodeFor !== meshId) continue;
|
|
363
|
+
if (settings.meshActiveTaskId !== taskId) continue;
|
|
364
|
+
const status = (typeof state.status === 'string' ? state.status : '').toLowerCase();
|
|
365
|
+
const chatStatus = (typeof state.activeChat?.status === 'string' ? state.activeChat.status : '').toLowerCase();
|
|
366
|
+
if (working.has(status) || working.has(chatStatus)) return id;
|
|
367
|
+
}
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** Clear a mesh assignment after the dispatched task reaches a terminal
|
|
372
|
+
* state (generating_completed / stopped / failed). */
|
|
373
|
+
detachMeshAssignmentFromInstance(instanceId: string): boolean {
|
|
374
|
+
const inst = this.instances.get(instanceId);
|
|
375
|
+
if (!inst || typeof inst.detachMeshAssignment !== 'function') return false;
|
|
376
|
+
inst.detachMeshAssignment();
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
|
|
309
380
|
refreshProviderDefinitions(resolveProvider: (providerType: string) => unknown): number {
|
|
310
381
|
let refreshed = 0;
|
|
311
382
|
for (const instance of this.instances.values()) {
|
|
@@ -12,10 +12,11 @@ import type { ProviderModule, ProviderSettingDef, ProviderResumeCapability } fro
|
|
|
12
12
|
import type { AcpConfigOption, AcpMode, ProviderControlSchema, ProviderSummaryMetadata, SessionCapability } from '../shared-types.js';
|
|
13
13
|
import type { MessageInputSupport } from './provider-input-support.js';
|
|
14
14
|
import type { ChatMessage } from '../types.js';
|
|
15
|
+
import type { InteractivePrompt } from './types/interactive-prompt.js';
|
|
15
16
|
|
|
16
17
|
// ─── ProviderState — Discriminated union by category ─────────────
|
|
17
18
|
|
|
18
|
-
export type ProviderStatus = 'idle' | 'generating' | 'waiting_approval' | 'error' | 'stopped' | 'starting';
|
|
19
|
+
export type ProviderStatus = 'idle' | 'generating' | 'waiting_approval' | 'waiting_choice' | 'error' | 'stopped' | 'starting';
|
|
19
20
|
|
|
20
21
|
export interface ProviderRuntimeWriteOwner {
|
|
21
22
|
clientId: string;
|
|
@@ -47,6 +48,7 @@ export interface ActiveChatData {
|
|
|
47
48
|
status: string;
|
|
48
49
|
messages: ChatMessage[];
|
|
49
50
|
activeModal: { message: string; buttons: string[] } | null;
|
|
51
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
50
52
|
inputContent?: string;
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -72,6 +74,7 @@ interface ProviderStateBase {
|
|
|
72
74
|
status: ProviderStatus;
|
|
73
75
|
/** chat data */
|
|
74
76
|
activeChat: ActiveChatData | null;
|
|
77
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
75
78
|
/** Workspace — project path or name (all categories) */
|
|
76
79
|
workspace?: string | null;
|
|
77
80
|
/** Runtime info (real-time detection) */
|
|
@@ -214,9 +217,29 @@ export interface ProviderInstance {
|
|
|
214
217
|
/** Update settings at runtime (called when user changes settings from dashboard) */
|
|
215
218
|
updateSettings?(newSettings: Record<string, any>): void;
|
|
216
219
|
|
|
220
|
+
/** Stamp a direct-dispatch mesh task assignment so generating_completed
|
|
221
|
+
* events route back to the originating coordinator. Cleared by
|
|
222
|
+
* detachMeshAssignment when the task reaches a terminal state. */
|
|
223
|
+
attachMeshAssignment?(assignment: { meshId: string; nodeId?: string; taskId?: string; dispatchNonce?: number; coordinatorDaemonId?: string; coordinatorSessionId?: string }): void;
|
|
224
|
+
detachMeshAssignment?(): void;
|
|
225
|
+
|
|
217
226
|
/** Refresh static provider definition/scripts without restarting the live runtime. */
|
|
218
227
|
refreshProviderDefinition?(provider: ProviderModule): void;
|
|
219
228
|
|
|
229
|
+
/**
|
|
230
|
+
* Record that a human is actively attending this session by hand right now
|
|
231
|
+
* (foreground tab selection, controlbar use, manual approval, terminal
|
|
232
|
+
* input). Provider-common signal that suppresses auto-approve for a short
|
|
233
|
+
* window so the user can drive the session manually; background mesh worker
|
|
234
|
+
* sessions never receive it, so their delegated auto-approve is unaffected.
|
|
235
|
+
*
|
|
236
|
+
* `opts.passive` marks a view-only action (select_session / open_panel). A
|
|
237
|
+
* delegated worker session ignores passive stamps so a coordinator merely
|
|
238
|
+
* watching its panel does not suppress its delegated auto-approve; explicit
|
|
239
|
+
* input still attends. Foreground sessions attend on passive views too.
|
|
240
|
+
*/
|
|
241
|
+
noteManualInteraction?(now?: number, opts?: { passive?: boolean }): void;
|
|
242
|
+
|
|
220
243
|
/** cleanup */
|
|
221
244
|
dispose(): void;
|
|
222
245
|
}
|