nexus-canon 1.11.3 → 1.11.5

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.
@@ -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,12 @@ 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;
8
28
  //# sourceMappingURL=canonArchive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonArchive.d.ts","sourceRoot":"","sources":["../src/canonArchive.ts"],"names":[],"mappings":"AAwBA,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;AAsBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0E7E"}
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"}
@@ -15,16 +15,49 @@
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-class roots (native/, canon/, projections/) — scaffolding
19
- * (HARNESSES.json, agents/, .github/, docs) is never archived.
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';
24
+ import * as fs from 'fs';
25
+ import * as path from 'path';
26
+ import { ARCHIVE_EXCLUSION_PATTERNS, ensureArchiveExclusion } from './canonRepo.js';
22
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
+ }
23
55
  function git(store, args, input) {
24
56
  return execFileSync('git', ['-C', store, ...args], {
25
57
  encoding: 'utf-8',
26
58
  input,
27
59
  maxBuffer: 256 * 1024 * 1024,
60
+ stdio: ['pipe', 'pipe', 'pipe'], // keep expected probe failures (ls-files --error-unmatch) out of the cron log
28
61
  });
29
62
  }
30
63
  /** Per-path last-commit epoch: one newest-first log walk; first sighting wins. */
@@ -59,55 +92,143 @@ export async function canonArchive(opts) {
59
92
  if (m)
60
93
  entries.push({ mode: m[1], sha: m[2], path: m[3] });
61
94
  }
62
- const moves = [];
95
+ // Blobs already held under archive/, by original path (a path can sit in more than one month bucket).
96
+ const archived = new Map();
97
+ for (const e of entries) {
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();
63
103
  for (const e of entries) {
64
- if (e.path.startsWith('archive/'))
104
+ if (e.path.startsWith('archive/') || !isArchivablePath(e.path))
65
105
  continue;
66
- if (!SESSION_ROOTS.some((r) => e.path.startsWith(r)))
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));
67
117
  continue;
68
- const ct = epochs.get(e.path) ?? 0;
69
- if (ct === 0 || ct >= cutoff)
118
+ }
119
+ const cts = files.map((e) => epochs.get(e.path) ?? 0);
120
+ if (cts.some((ct) => ct === 0 || ct >= cutoff))
70
121
  continue;
71
- const d = new Date(ct * 1000);
72
- const bucket = `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, '0')}`;
73
- moves.push({ from: e.path, to: `archive/${bucket}/${e.path}` });
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
+ }
74
131
  }
75
- if (moves.length === 0) {
132
+ if (moves.length === 0 && drops.length === 0) {
76
133
  console.log(`[canon-archive] nothing older than ${days}d to archive (${entries.length} tracked files)`);
134
+ // Still enforce the local footprint: a fresh (re-)clone or an older build may have materialized archive/.
135
+ if (!opts.dryRun)
136
+ ensureArchiveExclusion(store, 'canon-archive');
77
137
  return 0;
78
138
  }
79
- 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`);
80
141
  if (opts.dryRun) {
81
142
  for (const m of moves.slice(0, 20))
82
143
  console.log(` ${m.from} -> ${m.to}`);
83
144
  if (moves.length > 20)
84
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`);
85
150
  return 0;
86
151
  }
87
- // 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
88
153
  // the same blob sha — no content read, no re-upload, works in partial clones.
89
154
  const dest = new Map(moves.map((m) => [m.from, m.to]));
155
+ const dropped = new Set(drops);
90
156
  const indexInfo = entries
157
+ .filter((e) => !dropped.has(e.path))
91
158
  .map((e) => `${e.mode} ${e.sha} 0\t${dest.get(e.path) ?? e.path}`)
92
159
  .join('\n') + '\n';
93
160
  git(store, ['read-tree', '--empty']);
94
161
  git(store, ['update-index', '--index-info'], indexInfo);
162
+ // 09-26 FIX: --index-info entries carry NO stat data, so git treats every file already on disk as "not uptodate" and
163
+ // refuses to drop it when the exclusion applies (live: a store that had materialized archive/ kept all 1.6 GB).
164
+ // Re-stat what is really on disk (identical content → uptodate); missing paths (the new archive/ entries) are fine.
165
+ try {
166
+ git(store, ['update-index', '-q', '--refresh', '--ignore-missing']);
167
+ }
168
+ catch { /* exit 1 = some entries differ; harmless */ }
95
169
  const tree = git(store, ['write-tree']).trim();
