@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
package/src/shared-types.ts
CHANGED
|
@@ -15,6 +15,15 @@ import type {
|
|
|
15
15
|
DetectedIde,
|
|
16
16
|
AgentEntry,
|
|
17
17
|
} from './types.js';
|
|
18
|
+
import type {
|
|
19
|
+
SessionAttachedClient as CoreSessionAttachedClient,
|
|
20
|
+
SessionWriteOwner as CoreSessionWriteOwner,
|
|
21
|
+
SessionHostRecord as CoreSessionHostRecord,
|
|
22
|
+
SessionHostLogEntry as CoreSessionHostLogEntry,
|
|
23
|
+
SessionHostRequestTrace as CoreSessionHostRequestTrace,
|
|
24
|
+
SessionHostRuntimeTransition as CoreSessionHostRuntimeTransition,
|
|
25
|
+
SessionHostDiagnostics as CoreSessionHostDiagnostics,
|
|
26
|
+
} from '@adhdev/session-host-core';
|
|
18
27
|
|
|
19
28
|
export type {
|
|
20
29
|
StatusResponse,
|
|
@@ -56,6 +65,7 @@ import type {
|
|
|
56
65
|
GitWorkspaceUpdate,
|
|
57
66
|
WorkspaceGitSubscriptionParams,
|
|
58
67
|
} from './git/git-types.js';
|
|
68
|
+
import type { InteractivePrompt } from './providers/types/interactive-prompt.js';
|
|
59
69
|
|
|
60
70
|
export type {
|
|
61
71
|
GitCommandName,
|
|
@@ -110,6 +120,14 @@ export interface ReadChatSyncResult {
|
|
|
110
120
|
status: string;
|
|
111
121
|
title?: string;
|
|
112
122
|
activeModal?: { message: string; buttons: string[] } | null;
|
|
123
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
124
|
+
/**
|
|
125
|
+
* Chat source provenance from ChatSourceMachine (A2). Carries the
|
|
126
|
+
* selected source, transition cause, lock state, and legacy
|
|
127
|
+
* fallbackReason — opaque to the daemon-core, consumed by web-core
|
|
128
|
+
* for the source debug badge and SourceTimeline (A3).
|
|
129
|
+
*/
|
|
130
|
+
messageSource?: Record<string, unknown>;
|
|
113
131
|
}
|
|
114
132
|
|
|
115
133
|
export interface ProviderSummaryItem {
|
|
@@ -125,70 +143,67 @@ export interface ProviderSummaryMetadata {
|
|
|
125
143
|
items: ProviderSummaryItem[];
|
|
126
144
|
}
|
|
127
145
|
|
|
128
|
-
|
|
129
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Wire-subset session-host types.
|
|
148
|
+
*
|
|
149
|
+
* These are the shapes daemon-core / web-core see over the wire — a subset of the
|
|
150
|
+
* authoritative types owned by @adhdev/session-host-core (which additionally carry
|
|
151
|
+
* transport / category / launchCommand / buffer and stricter union typing on wire
|
|
152
|
+
* scalars). They are DERIVED from the SSOT via Pick/Omit so shared fields cannot
|
|
153
|
+
* drift; only the deliberate wire looseness (string-typed `type`/`lifecycle`,
|
|
154
|
+
* optional `meta`) is re-applied here.
|
|
155
|
+
*/
|
|
156
|
+
export type SessionHostAttachedClient = Omit<CoreSessionAttachedClient, 'type'> & {
|
|
157
|
+
/** Widened over the wire — the raw client-type string is not re-validated here. */
|
|
130
158
|
type: string;
|
|
131
|
-
|
|
132
|
-
attachedAt: number;
|
|
133
|
-
lastSeenAt: number;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export interface SessionHostWriteOwner {
|
|
137
|
-
clientId: string;
|
|
138
|
-
ownerType: 'agent' | 'user';
|
|
139
|
-
acquiredAt: number;
|
|
140
|
-
}
|
|
159
|
+
};
|
|
141
160
|
|
|
142
|
-
export
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
161
|
+
export type SessionHostWriteOwner = CoreSessionWriteOwner;
|
|
162
|
+
|
|
163
|
+
export type SessionHostRecord = Pick<
|
|
164
|
+
CoreSessionHostRecord,
|
|
165
|
+
| 'sessionId'
|
|
166
|
+
| 'runtimeKey'
|
|
167
|
+
| 'displayName'
|
|
168
|
+
| 'workspaceLabel'
|
|
169
|
+
| 'providerType'
|
|
170
|
+
| 'workspace'
|
|
171
|
+
| 'lifecycle'
|
|
172
|
+
| 'surfaceKind'
|
|
173
|
+
| 'osPid'
|
|
174
|
+
| 'lastActivityAt'
|
|
175
|
+
| 'createdAt'
|
|
176
|
+
| 'startedAt'
|
|
177
|
+
> & {
|
|
151
178
|
writeOwner: SessionHostWriteOwner | null;
|
|
152
179
|
attachedClients: SessionHostAttachedClient[];
|
|
153
|
-
|
|
154
|
-
lastActivityAt: number;
|
|
155
|
-
createdAt: number;
|
|
156
|
-
startedAt?: number;
|
|
180
|
+
/** Optional over the wire — omitted when the record carries no metadata. */
|
|
157
181
|
meta?: Record<string, unknown>;
|
|
158
|
-
}
|
|
182
|
+
};
|
|
159
183
|
|
|
160
|
-
export
|
|
161
|
-
timestamp: number;
|
|
162
|
-
level: 'debug' | 'info' | 'warn' | 'error';
|
|
163
|
-
message: string;
|
|
164
|
-
sessionId?: string;
|
|
165
|
-
}
|
|
184
|
+
export type SessionHostLogEntry = Omit<CoreSessionHostLogEntry, 'data'>;
|
|
166
185
|
|
|
167
|
-
export
|
|
168
|
-
|
|
169
|
-
requestId: string;
|
|
186
|
+
export type SessionHostRequestTrace = Omit<CoreSessionHostRequestTrace, 'type'> & {
|
|
187
|
+
/** Widened over the wire — the request-type union is not re-validated here. */
|
|
170
188
|
type: string;
|
|
171
|
-
|
|
172
|
-
clientId?: string;
|
|
173
|
-
success: boolean;
|
|
174
|
-
durationMs: number;
|
|
175
|
-
error?: string;
|
|
176
|
-
}
|
|
189
|
+
};
|
|
177
190
|
|
|
178
|
-
export
|
|
179
|
-
|
|
180
|
-
sessionId: string;
|
|
181
|
-
action: string;
|
|
191
|
+
export type SessionHostRuntimeTransition = Omit<CoreSessionHostRuntimeTransition, 'lifecycle'> & {
|
|
192
|
+
/** Widened over the wire — the lifecycle union is not re-validated here. */
|
|
182
193
|
lifecycle?: string;
|
|
183
|
-
|
|
184
|
-
success?: boolean;
|
|
185
|
-
error?: string;
|
|
186
|
-
}
|
|
194
|
+
};
|
|
187
195
|
|
|
188
|
-
export
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
196
|
+
export type SessionHostDiagnosticsSnapshot = Omit<
|
|
197
|
+
CoreSessionHostDiagnostics,
|
|
198
|
+
| 'supportedRequestTypes'
|
|
199
|
+
| 'sessions'
|
|
200
|
+
| 'liveRuntimes'
|
|
201
|
+
| 'recoverySnapshots'
|
|
202
|
+
| 'inactiveRecords'
|
|
203
|
+
| 'recentLogs'
|
|
204
|
+
| 'recentRequests'
|
|
205
|
+
| 'recentTransitions'
|
|
206
|
+
> & {
|
|
192
207
|
sessions?: SessionHostRecord[];
|
|
193
208
|
liveRuntimes?: SessionHostRecord[];
|
|
194
209
|
recoverySnapshots?: SessionHostRecord[];
|
|
@@ -196,7 +211,7 @@ export interface SessionHostDiagnosticsSnapshot {
|
|
|
196
211
|
recentLogs: SessionHostLogEntry[];
|
|
197
212
|
recentRequests: SessionHostRequestTrace[];
|
|
198
213
|
recentTransitions: SessionHostRuntimeTransition[];
|
|
199
|
-
}
|
|
214
|
+
};
|
|
200
215
|
|
|
201
216
|
export type TransportTopic = 'session.chat_tail' | 'session.runtime_output' | 'machine.runtime' | 'session_host.diagnostics' | 'session.modal' | 'daemon.metadata' | 'workspace.git';
|
|
202
217
|
|
|
@@ -283,6 +298,18 @@ export interface DaemonMetadataUpdate {
|
|
|
283
298
|
userName?: string;
|
|
284
299
|
seq: number;
|
|
285
300
|
timestamp: number;
|
|
301
|
+
/**
|
|
302
|
+
* Per-mesh state-change revision counters (meshId → monotonically increasing
|
|
303
|
+
* integer), bumped whenever the daemon's mesh graph/queue/mission state for that
|
|
304
|
+
* mesh changes (onMeshStateChange). Lets the dashboard replace its client-side
|
|
305
|
+
* mesh_status polling with an event-driven background refresh: when the revision
|
|
306
|
+
* for the mesh it is viewing advances, it re-fetches the aggregate mesh_status
|
|
307
|
+
* (SWR, keeping the current graph on screen). This is a lightweight nudge — the
|
|
308
|
+
* full aggregate snapshot is fetched on demand, not embedded here, so the
|
|
309
|
+
* daemon.metadata payload stays small. Optional/absent for daemons/builds that
|
|
310
|
+
* don't emit it (the client then keeps its polling fallback).
|
|
311
|
+
*/
|
|
312
|
+
meshStateRevisions?: Record<string, number>;
|
|
286
313
|
}
|
|
287
314
|
|
|
288
315
|
export interface TopicUpdateEnvelopeMap {
|
|
@@ -365,6 +392,7 @@ export interface SessionEntry {
|
|
|
365
392
|
runtimeRecoveryState?: string | null;
|
|
366
393
|
resume?: ProviderResumeCapability;
|
|
367
394
|
activeChat: SessionActiveChatData | null;
|
|
395
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
368
396
|
capabilities?: SessionCapability[];
|
|
369
397
|
/** Effective message input/media support for this session. Defaults fail-closed to text-only. */
|
|
370
398
|
messageInput?: MessageInputSupport;
|
|
@@ -388,7 +416,25 @@ export interface SessionEntry {
|
|
|
388
416
|
completionMarker?: string;
|
|
389
417
|
seenCompletionMarker?: string;
|
|
390
418
|
surfaceHidden?: boolean;
|
|
419
|
+
/**
|
|
420
|
+
* User (or coordinator-policy) muted: suppress attention side-effects
|
|
421
|
+
* (notifications, toasts, completion audio) for this session WITHOUT removing
|
|
422
|
+
* it from the inbox list. Distinct from surfaceHidden (which collapses it from
|
|
423
|
+
* the list). Daemon-owned, in-memory; rides the status snapshot.
|
|
424
|
+
*/
|
|
425
|
+
muted?: boolean;
|
|
391
426
|
settings?: Record<string, any>;
|
|
427
|
+
/**
|
|
428
|
+
* True owning-daemon id for a session a coordinator synthesises into its own
|
|
429
|
+
* status snapshot (mesh delegated sessions). The dashboard attributes the session
|
|
430
|
+
* to this daemon instead of the snapshot daemon so the worker node — not the
|
|
431
|
+
* coordinator — is shown as its machine.
|
|
432
|
+
*/
|
|
433
|
+
ownerDaemonId?: string;
|
|
434
|
+
/** True owning-machine display name fallback when the owning daemon is not aggregated. */
|
|
435
|
+
ownerMachineName?: string;
|
|
436
|
+
/** Set when this session is acting as a mesh coordinator for the given mesh. */
|
|
437
|
+
coordinator?: { meshId: string; role: 'coordinator' };
|
|
392
438
|
meshQueueStats?: {
|
|
393
439
|
total?: number;
|
|
394
440
|
active?: number;
|
|
@@ -449,6 +495,7 @@ export interface CompactSessionEntry {
|
|
|
449
495
|
completionMarker?: string;
|
|
450
496
|
seenCompletionMarker?: string;
|
|
451
497
|
surfaceHidden?: boolean;
|
|
498
|
+
muted?: boolean;
|
|
452
499
|
controlValues?: Record<string, string | number | boolean>;
|
|
453
500
|
providerControls?: ProviderControlSchema[];
|
|
454
501
|
summaryMetadata?: ProviderSummaryMetadata;
|
|
@@ -516,7 +563,43 @@ export interface AvailableProviderInfo {
|
|
|
516
563
|
lastVerification?: MachineProviderCheckResult;
|
|
517
564
|
/** Provider-declared Repo Mesh coordinator/MCP behavior. */
|
|
518
565
|
meshCoordinator?: ProviderMeshCoordinatorConfig;
|
|
519
|
-
|
|
566
|
+
/** BRAIN-ROUTING: suggested model values for the new-session model dropdown. */
|
|
567
|
+
modelOptions?: string[];
|
|
568
|
+
/** BRAIN-ROUTING: reasoning-effort values for the new-session thinking dropdown. */
|
|
569
|
+
thinkingLevelOptions?: string[];
|
|
570
|
+
/**
|
|
571
|
+
* Provider trust classification — derived from the on-disk layer the
|
|
572
|
+
* manifest came from and the shape of the manifest. Dashboards use
|
|
573
|
+
* this to render a trust badge and gate activation of
|
|
574
|
+
* `external-untrusted` providers behind a confirm modal.
|
|
575
|
+
*/
|
|
576
|
+
trust?: ProviderTrust;
|
|
577
|
+
/** Daemon-side human-readable description of the trust value. */
|
|
578
|
+
trustDescription?: string;
|
|
579
|
+
/** True when activation needs a user-side confirmation step. */
|
|
580
|
+
requiresConfirmation?: boolean;
|
|
581
|
+
/** Which on-disk layer the manifest lives in. */
|
|
582
|
+
sourceLayer?: 'user' | 'upstream' | 'external';
|
|
583
|
+
/** For external providers, the source-name namespace it came from. */
|
|
584
|
+
sourceName?: string | null;
|
|
585
|
+
/** Manifest-declared version, e.g. "1.2.1". */
|
|
586
|
+
providerVersion?: string;
|
|
587
|
+
/** Underlying executable name (CLI/binary providers). */
|
|
588
|
+
binary?: string;
|
|
589
|
+
/** Lifecycle label from the manifest: "Stable", "Beta", … */
|
|
590
|
+
status?: string;
|
|
591
|
+
/** One-line provider description from the manifest. */
|
|
592
|
+
details?: string;
|
|
593
|
+
/** Manifest-declared links: homepage, docs, repo, … */
|
|
594
|
+
links?: Record<string, string>;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
export type ProviderTrust =
|
|
598
|
+
| 'user-custom'
|
|
599
|
+
| 'trusted'
|
|
600
|
+
| 'trusted-with-scripts'
|
|
601
|
+
| 'external-safe'
|
|
602
|
+
| 'external-untrusted';
|
|
520
603
|
|
|
521
604
|
export interface MachineProviderCheckResult {
|
|
522
605
|
ok: boolean;
|
|
@@ -582,6 +665,13 @@ export interface ProviderControlSchema {
|
|
|
582
665
|
order?: number;
|
|
583
666
|
/** Hide this control even if it would otherwise render */
|
|
584
667
|
hidden?: boolean;
|
|
668
|
+
/**
|
|
669
|
+
* FSM state ids in which this control should be visible. When omitted the
|
|
670
|
+
* control is always visible. Mirrors the daemon's click-time enforcement so
|
|
671
|
+
* the bar hides controls the daemon would silently drop. Uses raw FSM state
|
|
672
|
+
* ids (e.g. 'idle', 'busy'), not the derived dashboard status.
|
|
673
|
+
*/
|
|
674
|
+
visibleWhenState?: string[];
|
|
585
675
|
}
|
|
586
676
|
|
|
587
677
|
// ─── Common Sub-Types (used across StatusReportPayload, BaseDaemonData, etc.) ──
|
|
@@ -687,6 +777,9 @@ export type DaemonStatusEventName =
|
|
|
687
777
|
| 'agent:waiting_approval'
|
|
688
778
|
| 'agent:generating_completed'
|
|
689
779
|
| 'agent:stopped'
|
|
780
|
+
| 'monitor:no_progress'
|
|
781
|
+
// Legacy alias for 'monitor:no_progress' — kept so older daemons that still
|
|
782
|
+
// emit it remain type-compatible with consumers during rollout.
|
|
690
783
|
| 'monitor:long_generating';
|
|
691
784
|
|
|
692
785
|
/** Minimal daemon-originated event payload relayed through the server. */
|
package/src/status/builders.ts
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
type NormalizeActiveChatOptions,
|
|
26
26
|
} from './normalize.js';
|
|
27
27
|
import { getMeshQueueStats } from '../mesh/mesh-work-queue.js';
|
|
28
|
+
import { getCoordinatorForSession } from '../mesh/coordinator-registry.js';
|
|
28
29
|
import { normalizeProviderStateControlValues } from '../providers/provider-patch-state.js';
|
|
29
30
|
import { normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
|
|
30
31
|
import {
|
|
@@ -33,6 +34,47 @@ import {
|
|
|
33
34
|
} from '../providers/open-panel-support.js';
|
|
34
35
|
import { TEXT_ONLY_MESSAGE_INPUT_SUPPORT } from '../providers/provider-input-support.js';
|
|
35
36
|
|
|
37
|
+
/**
|
|
38
|
+
* A coordinator-spawned worker session that mesh policy launched hidden. This is
|
|
39
|
+
* the daemon-side equivalent of the web `shouldAutoHideMeshConversation` predicate:
|
|
40
|
+
* these sessions should default to muted+hidden in the user dashboard (the user
|
|
41
|
+
* interacts through the ONE coordinator session, not each worker), while the
|
|
42
|
+
* coordinator↔worker mesh data/completion path (mesh-event-forwarding) is
|
|
43
|
+
* unaffected.
|
|
44
|
+
*/
|
|
45
|
+
function isCoordinatorSpawnedHiddenWorker(settings: Record<string, any> | undefined): boolean {
|
|
46
|
+
if (!settings) return false;
|
|
47
|
+
return settings.launchedByCoordinator === true
|
|
48
|
+
&& typeof settings.meshNodeFor === 'string'
|
|
49
|
+
&& settings.meshNodeFor.trim().length > 0
|
|
50
|
+
&& settings.spawnedSessionVisibility === 'hidden';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A session is surface-hidden (collapsed from the user's inbox/notifications) when
|
|
55
|
+
* mesh policy spawned it hidden, OR when a coordinator-spawned worker defaults
|
|
56
|
+
* hidden, OR when the user manually hid it (userHidden). userHidden === false is an
|
|
57
|
+
* explicit un-hide that overrides the policy/worker default until daemon restart.
|
|
58
|
+
*/
|
|
59
|
+
function resolveSurfaceHidden(settings: Record<string, any> | undefined): boolean {
|
|
60
|
+
if (!settings) return false;
|
|
61
|
+
if (settings.userHidden === true) return true;
|
|
62
|
+
if (settings.userHidden === false) return false;
|
|
63
|
+
return settings.spawnedSessionVisibility === 'hidden' || isCoordinatorSpawnedHiddenWorker(settings);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* A session is muted (attention side-effects suppressed, but still shown in the
|
|
68
|
+
* list) when the user muted it, OR a coordinator-spawned worker defaults muted.
|
|
69
|
+
* userMuted === false is an explicit un-mute overriding the worker default.
|
|
70
|
+
*/
|
|
71
|
+
function resolveMuted(settings: Record<string, any> | undefined): boolean {
|
|
72
|
+
if (!settings) return false;
|
|
73
|
+
if (settings.userMuted === true) return true;
|
|
74
|
+
if (settings.userMuted === false) return false;
|
|
75
|
+
return isCoordinatorSpawnedHiddenWorker(settings);
|
|
76
|
+
}
|
|
77
|
+
|
|
36
78
|
export type SessionEntryProfile = 'full' | 'live' | 'metadata';
|
|
37
79
|
|
|
38
80
|
export interface SessionEntryBuildOptions {
|
|
@@ -164,7 +206,7 @@ const ACP_SESSION_CAPABILITIES: SessionCapability[] = [
|
|
|
164
206
|
'set_thought_level',
|
|
165
207
|
];
|
|
166
208
|
|
|
167
|
-
function
|
|
209
|
+
function buildWorkspaceSession(
|
|
168
210
|
state: IdeProviderState,
|
|
169
211
|
cdpManagers: Map<string, DaemonCdpManager>,
|
|
170
212
|
options: SessionEntryBuildOptions,
|
|
@@ -179,7 +221,10 @@ function buildIdeWorkspaceSession(
|
|
|
179
221
|
const git = getGitSummaryForWorkspace(workspace, options);
|
|
180
222
|
const title = activeChat?.title || state.name;
|
|
181
223
|
const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
|
|
182
|
-
const
|
|
224
|
+
const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
|
|
225
|
+
const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
|
|
226
|
+
const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
|
|
227
|
+
const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
|
|
183
228
|
return {
|
|
184
229
|
id: state.instanceId || state.type,
|
|
185
230
|
parentId: null,
|
|
@@ -203,6 +248,7 @@ function buildIdeWorkspaceSession(
|
|
|
203
248
|
errorReason: state.errorReason,
|
|
204
249
|
lastUpdated: state.lastUpdated,
|
|
205
250
|
settings: state.settings,
|
|
251
|
+
...(coordinator && { coordinator }),
|
|
206
252
|
...(meshQueueStats && { meshQueueStats }),
|
|
207
253
|
};
|
|
208
254
|
}
|
|
@@ -221,7 +267,10 @@ function buildExtensionAgentSession(
|
|
|
221
267
|
const workspace = parent.workspace || null;
|
|
222
268
|
const git = getGitSummaryForWorkspace(workspace, options);
|
|
223
269
|
const meshCoordinatorFor = ext.settings?.meshCoordinatorFor as string | undefined;
|
|
224
|
-
const
|
|
270
|
+
const registryEntry = ext.instanceId ? getCoordinatorForSession(ext.instanceId) : undefined;
|
|
271
|
+
const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
|
|
272
|
+
const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
|
|
273
|
+
const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
|
|
225
274
|
return {
|
|
226
275
|
id: ext.instanceId || `${parent.instanceId}:${ext.type}`,
|
|
227
276
|
parentId: parent.instanceId || parent.type,
|
|
@@ -245,6 +294,7 @@ function buildExtensionAgentSession(
|
|
|
245
294
|
errorReason: ext.errorReason,
|
|
246
295
|
lastUpdated: ext.lastUpdated,
|
|
247
296
|
settings: ext.settings,
|
|
297
|
+
...(coordinator && { coordinator }),
|
|
248
298
|
...(meshQueueStats && { meshQueueStats }),
|
|
249
299
|
};
|
|
250
300
|
}
|
|
@@ -287,7 +337,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
|
|
|
287
337
|
const workspace = state.workspace || null;
|
|
288
338
|
const git = getGitSummaryForWorkspace(workspace, options);
|
|
289
339
|
const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
|
|
290
|
-
const
|
|
340
|
+
const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
|
|
341
|
+
const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
|
|
342
|
+
const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
|
|
343
|
+
const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
|
|
291
344
|
return {
|
|
292
345
|
id: state.instanceId,
|
|
293
346
|
parentId: null,
|
|
@@ -314,6 +367,7 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
|
|
|
314
367
|
mode: state.mode,
|
|
315
368
|
resume: state.resume,
|
|
316
369
|
activeChat,
|
|
370
|
+
activeInteractivePrompt: state.activeInteractivePrompt ?? null,
|
|
317
371
|
...(summaryMetadata && { summaryMetadata }),
|
|
318
372
|
...(includeSessionMetadata && {
|
|
319
373
|
capabilities: state.mode === 'terminal' ? PTY_SESSION_CAPABILITIES : CLI_CHAT_SESSION_CAPABILITIES,
|
|
@@ -327,7 +381,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
|
|
|
327
381
|
errorReason: state.errorReason,
|
|
328
382
|
lastUpdated: state.lastUpdated,
|
|
329
383
|
settings: state.settings,
|
|
384
|
+
...(coordinator && { coordinator }),
|
|
330
385
|
...(meshQueueStats && { meshQueueStats }),
|
|
386
|
+
...(resolveSurfaceHidden(state.settings) && { surfaceHidden: true }),
|
|
387
|
+
...(resolveMuted(state.settings) && { muted: true }),
|
|
331
388
|
};
|
|
332
389
|
}
|
|
333
390
|
|
|
@@ -341,7 +398,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
|
|
|
341
398
|
const workspace = state.workspace || null;
|
|
342
399
|
const git = getGitSummaryForWorkspace(workspace, options);
|
|
343
400
|
const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
|
|
344
|
-
const
|
|
401
|
+
const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
|
|
402
|
+
const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
|
|
403
|
+
const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
|
|
404
|
+
const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
|
|
345
405
|
return {
|
|
346
406
|
id: state.instanceId,
|
|
347
407
|
parentId: null,
|
|
@@ -364,7 +424,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
|
|
|
364
424
|
errorReason: state.errorReason,
|
|
365
425
|
lastUpdated: state.lastUpdated,
|
|
366
426
|
settings: state.settings,
|
|
427
|
+
...(coordinator && { coordinator }),
|
|
367
428
|
...(meshQueueStats && { meshQueueStats }),
|
|
429
|
+
...(resolveSurfaceHidden(state.settings) && { surfaceHidden: true }),
|
|
430
|
+
...(resolveMuted(state.settings) && { muted: true }),
|
|
368
431
|
};
|
|
369
432
|
}
|
|
370
433
|
|
|
@@ -380,7 +443,7 @@ export function buildSessionEntries(
|
|
|
380
443
|
const acpStates = allStates.filter((s): s is AcpProviderState => s.category === 'acp');
|
|
381
444
|
|
|
382
445
|
for (const state of ideStates) {
|
|
383
|
-
sessions.push(
|
|
446
|
+
sessions.push(buildWorkspaceSession(state, cdpManagers, options));
|
|
384
447
|
for (const ext of state.extensions as ExtensionProviderState[]) {
|
|
385
448
|
if (!shouldIncludeExtensionSession(ext)) continue;
|
|
386
449
|
sessions.push(buildExtensionAgentSession(state, ext, options));
|
|
@@ -60,8 +60,35 @@ export function classifyHotChatSessionsForSubscriptionFlush(
|
|
|
60
60
|
recentMessageGraceMs?: number;
|
|
61
61
|
activeStatuses?: ReadonlySet<string>;
|
|
62
62
|
activeSessionIds?: ReadonlySet<string>;
|
|
63
|
+
/**
|
|
64
|
+
* Per-session `lastMessageAt` of the most recent completion tail that has
|
|
65
|
+
* already been flushed to subscribers. A completed-but-unseen session is
|
|
66
|
+
* kept hot for delivery REGARDLESS of the 8s recency timer, but only until
|
|
67
|
+
* its current tail has been delivered once — bounding the guaranteed
|
|
68
|
+
* delivery so a slow-finalizing turn is not re-pushed every tick forever.
|
|
69
|
+
* A newer `lastMessageAt` (fresh turn) re-arms delivery.
|
|
70
|
+
*/
|
|
71
|
+
deliveredCompletionTailAt?: ReadonlyMap<string, number>;
|
|
72
|
+
/**
|
|
73
|
+
* (D8) PER-SUBSCRIPTION ACK gate — the authoritative guaranteed-delivery
|
|
74
|
+
* signal. Session ids for which at least one currently-subscribed ws has
|
|
75
|
+
* NOT yet been sent the session's finalized tail (its per-ws
|
|
76
|
+
* `lastDeliveredSignature` is empty / does not match the session's current
|
|
77
|
+
* tail). The daemon computes this from its live ws-subscription map; the
|
|
78
|
+
* classifier keeps every such session hot-for-delivery INDEPENDENT of the
|
|
79
|
+
* seen/unread badge, so a session whose unread badge cleared (or a fresh
|
|
80
|
+
* browser that re-subscribed after the single completion flush already
|
|
81
|
+
* fired) still gets its assistant-final tail delivered. Bounded because a
|
|
82
|
+
* subscriber's `lastDeliveredSignature` converges to the current tail the
|
|
83
|
+
* moment it is actually sent, dropping the session out of this set. When
|
|
84
|
+
* provided, this set is the guaranteed-delivery driver and the
|
|
85
|
+
* `deliveredCompletionTailAt` recency-watermark path is bypassed for these
|
|
86
|
+
* sessions (it stays only as the legacy opt-in for callers that don't pass
|
|
87
|
+
* a per-subscription set).
|
|
88
|
+
*/
|
|
89
|
+
underDeliveredSessionIds?: ReadonlySet<string>;
|
|
63
90
|
} = {},
|
|
64
|
-
): { active: Set<string>; finalizing: Set<string> } {
|
|
91
|
+
): { active: Set<string>; finalizing: Set<string>; guaranteedDelivery: Set<string> } {
|
|
65
92
|
const now = options.now ?? Date.now();
|
|
66
93
|
const recentMessageGraceMs = Math.max(
|
|
67
94
|
0,
|
|
@@ -71,8 +98,19 @@ export function classifyHotChatSessionsForSubscriptionFlush(
|
|
|
71
98
|
);
|
|
72
99
|
const activeStatuses = options.activeStatuses ?? DEFAULT_ACTIVE_CHAT_POLL_STATUSES;
|
|
73
100
|
const activeSessionIds = options.activeSessionIds ?? new Set<string>();
|
|
101
|
+
// The guaranteed-delivery path is opt-in: only callers that provide a
|
|
102
|
+
// delivered-watermark map (so they can BOUND re-pushes) participate. Callers
|
|
103
|
+
// without it keep the original recency-window-only behavior and never enter
|
|
104
|
+
// the completed-but-unseen keep-hot branch (which would otherwise thrash by
|
|
105
|
+
// re-pushing every tick with no delivered record to stop it).
|
|
106
|
+
const deliveredCompletionTailAt = options.deliveredCompletionTailAt ?? null;
|
|
107
|
+
const underDeliveredSessionIds = options.underDeliveredSessionIds ?? null;
|
|
74
108
|
const active = new Set<string>();
|
|
75
109
|
const excluded = new Set<string>();
|
|
110
|
+
// Sessions kept hot purely because they finalized late (outside the 8s
|
|
111
|
+
// window) and have not been delivered yet. The caller records these so the
|
|
112
|
+
// next classification knows their tail is now delivered.
|
|
113
|
+
const guaranteedDelivery = new Set<string>();
|
|
76
114
|
|
|
77
115
|
for (const session of sessions) {
|
|
78
116
|
const sessionId = typeof session?.id === 'string' ? session.id : '';
|
|
@@ -104,6 +142,49 @@ export function classifyHotChatSessionsForSubscriptionFlush(
|
|
|
104
142
|
|
|
105
143
|
if (activeStatuses.has(status) || shouldKeepRecentTailHot) {
|
|
106
144
|
active.add(sessionId);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// (D8) PER-SUBSCRIPTION ACK-BASED guaranteed delivery — the authoritative
|
|
149
|
+
// path. If ANY currently-subscribed ws for this session still lacks the
|
|
150
|
+
// finalized tail (empty / mismatched per-ws lastDeliveredSignature), keep
|
|
151
|
+
// the session hot-for-delivery REGARDLESS of the seen/unread badge. This is
|
|
152
|
+
// the fix for the agy coordinator stranded user-only: the single completion
|
|
153
|
+
// flush was marked "delivered" on FLUSH-FIRE (not browser-APPLIED), and
|
|
154
|
+
// re-delivery was gated on completedUnseen — so once the unread badge
|
|
155
|
+
// cleared, a subscriber that never actually applied the assistant tail (D6
|
|
156
|
+
// shrink-defer drop, or a fresh browser that re-subscribed after the flush
|
|
157
|
+
// instant) was permanently dropped and stayed user-only forever. Gating on
|
|
158
|
+
// "does a live subscriber still lack the tail" instead of the badge makes it
|
|
159
|
+
// re-arm for exactly those subscribers, and it self-bounds: the moment a
|
|
160
|
+
// subscriber is actually sent the tail its signature matches and it leaves
|
|
161
|
+
// this set (a same-tail re-flush is a cheap no-op via prepareSessionChatTailUpdate).
|
|
162
|
+
if (underDeliveredSessionIds && underDeliveredSessionIds.has(sessionId)) {
|
|
163
|
+
active.add(sessionId);
|
|
164
|
+
guaranteedDelivery.add(sessionId);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Legacy recency-watermark guaranteed-delivery path (opt-in via
|
|
169
|
+
// deliveredCompletionTailAt): a completed-but-unseen session whose native
|
|
170
|
+
// tail finalized AFTER the 8s window (common for multi-turn MAGI
|
|
171
|
+
// coordinators — the native-history tail lags the last PTY echo). Kept for
|
|
172
|
+
// callers that do not supply a per-subscription ACK set. When the
|
|
173
|
+
// per-subscription set is provided it is authoritative and this path is not
|
|
174
|
+
// consulted (the `continue` above already handled under-delivered sessions;
|
|
175
|
+
// a session NOT in the set is genuinely delivered, so it must not be revived
|
|
176
|
+
// here on the stale badge alone).
|
|
177
|
+
const completedUnseen = unread || inboxBucket === 'task_complete';
|
|
178
|
+
if (!underDeliveredSessionIds && deliveredCompletionTailAt && completedUnseen) {
|
|
179
|
+
const delivered = deliveredCompletionTailAt.get(sessionId) ?? 0;
|
|
180
|
+
// Not yet delivered for this turn (no record, or a newer tail arrived
|
|
181
|
+
// since the last delivery). lastMessageAt===0 (unknown ts) still counts
|
|
182
|
+
// as undelivered so the tail is not silently dropped.
|
|
183
|
+
const alreadyDelivered = delivered > 0 && lastMessageAt > 0 && delivered >= lastMessageAt;
|
|
184
|
+
if (!alreadyDelivered) {
|
|
185
|
+
active.add(sessionId);
|
|
186
|
+
guaranteedDelivery.add(sessionId);
|
|
187
|
+
}
|
|
107
188
|
}
|
|
108
189
|
}
|
|
109
190
|
|
|
@@ -111,5 +192,39 @@ export function classifyHotChatSessionsForSubscriptionFlush(
|
|
|
111
192
|
Array.from(previousHotSessionIds).filter((sessionId) => !active.has(sessionId) && !excluded.has(sessionId)),
|
|
112
193
|
);
|
|
113
194
|
|
|
114
|
-
return { active, finalizing };
|
|
195
|
+
return { active, finalizing, guaranteedDelivery };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Detect sessions that just transitioned from an active/generating state into
|
|
200
|
+
* a settled/completed-but-unseen state, so their finalized completion tail can
|
|
201
|
+
* be flushed exactly once regardless of the recency window. Pure: the caller
|
|
202
|
+
* owns the `previousStatus` map and updates it from the returned `nextStatus`.
|
|
203
|
+
*/
|
|
204
|
+
export function detectNewlySettledCompletedSessions(
|
|
205
|
+
sessions: HotChatSessionLike[],
|
|
206
|
+
previousStatus: ReadonlyMap<string, string>,
|
|
207
|
+
options: { activeStatuses?: ReadonlySet<string> } = {},
|
|
208
|
+
): { settled: Set<string>; nextStatus: Map<string, string> } {
|
|
209
|
+
const activeStatuses = options.activeStatuses ?? DEFAULT_ACTIVE_CHAT_POLL_STATUSES;
|
|
210
|
+
const settled = new Set<string>();
|
|
211
|
+
const nextStatus = new Map<string, string>();
|
|
212
|
+
|
|
213
|
+
for (const session of sessions) {
|
|
214
|
+
const sessionId = typeof session?.id === 'string' ? session.id : '';
|
|
215
|
+
if (!sessionId) continue;
|
|
216
|
+
const status = String(session?.status || '').toLowerCase();
|
|
217
|
+
const prevStatus = previousStatus.get(sessionId);
|
|
218
|
+
nextStatus.set(sessionId, status);
|
|
219
|
+
|
|
220
|
+
const wasActive = prevStatus !== undefined && activeStatuses.has(prevStatus);
|
|
221
|
+
const isSettledNow = !activeStatuses.has(status);
|
|
222
|
+
const inboxBucket = String(session?.inboxBucket || '').toLowerCase();
|
|
223
|
+
const completedUnseen = session?.unread === true || inboxBucket === 'task_complete';
|
|
224
|
+
if (wasActive && isSettledNow && completedUnseen) {
|
|
225
|
+
settled.add(sessionId);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return { settled, nextStatus };
|
|
115
230
|
}
|
package/src/status/normalize.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type ManagedStatus =
|
|
|
5
5
|
| 'idle'
|
|
6
6
|
| 'generating'
|
|
7
7
|
| 'waiting_approval'
|
|
8
|
+
| 'waiting_choice'
|
|
8
9
|
| 'error'
|
|
9
10
|
| 'stopped'
|
|
10
11
|
| 'starting'
|
|
@@ -151,6 +152,7 @@ export function normalizeManagedStatus(
|
|
|
151
152
|
|
|
152
153
|
const normalized = String(status || 'idle').trim().toLowerCase();
|
|
153
154
|
if (normalized === 'waiting_approval') return 'waiting_approval';
|
|
155
|
+
if (normalized === 'waiting_choice') return 'waiting_choice';
|
|
154
156
|
if (WORKING_STATUSES.has(normalized)) return 'generating';
|
|
155
157
|
if (normalized === 'error') return 'error';
|
|
156
158
|
if (normalized === 'stopped') return 'stopped';
|
package/src/status/reporter.ts
CHANGED
|
@@ -51,6 +51,8 @@ export class DaemonStatusReporter {
|
|
|
51
51
|
private lastStatusSentAt = 0;
|
|
52
52
|
private statusPendingThrottle = false;
|
|
53
53
|
private lastP2PStatusHash = '';
|
|
54
|
+
private lastP2PStatusSentAt: number = 0;
|
|
55
|
+
private p2pDebounceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
54
56
|
private lastServerStatusHash = '';
|
|
55
57
|
private lastStatusSummary = '';
|
|
56
58
|
|
|
@@ -118,7 +120,7 @@ export class DaemonStatusReporter {
|
|
|
118
120
|
case 'agent:waiting_approval':
|
|
119
121
|
case 'agent:generating_completed':
|
|
120
122
|
case 'agent:stopped':
|
|
121
|
-
case 'monitor:
|
|
123
|
+
case 'monitor:no_progress':
|
|
122
124
|
return value;
|
|
123
125
|
default:
|
|
124
126
|
return null;
|
|
@@ -317,6 +319,9 @@ export class DaemonStatusReporter {
|
|
|
317
319
|
cdpConnected: session.cdpConnected,
|
|
318
320
|
summaryMetadata: session.summaryMetadata,
|
|
319
321
|
settings: session.settings,
|
|
322
|
+
// Forward surfaceHidden so the server can gate push notifications for
|
|
323
|
+
// coordinator-hidden sessions (the WS path is the only one the server sees).
|
|
324
|
+
surfaceHidden: session.surfaceHidden,
|
|
320
325
|
})),
|
|
321
326
|
p2p: payload.p2p,
|
|
322
327
|
timestamp: now,
|
|
@@ -355,7 +360,20 @@ export class DaemonStatusReporter {
|
|
|
355
360
|
: { ...hashTarget, sessions };
|
|
356
361
|
const h = this.simpleHash(JSON.stringify(hashPayload));
|
|
357
362
|
if (h !== this.lastP2PStatusHash) {
|
|
363
|
+
const now = Date.now();
|
|
364
|
+
// Rate limit: max 1 per 500ms
|
|
365
|
+
if (this.lastP2PStatusSentAt && now - this.lastP2PStatusSentAt < 500) {
|
|
366
|
+
if (!this.p2pDebounceTimer) {
|
|
367
|
+
this.p2pDebounceTimer = setTimeout(() => {
|
|
368
|
+
this.p2pDebounceTimer = null;
|
|
369
|
+
this.sendUnifiedStatusReport({ reason: 'p2p_debounce' });
|
|
370
|
+
}, 500);
|
|
371
|
+
}
|
|
372
|
+
return false; // Dropped for now, but will trigger later
|
|
373
|
+
}
|
|
374
|
+
|
|
358
375
|
this.lastP2PStatusHash = h;
|
|
376
|
+
this.lastP2PStatusSentAt = now;
|
|
359
377
|
this.deps.p2p?.sendStatus(payload);
|
|
360
378
|
return true;
|
|
361
379
|
}
|