@adhdev/daemon-core 0.9.82-rc.18 → 0.9.82-rc.181
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/process-hardening.d.ts +50 -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 +22 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +178 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +106 -63
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +29 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/commands/handler.d.ts +110 -0
- package/dist/commands/mesh-coordinator.d.ts +72 -1
- package/dist/commands/router.d.ts +22 -0
- package/dist/config/chat-history.d.ts +8 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +72 -1
- package/dist/git/git-commands.d.ts +5 -1
- package/dist/index.d.ts +35 -8
- package/dist/index.js +20754 -5387
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20567 -5270
- 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/mesh/beads-db.d.ts +72 -0
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +30 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +90 -0
- package/dist/mesh/mesh-events.d.ts +97 -5
- package/dist/mesh/mesh-fast-forward.d.ts +41 -0
- package/dist/mesh/mesh-host-ownership.d.ts +9 -0
- package/dist/mesh/mesh-ledger.d.ts +58 -1
- package/dist/mesh/mesh-refine-status.d.ts +26 -0
- package/dist/mesh/mesh-work-queue.d.ts +54 -6
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +193 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +113 -0
- package/dist/providers/approval-utils.d.ts +13 -0
- package/dist/providers/cli-provider-instance.d.ts +35 -3
- package/dist/providers/contracts.d.ts +98 -5
- 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 +25 -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 +12 -0
- package/dist/providers/provider-instance.d.ts +12 -0
- 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 +169 -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 +56 -0
- package/dist/providers/spec/cli-adapter.d.ts +97 -0
- package/dist/providers/spec/driver.d.ts +159 -0
- package/dist/providers/spec/evaluator.d.ts +47 -0
- package/dist/providers/spec/loader.d.ts +14 -0
- package/dist/providers/spec/native-history-executor.d.ts +39 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/schema.gen.d.ts +511 -0
- package/dist/providers/spec/types.d.ts +212 -0
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +48 -0
- package/dist/repo-mesh-types.d.ts +102 -1
- package/dist/sessions/registry.d.ts +3 -0
- package/dist/shared-types.d.ts +42 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +1 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -2
- package/src/agent-stream/poller.ts +2 -3
- package/src/boot/daemon-lifecycle.ts +17 -10
- package/src/boot/process-hardening.ts +89 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +14 -1
- package/src/cli-adapter-types.d.ts +1 -0
- package/src/cli-adapter-types.ts +21 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1086 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +670 -1137
- 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 +3 -1
- package/src/cli-adapters/provider-cli-shared.d.ts +2 -0
- package/src/cli-adapters/provider-cli-shared.ts +59 -11
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +17 -1
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +8 -1
- package/src/commands/chat-commands.ts +1597 -60
- package/src/commands/cli-manager.ts +230 -3
- package/src/commands/handler.ts +809 -2
- package/src/commands/mesh-coordinator.ts +231 -127
- package/src/commands/router.ts +3495 -502
- package/src/config/chat-history.ts +91 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +280 -2
- package/src/config/recent-activity.ts +8 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/detection/ide-detector.ts +26 -16
- package/src/git/git-commands.ts +17 -5
- package/src/git/git-worktree.ts +8 -1
- package/src/index.ts +113 -7
- 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/logger.ts +2 -1
- package/src/mesh/beads-db.ts +486 -0
- package/src/mesh/contracts.ts +329 -0
- package/src/mesh/coordinator-prompt.ts +204 -30
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +437 -0
- package/src/mesh/mesh-events.ts +963 -67
- package/src/mesh/mesh-fast-forward.ts +438 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-ledger.ts +457 -104
- package/src/mesh/mesh-refine-status.ts +144 -0
- package/src/mesh/mesh-work-queue.ts +263 -159
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +366 -0
- package/src/mesh/worktree-bootstrap-config.ts +247 -0
- package/src/providers/approval-utils.d.ts +4 -0
- package/src/providers/approval-utils.ts +47 -5
- package/src/providers/chat-message-normalization.ts +4 -11
- package/src/providers/cli-provider-instance.ts +651 -57
- package/src/providers/contracts.ts +105 -5
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +19 -5
- 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 +419 -0
- package/src/providers/native-history/dispatcher.ts +231 -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 +9 -0
- package/src/providers/provider-loader.ts +585 -50
- package/src/providers/provider-schema.ts +31 -13
- 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 +458 -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 +210 -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 +507 -0
- package/src/providers/spec/driver.ts +540 -0
- package/src/providers/spec/evaluator.ts +298 -0
- package/src/providers/spec/loader.ts +130 -0
- package/src/providers/spec/native-history-executor.ts +706 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/schema.gen.ts +511 -0
- package/src/providers/spec/schema.json +211 -0
- package/src/providers/spec/types.ts +231 -0
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +396 -0
- package/src/providers/version-archive.ts +38 -20
- package/src/repo-mesh-types.ts +112 -1
- package/src/sessions/registry.ts +3 -0
- package/src/shared-types.ts +45 -1
- package/src/status/builders.ts +24 -6
- package/src/status/reporter.ts +15 -0
- package/src/status/snapshot.ts +84 -25
- package/src/system/host-memory.ts +29 -12
- package/src/types.ts +5 -0
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermes Agent — native history adapter.
|
|
3
|
+
*
|
|
4
|
+
* Hermes persists state in ~/.hermes/state.db (SQLite, better-sqlite3):
|
|
5
|
+
* sessions(id, source, started_at, ended_at, message_count, ...)
|
|
6
|
+
* messages(id, session_id, role, content, timestamp, ...)
|
|
7
|
+
*
|
|
8
|
+
* Earlier releases dumped per-session JSON files under ~/.hermes/sessions/;
|
|
9
|
+
* recent hermes (≥ 0.14) writes only to state.db. We read straight from
|
|
10
|
+
* the db when available and fall back to scanning legacy JSON dumps for
|
|
11
|
+
* archived sessions.
|
|
12
|
+
*
|
|
13
|
+
* The dispatcher hands us a sourcePath (the file the resolveHermesPath
|
|
14
|
+
* function picks). For the SQLite case the "path" is the db file itself
|
|
15
|
+
* and we resolve the most recent cli-source session inside readSession.
|
|
16
|
+
*/
|
|
17
|
+
'use strict';
|
|
18
|
+
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import * as os from 'node:os';
|
|
22
|
+
|
|
23
|
+
export interface NativeHistoryMessage {
|
|
24
|
+
id: string;
|
|
25
|
+
role: 'user' | 'assistant' | 'system';
|
|
26
|
+
content: string;
|
|
27
|
+
receivedAt: number;
|
|
28
|
+
kind?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface NativeHistorySession {
|
|
32
|
+
messages: NativeHistoryMessage[];
|
|
33
|
+
providerSessionId: string;
|
|
34
|
+
source: 'provider-native';
|
|
35
|
+
sourcePath: string;
|
|
36
|
+
sourceMtimeMs: number;
|
|
37
|
+
nativeHistoryCoverage: 'full';
|
|
38
|
+
workspace?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface NativeHistorySessionMeta {
|
|
42
|
+
historySessionId: string;
|
|
43
|
+
sessionId: string;
|
|
44
|
+
sourcePath: string;
|
|
45
|
+
sourceMtimeMs: number;
|
|
46
|
+
messageCount: number;
|
|
47
|
+
firstMessageAt: number;
|
|
48
|
+
lastMessageAt: number;
|
|
49
|
+
sessionTitle?: string;
|
|
50
|
+
preview?: string;
|
|
51
|
+
workspace?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const HERMES_STATE_DB = path.join(os.homedir(), '.hermes', 'state.db');
|
|
55
|
+
const HERMES_LEGACY_SESSIONS_DIR = path.join(os.homedir(), '.hermes', 'sessions');
|
|
56
|
+
|
|
57
|
+
function statMtimeMs(p: string): number {
|
|
58
|
+
try { return Math.floor(fs.statSync(p).mtimeMs); } catch { return 0; }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function openDb(): any | null {
|
|
62
|
+
if (!fs.existsSync(HERMES_STATE_DB)) return null;
|
|
63
|
+
try {
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
65
|
+
const Database = require('better-sqlite3');
|
|
66
|
+
return new Database(HERMES_STATE_DB, { readonly: true, fileMustExist: true });
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function loadMessagesForSession(db: any, sessionId: string): NativeHistoryMessage[] {
|
|
73
|
+
const rows: any[] = db.prepare(
|
|
74
|
+
`SELECT id, role, content, timestamp
|
|
75
|
+
FROM messages
|
|
76
|
+
WHERE session_id = ? AND content IS NOT NULL AND content != ''
|
|
77
|
+
ORDER BY timestamp ASC, id ASC`,
|
|
78
|
+
).all(sessionId);
|
|
79
|
+
const out: NativeHistoryMessage[] = [];
|
|
80
|
+
for (const r of rows) {
|
|
81
|
+
const role = normalizeHermesRole(r.role);
|
|
82
|
+
// Hermes stores some tool/system rows under role='tool'; surface as
|
|
83
|
+
// 'assistant' so they don't get dropped on the daemon's chat schema
|
|
84
|
+
// validation (role must be user/assistant/system).
|
|
85
|
+
out.push({
|
|
86
|
+
id: String(r.id),
|
|
87
|
+
role,
|
|
88
|
+
content: String(r.content),
|
|
89
|
+
receivedAt: Math.floor(Number(r.timestamp) * 1000),
|
|
90
|
+
kind: 'standard',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function readSession(sessionPath: string): NativeHistorySession | null {
|
|
97
|
+
if (!sessionPath) return null;
|
|
98
|
+
|
|
99
|
+
// Path mode A: SQLite — sourcePath is the state.db path. Pick the
|
|
100
|
+
// newest source='cli' session that has at least one persisted message.
|
|
101
|
+
if (sessionPath === HERMES_STATE_DB) {
|
|
102
|
+
const db = openDb();
|
|
103
|
+
if (!db) return null;
|
|
104
|
+
try {
|
|
105
|
+
const row: any = db.prepare(
|
|
106
|
+
`SELECT id, started_at FROM sessions
|
|
107
|
+
WHERE source = 'cli' AND message_count > 0
|
|
108
|
+
ORDER BY started_at DESC LIMIT 1`,
|
|
109
|
+
).get();
|
|
110
|
+
if (!row) return null;
|
|
111
|
+
const messages = loadMessagesForSession(db, row.id);
|
|
112
|
+
if (messages.length === 0) return null;
|
|
113
|
+
return {
|
|
114
|
+
messages,
|
|
115
|
+
providerSessionId: String(row.id),
|
|
116
|
+
source: 'provider-native',
|
|
117
|
+
sourcePath: sessionPath,
|
|
118
|
+
sourceMtimeMs: statMtimeMs(sessionPath),
|
|
119
|
+
nativeHistoryCoverage: 'full',
|
|
120
|
+
};
|
|
121
|
+
} finally {
|
|
122
|
+
try { db.close(); } catch { /* ignore */ }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Path mode B: legacy JSON dump — keep the old reader for archived
|
|
127
|
+
// sessions that pre-date the db format.
|
|
128
|
+
if (!path.isAbsolute(sessionPath) || !fs.existsSync(sessionPath)) return null;
|
|
129
|
+
let raw: any;
|
|
130
|
+
try { raw = JSON.parse(fs.readFileSync(sessionPath, 'utf8')); } catch { return null; }
|
|
131
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
132
|
+
const rawMessages = Array.isArray(raw.messages) ? raw.messages : [];
|
|
133
|
+
if (rawMessages.length === 0) return null;
|
|
134
|
+
const sourceMtimeMs = statMtimeMs(sessionPath);
|
|
135
|
+
const sessionStart = Number(raw.session_start) || sourceMtimeMs - rawMessages.length * 1000;
|
|
136
|
+
const messages: NativeHistoryMessage[] = [];
|
|
137
|
+
for (let i = 0; i < rawMessages.length; i += 1) {
|
|
138
|
+
const m = rawMessages[i];
|
|
139
|
+
const content = typeof m?.content === 'string' ? m.content : '';
|
|
140
|
+
if (!content) continue;
|
|
141
|
+
messages.push({
|
|
142
|
+
id: typeof m?.id === 'string' ? m.id : `msg_${i}`,
|
|
143
|
+
role: normalizeHermesRole(m?.role),
|
|
144
|
+
content,
|
|
145
|
+
receivedAt: sessionStart + i * 1000,
|
|
146
|
+
kind: 'standard',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (messages.length === 0) return null;
|
|
150
|
+
const sessionId = typeof raw.session_id === 'string' && raw.session_id
|
|
151
|
+
? raw.session_id
|
|
152
|
+
: path.basename(sessionPath, '.json').replace(/^session_/, '');
|
|
153
|
+
return {
|
|
154
|
+
messages,
|
|
155
|
+
providerSessionId: sessionId,
|
|
156
|
+
source: 'provider-native',
|
|
157
|
+
sourcePath: sessionPath,
|
|
158
|
+
sourceMtimeMs,
|
|
159
|
+
nativeHistoryCoverage: 'full',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export async function listSessions(_watchPath: string): Promise<NativeHistorySessionMeta[]> {
|
|
164
|
+
const out: NativeHistorySessionMeta[] = [];
|
|
165
|
+
|
|
166
|
+
const db = openDb();
|
|
167
|
+
if (db) {
|
|
168
|
+
try {
|
|
169
|
+
const rows: any[] = db.prepare(
|
|
170
|
+
`SELECT id, started_at, ended_at, message_count, title
|
|
171
|
+
FROM sessions
|
|
172
|
+
WHERE source = 'cli' AND message_count > 0
|
|
173
|
+
ORDER BY started_at DESC LIMIT 100`,
|
|
174
|
+
).all();
|
|
175
|
+
const mtime = statMtimeMs(HERMES_STATE_DB);
|
|
176
|
+
for (const r of rows) {
|
|
177
|
+
out.push({
|
|
178
|
+
historySessionId: String(r.id),
|
|
179
|
+
sessionId: String(r.id),
|
|
180
|
+
sourcePath: HERMES_STATE_DB,
|
|
181
|
+
sourceMtimeMs: mtime,
|
|
182
|
+
messageCount: Number(r.message_count) || 0,
|
|
183
|
+
firstMessageAt: Math.floor(Number(r.started_at) * 1000),
|
|
184
|
+
lastMessageAt: Math.floor(Number(r.ended_at || r.started_at) * 1000),
|
|
185
|
+
sessionTitle: typeof r.title === 'string' ? r.title : undefined,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
} finally {
|
|
189
|
+
try { db.close(); } catch { /* ignore */ }
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (fs.existsSync(HERMES_LEGACY_SESSIONS_DIR)) {
|
|
194
|
+
for (const name of fs.readdirSync(HERMES_LEGACY_SESSIONS_DIR)) {
|
|
195
|
+
if (!/^session_.*\.json$/.test(name)) continue;
|
|
196
|
+
const p = path.join(HERMES_LEGACY_SESSIONS_DIR, name);
|
|
197
|
+
const mtime = statMtimeMs(p);
|
|
198
|
+
if (!mtime) continue;
|
|
199
|
+
let raw: any;
|
|
200
|
+
try { raw = JSON.parse(fs.readFileSync(p, 'utf8')); } catch { continue; }
|
|
201
|
+
const msgs = Array.isArray(raw?.messages) ? raw.messages : [];
|
|
202
|
+
if (msgs.length === 0) continue;
|
|
203
|
+
const sessionId = typeof raw.session_id === 'string' && raw.session_id
|
|
204
|
+
? raw.session_id
|
|
205
|
+
: name.replace(/^session_/, '').replace(/\.json$/, '');
|
|
206
|
+
out.push({
|
|
207
|
+
historySessionId: sessionId,
|
|
208
|
+
sessionId,
|
|
209
|
+
sourcePath: p,
|
|
210
|
+
sourceMtimeMs: mtime,
|
|
211
|
+
messageCount: msgs.length,
|
|
212
|
+
firstMessageAt: Number(raw.session_start) || mtime,
|
|
213
|
+
lastMessageAt: Number(raw.last_updated) || mtime,
|
|
214
|
+
sessionTitle: typeof raw.title === 'string' ? raw.title : undefined,
|
|
215
|
+
preview: typeof msgs[0]?.content === 'string' ? String(msgs[0].content).slice(0, 80) : undefined,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
out.sort((a, b) => b.sourceMtimeMs - a.sourceMtimeMs);
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function normalizeHermesRole(r: any): 'user' | 'assistant' | 'system' {
|
|
225
|
+
const s = String(r ?? '').toLowerCase();
|
|
226
|
+
if (s === 'user' || s === 'human') return 'user';
|
|
227
|
+
if (s === 'assistant' || s === 'ai' || s === 'model') return 'assistant';
|
|
228
|
+
if (s === 'tool' || s === 'tool_result' || s === 'function') return 'assistant';
|
|
229
|
+
return 'system';
|
|
230
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* native-history — Daemon-side built-in adapters for CLI provider native history.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter reads conversation history directly from the CLI tool's on-disk
|
|
5
|
+
* storage without shelling out to a provider JS override script.
|
|
6
|
+
*
|
|
7
|
+
* OSS code (AGPL-3.0). Must not import from packages/ (proprietary).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
readSession as readClaudeCliSession,
|
|
12
|
+
listSessions as listClaudeCliSessions,
|
|
13
|
+
} from './claude-cli-transcript.js';
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
readSession as readCodexCliSession,
|
|
17
|
+
listSessions as listCodexCliSessions,
|
|
18
|
+
} from './codex-cli-transcript.js';
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
readSession as readAntigravityCliSession,
|
|
22
|
+
listSessions as listAntigravityCliSessions,
|
|
23
|
+
} from './antigravity-cli-transcript.js';
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
readSession as readHermesCliSession,
|
|
27
|
+
listSessions as listHermesCliSessions,
|
|
28
|
+
} from './hermes-cli-transcript.js';
|
|
29
|
+
|
|
30
|
+
export { createNativeHistoryDispatcher, type ReaderId } from './dispatcher.js';
|
|
@@ -306,6 +306,36 @@ export class ProviderInstanceManager {
|
|
|
306
306
|
return updated;
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
+
/** Stamp a mesh assignment on a single instance (used by mesh_send_task
|
|
310
|
+
* --direct so the worker's completion event has a coordinator routing
|
|
311
|
+
* marker in state.settings). Returns true if the instance existed and
|
|
312
|
+
* the stamp was applied. */
|
|
313
|
+
attachMeshAssignmentToInstance(instanceId: string, assignment: { meshId: string; nodeId?: string; taskId?: string }): boolean {
|
|
314
|
+
const inst = this.instances.get(instanceId);
|
|
315
|
+
if (!inst || typeof inst.attachMeshAssignment !== 'function') {
|
|
316
|
+
try {
|
|
317
|
+
const { LOG } = require('../logging/logger.js');
|
|
318
|
+
LOG.warn?.('MeshDispatch', `attachMeshAssignment skipped: instance ${instanceId} ${inst ? 'has no attach method' : 'not found'}`);
|
|
319
|
+
} catch { /* noop */ }
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
inst.attachMeshAssignment(assignment);
|
|
323
|
+
try {
|
|
324
|
+
const { LOG } = require('../logging/logger.js');
|
|
325
|
+
LOG.info?.('MeshDispatch', `stamped mesh assignment on ${instanceId}: mesh=${assignment.meshId} node=${assignment.nodeId || ''} task=${assignment.taskId || ''}`);
|
|
326
|
+
} catch { /* noop */ }
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/** Clear a mesh assignment after the dispatched task reaches a terminal
|
|
331
|
+
* state (generating_completed / stopped / failed). */
|
|
332
|
+
detachMeshAssignmentFromInstance(instanceId: string): boolean {
|
|
333
|
+
const inst = this.instances.get(instanceId);
|
|
334
|
+
if (!inst || typeof inst.detachMeshAssignment !== 'function') return false;
|
|
335
|
+
inst.detachMeshAssignment();
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
|
|
309
339
|
refreshProviderDefinitions(resolveProvider: (providerType: string) => unknown): number {
|
|
310
340
|
let refreshed = 0;
|
|
311
341
|
for (const instance of this.instances.values()) {
|
|
@@ -12,6 +12,7 @@ import type { ProviderModule, ProviderSettingDef, ProviderResumeCapability } fro
|
|
|
12
12
|
import type { AcpConfigOption, AcpMode, ProviderControlSchema, ProviderSummaryMetadata, SessionCapability } from '../shared-types.js';
|
|
13
13
|
import type { MessageInputSupport } from './provider-input-support.js';
|
|
14
14
|
import type { ChatMessage } from '../types.js';
|
|
15
|
+
import type { InteractivePrompt } from './types/interactive-prompt.js';
|
|
15
16
|
|
|
16
17
|
// ─── ProviderState — Discriminated union by category ─────────────
|
|
17
18
|
|
|
@@ -47,6 +48,7 @@ export interface ActiveChatData {
|
|
|
47
48
|
status: string;
|
|
48
49
|
messages: ChatMessage[];
|
|
49
50
|
activeModal: { message: string; buttons: string[] } | null;
|
|
51
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
50
52
|
inputContent?: string;
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -72,6 +74,7 @@ interface ProviderStateBase {
|
|
|
72
74
|
status: ProviderStatus;
|
|
73
75
|
/** chat data */
|
|
74
76
|
activeChat: ActiveChatData | null;
|
|
77
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
75
78
|
/** Workspace — project path or name (all categories) */
|
|
76
79
|
workspace?: string | null;
|
|
77
80
|
/** Runtime info (real-time detection) */
|
|
@@ -214,6 +217,12 @@ export interface ProviderInstance {
|
|
|
214
217
|
/** Update settings at runtime (called when user changes settings from dashboard) */
|
|
215
218
|
updateSettings?(newSettings: Record<string, any>): void;
|
|
216
219
|
|
|
220
|
+
/** Stamp a direct-dispatch mesh task assignment so generating_completed
|
|
221
|
+
* events route back to the originating coordinator. Cleared by
|
|
222
|
+
* detachMeshAssignment when the task reaches a terminal state. */
|
|
223
|
+
attachMeshAssignment?(assignment: { meshId: string; nodeId?: string; taskId?: string }): void;
|
|
224
|
+
detachMeshAssignment?(): void;
|
|
225
|
+
|
|
217
226
|
/** Refresh static provider definition/scripts without restarting the live runtime. */
|
|
218
227
|
refreshProviderDefinition?(provider: ProviderModule): void;
|
|
219
228
|
|