96
170
  const parent = git(store, ['rev-parse', 'HEAD']).trim();
97
171
  const commit = git(store, [
98
172
  '-c', 'user.email=canon-archive@local', '-c', 'user.name=canon-archive',
99
173
  'commit-tree', tree, '-p', parent,
100
- '-m', `canon-archive: ${moves.length} sessions older than ${days}d -> archive/ (renames only; remote keeps everything)`,
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)'),
101
176
  ]).trim();
102
177
  git(store, ['update-ref', 'HEAD', commit]);
103
178
  // Sparse-exclude archive/ so the local worktree DROPS the moved files (this
104
179
  // is where the flat-forever footprint comes from), then sync the worktree.
105
- git(store, ['sparse-checkout', 'set', '--no-cone', '/*', '!archive/']);
180
+ git(store, ['sparse-checkout', 'set', '--no-cone', ...ARCHIVE_EXCLUSION_PATTERNS]);
106
181
  git(store, ['read-tree', '-mu', 'HEAD']);
182
+ git(store, ['sparse-checkout', 'reapply']);
183
+ // 09-26 FIX (reproduced): the index rewrite above carries no stat data, so git leaves the moved files ON DISK
184
+ // at their old paths as UNTRACKED files — nothing is freed, the next archive run aborts on the dirty tree,
185
+ // and the next sync's `git add -A` would re-add every archived session at its old path. Remove each leftover
186
+ // only when its bytes hash to the archived blob (so a file a writer touched meanwhile is never lost).
187
+ const shaByFrom = new Map(entries.map((e) => [e.path, e.sha]));
188
+ let removed = 0, kept = 0, freed = 0;
189
+ const dirs = new Set();
190
+ for (const from of [...moves.map((m) => m.from), ...drops]) {
191
+ const abs = path.join(store, from);
192
+ if (!fs.existsSync(abs))
193
+ continue;
194
+ let tracked = true;
195
+ try {
196
+ git(store, ['ls-files', '--error-unmatch', '--', from]);
197
+ }
198
+ catch {
199
+ tracked = false;
200
+ }
201
+ const sha = tracked ? '' : git(store, ['hash-object', '--', from]).trim();
202
+ if (tracked || sha !== shaByFrom.get(from)) {
203
+ kept++;
204
+ continue;
205
+ }
206
+ freed += fs.statSync(abs).size;
207
+ fs.unlinkSync(abs);
208
+ removed++;
209
+ dirs.add(path.dirname(abs));
210
+ }
211
+ // Prune directories the removals emptied (deepest first), never the store root.
212
+ for (const d of [...dirs].sort((a, b) => b.length - a.length)) {
213
+ let cur = d;
214
+ while (cur.startsWith(store + path.sep) && cur !== store) {
215
+ try {
216
+ if (fs.readdirSync(cur).length > 0)
217
+ break;
218
+ fs.rmdirSync(cur);
219
+ }
220
+ catch {
221
+ break;
222
+ }
223
+ cur = path.dirname(cur);
224
+ }
225
+ }
226
+ console.log(`[canon-archive] local worktree: removed ${removed} archived file(s) (${(freed / 1048576).toFixed(1)} MB freed)` +
227
+ (kept ? `, kept ${kept} that changed since the move (review)` : ''));
107
228
  if (opts.push !== false) {
108
229
  try {
109
230
  git(store, ['push', 'origin', 'HEAD']);
110
- 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)`);
111
232
  }
112
233
  catch (e) {
113
234
  console.error(`[canon-archive] PUSH FAILED (commit is local-only — rerun push): ${String(e?.message ?? e).slice(0, 200)}`);
@@ -116,4 +237,58 @@ export async function canonArchive(opts) {
116
237
  }
117
238
  return 0;
118
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
+ }
119
294
  //# sourceMappingURL=canonArchive.js.map
@@ -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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"}
@@ -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 {
@@ -1 +1 @@
1
- {"version":3,"file":"canonGraph.d.ts","sourceRoot":"","sources":["../src/canonGraph.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO1E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,0GAA0G;IAC1G,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAwCD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAkDnF;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO1G;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qIAAqI;IACrI,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAsB,UAAU,CAAC,CAAC,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqSrF"}
1
+ {"version":3,"file":"canonGraph.d.ts","sourceRoot":"","sources":["../src/canonGraph.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ1E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,0GAA0G;IAC1G,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAwCD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAoDhH;AAYD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO1G;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qIAAqI;IACrI,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAsB,UAAU,CAAC,CAAC,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4SrF"}