nexus-canon 1.11.4 → 1.11.6
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/canonArchive.d.ts +29 -0
- package/dist/canonArchive.d.ts.map +1 -1
- package/dist/canonArchive.js +222 -20
- package/dist/canonArchive.js.map +1 -1
- package/dist/canonArchiveRead.d.ts +22 -0
- package/dist/canonArchiveRead.d.ts.map +1 -0
- package/dist/canonArchiveRead.js +176 -0
- package/dist/canonArchiveRead.js.map +1 -0
- package/dist/canonGraph.d.ts +1 -1
- package/dist/canonGraph.d.ts.map +1 -1
- package/dist/canonGraph.js +35 -9
- package/dist/canonGraph.js.map +1 -1
- package/dist/canonPull.d.ts +26 -0
- package/dist/canonPull.d.ts.map +1 -1
- package/dist/canonPull.js +197 -16
- package/dist/canonPull.js.map +1 -1
- package/dist/canonSync.d.ts.map +1 -1
- package/dist/canonSync.js +3 -0
- package/dist/canonSync.js.map +1 -1
- package/dist/canonTouched.d.ts.map +1 -1
- package/dist/canonTouched.js +35 -33
- package/dist/canonTouched.js.map +1 -1
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/canonArchive.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Only session transcripts are archivable. The session roots also hold current-state files that must stay live:
|
|
3
|
+
* captured capability artifacts (`canon/artifacts/`), captured memory files (`…/memory/…`), and index docs
|
|
4
|
+
* (`SKIPPED.md`, `MAPPING.md`, `PROJECTIONS.md`, `.gitkeep`). 09-26: the prefix-only filter had archived ~1.3k of them.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isArchivablePath(p: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* The files of ONE session move and dedupe together: chunks (`<id>.jsonl.part-NNNN`), sidecars (`<id>.events.jsonl`,
|
|
9
|
+
* `<id>.meta.json`), and subagent files (`<id>/subagents/…`, `<id>.subagents/…`). Key = the path up to the first uuid
|
|
10
|
+
* segment (its stem), else the directory + the basename's stem.
|
|
11
|
+
*/
|
|
12
|
+
export declare function sessionUnit(p: string): string;
|
|
1
13
|
export interface CanonArchiveOptions {
|
|
2
14
|
store: string;
|
|
3
15
|
days?: number;
|
|
@@ -5,4 +17,21 @@ export interface CanonArchiveOptions {
|
|
|
5
17
|
push?: boolean;
|
|
6
18
|
}
|
|
7
19
|
export declare function canonArchive(opts: CanonArchiveOptions): Promise<number>;
|
|
20
|
+
/**
|
|
21
|
+
* Remove UNTRACKED files that are byte-identical to an archived copy at the same original path, before a commit
|
|
22
|
+
* stages them. Two writers re-create archived sessions on disk: the browser-branch fold-in (`git checkout FETCH_HEAD
|
|
23
|
+
* -- native/browser-cortex` restores every file the branch holds) and harness roots whose copies are re-staged
|
|
24
|
+
* unchanged. Without this, every sync re-adds them and every archive run drops them again (seen 09-26: 77 files per
|
|
25
|
+
* cycle). A session that grew differs from its archived copy and stays; files tracked in HEAD are never touched.
|
|
26
|
+
*/
|
|
27
|
+
export declare function dropArchivedDuplicates(store: string, label: string): number;
|
|
28
|
+
/**
|
|
29
|
+
* Remove a NEWLY staged session that is an ECHO of a session the store already holds under a DIFFERENT project dir
|
|
30
|
+
* (same harness, same file names, identical bytes — live or archived). Mechanism (09-26, 21 archived ids): a hosted box
|
|
31
|
+
* hydrates sessions with `pull --native --project "$PWD"` into ~/.claude/projects/-root/, then its outbound sync captures
|
|
32
|
+
* them as new sessions under native/claude-code/-root/ → `canon pull <uuid>` became ambiguous. Unit-level (sessionUnit):
|
|
33
|
+
* the whole session must be new under this dir and every file must match the SAME other dir; a session continued on
|
|
34
|
+
* the box differs and is kept. Files tracked in HEAD are never touched.
|
|
35
|
+
*/
|
|
36
|
+
export declare function dropEchoedSessions(store: string, label: string): number;
|
|
8
37
|
//# sourceMappingURL=canonArchive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonArchive.d.ts","sourceRoot":"","sources":["../src/canonArchive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canonArchive.d.ts","sourceRoot":"","sources":["../src/canonArchive.ts"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKnD;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwI7E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA+B3E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwDvE"}
|
package/dist/canonArchive.js
CHANGED
|
@@ -15,14 +15,43 @@
|
|
|
15
15
|
* on demand (partial clone) — the "link" always resolves, like [[archive]].
|
|
16
16
|
*
|
|
17
17
|
* Safety: refuses to run on a dirty worktree (a mid-sync watcher), and only
|
|
18
|
-
* touches session
|
|
19
|
-
* (HARNESSES.json, agents/, .github/, docs)
|
|
18
|
+
* touches session transcripts under native/, canon/, projections/ (isArchivablePath) —
|
|
19
|
+
* scaffolding (HARNESSES.json, agents/, .github/, docs), capability artifacts, captured
|
|
20
|
+
* memory, and index docs are never archived. Whole sessions move together (sessionUnit),
|
|
21
|
+
* and a live session byte-identical to its archived copy is dropped (the 09-20 re-add).
|
|
20
22
|
*/
|
|
21
23
|
import { execFileSync } from 'child_process';
|
|
22
24
|
import * as fs from 'fs';
|
|
23
25
|
import * as path from 'path';
|
|
24
26
|
import { ARCHIVE_EXCLUSION_PATTERNS, ensureArchiveExclusion } from './canonRepo.js';
|
|
25
27
|
const SESSION_ROOTS = ['native/', 'canon/', 'projections/'];
|
|
28
|
+
/**
|
|
29
|
+
* Only session transcripts are archivable. The session roots also hold current-state files that must stay live:
|
|
30
|
+
* captured capability artifacts (`canon/artifacts/`), captured memory files (`…/memory/…`), and index docs
|
|
31
|
+
* (`SKIPPED.md`, `MAPPING.md`, `PROJECTIONS.md`, `.gitkeep`). 09-26: the prefix-only filter had archived ~1.3k of them.
|
|
32
|
+
*/
|
|
33
|
+
export function isArchivablePath(p) {
|
|
34
|
+
if (!SESSION_ROOTS.some((r) => p.startsWith(r)))
|
|
35
|
+
return false;
|
|
36
|
+
if (p.startsWith('canon/artifacts/'))
|
|
37
|
+
return false;
|
|
38
|
+
if (p.split('/').includes('memory'))
|
|
39
|
+
return false;
|
|
40
|
+
return !p.endsWith('.md') && !p.endsWith('.gitkeep');
|
|
41
|
+
}
|
|
42
|
+
const UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/;
|
|
43
|
+
/**
|
|
44
|
+
* The files of ONE session move and dedupe together: chunks (`<id>.jsonl.part-NNNN`), sidecars (`<id>.events.jsonl`,
|
|
45
|
+
* `<id>.meta.json`), and subagent files (`<id>/subagents/…`, `<id>.subagents/…`). Key = the path up to the first uuid
|
|
46
|
+
* segment (its stem), else the directory + the basename's stem.
|
|
47
|
+
*/
|
|
48
|
+
export function sessionUnit(p) {
|
|
49
|
+
const parts = p.split('/');
|
|
50
|
+
const i = parts.findIndex((s) => UUID_SEGMENT.test(s));
|
|
51
|
+
if (i >= 0)
|
|
52
|
+
return [...parts.slice(0, i), parts[i].match(UUID_SEGMENT)[0]].join('/');
|
|
53
|
+
return [...parts.slice(0, -1), parts[parts.length - 1].split('.')[0]].join('/');
|
|
54
|
+
}
|
|
26
55
|
function git(store, args, input) {
|
|
27
56
|
return execFileSync('git', ['-C', store, ...args], {
|
|
28
57
|
encoding: 'utf-8',
|
|
@@ -63,38 +92,69 @@ export async function canonArchive(opts) {
|
|
|
63
92
|
if (m)
|
|
64
93
|
entries.push({ mode: m[1], sha: m[2], path: m[3] });
|
|
65
94
|
}
|
|
66
|
-
|
|
95
|
+
// Blobs already held under archive/, by original path (a path can sit in more than one month bucket).
|
|
96
|
+
const archived = new Map();
|
|
67
97
|
for (const e of entries) {
|
|
68
|
-
|
|
98
|
+
const m = e.path.match(/^archive\/\d{4}-\d{2}\/(.+)$/);
|
|
99
|
+
if (m)
|
|
100
|
+
(archived.get(m[1]) ?? archived.set(m[1], new Set()).get(m[1])).add(e.sha);
|
|
101
|
+
}
|
|
102
|
+
const units = new Map();
|
|
103
|
+
for (const e of entries) {
|
|
104
|
+
if (e.path.startsWith('archive/') || !isArchivablePath(e.path))
|
|
69
105
|
continue;
|
|
70
|
-
|
|
106
|
+
const k = sessionUnit(e.path);
|
|
107
|
+
(units.get(k) ?? units.set(k, []).get(k)).push(e);
|
|
108
|
+
}
|
|
109
|
+
// Per session: DROP when every live file is byte-identical to an archived copy (the 09-20 re-add left ~15k such
|
|
110
|
+
// sessions live — no age test, they are pure duplicates); MOVE when every file is older than the cutoff (a chunked
|
|
111
|
+
// session that is still growing keeps its old parts live with the new ones). A grown or changed session stays live.
|
|
112
|
+
const moves = [];
|
|
113
|
+
const drops = [];
|
|
114
|
+
for (const files of units.values()) {
|
|
115
|
+
if (files.every((e) => archived.get(e.path)?.has(e.sha))) {
|
|
116
|
+
drops.push(...files.map((e) => e.path));
|
|
71
117
|
continue;
|
|
72
|
-
|
|
73
|
-
|
|
118
|
+
}
|
|
119
|
+
const cts = files.map((e) => epochs.get(e.path) ?? 0);
|
|
120
|
+
if (cts.some((ct) => ct === 0 || ct >= cutoff))
|
|
74
121
|
continue;
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
122
|
+
for (const [i, e] of files.entries()) {
|
|
123
|
+
if (archived.get(e.path)?.has(e.sha)) {
|
|
124
|
+
drops.push(e.path);
|
|
125
|
+
continue;
|
|
126
|
+
} // already archived byte-identical: no second copy
|
|
127
|
+
const d = new Date(cts[i] * 1000);
|
|
128
|
+
const bucket = `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, '0')}`;
|
|
129
|
+
moves.push({ from: e.path, to: `archive/${bucket}/${e.path}` });
|
|
130
|
+
}
|
|
78
131
|
}
|
|
79
|
-
if (moves.length === 0) {
|
|
132
|
+
if (moves.length === 0 && drops.length === 0) {
|
|
80
133
|
console.log(`[canon-archive] nothing older than ${days}d to archive (${entries.length} tracked files)`);
|
|
81
134
|
// Still enforce the local footprint: a fresh (re-)clone or an older build may have materialized archive/.
|
|
82
135
|
if (!opts.dryRun)
|
|
83
136
|
ensureArchiveExclusion(store, 'canon-archive');
|
|
84
137
|
return 0;
|
|
85
138
|
}
|
|
86
|
-
console.log(`[canon-archive] archiving ${moves.length} of ${entries.length} files (last commit > ${days}d ago)`
|
|
139
|
+
console.log(`[canon-archive] archiving ${moves.length} of ${entries.length} files (last commit > ${days}d ago); ` +
|
|
140
|
+
`dropping ${drops.length} live duplicate(s) of archived files`);
|
|
87
141
|
if (opts.dryRun) {
|
|
88
142
|
for (const m of moves.slice(0, 20))
|
|
89
143
|
console.log(` ${m.from} -> ${m.to}`);
|
|
90
144
|
if (moves.length > 20)
|
|
91
145
|
console.log(` … ${moves.length - 20} more`);
|
|
146
|
+
for (const p of drops.slice(0, 20))
|
|
147
|
+
console.log(` drop ${p} (identical copy under archive/)`);
|
|
148
|
+
if (drops.length > 20)
|
|
149
|
+
console.log(` … ${drops.length - 20} more drops`);
|
|
92
150
|
return 0;
|
|
93
151
|
}
|
|
94
|
-
// Build the new index wholesale: every entry at its final path. Renames keep
|
|
152
|
+
// Build the new index wholesale: every entry at its final path (dropped duplicates omitted). Renames keep
|
|
95
153
|
// the same blob sha — no content read, no re-upload, works in partial clones.
|
|
96
154
|
const dest = new Map(moves.map((m) => [m.from, m.to]));
|
|
155
|
+
const dropped = new Set(drops);
|
|
97
156
|
const indexInfo = entries
|
|
157
|
+
.filter((e) => !dropped.has(e.path))
|
|
98
158
|
.map((e) => `${e.mode} ${e.sha} 0\t${dest.get(e.path) ?? e.path}`)
|
|
99
159
|
.join('\n') + '\n';
|
|
100
160
|
git(store, ['read-tree', '--empty']);
|
|
@@ -111,7 +171,8 @@ export async function canonArchive(opts) {
|
|
|
111
171
|
const commit = git(store, [
|
|
112
172
|
'-c', 'user.email=canon-archive@local', '-c', 'user.name=canon-archive',
|
|
113
173
|
'commit-tree', tree, '-p', parent,
|
|
114
|
-
'-m', `canon-archive: ${moves.length}
|
|
174
|
+
'-m', `canon-archive: ${moves.length} files older than ${days}d -> archive/` +
|
|
175
|
+
(drops.length ? `, ${drops.length} live duplicates of archived files dropped` : '') + (moves.length ? ' (renames only; remote keeps everything)' : ' (remote keeps everything)'),
|
|
115
176
|
]).trim();
|
|
116
177
|
git(store, ['update-ref', 'HEAD', commit]);
|
|
117
178
|
// Sparse-exclude archive/ so the local worktree DROPS the moved files (this
|
|
@@ -126,19 +187,19 @@ export async function canonArchive(opts) {
|
|
|
126
187
|
const shaByFrom = new Map(entries.map((e) => [e.path, e.sha]));
|
|
127
188
|
let removed = 0, kept = 0, freed = 0;
|
|
128
189
|
const dirs = new Set();
|
|
129
|
-
for (const
|
|
130
|
-
const abs = path.join(store,
|
|
190
|
+
for (const from of [...moves.map((m) => m.from), ...drops]) {
|
|
191
|
+
const abs = path.join(store, from);
|
|
131
192
|
if (!fs.existsSync(abs))
|
|
132
193
|
continue;
|
|
133
194
|
let tracked = true;
|
|
134
195
|
try {
|
|
135
|
-
git(store, ['ls-files', '--error-unmatch', '--',
|
|
196
|
+
git(store, ['ls-files', '--error-unmatch', '--', from]);
|
|
136
197
|
}
|
|
137
198
|
catch {
|
|
138
199
|
tracked = false;
|
|
139
200
|
}
|
|
140
|
-
const sha = tracked ? '' : git(store, ['hash-object', '--',
|
|
141
|
-
if (tracked || sha !== shaByFrom.get(
|
|
201
|
+
const sha = tracked ? '' : git(store, ['hash-object', '--', from]).trim();
|
|
202
|
+
if (tracked || sha !== shaByFrom.get(from)) {
|
|
142
203
|
kept++;
|
|
143
204
|
continue;
|
|
144
205
|
}
|
|
@@ -167,7 +228,7 @@ export async function canonArchive(opts) {
|
|
|
167
228
|
if (opts.push !== false) {
|
|
168
229
|
try {
|
|
169
230
|
git(store, ['push', 'origin', 'HEAD']);
|
|
170
|
-
console.log(`[canon-archive] pushed ${commit.slice(0, 10)} (${moves.length} archived)`);
|
|
231
|
+
console.log(`[canon-archive] pushed ${commit.slice(0, 10)} (${moves.length} archived, ${drops.length} duplicates dropped)`);
|
|
171
232
|
}
|
|
172
233
|
catch (e) {
|
|
173
234
|
console.error(`[canon-archive] PUSH FAILED (commit is local-only — rerun push): ${String(e?.message ?? e).slice(0, 200)}`);
|
|
@@ -176,4 +237,145 @@ export async function canonArchive(opts) {
|
|
|
176
237
|
}
|
|
177
238
|
return 0;
|
|
178
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Remove UNTRACKED files that are byte-identical to an archived copy at the same original path, before a commit
|
|
242
|
+
* stages them. Two writers re-create archived sessions on disk: the browser-branch fold-in (`git checkout FETCH_HEAD
|
|
243
|
+
* -- native/browser-cortex` restores every file the branch holds) and harness roots whose copies are re-staged
|
|
244
|
+
* unchanged. Without this, every sync re-adds them and every archive run drops them again (seen 09-26: 77 files per
|
|
245
|
+
* cycle). A session that grew differs from its archived copy and stays; files tracked in HEAD are never touched.
|
|
246
|
+
*/
|
|
247
|
+
export function dropArchivedDuplicates(store, label) {
|
|
248
|
+
let tree = '';
|
|
249
|
+
let untracked = '';
|
|
250
|
+
let staged = '';
|
|
251
|
+
try {
|
|
252
|
+
tree = git(store, ['ls-tree', '-r', 'HEAD', '--', 'archive']);
|
|
253
|
+
untracked = git(store, ['ls-files', '--others', '--exclude-standard', '-z']);
|
|
254
|
+
// `git checkout <tree> -- <path>` (the browser fold-in) writes AND stages — those files are added in the index, not untracked.
|
|
255
|
+
staged = git(store, ['diff', '--cached', '--name-only', '--diff-filter=A', '-z', 'HEAD']);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
const stagedSet = new Set(staged.split('\0').filter(Boolean));
|
|
261
|
+
const archived = new Map();
|
|
262
|
+
for (const line of tree.split('\n')) {
|
|
263
|
+
const m = line.match(/^\d{6} blob ([0-9a-f]{40,64})\tarchive\/\d{4}-\d{2}\/(.+)$/);
|
|
264
|
+
if (m && isArchivablePath(m[2]))
|
|
265
|
+
(archived.get(m[2]) ?? archived.set(m[2], new Set()).get(m[2])).add(m[1]);
|
|
266
|
+
}
|
|
267
|
+
let removed = 0;
|
|
268
|
+
for (const rel of [...untracked.split('\0'), ...stagedSet]) {
|
|
269
|
+
const shas = rel ? archived.get(rel) : undefined;
|
|
270
|
+
if (!shas)
|
|
271
|
+
continue;
|
|
272
|
+
let sha = '';
|
|
273
|
+
try {
|
|
274
|
+
sha = git(store, ['hash-object', '--', rel]).trim();
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (!shas.has(sha))
|
|
280
|
+
continue;
|
|
281
|
+
try {
|
|
282
|
+
if (stagedSet.has(rel))
|
|
283
|
+
git(store, ['rm', '-q', '-f', '--', rel]); // unstage + delete (only ever an index-ADDED path)
|
|
284
|
+
else
|
|
285
|
+
fs.unlinkSync(path.join(store, rel));
|
|
286
|
+
removed++;
|
|
287
|
+
}
|
|
288
|
+
catch { /* raced away */ }
|
|
289
|
+
}
|
|
290
|
+
if (removed)
|
|
291
|
+
console.log(`[${label}] skipped ${removed} file(s) identical to their archived copy (not re-added)`);
|
|
292
|
+
return removed;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Remove a NEWLY staged session that is an ECHO of a session the store already holds under a DIFFERENT project dir
|
|
296
|
+
* (same harness, same file names, identical bytes — live or archived). Mechanism (09-26, 21 archived ids): a hosted box
|
|
297
|
+
* hydrates sessions with `pull --native --project "$PWD"` into ~/.claude/projects/-root/, then its outbound sync captures
|
|
298
|
+
* them as new sessions under native/claude-code/-root/ → `canon pull <uuid>` became ambiguous. Unit-level (sessionUnit):
|
|
299
|
+
* the whole session must be new under this dir and every file must match the SAME other dir; a session continued on
|
|
300
|
+
* the box differs and is kept. Files tracked in HEAD are never touched.
|
|
301
|
+
*/
|
|
302
|
+
export function dropEchoedSessions(store, label) {
|
|
303
|
+
let tree = '';
|
|
304
|
+
let untracked = '';
|
|
305
|
+
let staged = '';
|
|
306
|
+
try {
|
|
307
|
+
tree = git(store, ['ls-tree', '-r', 'HEAD', '--', 'native', 'archive']);
|
|
308
|
+
untracked = git(store, ['ls-files', '--others', '--exclude-standard', '-z', '--', 'native']);
|
|
309
|
+
staged = git(store, ['diff', '--cached', '--name-only', '--diff-filter=A', '-z', 'HEAD', '--', 'native']);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return 0;
|
|
313
|
+
}
|
|
314
|
+
const split = (p) => p.match(/^native\/([^/]+)\/([^/]+)\/(.+)$/); // harness, project dir, rest
|
|
315
|
+
const known = new Map(); // harness|rest → dir → shas
|
|
316
|
+
const liveUnits = new Set();
|
|
317
|
+
for (const line of tree.split('\n')) {
|
|
318
|
+
const m = line.match(/^\d{6} blob ([0-9a-f]{40,64})\t(.+)$/);
|
|
319
|
+
if (!m)
|
|
320
|
+
continue;
|
|
321
|
+
const live = !m[2].startsWith('archive/');
|
|
322
|
+
const p = live ? m[2] : m[2].replace(/^archive\/\d{4}-\d{2}\//, '');
|
|
323
|
+
const s = split(p);
|
|
324
|
+
if (!s)
|
|
325
|
+
continue;
|
|
326
|
+
if (live)
|
|
327
|
+
liveUnits.add(sessionUnit(p));
|
|
328
|
+
const k = `${s[1]}|${s[3]}`;
|
|
329
|
+
const byDir = known.get(k) ?? known.set(k, new Map()).get(k);
|
|
330
|
+
(byDir.get(s[2]) ?? byDir.set(s[2], new Set()).get(s[2])).add(m[1]);
|
|
331
|
+
}
|
|
332
|
+
const stagedSet = new Set(staged.split('\0').filter(Boolean));
|
|
333
|
+
const units = new Map();
|
|
334
|
+
for (const rel of [...untracked.split('\0').filter(Boolean), ...stagedSet]) {
|
|
335
|
+
if (!split(rel) || !isArchivablePath(rel))
|
|
336
|
+
continue;
|
|
337
|
+
const u = sessionUnit(rel);
|
|
338
|
+
(units.get(u) ?? units.set(u, []).get(u)).push(rel);
|
|
339
|
+
}
|
|
340
|
+
let removed = 0, sessions = 0;
|
|
341
|
+
for (const [unit, files] of units) {
|
|
342
|
+
if (liveUnits.has(unit))
|
|
343
|
+
continue; // this dir already holds the session — a change to it is a continuation
|
|
344
|
+
let common; // other project dirs holding every file of this unit byte-identical
|
|
345
|
+
for (const rel of files) {
|
|
346
|
+
const s = split(rel);
|
|
347
|
+
let sha = '';
|
|
348
|
+
try {
|
|
349
|
+
sha = git(store, ['hash-object', '--', rel]).trim();
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
common = [];
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
const dirs = [];
|
|
356
|
+
for (const [d, shas] of known.get(`${s[1]}|${s[3]}`) ?? new Map())
|
|
357
|
+
if (d !== s[2] && shas.has(sha))
|
|
358
|
+
dirs.push(d);
|
|
359
|
+
common = common === undefined ? dirs : common.filter((d) => dirs.includes(d));
|
|
360
|
+
if (!common.length)
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
363
|
+
if (!common?.length)
|
|
364
|
+
continue;
|
|
365
|
+
for (const rel of files) {
|
|
366
|
+
try {
|
|
367
|
+
if (stagedSet.has(rel))
|
|
368
|
+
git(store, ['rm', '-q', '-f', '--', rel]);
|
|
369
|
+
else
|
|
370
|
+
fs.unlinkSync(path.join(store, rel));
|
|
371
|
+
removed++;
|
|
372
|
+
}
|
|
373
|
+
catch { /* raced away */ }
|
|
374
|
+
}
|
|
375
|
+
sessions++;
|
|
376
|
+
}
|
|
377
|
+
if (sessions)
|
|
378
|
+
console.log(`[${label}] skipped ${sessions} echoed session(s) (${removed} file(s)) — already in the store under another project dir`);
|
|
379
|
+
return removed;
|
|
380
|
+
}
|
|
179
381
|
//# sourceMappingURL=canonArchive.js.map
|
package/dist/canonArchive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonArchive.js","sourceRoot":"","sources":["../src/canonArchive.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canonArchive.js","sourceRoot":"","sources":["../src/canonArchive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CanonSession } from './canonPull.js';
|
|
2
|
+
/** Where an archived session's bytes live: git blob ids in the store (part order), plus the events sidecar. */
|
|
3
|
+
export interface ArchivedSessionRef {
|
|
4
|
+
store: string;
|
|
5
|
+
/** Repo path of the logical session under archive/ (e.g. archive/2026-08/canon/claude-code/<dir>/<id>.jsonl). */
|
|
6
|
+
path: string;
|
|
7
|
+
blobs: string[];
|
|
8
|
+
sidecarBlob?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Archived canonical sessions (HEAD `archive/<YYYY-MM>/canon/…`) whose logical path is NOT live — a live copy
|
|
12
|
+
* always wins. A session archived in more than one month bucket resolves to the newest bucket. Same grouping and
|
|
13
|
+
* uuid rules as discoverCanonSessions (parts-aware, events sidecars excluded, empty mains skipped).
|
|
14
|
+
*/
|
|
15
|
+
export declare function discoverArchivedCanonSessions(store: string, live: Iterable<string>, opts?: {
|
|
16
|
+
home?: string;
|
|
17
|
+
}): CanonSession[];
|
|
18
|
+
/** Stream a session's JSONL lines — disk parts for a live session, git blobs for an archived one. */
|
|
19
|
+
export declare function sessionLines(s: CanonSession): AsyncGenerator<string>;
|
|
20
|
+
/** Stream the events sidecar's lines (nothing when the session has none). */
|
|
21
|
+
export declare function sidecarLines(s: CanonSession): AsyncGenerator<string>;
|
|
22
|
+
//# sourceMappingURL=canonArchiveRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonArchiveRead.d.ts","sourceRoot":"","sources":["../src/canonArchiveRead.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,+GAA+G;AAC/G,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iHAAiH;IACjH,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,YAAY,EAAE,CA+DhB;AAED,qGAAqG;AACrG,wBAAuB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAM3E;AAED,6EAA6E;AAC7E,wBAAuB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAO3E"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* canonArchiveRead — read archived canon sessions straight from the store's git objects (2026-09-26).
|
|
3
|
+
*
|
|
4
|
+
* The hot/archive split (canonArchive.ts) keeps `archive/` out of the local worktree, so anything that walks
|
|
5
|
+
* `canon/` on disk (the project graphs) would lose every session older than the archive cutoff. This module lists
|
|
6
|
+
* the archived canonical line from HEAD's tree and streams session bytes with `git cat-file` — nothing is written
|
|
7
|
+
* to disk. In a partial clone a blob that is not local yet is fetched on demand by git (promisor remote).
|
|
8
|
+
*
|
|
9
|
+
* Archived blobs never change, so consumers can key caches on the blob ids (canonTouched does): each archived
|
|
10
|
+
* session is read once per machine, then served from cache.
|
|
11
|
+
*
|
|
12
|
+
* @module canonArchiveRead
|
|
13
|
+
*/
|
|
14
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import * as readline from 'node:readline';
|
|
18
|
+
/**
|
|
19
|
+
* Archived canonical sessions (HEAD `archive/<YYYY-MM>/canon/…`) whose logical path is NOT live — a live copy
|
|
20
|
+
* always wins. A session archived in more than one month bucket resolves to the newest bucket. Same grouping and
|
|
21
|
+
* uuid rules as discoverCanonSessions (parts-aware, events sidecars excluded, empty mains skipped).
|
|
22
|
+
*/
|
|
23
|
+
export function discoverArchivedCanonSessions(store, live, opts = {}) {
|
|
24
|
+
let out = '';
|
|
25
|
+
try {
|
|
26
|
+
out = execFileSync('git', ['-C', store, 'ls-tree', '-r', '-l', 'HEAD', '--', 'archive'], {
|
|
27
|
+
encoding: 'utf8', maxBuffer: 512 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
const liveRels = new Set(live);
|
|
34
|
+
const groups = new Map(); // key = rel under canon/ (logical .jsonl)
|
|
35
|
+
const sidecars = new Map();
|
|
36
|
+
for (const line of out.split('\n')) {
|
|
37
|
+
const m = line.match(/^\d{6} blob ([0-9a-f]{40,64}) +(\d+|-)\t(.+)$/);
|
|
38
|
+
if (!m)
|
|
39
|
+
continue;
|
|
40
|
+
const pm = m[3].match(/^archive\/(\d{4}-\d{2})\/canon\/(.+)$/);
|
|
41
|
+
if (!pm)
|
|
42
|
+
continue;
|
|
43
|
+
const [bucket, rest] = [pm[1], pm[2]];
|
|
44
|
+
if (rest.endsWith('.events.jsonl')) {
|
|
45
|
+
const logical = rest.replace(/\.events\.jsonl$/, '.jsonl');
|
|
46
|
+
const cur = sidecars.get(logical);
|
|
47
|
+
if (!cur || bucket > cur.bucket)
|
|
48
|
+
sidecars.set(logical, { bucket, sha: m[1] });
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const cm = rest.match(/^(.*\.jsonl)\.part-\d{4}$/);
|
|
52
|
+
const logical = cm ? cm[1] : rest;
|
|
53
|
+
if (!logical.endsWith('.jsonl'))
|
|
54
|
+
continue;
|
|
55
|
+
const g = groups.get(logical);
|
|
56
|
+
const part = { name: rest, sha: m[1], size: m[2] === '-' ? 0 : parseInt(m[2], 10) };
|
|
57
|
+
if (!g || bucket > g.bucket)
|
|
58
|
+
groups.set(logical, { bucket, parts: [part] });
|
|
59
|
+
else if (bucket === g.bucket)
|
|
60
|
+
g.parts.push(part);
|
|
61
|
+
}
|
|
62
|
+
const titles = loadTitleCache(opts.home);
|
|
63
|
+
let titlesChanged = false;
|
|
64
|
+
const sessions = [];
|
|
65
|
+
for (const [rel, g] of groups) {
|
|
66
|
+
if (liveRels.has(rel))
|
|
67
|
+
continue;
|
|
68
|
+
g.parts.sort((a, b) => a.name.localeCompare(b.name));
|
|
69
|
+
const bytes = g.parts.reduce((n, p) => n + p.size, 0);
|
|
70
|
+
if (bytes === 0)
|
|
71
|
+
continue;
|
|
72
|
+
let uuid = path.basename(rel, '.jsonl');
|
|
73
|
+
const parent = path.basename(path.dirname(rel));
|
|
74
|
+
if (!/^[0-9a-f]{8}-/i.test(uuid) && /^[0-9a-f]{8}-[0-9a-f-]{10,}$/i.test(parent))
|
|
75
|
+
uuid = parent;
|
|
76
|
+
const side = sidecars.get(rel);
|
|
77
|
+
let title;
|
|
78
|
+
if (side) {
|
|
79
|
+
if (side.sha in titles.map)
|
|
80
|
+
title = titles.map[side.sha] ?? undefined;
|
|
81
|
+
else {
|
|
82
|
+
title = titleFromEvents(store, side.sha);
|
|
83
|
+
titles.map[side.sha] = title ?? null;
|
|
84
|
+
titlesChanged = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const repoPath = `archive/${g.bucket}/canon/${rel}`;
|
|
88
|
+
const archived = { store, path: repoPath, blobs: g.parts.map((p) => p.sha), sidecarBlob: side?.sha };
|
|
89
|
+
sessions.push({
|
|
90
|
+
uuid, rel, bytes, title, harness: rel.split('/')[0] ?? '?',
|
|
91
|
+
parts: g.parts.map((p) => `archive/${g.bucket}/canon/${p.name}`),
|
|
92
|
+
archived,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (titlesChanged)
|
|
96
|
+
saveTitleCache(titles);
|
|
97
|
+
return sessions.sort((a, b) => a.rel.localeCompare(b.rel));
|
|
98
|
+
}
|
|
99
|
+
/** Stream a session's JSONL lines — disk parts for a live session, git blobs for an archived one. */
|
|
100
|
+
export async function* sessionLines(s) {
|
|
101
|
+
if (!s.archived) {
|
|
102
|
+
for (const part of s.parts)
|
|
103
|
+
yield* linesOf(fs.createReadStream(part));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const sha of s.archived.blobs)
|
|
107
|
+
yield* blobLines(s.archived.store, sha);
|
|
108
|
+
}
|
|
109
|
+
/** Stream the events sidecar's lines (nothing when the session has none). */
|
|
110
|
+
export async function* sidecarLines(s) {
|
|
111
|
+
if (s.archived) {
|
|
112
|
+
if (s.archived.sidecarBlob)
|
|
113
|
+
yield* blobLines(s.archived.store, s.archived.sidecarBlob);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const sidecar = s.parts[0].replace(/\.part-\d{4}$/, '').replace(/\.jsonl$/, '.events.jsonl');
|
|
117
|
+
if (fs.existsSync(sidecar))
|
|
118
|
+
yield* linesOf(fs.createReadStream(sidecar));
|
|
119
|
+
}
|
|
120
|
+
async function* linesOf(input) {
|
|
121
|
+
const rl = readline.createInterface({ input, crlfDelay: Infinity });
|
|
122
|
+
for await (const line of rl)
|
|
123
|
+
yield line;
|
|
124
|
+
}
|
|
125
|
+
async function* blobLines(store, sha) {
|
|
126
|
+
const child = spawn('git', ['-C', store, 'cat-file', 'blob', sha], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
127
|
+
let stderr = '';
|
|
128
|
+
child.stderr.on('data', (d) => { stderr += String(d); });
|
|
129
|
+
const exited = new Promise((resolve) => child.on('close', (code) => resolve(code ?? 1)));
|
|
130
|
+
yield* linesOf(child.stdout);
|
|
131
|
+
const code = await exited;
|
|
132
|
+
if (code !== 0)
|
|
133
|
+
throw new Error(`git cat-file blob ${sha.slice(0, 12)} failed (${code}): ${stderr.trim().slice(0, 200)}`);
|
|
134
|
+
}
|
|
135
|
+
function titleFromEvents(store, sha) {
|
|
136
|
+
let text = '';
|
|
137
|
+
try {
|
|
138
|
+
text = execFileSync('git', ['-C', store, 'cat-file', 'blob', sha], { encoding: 'utf8', maxBuffer: 256 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
let title;
|
|
144
|
+
for (const line of text.split('\n')) {
|
|
145
|
+
if (!line.includes('ai-title'))
|
|
146
|
+
continue;
|
|
147
|
+
try {
|
|
148
|
+
const r = JSON.parse(line);
|
|
149
|
+
if (r.type === 'ai-title' && r.aiTitle)
|
|
150
|
+
title = r.aiTitle;
|
|
151
|
+
}
|
|
152
|
+
catch { /* skip */ }
|
|
153
|
+
}
|
|
154
|
+
return title;
|
|
155
|
+
}
|
|
156
|
+
// Titles of archived sessions, keyed by the sidecar's blob id (immutable → never stale). Derived + disposable.
|
|
157
|
+
function titleCachePath(home) {
|
|
158
|
+
return path.join(home ?? process.env.HOME ?? '/home/runner/workspace', '.canon', 'archived-titles.json');
|
|
159
|
+
}
|
|
160
|
+
function loadTitleCache(home) {
|
|
161
|
+
const file = titleCachePath(home);
|
|
162
|
+
try {
|
|
163
|
+
return { file, map: JSON.parse(fs.readFileSync(file, 'utf8')) };
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return { file, map: {} };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function saveTitleCache(c) {
|
|
170
|
+
try {
|
|
171
|
+
fs.mkdirSync(path.dirname(c.file), { recursive: true });
|
|
172
|
+
fs.writeFileSync(c.file, JSON.stringify(c.map));
|
|
173
|
+
}
|
|
174
|
+
catch { /* cache only */ }
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=canonArchiveRead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonArchiveRead.js","sourceRoot":"","sources":["../src/canonArchiveRead.ts"],"names":[],"mappings":"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"}
|
package/dist/canonGraph.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface ProjectEntry {
|
|
|
12
12
|
* Fully environment-derived ($HOME + filesystem + the store's own dirs);
|
|
13
13
|
* `projects/ROOTS.json` overrides win where present. No hardcoded roots.
|
|
14
14
|
*/
|
|
15
|
-
export declare function deriveProjectSessionMap(store: string): Record<string, ProjectEntry>;
|
|
15
|
+
export declare function deriveProjectSessionMap(store: string, archivedRels?: string[]): Record<string, ProjectEntry>;
|
|
16
16
|
/** Resolve which project a canon session belongs to (by path prefix). */
|
|
17
17
|
export declare function sessionProject(projects: Record<string, ProjectEntry>, s: CanonSession): string | undefined;
|
|
18
18
|
export interface CanonGraphOptions {
|