@adhdev/daemon-core 0.9.82-rc.35 → 0.9.82-rc.351
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 +8 -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 +46 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +116 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +53 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +14 -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/cli-manager.d.ts +2 -1
- package/dist/commands/handler.d.ts +110 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router.d.ts +324 -1
- package/dist/commands/upgrade-helper.d.ts +12 -0
- package/dist/config/chat-history.d.ts +9 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +77 -1
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +11 -1
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +23 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/index.d.ts +2 -0
- package/dist/index.d.ts +53 -13
- package/dist/index.js +39817 -14303
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41436 -16047
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +46 -0
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +36 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +174 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +169 -0
- package/dist/mesh/mesh-events-pending.d.ts +55 -0
- package/dist/mesh/mesh-events-stale.d.ts +40 -0
- package/dist/mesh/mesh-events-utils.d.ts +62 -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 +9 -0
- package/dist/mesh/mesh-init.d.ts +86 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -3
- package/dist/mesh/mesh-ledger.d.ts +77 -1
- package/dist/mesh/mesh-missions.d.ts +164 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +7 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +420 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
- package/dist/mesh/mesh-work-queue.d.ts +218 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
- package/dist/providers/acp-provider-instance.d.ts +2 -0
- package/dist/providers/approval-utils.d.ts +13 -0
- package/dist/providers/chat-message-normalization.d.ts +12 -0
- package/dist/providers/cli-provider-instance.d.ts +77 -3
- package/dist/providers/contracts.d.ts +139 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/dispatcher.d.ts +27 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +14 -0
- package/dist/providers/provider-instance.d.ts +15 -1
- package/dist/providers/provider-loader.d.ts +26 -4
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -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 +69 -0
- package/dist/providers/spec/cli-adapter.d.ts +217 -0
- package/dist/providers/spec/evaluator.d.ts +23 -0
- package/dist/providers/spec/fsm-driver.d.ts +322 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +72 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +144 -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 +180 -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 +295 -13
- package/dist/sessions/registry.d.ts +6 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +59 -2
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +26 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -3
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +55 -12
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +1 -0
- package/src/cli-adapter-types.ts +47 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1215 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +774 -1141
- package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
- package/src/cli-adapters/provider-cli-parse.ts +13 -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 +100 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +90 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -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.ts +1823 -62
- package/src/commands/cli-manager.ts +304 -14
- package/src/commands/handler.ts +809 -2
- package/src/commands/mesh-coordinator.ts +332 -122
- package/src/commands/router.ts +7505 -1311
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +81 -30
- package/src/config/chat-history.ts +483 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +388 -6
- package/src/config/recent-activity.ts +8 -2
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/detection/cli-detector.ts +28 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +55 -14
- package/src/git/git-diff.ts +53 -0
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +574 -43
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +8 -1
- package/src/git/index.ts +16 -0
- package/src/index.ts +151 -12
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +220 -0
- package/src/logging/logger.ts +2 -1
- package/src/mesh/contracts.ts +329 -0
- package/src/mesh/coordinator-prompt.ts +234 -31
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +667 -0
- package/src/mesh/mesh-delivery-policy.ts +315 -0
- package/src/mesh/mesh-events-coordinator.ts +2303 -0
- package/src/mesh/mesh-events-pending.ts +567 -0
- package/src/mesh/mesh-events-stale.ts +307 -0
- package/src/mesh/mesh-events-utils.ts +381 -0
- package/src/mesh/mesh-events.ts +30 -1035
- package/src/mesh/mesh-fast-forward.ts +839 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-init.ts +260 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -5
- package/src/mesh/mesh-ledger.ts +590 -102
- package/src/mesh/mesh-missions.ts +322 -0
- package/src/mesh/mesh-reconcile-loop.ts +989 -0
- package/src/mesh/mesh-refine-batch.ts +197 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-review-inbox.ts +307 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +1664 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
- package/src/mesh/mesh-work-queue.ts +901 -141
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +331 -0
- package/src/providers/acp-provider-instance.ts +25 -9
- package/src/providers/approval-utils.d.ts +4 -0
- package/src/providers/approval-utils.ts +47 -5
- package/src/providers/chat-message-normalization.ts +45 -5
- package/src/providers/cli-provider-instance.ts +1041 -99
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +150 -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/native-history/antigravity-cli-transcript.ts +643 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/dispatcher.ts +340 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +30 -0
- package/src/providers/provider-instance.ts +10 -1
- package/src/providers/provider-loader.ts +670 -50
- package/src/providers/provider-schema.ts +87 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -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 +168 -0
- package/src/providers/spec/cli-adapter.ts +986 -0
- package/src/providers/spec/evaluator.ts +345 -0
- package/src/providers/spec/fsm-driver.ts +1065 -0
- package/src/providers/spec/fsm-evaluator.ts +255 -0
- package/src/providers/spec/fsm-loader.ts +120 -0
- package/src/providers/spec/fsm-types.ts +238 -0
- package/src/providers/spec/native-history-executor.ts +1136 -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 +226 -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 +378 -14
- package/src/sessions/registry.ts +6 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +64 -1
- package/src/status/builders.ts +26 -6
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +5 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { appendLedgerEntry, buildTaskCompletionEvidence, readLedgerEntries } from './mesh-ledger.js';
|
|
2
|
+
import type { MeshLedgerKind } from './mesh-ledger.js';
|
|
3
|
+
import { updateDirectDispatchStatus, cleanupTerminalDirectDispatches } from './mesh-work-queue.js';
|
|
4
|
+
import { markSessionDeliveriesTerminal } from './mesh-delivery-policy.js';
|
|
5
|
+
import { queuePendingMeshCoordinatorEvent } from './mesh-events-pending.js';
|
|
6
|
+
import { readNonEmptyString, readRecord, resolveEventSessionId, readWorkerResultMetadata } from './mesh-events-utils.js';
|
|
7
|
+
import { meshNodeIdMatches, type MeshNodeIdentified } from '@adhdev/mesh-shared';
|
|
8
|
+
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Stale direct-dispatch detection & transcript reconciliation
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
export function findRecentTerminalLedgerEvidence(args: {
|
|
14
|
+
meshId: string;
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
nodeId?: string;
|
|
17
|
+
}): { id: string; kind: MeshLedgerKind; payload: Record<string, unknown>; timestamp: string } | null {
|
|
18
|
+
if (!args.sessionId && !args.nodeId) return null;
|
|
19
|
+
// Tail-limit: 200 entries gives a wide enough window to catch terminal events for active
|
|
20
|
+
// sessions while avoiding a full O(n) scan. If a terminal is older than 200 entries,
|
|
21
|
+
// the MeshRuntimeStore fingerprint dedup will still block duplicate processing downstream.
|
|
22
|
+
const entries = readLedgerEntries(args.meshId, { tail: 200 });
|
|
23
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
24
|
+
const entry = entries[i];
|
|
25
|
+
if (entry.kind !== 'task_completed' && entry.kind !== 'task_failed' && entry.kind !== 'task_stalled') continue;
|
|
26
|
+
if (args.sessionId && entry.sessionId === args.sessionId) {
|
|
27
|
+
return { id: entry.id, kind: entry.kind, payload: entry.payload || {}, timestamp: entry.timestamp };
|
|
28
|
+
}
|
|
29
|
+
// Normalized node-id match (P4): a ledger entry may store its node id as `nodeId`
|
|
30
|
+
// (runtime form) or `node_id` (DB column form leaked onto the object). A raw `===`
|
|
31
|
+
// against args.nodeId drops the entry when the entry's stored form differs from the
|
|
32
|
+
// form the caller passes, so a valid terminal completion goes unfound. meshNodeIdMatches
|
|
33
|
+
// normalizes the entry across all 3 forms before comparing. (The entry's typed shape
|
|
34
|
+
// omits the open index signature MeshNodeIdentified declares, hence the cast.)
|
|
35
|
+
if (!args.sessionId && args.nodeId && meshNodeIdMatches(entry as unknown as MeshNodeIdentified, args.nodeId)) {
|
|
36
|
+
return { id: entry.id, kind: entry.kind, payload: entry.payload || {}, timestamp: entry.timestamp };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Returns true when a task_dispatched entry for the given session appears AFTER the terminal
|
|
43
|
+
// entry (identified by terminalId) in ledger order. Positional (append) order is used rather
|
|
44
|
+
// than timestamp comparison because both entries may share the same millisecond.
|
|
45
|
+
export function hasDispatchAfterTerminal(meshId: string, sessionId: string, terminalId: string): boolean {
|
|
46
|
+
// 200-entry window matches findRecentTerminalLedgerEvidence for consistency.
|
|
47
|
+
const entries = readLedgerEntries(meshId, { tail: 200 });
|
|
48
|
+
let pastTerminal = false;
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (!pastTerminal) {
|
|
51
|
+
if (entry.id === terminalId) pastTerminal = true;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (entry.kind === 'task_dispatched' && entry.sessionId === sessionId) return true;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function hasUnterminalDirectDispatchLedgerEntry(meshId: string, sessionId: string): boolean {
|
|
60
|
+
// Some dispatch paths can persist task_dispatched before the direct-dispatch DB row is
|
|
61
|
+
// available. Recover routing from ledger order so coordinator self-targets still emit
|
|
62
|
+
// task_completed and pendingCoordinatorEvents.
|
|
63
|
+
const entries = readLedgerEntries(meshId, { tail: 200 });
|
|
64
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
65
|
+
const entry = entries[i];
|
|
66
|
+
if (entry.sessionId !== sessionId) continue;
|
|
67
|
+
if (entry.kind === 'task_completed' || entry.kind === 'task_failed' || entry.kind === 'task_stalled') {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (entry.kind === 'task_dispatched' && entry.payload?.source === 'direct') {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// True when a terminal ledger payload was recorded from WEAK completion evidence (a false
|
|
78
|
+
// idle): insufficient evidence level, review-recommended, or a missing-final-assistant
|
|
79
|
+
// completion diagnostic. Mirrors isWeakTerminalLedgerPayload in mesh-events-coordinator —
|
|
80
|
+
// a weak terminal is non-authoritative and may be superseded by a genuine completion.
|
|
81
|
+
function isWeakCompletionLedgerPayload(payload: Record<string, unknown> | undefined): boolean {
|
|
82
|
+
if (!payload) return false;
|
|
83
|
+
if (payload.evidenceLevel === 'insufficient' || payload.reviewRecommended === true) return true;
|
|
84
|
+
const diag = readRecord(payload.completionDiagnostic);
|
|
85
|
+
return diag?.finalAssistantPresent === false || diag?.blockReason === 'missing_final_assistant';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function findDirectDispatchLedgerEntry(args: {
|
|
89
|
+
meshId: string;
|
|
90
|
+
taskId: string;
|
|
91
|
+
sessionId?: string;
|
|
92
|
+
}): { id: string; timestamp: string; nodeId?: string; sessionId?: string; providerType?: string; payload: Record<string, unknown> } | null {
|
|
93
|
+
const entries = readLedgerEntries(args.meshId, { tail: 500 });
|
|
94
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
95
|
+
const entry = entries[i];
|
|
96
|
+
if (entry.kind !== 'task_dispatched') continue;
|
|
97
|
+
const payloadTaskId = readNonEmptyString(entry.payload?.taskId);
|
|
98
|
+
if (payloadTaskId !== args.taskId) continue;
|
|
99
|
+
if (args.sessionId && entry.sessionId && entry.sessionId !== args.sessionId) continue;
|
|
100
|
+
return {
|
|
101
|
+
id: entry.id,
|
|
102
|
+
timestamp: entry.timestamp,
|
|
103
|
+
nodeId: entry.nodeId,
|
|
104
|
+
sessionId: entry.sessionId,
|
|
105
|
+
providerType: entry.providerType,
|
|
106
|
+
payload: entry.payload || {},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function hasTerminalLedgerAfterDispatch(args: {
|
|
113
|
+
meshId: string;
|
|
114
|
+
taskId: string;
|
|
115
|
+
sessionId?: string;
|
|
116
|
+
dispatchEntryId?: string;
|
|
117
|
+
dispatchTimestamp?: string;
|
|
118
|
+
}): boolean {
|
|
119
|
+
const entries = readLedgerEntries(args.meshId, { tail: 500 });
|
|
120
|
+
let afterDispatch = !args.dispatchEntryId && !args.dispatchTimestamp;
|
|
121
|
+
const dispatchTime = args.dispatchTimestamp ? new Date(args.dispatchTimestamp).getTime() : Number.NaN;
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (!afterDispatch) {
|
|
124
|
+
if (args.dispatchEntryId && entry.id === args.dispatchEntryId) {
|
|
125
|
+
afterDispatch = true;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!args.dispatchEntryId && Number.isFinite(dispatchTime)) {
|
|
129
|
+
const entryTime = new Date(entry.timestamp).getTime();
|
|
130
|
+
if (Number.isFinite(entryTime) && entryTime >= dispatchTime) afterDispatch = true;
|
|
131
|
+
}
|
|
132
|
+
if (!afterDispatch) continue;
|
|
133
|
+
}
|
|
134
|
+
if (entry.kind !== 'task_completed' && entry.kind !== 'task_failed' && entry.kind !== 'task_stalled') continue;
|
|
135
|
+
// Fix C (reconcile fallback expansion): a task_completed recorded from a FALSE idle
|
|
136
|
+
// (weak evidence / no confirmed final assistant) is NOT authoritative terminal
|
|
137
|
+
// evidence. Skip it so the transcript reconcile can still synthesize the GENUINE
|
|
138
|
+
// completion for a re-dispatched / prematurely-terminated direct task instead of
|
|
139
|
+
// bailing with alreadyTerminal.
|
|
140
|
+
if (entry.kind === 'task_completed' && isWeakCompletionLedgerPayload(entry.payload)) continue;
|
|
141
|
+
const terminalTaskId = readNonEmptyString(entry.payload?.taskId);
|
|
142
|
+
if (terminalTaskId && terminalTaskId === args.taskId) return true;
|
|
143
|
+
if (terminalTaskId && terminalTaskId !== args.taskId) continue;
|
|
144
|
+
if (args.sessionId && entry.sessionId === args.sessionId) return true;
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function reconcileDirectDispatchCompletionFromTranscript(args: {
|
|
150
|
+
meshId: string;
|
|
151
|
+
nodeId?: string;
|
|
152
|
+
sessionId: string;
|
|
153
|
+
providerType?: string;
|
|
154
|
+
providerSessionId?: string;
|
|
155
|
+
taskId: string;
|
|
156
|
+
finalSummary: string;
|
|
157
|
+
transcriptMessageAt?: string;
|
|
158
|
+
completedAt?: string;
|
|
159
|
+
targetCoordinatorDaemonId?: string;
|
|
160
|
+
source?: string;
|
|
161
|
+
}): { reconciled: boolean; kind?: MeshLedgerKind; alreadyTerminal?: boolean; workerResult?: unknown; ledgerEntryId?: string; reason?: string } {
|
|
162
|
+
const finalSummary = readNonEmptyString(args.finalSummary);
|
|
163
|
+
if (!args.meshId || !args.taskId || !args.sessionId || !finalSummary) {
|
|
164
|
+
return { reconciled: false, reason: 'missing_required_completion_evidence' };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const dispatch = findDirectDispatchLedgerEntry({
|
|
168
|
+
meshId: args.meshId,
|
|
169
|
+
taskId: args.taskId,
|
|
170
|
+
sessionId: args.sessionId,
|
|
171
|
+
});
|
|
172
|
+
if (hasTerminalLedgerAfterDispatch({
|
|
173
|
+
meshId: args.meshId,
|
|
174
|
+
taskId: args.taskId,
|
|
175
|
+
sessionId: args.sessionId,
|
|
176
|
+
dispatchEntryId: dispatch?.id,
|
|
177
|
+
dispatchTimestamp: dispatch?.timestamp,
|
|
178
|
+
})) {
|
|
179
|
+
return { reconciled: false, alreadyTerminal: true, reason: 'terminal_ledger_entry_exists' };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const nodeId = readNonEmptyString(args.nodeId) || dispatch?.nodeId;
|
|
183
|
+
const providerType = readNonEmptyString(args.providerType) || dispatch?.providerType || readNonEmptyString(dispatch?.payload.providerType);
|
|
184
|
+
const completedAt = args.completedAt || new Date().toISOString();
|
|
185
|
+
const evidence = buildTaskCompletionEvidence({
|
|
186
|
+
event: 'agent:generating_completed',
|
|
187
|
+
nodeId: nodeId || 'unknown',
|
|
188
|
+
sessionId: args.sessionId,
|
|
189
|
+
providerType,
|
|
190
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
191
|
+
finalSummary,
|
|
192
|
+
completedAt,
|
|
193
|
+
});
|
|
194
|
+
const workerResult = evidence.workerResult;
|
|
195
|
+
const dispatchTime = dispatch?.timestamp ? new Date(dispatch.timestamp).getTime() : Number.NaN;
|
|
196
|
+
const transcriptTime = args.transcriptMessageAt ? new Date(args.transcriptMessageAt).getTime() : Number.NaN;
|
|
197
|
+
const transcriptAfterDispatch = Number.isFinite(dispatchTime) && Number.isFinite(transcriptTime) && transcriptTime >= dispatchTime;
|
|
198
|
+
if (workerResult.source !== 'final_summary_json' && !transcriptAfterDispatch) {
|
|
199
|
+
return { reconciled: false, reason: 'transcript_not_proven_after_dispatch' };
|
|
200
|
+
}
|
|
201
|
+
const workerFailed = workerResult.status === 'failed' || (workerResult.status !== 'completed' && workerResult.errors.length > 0);
|
|
202
|
+
const kind: MeshLedgerKind = workerFailed ? 'task_failed' : 'task_completed';
|
|
203
|
+
|
|
204
|
+
const entry = appendLedgerEntry(args.meshId, {
|
|
205
|
+
kind,
|
|
206
|
+
nodeId: nodeId || undefined,
|
|
207
|
+
sessionId: args.sessionId,
|
|
208
|
+
providerType: providerType || undefined,
|
|
209
|
+
payload: {
|
|
210
|
+
event: 'agent:generating_completed',
|
|
211
|
+
source: args.source || 'direct_task_transcript_reconciliation',
|
|
212
|
+
taskId: args.taskId,
|
|
213
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
214
|
+
finalSummary,
|
|
215
|
+
workerResult,
|
|
216
|
+
completionDiagnostic: {
|
|
217
|
+
reason: 'direct_task_transcript_reconciliation',
|
|
218
|
+
dispatchEntryId: dispatch?.id,
|
|
219
|
+
dispatchTimestamp: dispatch?.timestamp,
|
|
220
|
+
transcriptMessageAt: readNonEmptyString(args.transcriptMessageAt),
|
|
221
|
+
transcriptFinalAssistantPresent: true,
|
|
222
|
+
},
|
|
223
|
+
evidence,
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
updateDirectDispatchStatus(args.meshId, args.sessionId, kind === 'task_completed' ? 'completed' : 'failed');
|
|
227
|
+
markSessionDeliveriesTerminal(args.meshId, args.sessionId, kind === 'task_completed' ? 'completed' : 'failed');
|
|
228
|
+
setImmediate(() => cleanupTerminalDirectDispatches());
|
|
229
|
+
queuePendingMeshCoordinatorEvent({
|
|
230
|
+
event: kind === 'task_completed' ? 'agent:generating_completed' : 'agent:stopped',
|
|
231
|
+
meshId: args.meshId,
|
|
232
|
+
nodeLabel: nodeId ? `Node '${nodeId}'` : 'Remote agent',
|
|
233
|
+
nodeId: nodeId || undefined,
|
|
234
|
+
metadataEvent: {
|
|
235
|
+
targetSessionId: args.sessionId,
|
|
236
|
+
providerType: providerType || undefined,
|
|
237
|
+
providerSessionId: readNonEmptyString(args.providerSessionId),
|
|
238
|
+
finalSummary,
|
|
239
|
+
taskId: args.taskId,
|
|
240
|
+
workerResult,
|
|
241
|
+
completionDiagnostic: {
|
|
242
|
+
reason: 'direct_task_transcript_reconciliation',
|
|
243
|
+
terminalLedgerKind: kind,
|
|
244
|
+
terminalLedgerId: entry.id,
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
coordinatorMessage: undefined,
|
|
248
|
+
queuedAt: Date.now(),
|
|
249
|
+
...(readNonEmptyString(args.targetCoordinatorDaemonId) ? { targetCoordinatorDaemonId: readNonEmptyString(args.targetCoordinatorDaemonId) } : {}),
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
return { reconciled: true, kind, workerResult, ledgerEntryId: entry.id };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function buildNoProgressCompletionReconciliation(args: {
|
|
256
|
+
meshId: string;
|
|
257
|
+
nodeId?: string;
|
|
258
|
+
nodeLabel: string;
|
|
259
|
+
metadataEvent: Record<string, unknown>;
|
|
260
|
+
sourceInstanceId?: string;
|
|
261
|
+
}): Record<string, unknown> | null {
|
|
262
|
+
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
263
|
+
const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
|
|
264
|
+
const providerType = readNonEmptyString(args.metadataEvent.providerType);
|
|
265
|
+
const providerSessionId = readNonEmptyString(args.metadataEvent.providerSessionId);
|
|
266
|
+
const workerResult = readWorkerResultMetadata(args.metadataEvent);
|
|
267
|
+
const completionDiagnostic = readRecord(args.metadataEvent.completionDiagnostic);
|
|
268
|
+
const finalSummary = readNonEmptyString(args.metadataEvent.finalSummary);
|
|
269
|
+
const status = readNonEmptyString(args.metadataEvent.status).toLowerCase();
|
|
270
|
+
const explicitCompletionEvidence = Boolean(
|
|
271
|
+
finalSummary
|
|
272
|
+
|| workerResult
|
|
273
|
+
|| completionDiagnostic?.finalAssistantPresent === true
|
|
274
|
+
|| status === 'idle'
|
|
275
|
+
|| status === 'ready'
|
|
276
|
+
|| status === 'completed',
|
|
277
|
+
);
|
|
278
|
+
if (explicitCompletionEvidence) {
|
|
279
|
+
return {
|
|
280
|
+
...args.metadataEvent,
|
|
281
|
+
targetSessionId: sessionId,
|
|
282
|
+
providerType,
|
|
283
|
+
providerSessionId,
|
|
284
|
+
finalSummary,
|
|
285
|
+
source: 'no_progress_reconciliation',
|
|
286
|
+
reconciledFromEvent: 'monitor:no_progress',
|
|
287
|
+
timestamp: args.metadataEvent.timestamp ?? Date.now(),
|
|
288
|
+
completionDiagnostic: {
|
|
289
|
+
...(completionDiagnostic || {}),
|
|
290
|
+
reconciliationReason: 'provider_completion_evidence',
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const terminal = findRecentTerminalLedgerEvidence({
|
|
296
|
+
meshId: args.meshId,
|
|
297
|
+
sessionId: sessionId || undefined,
|
|
298
|
+
nodeId: nodeId || undefined,
|
|
299
|
+
});
|
|
300
|
+
if (!terminal) return null;
|
|
301
|
+
return {
|
|
302
|
+
...args.metadataEvent,
|
|
303
|
+
source: 'no_progress_terminal_ledger_suppression',
|
|
304
|
+
terminalLedgerKind: terminal.kind,
|
|
305
|
+
terminalLedgerAt: terminal.timestamp,
|
|
306
|
+
};
|
|
307
|
+
}
|