somtum 3.1.0 → 3.2.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 +31 -3
- package/dist/cli/backfill.d.ts +23 -0
- package/dist/cli/backfill.d.ts.map +1 -0
- package/dist/cli/backfill.js +134 -0
- package/dist/cli/backfill.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +16 -11
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/first_session_check.js +4 -4
- package/dist/cli/first_session_check.js.map +1 -1
- package/dist/cli/forget.d.ts +10 -0
- package/dist/cli/forget.d.ts.map +1 -1
- package/dist/cli/forget.js +30 -0
- package/dist/cli/forget.js.map +1 -1
- package/dist/cli/import.d.ts.map +1 -1
- package/dist/cli/import.js +21 -4
- package/dist/cli/import.js.map +1 -1
- package/dist/cli/index.js +24 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.d.ts.map +1 -1
- package/dist/cli/list.js +4 -2
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/search.d.ts.map +1 -1
- package/dist/cli/search.js +3 -0
- package/dist/cli/search.js.map +1 -1
- package/dist/cli/stats.d.ts.map +1 -1
- package/dist/cli/stats.js +4 -3
- package/dist/cli/stats.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/core/dedup.d.ts +5 -9
- package/dist/core/dedup.d.ts.map +1 -1
- package/dist/core/dedup.js +19 -8
- package/dist/core/dedup.js.map +1 -1
- package/dist/core/embeddings_xenova.d.ts +3 -0
- package/dist/core/embeddings_xenova.d.ts.map +1 -1
- package/dist/core/embeddings_xenova.js +18 -2
- package/dist/core/embeddings_xenova.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 +11 -1
- package/dist/core/extractor.js.map +1 -1
- package/dist/core/git_context.d.ts +20 -0
- package/dist/core/git_context.d.ts.map +1 -0
- package/dist/core/git_context.js +108 -0
- package/dist/core/git_context.js.map +1 -0
- package/dist/core/recall_filter.d.ts +9 -0
- package/dist/core/recall_filter.d.ts.map +1 -0
- package/dist/core/recall_filter.js +30 -0
- package/dist/core/recall_filter.js.map +1 -0
- package/dist/core/retriever/bm25.d.ts +2 -0
- package/dist/core/retriever/bm25.d.ts.map +1 -1
- package/dist/core/retriever/bm25.js +32 -7
- package/dist/core/retriever/bm25.js.map +1 -1
- package/dist/core/retriever/factory.d.ts.map +1 -1
- package/dist/core/retriever/factory.js +10 -6
- package/dist/core/retriever/factory.js.map +1 -1
- package/dist/core/schema.d.ts +129 -456
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +20 -11
- package/dist/core/schema.js.map +1 -1
- package/dist/core/session_discovery.d.ts +12 -0
- package/dist/core/session_discovery.d.ts.map +1 -0
- package/dist/core/session_discovery.js +111 -0
- package/dist/core/session_discovery.js.map +1 -0
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +6 -3
- package/dist/core/store.js.map +1 -1
- package/dist/db/migrations/007_git_branch.sql +15 -0
- package/dist/hooks/post_session.d.ts +19 -30
- package/dist/hooks/post_session.d.ts.map +1 -1
- package/dist/hooks/post_session.js +51 -24
- package/dist/hooks/post_session.js.map +1 -1
- package/dist/hooks/pre_prompt.d.ts +2 -30
- package/dist/hooks/pre_prompt.d.ts.map +1 -1
- package/dist/hooks/pre_prompt.js +40 -13
- package/dist/hooks/pre_prompt.js.map +1 -1
- package/dist/hooks/pre_read.d.ts +2 -36
- package/dist/hooks/pre_read.d.ts.map +1 -1
- package/dist/hooks/pre_read.js +1 -1
- package/dist/hooks/pre_read.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +34 -67
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +14 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +13 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;;EAO1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB;;;;EAA6C,CAAC;AAC3E,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB;;;;;iBAKlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;iBAe3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,qBAAqB;;;;;;;iBAOhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,qBAAqB;;;;;;;;iBAQhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;iBAMrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAElC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,iBAAiB;;;;;EAAoD,CAAC;AACnF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+FvB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
package/dist/core/schema.js
CHANGED
|
@@ -25,6 +25,9 @@ export const ObservationSchema = z.object({
|
|
|
25
25
|
deleted_at: z.number().int().nullable(),
|
|
26
26
|
scope: ObservationScope.default('project'),
|
|
27
27
|
last_confirmed_at: z.number().int().nullable(),
|
|
28
|
+
git_branch: z.string().nullable().default(null),
|
|
29
|
+
git_commit: z.string().nullable().default(null),
|
|
30
|
+
git_before_first_commit: z.boolean().default(false),
|
|
28
31
|
});
|
|
29
32
|
export const ObservationInputSchema = z.object({
|
|
30
33
|
id: z.string().min(1).optional(),
|
|
@@ -39,6 +42,9 @@ export const ObservationInputSchema = z.object({
|
|
|
39
42
|
tokens_saved: z.number().int().nonnegative().default(0),
|
|
40
43
|
tokens_spent: z.number().int().nonnegative().default(0),
|
|
41
44
|
scope: ObservationScope.default('project'),
|
|
45
|
+
git_branch: z.string().nullable().optional(),
|
|
46
|
+
git_commit: z.string().nullable().optional(),
|
|
47
|
+
git_before_first_commit: z.boolean().optional(),
|
|
42
48
|
});
|
|
43
49
|
export const ObservationUpdateSchema = z.object({
|
|
44
50
|
title: z.string().min(1).max(80).optional(),
|
|
@@ -105,7 +111,7 @@ export const ConfigSchema = z.object({
|
|
|
105
111
|
// smaller than this. The turns are kept and sent with the next extraction.
|
|
106
112
|
min_new_tokens: z.number().int().nonnegative().default(500),
|
|
107
113
|
})
|
|
108
|
-
.
|
|
114
|
+
.prefault({}),
|
|
109
115
|
cache: z
|
|
110
116
|
.object({
|
|
111
117
|
enabled: z.boolean().default(true),
|
|
@@ -114,27 +120,27 @@ export const ConfigSchema = z.object({
|
|
|
114
120
|
max_entries: z.number().int().positive().default(10_000),
|
|
115
121
|
ttl_days: z.number().int().positive().default(90),
|
|
116
122
|
})
|
|
117
|
-
.
|
|
123
|
+
.prefault({}),
|
|
118
124
|
retrieval: z
|
|
119
125
|
.object({
|
|
120
126
|
strategy: RetrievalStrategy.default('bm25'),
|
|
121
127
|
k: z.number().int().positive().default(8),
|
|
122
128
|
rerank_model: z.string().default('claude-haiku-4-5-20251001'),
|
|
123
|
-
bm25: z.object({ enabled: z.boolean().default(true) }).
|
|
129
|
+
bm25: z.object({ enabled: z.boolean().default(true) }).prefault({}),
|
|
124
130
|
embeddings: z
|
|
125
131
|
.object({
|
|
126
132
|
enabled: z.boolean().default(false),
|
|
127
133
|
model: z.string().default('Xenova/bge-small-en-v1.5'),
|
|
128
134
|
})
|
|
129
|
-
.
|
|
135
|
+
.prefault({}),
|
|
130
136
|
index: z
|
|
131
137
|
.object({
|
|
132
138
|
enabled: z.boolean().default(false),
|
|
133
139
|
model: z.string().default('claude-haiku-4-5-20251001'),
|
|
134
140
|
})
|
|
135
|
-
.
|
|
141
|
+
.prefault({}),
|
|
136
142
|
})
|
|
137
|
-
.
|
|
143
|
+
.prefault({}),
|
|
138
144
|
file_gating: z
|
|
139
145
|
.object({
|
|
140
146
|
// Opt-in: summaries cost extraction tokens and only pay off when the
|
|
@@ -143,7 +149,7 @@ export const ConfigSchema = z.object({
|
|
|
143
149
|
min_file_size_tokens: z.number().int().positive().default(300),
|
|
144
150
|
exclude_globs: z.array(z.string()).default(['**/*.env', '**/secrets/**']),
|
|
145
151
|
})
|
|
146
|
-
.
|
|
152
|
+
.prefault({}),
|
|
147
153
|
privacy: z
|
|
148
154
|
.object({
|
|
149
155
|
telemetry: z.boolean().default(false),
|
|
@@ -157,14 +163,14 @@ export const ConfigSchema = z.object({
|
|
|
157
163
|
'AKIA[0-9A-Z]{16}',
|
|
158
164
|
]),
|
|
159
165
|
})
|
|
160
|
-
.
|
|
166
|
+
.prefault({}),
|
|
161
167
|
sync: z
|
|
162
168
|
.object({
|
|
163
169
|
enabled: z.boolean().default(false),
|
|
164
170
|
backend: z.string().default('ssh'),
|
|
165
171
|
remote: z.string().nullable().default(null),
|
|
166
172
|
})
|
|
167
|
-
.
|
|
173
|
+
.prefault({}),
|
|
168
174
|
injection: z
|
|
169
175
|
.object({
|
|
170
176
|
enabled: z.boolean().default(true),
|
|
@@ -172,15 +178,18 @@ export const ConfigSchema = z.object({
|
|
|
172
178
|
max_chars: z.number().int().positive().default(1500),
|
|
173
179
|
// Minimum BM25 relevance score to inject a memory (0 = inject all results).
|
|
174
180
|
min_relevance_score: z.number().min(0).default(0),
|
|
181
|
+
// Distinct prompt words a memory must contain to be injected, once the
|
|
182
|
+
// prompt has at least 3 content words (shorter prompts need 1).
|
|
183
|
+
min_matched_terms: z.number().int().positive().default(2),
|
|
175
184
|
// Prepend a one-line token budget summary to every injection.
|
|
176
185
|
show_budget: z.boolean().default(true),
|
|
177
186
|
})
|
|
178
|
-
.
|
|
187
|
+
.prefault({}),
|
|
179
188
|
diagnostics: z
|
|
180
189
|
.object({
|
|
181
190
|
// Set false to suppress the auto-doctor check after a zero-memory first session.
|
|
182
191
|
first_session_check: z.boolean().default(true),
|
|
183
192
|
})
|
|
184
|
-
.
|
|
193
|
+
.prefault({}),
|
|
185
194
|
});
|
|
186
195
|
//# sourceMappingURL=schema.js.map
|
package/dist/core/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,UAAU;IACV,UAAU;IACV,QAAQ;IACR,cAAc;IACd,SAAS;IACT,OAAO;CACR,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentId } from '../agents/types.js';
|
|
2
|
+
export interface PastSession {
|
|
3
|
+
agent: AgentId;
|
|
4
|
+
path: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
mtime: number;
|
|
7
|
+
bytes: number;
|
|
8
|
+
branch: string | null;
|
|
9
|
+
commit: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function findPastSessions(cwd: string, agents: readonly AgentId[]): PastSession[];
|
|
12
|
+
//# sourceMappingURL=session_discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_discovery.d.ts","sourceRoot":"","sources":["../../src/core/session_discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAoGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,EAAE,CAMvF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { closeSync, existsSync, openSync, readSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
function readSlice(path, from, bytes) {
|
|
5
|
+
const fd = openSync(path, 'r');
|
|
6
|
+
try {
|
|
7
|
+
const size = statSync(path).size;
|
|
8
|
+
const length = Math.min(bytes, size);
|
|
9
|
+
const buf = Buffer.alloc(length);
|
|
10
|
+
readSync(fd, buf, 0, length, from === 'start' ? 0 : size - length);
|
|
11
|
+
return buf.toString('utf8');
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
closeSync(fd);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Claude Code names a project's transcript folder after its path with every
|
|
18
|
+
// non-alphanumeric character replaced by "-". Worktrees of the project live
|
|
19
|
+
// under <project>/.claude/worktrees/<name>, which becomes "<slug>--claude-worktrees-<name>".
|
|
20
|
+
function claudeSessions(cwd) {
|
|
21
|
+
const root = join(process.env['CLAUDE_CONFIG_DIR'] ?? join(homedir(), '.claude'), 'projects');
|
|
22
|
+
if (!existsSync(root))
|
|
23
|
+
return [];
|
|
24
|
+
const slug = cwd.replace(/[^A-Za-z0-9]/g, '-');
|
|
25
|
+
const out = [];
|
|
26
|
+
for (const dir of readdirSync(root)) {
|
|
27
|
+
if (dir !== slug && !dir.startsWith(`${slug}--claude-worktrees-`))
|
|
28
|
+
continue;
|
|
29
|
+
for (const file of readdirSync(join(root, dir))) {
|
|
30
|
+
if (!file.endsWith('.jsonl'))
|
|
31
|
+
continue;
|
|
32
|
+
const path = join(root, dir, file);
|
|
33
|
+
const st = statSync(path);
|
|
34
|
+
if (!st.isFile())
|
|
35
|
+
continue;
|
|
36
|
+
// The branch can change mid-session; the one it ended on is the one
|
|
37
|
+
// the extracted decisions describe.
|
|
38
|
+
let branch = null;
|
|
39
|
+
for (const line of readSlice(path, 'end', 64 * 1024)
|
|
40
|
+
.split('\n')
|
|
41
|
+
.reverse()) {
|
|
42
|
+
const m = /"gitBranch":"([^"]*)"/.exec(line);
|
|
43
|
+
if (m) {
|
|
44
|
+
// "HEAD" means detached: no branch to attribute the session to.
|
|
45
|
+
branch = m[1] && m[1] !== 'HEAD' ? m[1] : null;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
out.push({
|
|
50
|
+
agent: 'claude-code',
|
|
51
|
+
path,
|
|
52
|
+
sessionId: file.slice(0, -'.jsonl'.length),
|
|
53
|
+
mtime: st.mtimeMs,
|
|
54
|
+
bytes: st.size,
|
|
55
|
+
branch,
|
|
56
|
+
commit: null,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function codexSessions(cwd) {
|
|
63
|
+
const root = join(process.env['CODEX_HOME'] ?? join(homedir(), '.codex'), 'sessions');
|
|
64
|
+
if (!existsSync(root))
|
|
65
|
+
return [];
|
|
66
|
+
const out = [];
|
|
67
|
+
const walk = (dir) => {
|
|
68
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
69
|
+
const path = join(dir, entry.name);
|
|
70
|
+
if (entry.isDirectory()) {
|
|
71
|
+
walk(path);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!entry.name.endsWith('.jsonl'))
|
|
75
|
+
continue;
|
|
76
|
+
let meta;
|
|
77
|
+
try {
|
|
78
|
+
meta = JSON.parse(readSlice(path, 'start', 64 * 1024).split('\n')[0] ?? '');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const p = meta.payload;
|
|
84
|
+
if (meta.type !== 'session_meta' || !p?.id || !p.cwd)
|
|
85
|
+
continue;
|
|
86
|
+
if (p.cwd !== cwd && !p.cwd.startsWith(`${cwd}/`))
|
|
87
|
+
continue;
|
|
88
|
+
const st = statSync(path);
|
|
89
|
+
out.push({
|
|
90
|
+
agent: 'codex',
|
|
91
|
+
path,
|
|
92
|
+
sessionId: p.id,
|
|
93
|
+
mtime: st.mtimeMs,
|
|
94
|
+
bytes: st.size,
|
|
95
|
+
branch: p.git?.branch ?? null,
|
|
96
|
+
commit: p.git?.commit_hash ?? null,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
walk(root);
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
// Past Claude Code and Codex sessions for this project, newest first.
|
|
104
|
+
export function findPastSessions(cwd, agents) {
|
|
105
|
+
const found = [
|
|
106
|
+
...(agents.includes('claude-code') ? claudeSessions(cwd) : []),
|
|
107
|
+
...(agents.includes('codex') ? codexSessions(cwd) : []),
|
|
108
|
+
];
|
|
109
|
+
return found.sort((a, b) => b.mtime - a.mtime);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=session_discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_discovery.js","sourceRoot":"","sources":["../../src/core/session_discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/core/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAkDrB,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEnC,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,GAAE,aAAkB,GAAG,WAAW;IA2CzE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,GAAE,aAAkB,GAAG,WAAW,GAAG,IAAI;IA0B7F,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI;IAO5D,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC5B,WAAW,EAAE;IAahB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;IAa5D,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE;IAW/D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAOnC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMtD,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GACtF,WAAW,EAAE;IAYhB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAO/B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAUzC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIjD,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,WAAW,EAAE;IAW7E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE;IAU1E,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC;IAoB/D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAU3C,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAY3C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAWrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,WAAW,EAAE;IAa1E,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE;IAa/E,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,KAAK,SAAK,GACT;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE;CAwBpD"}
|
package/dist/core/store.js
CHANGED
|
@@ -19,6 +19,9 @@ function rowToObservation(row) {
|
|
|
19
19
|
deleted_at: row.deleted_at,
|
|
20
20
|
scope: row.scope ?? 'project',
|
|
21
21
|
last_confirmed_at: row.last_confirmed_at ?? null,
|
|
22
|
+
git_branch: row.git_branch ?? null,
|
|
23
|
+
git_commit: row.git_commit ?? null,
|
|
24
|
+
git_before_first_commit: row.git_before_first_commit === 1,
|
|
22
25
|
});
|
|
23
26
|
}
|
|
24
27
|
export class MemoryStore {
|
|
@@ -39,9 +42,9 @@ export class MemoryStore {
|
|
|
39
42
|
.prepare(`INSERT INTO observations
|
|
40
43
|
(id, project_id, session_id, kind, title, body, files, tags,
|
|
41
44
|
created_at, tokens_saved, tokens_spent, superseded_by, embedding, deleted_at,
|
|
42
|
-
scope, last_confirmed_at)
|
|
43
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, ?, NULL)`)
|
|
44
|
-
.run(id, parsed.project_id, parsed.session_id, parsed.kind, title, body, JSON.stringify(parsed.files), JSON.stringify(parsed.tags), created_at, parsed.tokens_saved, parsed.tokens_spent, scope);
|
|
45
|
+
scope, last_confirmed_at, git_branch, git_commit, git_before_first_commit)
|
|
46
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, ?, NULL, ?, ?, ?)`)
|
|
47
|
+
.run(id, parsed.project_id, parsed.session_id, parsed.kind, title, body, JSON.stringify(parsed.files), JSON.stringify(parsed.tags), created_at, parsed.tokens_saved, parsed.tokens_spent, scope, parsed.git_branch ?? null, parsed.git_commit ?? null, parsed.git_before_first_commit ? 1 : 0);
|
|
45
48
|
});
|
|
46
49
|
txn.immediate();
|
|
47
50
|
return this.get(id);
|
package/dist/core/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAMlB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- 007_git_branch.sql
|
|
2
|
+
-- The branch and commit a memory was captured on. Memories from another
|
|
3
|
+
-- branch that still exists and is not merged into the current one are not
|
|
4
|
+
-- recalled, so parallel branches can't feed each other conflicting decisions.
|
|
5
|
+
-- NULL for memories captured before 3.2 or outside a git repository: those
|
|
6
|
+
-- stay visible everywhere.
|
|
7
|
+
|
|
8
|
+
ALTER TABLE observations ADD COLUMN git_branch TEXT;
|
|
9
|
+
ALTER TABLE observations ADD COLUMN git_commit TEXT;
|
|
10
|
+
-- 1 when the branch had no commits of its own yet. Git then sees the branch as
|
|
11
|
+
-- already merged into its base, so ancestry can't tell an untouched experiment
|
|
12
|
+
-- from finished work; such memories stay with their branch until it's deleted.
|
|
13
|
+
ALTER TABLE observations ADD COLUMN git_before_first_commit INTEGER NOT NULL DEFAULT 0;
|
|
14
|
+
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_observations_branch ON observations(project_id, git_branch);
|
|
@@ -1,46 +1,34 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { type DB } from '../core/db.js';
|
|
3
3
|
import { type LlmCaller } from '../core/extractor.js';
|
|
4
|
+
import { type GitCapture } from '../core/git_context.js';
|
|
4
5
|
import type { Config } from '../core/schema.js';
|
|
5
|
-
|
|
6
|
+
import { parseTranscript } from '../core/transcript.js';
|
|
7
|
+
export declare const HookPayloadSchema: z.ZodObject<{
|
|
6
8
|
session_id: z.ZodOptional<z.ZodString>;
|
|
7
9
|
cwd: z.ZodOptional<z.ZodString>;
|
|
8
10
|
project_id: z.ZodOptional<z.ZodString>;
|
|
9
11
|
transcript: z.ZodOptional<z.ZodString>;
|
|
10
12
|
transcript_path: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
11
13
|
hook_event_name: z.ZodOptional<z.ZodString>;
|
|
12
|
-
},
|
|
13
|
-
project_id?: string | undefined;
|
|
14
|
-
session_id?: string | undefined;
|
|
15
|
-
cwd?: string | undefined;
|
|
16
|
-
transcript?: string | undefined;
|
|
17
|
-
transcript_path?: string | null | undefined;
|
|
18
|
-
hook_event_name?: string | undefined;
|
|
19
|
-
}, {
|
|
20
|
-
project_id?: string | undefined;
|
|
21
|
-
session_id?: string | undefined;
|
|
22
|
-
cwd?: string | undefined;
|
|
23
|
-
transcript?: string | undefined;
|
|
24
|
-
transcript_path?: string | null | undefined;
|
|
25
|
-
hook_event_name?: string | undefined;
|
|
26
|
-
}>, {
|
|
27
|
-
project_id?: string | undefined;
|
|
28
|
-
session_id?: string | undefined;
|
|
29
|
-
cwd?: string | undefined;
|
|
30
|
-
transcript?: string | undefined;
|
|
31
|
-
transcript_path?: string | null | undefined;
|
|
32
|
-
hook_event_name?: string | undefined;
|
|
33
|
-
}, {
|
|
34
|
-
project_id?: string | undefined;
|
|
35
|
-
session_id?: string | undefined;
|
|
36
|
-
cwd?: string | undefined;
|
|
37
|
-
transcript?: string | undefined;
|
|
38
|
-
transcript_path?: string | null | undefined;
|
|
39
|
-
hook_event_name?: string | undefined;
|
|
40
|
-
}>;
|
|
14
|
+
}, z.core.$strip>;
|
|
41
15
|
export type HookPayload = z.infer<typeof HookPayloadSchema>;
|
|
42
16
|
export declare function readToEnd(stream: NodeJS.ReadableStream): Promise<string>;
|
|
17
|
+
interface ResolvedTranscript {
|
|
18
|
+
text: string;
|
|
19
|
+
turns: ReturnType<typeof parseTranscript>;
|
|
20
|
+
}
|
|
21
|
+
export interface ExtractionPlan {
|
|
22
|
+
transcript: string;
|
|
23
|
+
tokens: number;
|
|
24
|
+
resumeAt: number;
|
|
25
|
+
truncatedFrom: number | null;
|
|
26
|
+
}
|
|
27
|
+
export declare function planExtraction(db: DB, sessionId: string, resolved: ResolvedTranscript): ExtractionPlan;
|
|
28
|
+
export declare function readTranscript(raw: string): ResolvedTranscript;
|
|
43
29
|
export interface RunOptions {
|
|
30
|
+
git?: GitCapture;
|
|
31
|
+
capturedAt?: number;
|
|
44
32
|
cwd?: string;
|
|
45
33
|
config?: Config;
|
|
46
34
|
caller?: LlmCaller;
|
|
@@ -64,4 +52,5 @@ export interface RunResult {
|
|
|
64
52
|
}
|
|
65
53
|
export declare function runPostSession(payload: HookPayload, opts?: RunOptions): Promise<RunResult>;
|
|
66
54
|
export declare function main(): Promise<void>;
|
|
55
|
+
export {};
|
|
67
56
|
//# sourceMappingURL=post_session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post_session.d.ts","sourceRoot":"","sources":["../../src/hooks/post_session.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"post_session.d.ts","sourceRoot":"","sources":["../../src/hooks/post_session.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAWpF,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,OAAO,EAA8B,eAAe,EAAe,MAAM,uBAAuB,CAAC;AAEjG,eAAO,MAAM,iBAAiB;;;;;;;iBAa1B,CAAC;AAEL,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;CAC3C;AAqLD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAKD,wBAAgB,cAAc,CAC5B,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,GAC3B,cAAc,CAmBhB;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAG9D;AAED,MAAM,WAAW,UAAU;IAGzB,GAAG,CAAC,EAAE,UAAU,CAAC;IAGjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,SAAS,CAAC,CAoLpB;AAwCD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B1C"}
|
|
@@ -14,6 +14,8 @@ import { FileFingerprintStore, matchesAnyGlob, statFile, summarizeFile, summaryH
|
|
|
14
14
|
import { fingerprintFiles } from '../core/fingerprint.js';
|
|
15
15
|
import { generateIndex } from '../core/index_gen.js';
|
|
16
16
|
import { TokenLedger } from '../core/ledger.js';
|
|
17
|
+
import { captureGit } from '../core/git_context.js';
|
|
18
|
+
import { scopeToBranch, newestOfDuplicates } from '../core/recall_filter.js';
|
|
17
19
|
import { callerFor, NO_BACKEND_MESSAGE, pickBackend } from '../core/llm_backend.js';
|
|
18
20
|
import { memoriesDir, writeMemoryMarkdown } from '../core/memory_files.js';
|
|
19
21
|
import { projectNameFromCwd, resolveProjectId } from '../core/project_id.js';
|
|
@@ -54,10 +56,7 @@ function resolveTranscript(payload) {
|
|
|
54
56
|
throw new Error(`No transcript found for session ${payload.session_id ?? '?'}`);
|
|
55
57
|
raw = readFileSync(path, 'utf8');
|
|
56
58
|
}
|
|
57
|
-
|
|
58
|
-
// If the parser found structured turns, render them compactly for the extractor.
|
|
59
|
-
// Otherwise fall back to the raw string (plain-text transcript fixtures etc.).
|
|
60
|
-
return { text: turns.length > 0 ? renderTurns(turns) : raw, turns };
|
|
59
|
+
return readTranscript(raw);
|
|
61
60
|
}
|
|
62
61
|
function populateCache(db, turns, opts) {
|
|
63
62
|
const cache = new PromptCache(db);
|
|
@@ -157,18 +156,19 @@ async function populateFileSummaries(db, turns, opts) {
|
|
|
157
156
|
}
|
|
158
157
|
// Write top-k memories to a warm-start file after PreCompact so the next
|
|
159
158
|
// UserPromptSubmit can restore context into the fresh post-compaction session.
|
|
160
|
-
function writeWarmStart(db, projectId, k = 8) {
|
|
159
|
+
function writeWarmStart(db, projectId, cwd, k = 8) {
|
|
161
160
|
try {
|
|
162
161
|
const retriever = new Bm25Retriever(db);
|
|
163
162
|
// Use a broad "recent" query — we want the most useful memories overall, not
|
|
164
163
|
// query-specific ones, because we don't know what comes next.
|
|
165
164
|
const results = retriever.search('recent decisions learnings bugs commands', {
|
|
166
|
-
k,
|
|
165
|
+
k: k * 2,
|
|
167
166
|
projectId,
|
|
168
167
|
});
|
|
169
168
|
// retriever.search is async but Bm25Retriever is synchronous under the hood;
|
|
170
169
|
// we await-via-then to stay non-blocking.
|
|
171
|
-
void Promise.resolve(results).then((
|
|
170
|
+
void Promise.resolve(results).then((found) => {
|
|
171
|
+
const hits = newestOfDuplicates(scopeToBranch(found, cwd)).slice(0, k);
|
|
172
172
|
if (hits.length === 0)
|
|
173
173
|
return;
|
|
174
174
|
const lines = hits
|
|
@@ -187,6 +187,36 @@ function writeWarmStart(db, projectId, k = 8) {
|
|
|
187
187
|
// Non-fatal: warm-start is a best-effort enhancement.
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
+
// Cap transcript size to stay within model context limits.
|
|
191
|
+
// At ~4 chars/token, 60k tokens ≈ 240 KB of text. Anything beyond that
|
|
192
|
+
// risks a context-limit error in Haiku; we take the tail (most recent turns).
|
|
193
|
+
const MAX_TRANSCRIPT_TOKENS = 60_000;
|
|
194
|
+
// What an extraction of this session would send right now: only the turns not
|
|
195
|
+
// yet extracted, capped to the most recent MAX_TRANSCRIPT_TOKENS. Shared with
|
|
196
|
+
// `somtum backfill` so its cost preview matches what is actually sent.
|
|
197
|
+
export function planExtraction(db, sessionId, resolved) {
|
|
198
|
+
const resumeAt = new SessionProgressStore(db).resumeIndex(sessionId, resolved.turns);
|
|
199
|
+
const pendingText = resolved.turns.length > 0 ? renderTurns(resolved.turns.slice(resumeAt)) : resolved.text;
|
|
200
|
+
const pendingTokens = countTokens(pendingText);
|
|
201
|
+
if (pendingTokens <= MAX_TRANSCRIPT_TOKENS) {
|
|
202
|
+
return { transcript: pendingText, tokens: pendingTokens, resumeAt, truncatedFrom: null };
|
|
203
|
+
}
|
|
204
|
+
// Characters per token varies with content (code is denser than prose), so
|
|
205
|
+
// shrink from the estimate until the measured count is under the cap.
|
|
206
|
+
let transcript = pendingText.slice(-MAX_TRANSCRIPT_TOKENS * 4);
|
|
207
|
+
let tokens = countTokens(transcript);
|
|
208
|
+
while (tokens > MAX_TRANSCRIPT_TOKENS) {
|
|
209
|
+
transcript = transcript.slice(-Math.floor(transcript.length * (MAX_TRANSCRIPT_TOKENS / tokens) * 0.98));
|
|
210
|
+
tokens = countTokens(transcript);
|
|
211
|
+
}
|
|
212
|
+
return { transcript, tokens, resumeAt, truncatedFrom: pendingText.length };
|
|
213
|
+
}
|
|
214
|
+
// If the parser found structured turns, render them compactly for the extractor.
|
|
215
|
+
// Otherwise fall back to the raw string (plain-text transcript fixtures etc.).
|
|
216
|
+
export function readTranscript(raw) {
|
|
217
|
+
const turns = parseTranscript(raw);
|
|
218
|
+
return { text: turns.length > 0 ? renderTurns(turns) : raw, turns };
|
|
219
|
+
}
|
|
190
220
|
export async function runPostSession(payload, opts = {}) {
|
|
191
221
|
const startedAt = Date.now();
|
|
192
222
|
const parsed = HookPayloadSchema.parse(payload);
|
|
@@ -208,21 +238,11 @@ export async function runPostSession(payload, opts = {}) {
|
|
|
208
238
|
const progress = new SessionProgressStore(db);
|
|
209
239
|
// Only the turns not yet extracted for this session are sent: a session
|
|
210
240
|
// that compacts and then ends is extracted once, not twice.
|
|
211
|
-
const
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
// risks a context-limit error in Haiku; we take the tail (most recent turns).
|
|
217
|
-
const MAX_TRANSCRIPT_TOKENS = 60_000;
|
|
218
|
-
const transcript = countTokens(pendingText) > MAX_TRANSCRIPT_TOKENS
|
|
219
|
-
? (() => {
|
|
220
|
-
const charBudget = MAX_TRANSCRIPT_TOKENS * 4;
|
|
221
|
-
hookLog(`[post_session] WARN: transcript truncated to last ~${charBudget} chars (was ${pendingText.length})`);
|
|
222
|
-
return pendingText.slice(-charBudget);
|
|
223
|
-
})()
|
|
224
|
-
: pendingText;
|
|
225
|
-
const transcriptTokens = countTokens(transcript);
|
|
241
|
+
const plan = planExtraction(db, sessionId, resolved);
|
|
242
|
+
const { transcript, resumeAt, tokens: transcriptTokens } = plan;
|
|
243
|
+
if (plan.truncatedFrom !== null) {
|
|
244
|
+
hookLog(`[post_session] WARN: transcript truncated to last ~${MAX_TRANSCRIPT_TOKENS * 4} chars (was ${plan.truncatedFrom})`);
|
|
245
|
+
}
|
|
226
246
|
let extraction = resumeAt > 0 ? 'incremental' : 'full';
|
|
227
247
|
let outcome = {
|
|
228
248
|
observations: [],
|
|
@@ -256,6 +276,7 @@ export async function runPostSession(payload, opts = {}) {
|
|
|
256
276
|
progress.markExtracted(sessionId, projectId, resolved.turns);
|
|
257
277
|
}
|
|
258
278
|
const total = outcome.observations.length;
|
|
279
|
+
const gitInfo = opts.git ?? captureGit(cwd);
|
|
259
280
|
// Divide extraction cost across observations so per-observation tokens_spent adds up.
|
|
260
281
|
const perObsSpend = total > 0 ? Math.floor(outcome.tokensSpent / total) : 0;
|
|
261
282
|
const memDir = memoriesDir(opts.dbPath ? opts.dbPath.replace(/db\.sqlite$/, '') : projectDir(projectId));
|
|
@@ -273,6 +294,10 @@ export async function runPostSession(payload, opts = {}) {
|
|
|
273
294
|
tags: obs.tags,
|
|
274
295
|
tokens_saved: saved,
|
|
275
296
|
tokens_spent: perObsSpend,
|
|
297
|
+
git_branch: gitInfo.branch,
|
|
298
|
+
git_commit: gitInfo.commit,
|
|
299
|
+
git_before_first_commit: gitInfo.beforeFirstCommit,
|
|
300
|
+
...(opts.capturedAt !== undefined ? { created_at: Math.round(opts.capturedAt) } : {}),
|
|
276
301
|
}, { redactPatterns: config.privacy.redact_patterns });
|
|
277
302
|
// Write the human-readable markdown mirror alongside the SQLite row.
|
|
278
303
|
try {
|
|
@@ -285,7 +310,9 @@ export async function runPostSession(payload, opts = {}) {
|
|
|
285
310
|
inserted += 1;
|
|
286
311
|
}
|
|
287
312
|
// M10: deduplicate — mark near-duplicate observations from prior sessions as superseded.
|
|
288
|
-
const dedupResult = deduplicateObservations(db, projectId, insertedIds
|
|
313
|
+
const dedupResult = deduplicateObservations(db, projectId, insertedIds, {
|
|
314
|
+
defaultBranch: gitInfo.defaultBranch,
|
|
315
|
+
});
|
|
289
316
|
const tokensSavedTotal = store.totalTokensSaved(projectId);
|
|
290
317
|
const cacheEntriesAdded = config.cache.enabled
|
|
291
318
|
? populateCache(db, resolved.turns, {
|
|
@@ -314,7 +341,7 @@ export async function runPostSession(payload, opts = {}) {
|
|
|
314
341
|
now: opts.now ?? Date.now(),
|
|
315
342
|
});
|
|
316
343
|
if (parsed.hook_event_name === 'PreCompact') {
|
|
317
|
-
writeWarmStart(db, projectId);
|
|
344
|
+
writeWarmStart(db, projectId, cwd);
|
|
318
345
|
}
|
|
319
346
|
// Summaries are optional work: run them last, and only while the hook's
|
|
320
347
|
// time budget lasts, so they can never cost us the index or warm-start.
|