somtum 2.3.0 → 3.1.0
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/README.md +101 -852
- package/dist/agents/claude_code.d.ts +3 -0
- package/dist/agents/claude_code.d.ts.map +1 -0
- package/dist/agents/claude_code.js +112 -0
- package/dist/agents/claude_code.js.map +1 -0
- package/dist/agents/codex.d.ts +3 -0
- package/dist/agents/codex.d.ts.map +1 -0
- package/dist/agents/codex.js +173 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +24 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/shared.d.ts +3 -0
- package/dist/agents/shared.d.ts.map +1 -0
- package/dist/agents/shared.js +18 -0
- package/dist/agents/shared.js.map +1 -0
- package/dist/agents/types.d.ts +11 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +65 -78
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/hook.d.ts.map +1 -1
- package/dist/cli/hook.js +1 -4
- package/dist/cli/hook.js.map +1 -1
- package/dist/cli/index.js +14 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +19 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +68 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init_codex.d.ts +12 -0
- package/dist/cli/init_codex.d.ts.map +1 -0
- package/dist/cli/init_codex.js +53 -0
- package/dist/cli/init_codex.js.map +1 -0
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +2 -0
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/stats.d.ts +4 -0
- package/dist/cli/stats.d.ts.map +1 -1
- package/dist/cli/stats.js +71 -43
- package/dist/cli/stats.js.map +1 -1
- package/dist/cli/ui.d.ts +1 -1
- package/dist/cli/ui.d.ts.map +1 -1
- package/dist/cli/ui.js +1 -1
- package/dist/cli/ui.js.map +1 -1
- package/dist/core/extractor.d.ts +1 -0
- package/dist/core/extractor.d.ts.map +1 -1
- package/dist/core/extractor.js +93 -52
- package/dist/core/extractor.js.map +1 -1
- package/dist/core/ledger.d.ts +28 -0
- package/dist/core/ledger.d.ts.map +1 -0
- package/dist/core/ledger.js +43 -0
- package/dist/core/ledger.js.map +1 -0
- package/dist/core/llm_backend.d.ts +7 -0
- package/dist/core/llm_backend.d.ts.map +1 -0
- package/dist/core/llm_backend.js +44 -0
- package/dist/core/llm_backend.js.map +1 -0
- package/dist/core/memory_files.d.ts.map +1 -1
- package/dist/core/memory_files.js +2 -3
- package/dist/core/memory_files.js.map +1 -1
- package/dist/core/retriever/bm25.d.ts +1 -1
- package/dist/core/retriever/bm25.d.ts.map +1 -1
- package/dist/core/retriever/bm25.js +11 -1
- package/dist/core/retriever/bm25.js.map +1 -1
- package/dist/core/schema.d.ts +19 -4
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +10 -1
- package/dist/core/schema.js.map +1 -1
- package/dist/core/session_progress.d.ts +10 -0
- package/dist/core/session_progress.d.ts.map +1 -0
- package/dist/core/session_progress.js +39 -0
- package/dist/core/session_progress.js.map +1 -0
- package/dist/core/transcript.d.ts.map +1 -1
- package/dist/core/transcript.js +2 -108
- package/dist/core/transcript.js.map +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/db/migrations/006_token_ledger.sql +33 -0
- package/dist/hooks/post_session.d.ts +6 -5
- package/dist/hooks/post_session.d.ts.map +1 -1
- package/dist/hooks/post_session.js +107 -57
- package/dist/hooks/post_session.js.map +1 -1
- package/dist/hooks/pre_prompt.d.ts.map +1 -1
- package/dist/hooks/pre_prompt.js +14 -1
- package/dist/hooks/pre_prompt.js.map +1 -1
- package/dist/hooks/pre_read.d.ts +16 -2
- package/dist/hooks/pre_read.d.ts.map +1 -1
- package/dist/hooks/pre_read.js +81 -26
- package/dist/hooks/pre_read.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2 -0
- package/dist/mcp/tools.js.map +1 -1
- package/package.json +9 -3
package/dist/cli/stats.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type LedgerSummary } from '../core/ledger.js';
|
|
1
2
|
export interface StatsSnapshot {
|
|
2
3
|
project_id: string;
|
|
3
4
|
memories: number;
|
|
@@ -11,6 +12,7 @@ export interface StatsSnapshot {
|
|
|
11
12
|
strategy: string;
|
|
12
13
|
call_count: number;
|
|
13
14
|
}>;
|
|
15
|
+
ledger: LedgerSummary;
|
|
14
16
|
tokens_saved_estimated: number;
|
|
15
17
|
tokens_spent_estimated: number;
|
|
16
18
|
net_estimated: number;
|
|
@@ -20,9 +22,11 @@ export declare function collectStats(opts?: {
|
|
|
20
22
|
cwd?: string;
|
|
21
23
|
dbPath?: string;
|
|
22
24
|
projectId?: string;
|
|
25
|
+
since?: number;
|
|
23
26
|
}): StatsSnapshot;
|
|
24
27
|
export declare function statsCommand(options?: {
|
|
25
28
|
json?: boolean;
|
|
26
29
|
cwd?: string;
|
|
30
|
+
since?: string;
|
|
27
31
|
}): number;
|
|
28
32
|
//# sourceMappingURL=stats.d.ts.map
|
package/dist/cli/stats.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKpE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEvE,MAAM,EAAE,aAAa,CAAC;IAEtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,YAAY,CAC1B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/E,aAAa,CAuCf;AAiFD,wBAAgB,YAAY,CAC1B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,CA2BR"}
|
package/dist/cli/stats.js
CHANGED
|
@@ -4,8 +4,10 @@ import { openDb } from '../core/db.js';
|
|
|
4
4
|
import { MemoryStore } from '../core/store.js';
|
|
5
5
|
import { PromptCache } from '../core/cache.js';
|
|
6
6
|
import { RetrievalStatsStore } from '../core/retrieval_stats.js';
|
|
7
|
+
import { TokenLedger } from '../core/ledger.js';
|
|
7
8
|
import { resolveProjectId } from '../core/project_id.js';
|
|
8
|
-
import {
|
|
9
|
+
import { pickBackend } from '../core/llm_backend.js';
|
|
10
|
+
import { loadConfig, projectDir, globalDbPath, GLOBAL_PROJECT_ID } from '../config.js';
|
|
9
11
|
export function collectStats(opts = {}) {
|
|
10
12
|
const cwd = opts.cwd ?? process.cwd();
|
|
11
13
|
const projectId = opts.projectId ?? resolveProjectId(cwd);
|
|
@@ -24,6 +26,7 @@ export function collectStats(opts = {}) {
|
|
|
24
26
|
const globalMemories = globalDb
|
|
25
27
|
? new MemoryStore(globalDb).countByProject(GLOBAL_PROJECT_ID)
|
|
26
28
|
: 0;
|
|
29
|
+
const ledgerOpts = opts.since !== undefined ? { since: opts.since } : {};
|
|
27
30
|
return {
|
|
28
31
|
project_id: projectId,
|
|
29
32
|
memories: store.countByProject(projectId),
|
|
@@ -34,6 +37,7 @@ export function collectStats(opts = {}) {
|
|
|
34
37
|
cache_misses: cacheHits.miss_count,
|
|
35
38
|
cache_hit_rate: cacheHits.hit_rate,
|
|
36
39
|
retrieval_by_strategy: retrievalBreakdown,
|
|
40
|
+
ledger: new TokenLedger(db).summary(projectId, ledgerOpts),
|
|
37
41
|
tokens_saved_estimated: saved,
|
|
38
42
|
tokens_spent_estimated: spent,
|
|
39
43
|
net_estimated: saved - spent,
|
|
@@ -45,58 +49,82 @@ export function collectStats(opts = {}) {
|
|
|
45
49
|
globalDb?.close();
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
const n = (v) => v.toLocaleString('en-US');
|
|
53
|
+
const row = (label, count, tokens, note = '') => ` ${label.padEnd(18)} ${count.padStart(10)} ${tokens.padStart(14)}${note ? ` ${note}` : ''}`;
|
|
54
|
+
function printHuman(s, sinceLabel) {
|
|
49
55
|
console.log(`project ${s.project_id}`);
|
|
50
|
-
console.log(`memories ${s.memories}`);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (n > 0)
|
|
55
|
-
console.log(` ${k.padEnd(15)} ${n}`);
|
|
56
|
+
console.log(`memories ${s.memories}${s.global_memories > 0 ? ` (global: ${s.global_memories})` : ''}`);
|
|
57
|
+
for (const [k, c] of Object.entries(s.by_kind)) {
|
|
58
|
+
if (c > 0)
|
|
59
|
+
console.log(` ${k.padEnd(15)} ${c}`);
|
|
56
60
|
}
|
|
57
|
-
|
|
58
|
-
console.log(
|
|
59
|
-
console.log(`
|
|
60
|
-
const
|
|
61
|
-
console.log(
|
|
62
|
-
if (
|
|
63
|
-
console.log(
|
|
64
|
-
for (const r of s.retrieval_by_strategy) {
|
|
65
|
-
console.log(` ${r.strategy.padEnd(12)} ${r.call_count}`);
|
|
66
|
-
}
|
|
61
|
+
const l = s.ledger;
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log(`Somtum's own token use, metered (${sinceLabel})`);
|
|
64
|
+
const skipped = l.extraction_skipped.events > 0 ? `${l.extraction_skipped.events} skipped` : '';
|
|
65
|
+
console.log(row('extraction', `${l.extraction.events} calls`, `${n(l.extraction.tokens)} tok`, skipped));
|
|
66
|
+
if (l.file_summary.events > 0) {
|
|
67
|
+
console.log(row('file summaries', `${l.file_summary.events} calls`, `${n(l.file_summary.tokens)} tok`));
|
|
67
68
|
}
|
|
68
|
-
console.log(
|
|
69
|
-
console.log(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
console.log(
|
|
69
|
+
console.log(row('injected context', `${l.injection.events} prompts`, `${n(l.injection.tokens)} tok`, "added to your agent's input"));
|
|
70
|
+
console.log(row('total', '', `${n(l.overhead_tokens)} tok`));
|
|
71
|
+
const g = l.file_gate;
|
|
72
|
+
if (g.denied.events > 0) {
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log(`File gating, metered (${sinceLabel})`);
|
|
75
|
+
console.log(row('full reads avoided', `${g.denied.events}`, `${n(g.denied.tokens)} tok`));
|
|
76
|
+
console.log(row('summaries shown', `${g.summary.events}`, `-${n(g.summary.tokens)} tok`));
|
|
77
|
+
console.log(row('read anyway', `${g.reread.events}`, `-${n(g.reread.tokens)} tok`));
|
|
78
|
+
const verdict = g.net_tokens >= 0 ? 'saved' : 'lost — consider turning file gating off';
|
|
79
|
+
console.log(row('net', '', `${g.net_tokens >= 0 ? '' : '-'}${n(Math.abs(g.net_tokens))} tok`, verdict));
|
|
75
80
|
}
|
|
76
|
-
|
|
77
|
-
console.log(
|
|
81
|
+
if (s.cache_entries > 0 || s.cache_hits > 0) {
|
|
82
|
+
console.log('');
|
|
83
|
+
const hitRate = s.cache_hit_rate !== null ? `${(s.cache_hit_rate * 100).toFixed(1)}%` : 'n/a';
|
|
84
|
+
console.log(`prompt cache ${s.cache_entries} entries · ${s.cache_hits} hits · ${s.cache_misses} misses · ${hitRate} hit rate`);
|
|
78
85
|
}
|
|
86
|
+
if (s.retrieval_by_strategy.length > 0) {
|
|
87
|
+
console.log(`retrieval ${s.retrieval_by_strategy.map((r) => `${r.strategy} ${r.call_count}`).join(' · ')}`);
|
|
88
|
+
}
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log(`estimate ~${n(s.tokens_saved_estimated)} tokens of context replaced by memories`);
|
|
91
|
+
console.log(' (a heuristic, not a measurement: see https://riz007.github.io/somtum/guide/costs)');
|
|
92
|
+
}
|
|
93
|
+
function parseSince(raw) {
|
|
94
|
+
if (!raw)
|
|
95
|
+
return { label: 'all time' };
|
|
96
|
+
const m = /^(\d+)d$/.exec(raw.trim());
|
|
97
|
+
if (!m)
|
|
98
|
+
throw new Error(`--since expects a number of days like 7d, got "${raw}"`);
|
|
99
|
+
const days = Number(m[1]);
|
|
100
|
+
return { since: Date.now() - days * 24 * 60 * 60 * 1000, label: `last ${days} days` };
|
|
79
101
|
}
|
|
80
102
|
export function statsCommand(options = {}) {
|
|
81
|
-
const
|
|
103
|
+
const cwd = options.cwd ?? process.cwd();
|
|
104
|
+
let window;
|
|
105
|
+
try {
|
|
106
|
+
window = parseSince(options.since);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error(`somtum: ${err.message}`);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
const snap = collectStats(window.since !== undefined ? { cwd, since: window.since } : { cwd });
|
|
82
113
|
if (options.json) {
|
|
83
114
|
console.log(JSON.stringify(snap, null, 2));
|
|
115
|
+
return 0;
|
|
84
116
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
console.log('hint: No memories captured yet. After your next Claude session ends,');
|
|
97
|
-
console.log(' the SessionEnd hook will extract observations automatically.');
|
|
98
|
-
console.log(' Run `somtum doctor` to verify the hook is installed correctly.');
|
|
99
|
-
}
|
|
117
|
+
printHuman(snap, window.label);
|
|
118
|
+
if (snap.memories === 0) {
|
|
119
|
+
console.log('');
|
|
120
|
+
if (!pickBackend(loadConfig({ cwd }))) {
|
|
121
|
+
console.log('hint: no extraction backend is available, so sessions cannot be captured.');
|
|
122
|
+
console.log(' Install the claude or codex CLI, or set ANTHROPIC_API_KEY in your shell');
|
|
123
|
+
console.log(' profile. Check the full setup with: somtum doctor');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log('hint: no memories yet. They are extracted when a session ends or compacts.');
|
|
127
|
+
console.log(' Run `somtum doctor` if a session has ended and this is still empty.');
|
|
100
128
|
}
|
|
101
129
|
}
|
|
102
130
|
return 0;
|
package/dist/cli/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/ui.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const SOMTUM_LOGO = "\n \u001B[32m\u001B[1m_____ \u001B[31m____ \u001B[33m__ \u001B[32m__________ \u001B[31m__ \u001B[33m___\n \u001B[32m/ ___/ \u001B[31m/ __ \\\u001B[33m/ |/ \u001B[32m/_ __/ / / \u001B[31m/ |/ \u001B[33m/\n \u001B[32m\\__ \\ \u001B[31m/ / / /\u001B[33m /|_/ / \u001B[32m/ / / / / \u001B[31m/ /|_/ / \u001B[33m\n \u001B[32m___/ / \u001B[31m/_/ / \u001B[33m/ / / \u001B[32m/ / / /_/ / \u001B[31m/ / / \u001B[33m\n\u001B[32m/____/ \u001B[31m\\____/ \u001B[33m/_/ /_/ \u001B[32m/_/ \\____/ \u001B[31m/_/ /_/ \u001B[0m\n \n \u001B[1m\u001B[32mLocal-first memory for
|
|
1
|
+
export declare const SOMTUM_LOGO = "\n \u001B[32m\u001B[1m_____ \u001B[31m____ \u001B[33m__ \u001B[32m__________ \u001B[31m__ \u001B[33m___\n \u001B[32m/ ___/ \u001B[31m/ __ \\\u001B[33m/ |/ \u001B[32m/_ __/ / / \u001B[31m/ |/ \u001B[33m/\n \u001B[32m\\__ \\ \u001B[31m/ / / /\u001B[33m /|_/ / \u001B[32m/ / / / / \u001B[31m/ /|_/ / \u001B[33m\n \u001B[32m___/ / \u001B[31m/_/ / \u001B[33m/ / / \u001B[32m/ / / /_/ / \u001B[31m/ / / \u001B[33m\n\u001B[32m/____/ \u001B[31m\\____/ \u001B[33m/_/ /_/ \u001B[32m/_/ \\____/ \u001B[31m/_/ /_/ \u001B[0m\n \n \u001B[1m\u001B[32mLocal-first memory for coding agents\u001B[0m\n";
|
|
2
2
|
export declare function printLogo(): void;
|
|
3
3
|
//# sourceMappingURL=ui.d.ts.map
|
package/dist/cli/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,4oBAQvB,CAAC;AAEF,wBAAgB,SAAS,IAAI,IAAI,CAKhC"}
|
package/dist/cli/ui.js
CHANGED
|
@@ -10,7 +10,7 @@ export const SOMTUM_LOGO = `
|
|
|
10
10
|
${GREEN}___/ / ${RED}/_/ / ${YELLOW}/ / / ${GREEN}/ / / /_/ / ${RED}/ / / ${YELLOW}
|
|
11
11
|
${GREEN}/____/ ${RED}\\____/ ${YELLOW}/_/ /_/ ${GREEN}/_/ \\____/ ${RED}/_/ /_/ ${RESET}
|
|
12
12
|
|
|
13
|
-
${BOLD}${GREEN}Local-first memory for
|
|
13
|
+
${BOLD}${GREEN}Local-first memory for coding agents${RESET}
|
|
14
14
|
`;
|
|
15
15
|
export function printLogo() {
|
|
16
16
|
// Only print if we're in a TTY to avoid messing up pipes/logs
|
package/dist/cli/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG;KACtB,KAAK,GAAG,IAAI,SAAS,GAAG,SAAS,MAAM,OAAO,KAAK,eAAe,GAAG,OAAO,MAAM;IACnF,KAAK,UAAU,GAAG,UAAU,MAAM,UAAU,KAAK,eAAe,GAAG,UAAU,MAAM;IACnF,KAAK,WAAW,GAAG,UAAU,MAAM,WAAW,KAAK,aAAa,GAAG,YAAY,MAAM;GACtF,KAAK,UAAU,GAAG,SAAS,MAAM,UAAU,KAAK,eAAe,GAAG,WAAW,MAAM;EACpF,KAAK,UAAU,GAAG,WAAW,MAAM,YAAY,KAAK,gBAAgB,GAAG,cAAc,KAAK;;KAEvF,IAAI,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,CAAC,MAAM,WAAW,GAAG;KACtB,KAAK,GAAG,IAAI,SAAS,GAAG,SAAS,MAAM,OAAO,KAAK,eAAe,GAAG,OAAO,MAAM;IACnF,KAAK,UAAU,GAAG,UAAU,MAAM,UAAU,KAAK,eAAe,GAAG,UAAU,MAAM;IACnF,KAAK,WAAW,GAAG,UAAU,MAAM,WAAW,KAAK,aAAa,GAAG,YAAY,MAAM;GACtF,KAAK,UAAU,GAAG,SAAS,MAAM,UAAU,KAAK,eAAe,GAAG,WAAW,MAAM;EACpF,KAAK,UAAU,GAAG,WAAW,MAAM,YAAY,KAAK,gBAAgB,GAAG,cAAc,KAAK;;KAEvF,IAAI,GAAG,KAAK,uCAAuC,KAAK;CAC5D,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,8DAA8D;IAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
package/dist/core/extractor.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface LlmCaller {
|
|
|
12
12
|
}>;
|
|
13
13
|
}
|
|
14
14
|
export declare function claudeCodeCaller(): LlmCaller;
|
|
15
|
+
export declare function codexCliCaller(codexModel?: string): LlmCaller;
|
|
15
16
|
export declare function anthropicCaller(client: Anthropic): LlmCaller;
|
|
16
17
|
export interface ExtractOptions {
|
|
17
18
|
model: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E;AAsDD,wBAAgB,gBAAgB,IAAI,SAAS,CAyB5C;AAKD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAW7D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAiB5D;AAwED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA8D5B;AAMD,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,oBAAoB,EACjC,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAKR"}
|
package/dist/core/extractor.js
CHANGED
|
@@ -1,58 +1,84 @@
|
|
|
1
|
+
import { tmpdir } from 'node:os';
|
|
1
2
|
import { ExtractorResponseSchema, ObservationKind, } from './schema.js';
|
|
2
3
|
import { countTokens } from './tokens.js';
|
|
4
|
+
// Runs an agent CLI in one-shot mode and resolves with its stdout.
|
|
5
|
+
// SOMTUM_IN_HOOK tells nested somtum hooks (fired when the child agent's own
|
|
6
|
+
// session ends) to exit immediately; without it, post_session → agent CLI →
|
|
7
|
+
// post_session → ... deadlocks.
|
|
8
|
+
async function runCli({ command, args, input, cwd }) {
|
|
9
|
+
const { spawn } = await import('node:child_process');
|
|
10
|
+
const TIMEOUT_MS = 60_000;
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const child = spawn(command, args, {
|
|
13
|
+
cwd,
|
|
14
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
15
|
+
env: { ...process.env, SOMTUM_IN_HOOK: '1' },
|
|
16
|
+
});
|
|
17
|
+
const stdoutChunks = [];
|
|
18
|
+
const stderrChunks = [];
|
|
19
|
+
child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
|
|
20
|
+
child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
child.kill();
|
|
23
|
+
reject(new Error(`${command} CLI timed out after ${TIMEOUT_MS / 1000}s`));
|
|
24
|
+
}, TIMEOUT_MS);
|
|
25
|
+
child.on('error', (err) => {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
reject(err.code === 'ENOENT' ? new Error(`${command} CLI not found on PATH`) : err);
|
|
28
|
+
});
|
|
29
|
+
child.on('close', (code) => {
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
if (code !== 0) {
|
|
32
|
+
const errText = Buffer.concat(stderrChunks).toString('utf8').trim();
|
|
33
|
+
reject(new Error(`${command} exited ${code}: ${errText || '(no stderr)'}`));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
resolve(Buffer.concat(stdoutChunks).toString('utf8').trim());
|
|
37
|
+
});
|
|
38
|
+
child.stdin.write(input, 'utf8');
|
|
39
|
+
child.stdin.end();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
3
42
|
export function claudeCodeCaller() {
|
|
4
43
|
return {
|
|
5
44
|
async complete({ model, system, user }) {
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
// Claude
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
reject(new Error(`claude exited ${code}: ${errText || '(no stderr)'}`));
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const text = Buffer.concat(stdoutChunks).toString('utf8').trim();
|
|
47
|
-
resolve({
|
|
48
|
-
text,
|
|
49
|
-
inputTokens: countTokens(system + user),
|
|
50
|
-
outputTokens: countTokens(text),
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
child.stdin.write(fullPrompt, 'utf8');
|
|
54
|
-
child.stdin.end();
|
|
55
|
-
});
|
|
45
|
+
// Pass the extraction model through — otherwise the CLI falls back to
|
|
46
|
+
// the user's default model (often Opus), making extraction ~10× pricier.
|
|
47
|
+
// The remaining flags strip Claude Code's own system prompt, tool schemas,
|
|
48
|
+
// MCP servers and CLAUDE.md: ~37k tokens of overhead on every call otherwise.
|
|
49
|
+
const args = [
|
|
50
|
+
'-p',
|
|
51
|
+
'--output-format',
|
|
52
|
+
'text',
|
|
53
|
+
'--system-prompt',
|
|
54
|
+
system,
|
|
55
|
+
'--tools',
|
|
56
|
+
'',
|
|
57
|
+
'--strict-mcp-config',
|
|
58
|
+
'--setting-sources',
|
|
59
|
+
'',
|
|
60
|
+
'--no-session-persistence',
|
|
61
|
+
];
|
|
62
|
+
if (model && model.trim().length > 0)
|
|
63
|
+
args.push('--model', model);
|
|
64
|
+
const text = await runCli({ command: 'claude', args, input: user });
|
|
65
|
+
return { text, inputTokens: countTokens(system + user), outputTokens: countTokens(text) };
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// `codex exec` has no system-prompt flag, so the instructions travel inline.
|
|
70
|
+
// It runs from the OS temp dir so the project's AGENTS.md is not loaded, and
|
|
71
|
+
// uses its own model setting: extraction.model names a Claude model.
|
|
72
|
+
export function codexCliCaller(codexModel) {
|
|
73
|
+
return {
|
|
74
|
+
async complete({ system, user }) {
|
|
75
|
+
const args = ['exec', '--ephemeral', '--skip-git-repo-check', '--sandbox', 'read-only'];
|
|
76
|
+
if (codexModel && codexModel.trim().length > 0)
|
|
77
|
+
args.push('--model', codexModel);
|
|
78
|
+
args.push('-');
|
|
79
|
+
const input = `<instructions>\n${system}\n</instructions>\n\n${user}`;
|
|
80
|
+
const text = await runCli({ command: 'codex', args, input, cwd: tmpdir() });
|
|
81
|
+
return { text, inputTokens: countTokens(input), outputTokens: countTokens(text) };
|
|
56
82
|
},
|
|
57
83
|
};
|
|
58
84
|
}
|
|
@@ -96,7 +122,7 @@ const JSON_SCHEMA_HINT = {
|
|
|
96
122
|
};
|
|
97
123
|
const SYSTEM_PROMPT = `You are Somtum's session extractor.
|
|
98
124
|
|
|
99
|
-
Read the provided
|
|
125
|
+
Read the provided coding-agent session transcript and return durable observations:
|
|
100
126
|
|
|
101
127
|
EXTRACT:
|
|
102
128
|
- Decisions with rationale ("we use pnpm because X")
|
|
@@ -127,6 +153,20 @@ function extractJsonBlob(text) {
|
|
|
127
153
|
return fence[1].trim();
|
|
128
154
|
return trimmed;
|
|
129
155
|
}
|
|
156
|
+
// Without delimiters and a closing instruction, a transcript that ends
|
|
157
|
+
// mid-task gets continued: the model role-plays the agent and emits tool calls
|
|
158
|
+
// instead of JSON. Stating the cap also stops it writing observations we drop.
|
|
159
|
+
function transcriptPrompt(transcript, maxObservations) {
|
|
160
|
+
return [
|
|
161
|
+
'<transcript>',
|
|
162
|
+
transcript,
|
|
163
|
+
'</transcript>',
|
|
164
|
+
'',
|
|
165
|
+
'The transcript above is a finished session to analyze, not a conversation to continue.',
|
|
166
|
+
'Do not act as the assistant in it.',
|
|
167
|
+
`Return only the JSON object described in the system prompt, with at most ${maxObservations} observations: the most durable ones.`,
|
|
168
|
+
].join('\n');
|
|
169
|
+
}
|
|
130
170
|
export async function extract(transcript, caller, options) {
|
|
131
171
|
let attempt = 0;
|
|
132
172
|
let lastError;
|
|
@@ -137,7 +177,7 @@ export async function extract(transcript, caller, options) {
|
|
|
137
177
|
// On retry: send only the bad output + error, not the full transcript again.
|
|
138
178
|
// Re-sending the transcript would double the token cost of every retry.
|
|
139
179
|
const userPrompt = attempt === 0
|
|
140
|
-
?
|
|
180
|
+
? transcriptPrompt(transcript, options.maxObservations)
|
|
141
181
|
: `Your previous response failed schema validation.\n\nError: ${lastError}\n\nYour previous output:\n${lastRawOutput}\n\nReturn valid JSON only, matching the schema in the system prompt.`;
|
|
142
182
|
const { text, inputTokens, outputTokens } = await caller.complete({
|
|
143
183
|
model: options.model,
|
|
@@ -154,6 +194,7 @@ export async function extract(transcript, caller, options) {
|
|
|
154
194
|
}
|
|
155
195
|
catch (err) {
|
|
156
196
|
lastError = `JSON.parse failed: ${err.message}`;
|
|
197
|
+
console.warn(`[somtum] extraction attempt ${attempt + 1} returned non-JSON: ${text.slice(0, 120)}`);
|
|
157
198
|
attempt += 1;
|
|
158
199
|
continue;
|
|
159
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DB } from './db.js';
|
|
2
|
+
export type LedgerEvent = 'extraction' | 'extraction_skipped' | 'file_summary' | 'injection' | 'file_gate_denied' | 'file_gate_summary' | 'file_gate_reread';
|
|
3
|
+
export interface LedgerCount {
|
|
4
|
+
events: number;
|
|
5
|
+
tokens: number;
|
|
6
|
+
}
|
|
7
|
+
export interface LedgerSummary {
|
|
8
|
+
extraction: LedgerCount;
|
|
9
|
+
extraction_skipped: LedgerCount;
|
|
10
|
+
file_summary: LedgerCount;
|
|
11
|
+
injection: LedgerCount;
|
|
12
|
+
file_gate: {
|
|
13
|
+
denied: LedgerCount;
|
|
14
|
+
summary: LedgerCount;
|
|
15
|
+
reread: LedgerCount;
|
|
16
|
+
net_tokens: number;
|
|
17
|
+
};
|
|
18
|
+
overhead_tokens: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class TokenLedger {
|
|
21
|
+
private readonly db;
|
|
22
|
+
constructor(db: DB);
|
|
23
|
+
record(projectId: string, event: LedgerEvent, tokens: number, sessionId?: string | null, now?: number): void;
|
|
24
|
+
summary(projectId: string, opts?: {
|
|
25
|
+
since?: number;
|
|
26
|
+
}): LedgerSummary;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/core/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,oBAAoB,GACpB,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,WAAW,CAAC;IACxB,kBAAkB,EAAE,WAAW,CAAC;IAChC,YAAY,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE;QACT,MAAM,EAAE,WAAW,CAAC;QACpB,OAAO,EAAE,WAAW,CAAC;QACrB,MAAM,EAAE,WAAW,CAAC;QAEpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEnC,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,GAAG,SAAa,GACf,IAAI;IASP,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,aAAa;CAkCzE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const EMPTY = { events: 0, tokens: 0 };
|
|
2
|
+
export class TokenLedger {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
record(projectId, event, tokens, sessionId = null, now = Date.now()) {
|
|
8
|
+
this.db
|
|
9
|
+
.prepare(`INSERT INTO token_ledger (project_id, session_id, event, tokens, created_at)
|
|
10
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
11
|
+
.run(projectId, sessionId, event, Math.max(0, Math.round(tokens)), now);
|
|
12
|
+
}
|
|
13
|
+
summary(projectId, opts = {}) {
|
|
14
|
+
const rows = this.db
|
|
15
|
+
.prepare(`SELECT event, COUNT(*) AS events, COALESCE(SUM(tokens), 0) AS tokens
|
|
16
|
+
FROM token_ledger
|
|
17
|
+
WHERE project_id = ? AND created_at >= ?
|
|
18
|
+
GROUP BY event`)
|
|
19
|
+
.all(projectId, opts.since ?? 0);
|
|
20
|
+
const by = new Map(rows.map((r) => [r.event, { events: r.events, tokens: r.tokens }]));
|
|
21
|
+
const get = (e) => by.get(e) ?? EMPTY;
|
|
22
|
+
const denied = get('file_gate_denied');
|
|
23
|
+
const summary = get('file_gate_summary');
|
|
24
|
+
const reread = get('file_gate_reread');
|
|
25
|
+
const extraction = get('extraction');
|
|
26
|
+
const fileSummary = get('file_summary');
|
|
27
|
+
const injection = get('injection');
|
|
28
|
+
return {
|
|
29
|
+
extraction,
|
|
30
|
+
extraction_skipped: get('extraction_skipped'),
|
|
31
|
+
file_summary: fileSummary,
|
|
32
|
+
injection,
|
|
33
|
+
file_gate: {
|
|
34
|
+
denied,
|
|
35
|
+
summary,
|
|
36
|
+
reread,
|
|
37
|
+
net_tokens: denied.tokens - summary.tokens - reread.tokens,
|
|
38
|
+
},
|
|
39
|
+
overhead_tokens: extraction.tokens + fileSummary.tokens + injection.tokens,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/core/ledger.ts"],"names":[],"mappings":"AAgCA,MAAM,KAAK,GAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEpD,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,EAAM;QAAN,OAAE,GAAF,EAAE,CAAI;IAAG,CAAC;IAEvC,MAAM,CACJ,SAAiB,EACjB,KAAkB,EAClB,MAAc,EACd,YAA2B,IAAI,EAC/B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAEhB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;gCACwB,CACzB;aACA,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,OAA2B,EAAE;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;wBAGgB,CACjB;aACA,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAA6D,CAAC;QAE/F,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,CAAC,CAAc,EAAe,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAEhE,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;QAEnC,OAAO;YACL,UAAU;YACV,kBAAkB,EAAE,GAAG,CAAC,oBAAoB,CAAC;YAC7C,YAAY,EAAE,WAAW;YACzB,SAAS;YACT,SAAS,EAAE;gBACT,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;aAC3D;YACD,eAAe,EAAE,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;SAC3E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type LlmCaller } from './extractor.js';
|
|
2
|
+
import type { Config } from './schema.js';
|
|
3
|
+
export type Backend = 'anthropic' | 'claude-cli' | 'codex-cli';
|
|
4
|
+
export declare function pickBackend(config: Config, env?: NodeJS.ProcessEnv, has?: (bin: string) => boolean): Backend | null;
|
|
5
|
+
export declare function callerFor(backend: Backend, config: Config): LlmCaller;
|
|
6
|
+
export declare const NO_BACKEND_MESSAGE: string;
|
|
7
|
+
//# sourceMappingURL=llm_backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm_backend.d.ts","sourceRoot":"","sources":["../../src/core/llm_backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;AAiB/D,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAgB,GACrC,OAAO,GAAG,IAAI,CAOhB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAWrE;AAED,eAAO,MAAM,kBAAkB,QAEQ,CAAC"}
|