@dzhechkov/harness-core 0.3.50 → 0.3.52

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/brain.d.ts CHANGED
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * @packageDocumentation
16
16
  */
17
- import { type BookKUHit } from './book-kb.js';
17
+ import { type BookKU, type BookKUHit } from './book-kb.js';
18
18
  /** The durable, cross-project brain home. `DZ_BRAIN_HOME` overrides `~/.dz/brain`. */
19
19
  export declare function brainHome(): string;
20
20
  /** Lexical (FTS5) store for the whole brain — all sources, source-tagged. */
@@ -31,6 +31,10 @@ export interface BrainSource {
31
31
  readonly corpusVersion?: string;
32
32
  readonly lang?: string;
33
33
  readonly isbn?: string;
34
+ /** SPDX-ish license id — carried for repo sources (§8: refuse promoting unknown-license repos). */
35
+ readonly license?: string;
36
+ /** Relative path (from the brain home) to this source's capability card, e.g. `primers/<slug>.md`. */
37
+ readonly primer?: string;
34
38
  readonly addedTs: string;
35
39
  }
36
40
  /** The brain registry — the durable list of everything ingested. */
@@ -47,11 +51,48 @@ export declare function readRegistry(home: string): BrainRegistry;
47
51
  export declare function writeRegistry(home: string, reg: BrainRegistry): void;
48
52
  /** List every registered source. `home` defaults to {@link brainHome}. */
49
53
  export declare function listBrain(home?: string): BrainSource[];
54
+ /**
55
+ * Read reconstructed KUs from ANY `books.sqlite`-format lexical store (a project store, the brain
56
+ * store, or a per-source slice) — the single shared reader behind {@link promoteProjectToBrain},
57
+ * {@link buildPrimer}, {@link exportBrainSlice}, and {@link importBrainSlice}. `source` narrows to
58
+ * one book; default reads all. Synchronous (native `better-sqlite3` via `createRequire`) and
59
+ * best-effort: an absent store or unresolved dependency returns an honest `error`, never throws.
60
+ */
61
+ export declare function readBookKus(opts: {
62
+ storePath: string;
63
+ depsRoot?: string;
64
+ source?: string;
65
+ }): {
66
+ kus: BookKU[];
67
+ error?: string;
68
+ };
69
+ /**
70
+ * Build a source's capability card (ADR-001 §5.4) by reading its KUs from the brain lexical store
71
+ * ({@link readBookKus}) + its registry entry, then rendering {@link buildPrimerMarkdown}. Best-effort:
72
+ * a missing store/source returns an honest `error` with empty `markdown`, never throws.
73
+ */
74
+ export declare function buildPrimer(opts: {
75
+ brainHome?: string;
76
+ depsRoot?: string;
77
+ slug: string;
78
+ }): Promise<{
79
+ markdown: string;
80
+ error?: string;
81
+ }>;
82
+ /** Write a source's primer to `<brainHome>/primers/<slug>.md` (mkdir). Best-effort; honest error. */
83
+ export declare function writePrimer(opts: {
84
+ brainHome?: string;
85
+ depsRoot?: string;
86
+ slug: string;
87
+ }): Promise<{
88
+ path: string;
89
+ error?: string;
90
+ }>;
50
91
  /**
51
92
  * Promote a PROJECT's digitized book KB into the durable cross-project brain (ADR-001 P0
52
- * `book-brain-register`). Reads the project's lexical `books.sqlite`, groups KUs by book, and for
53
- * each book mirrors them into the brain's lexical store ({@link putBookKnowledge}) and re-embeds
54
- * them into the brain's vector store ({@link indexPatternsToAgentdb}), then refreshes the registry.
93
+ * `book-brain-register`). Reads the project's lexical `books.sqlite` ({@link readBookKus}) and mirrors
94
+ * every KU into the brain via the shared {@link mirrorKusToBrain} path (lexical + vector + registry +
95
+ * primer). `kind: 'book'`.
55
96
  *
56
97
  * **Non-clobbering:** promoting the same book twice does not duplicate — the lexical upsert keys on
57
98
  * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
@@ -67,6 +108,62 @@ export declare function promoteProjectToBrain(opts: {
67
108
  kus: number;
68
109
  error?: string;
69
110
  }>;
111
+ /**
112
+ * Export ONE source's KUs from the brain as a STANDALONE lexical-only `books.sqlite` slice at
113
+ * `outPath` (ADR-001 §8.1). Reads via {@link readBookKus} and writes via {@link putBookKnowledge} —
114
+ * lexical only; vectors re-embed on import. This is the portable, per-book shareable unit.
115
+ */
116
+ export declare function exportBrainSlice(opts: {
117
+ brainHome?: string;
118
+ depsRoot?: string;
119
+ slug: string;
120
+ outPath: string;
121
+ }): Promise<{
122
+ kuCount: number;
123
+ error?: string;
124
+ }>;
125
+ /**
126
+ * Import a per-book slice ({@link exportBrainSlice} output, or a pack's `brain/<slug>.sqlite`) into
127
+ * the brain (ADR-001 §8.1). Reads the slice's KUs ({@link readBookKus}) and mirrors them via the same
128
+ * non-clobbering {@link mirrorKusToBrain} path as promote (upsert + re-embed + registry + primer).
129
+ */
130
+ export declare function importBrainSlice(opts: {
131
+ brainHome?: string;
132
+ depsRoot?: string;
133
+ slicePath: string;
134
+ addedTs: string;
135
+ }): Promise<{
136
+ sources: string[];
137
+ kus: number;
138
+ error?: string;
139
+ }>;
140
+ /**
141
+ * Register an array of already-shaped KUs (from a repo deep-walk, §6, or raw JSON) into the brain via
142
+ * the shared {@link mirrorKusToBrain} path — the CLI `--from-kus` backend. `slug` is authoritative:
143
+ * every KU is registered under it (so a repo's `book` field is normalized to the source slug). The
144
+ * registry entry carries `kind` and, for `repo`, `license`.
145
+ */
146
+ /**
147
+ * SPDX ids the license gate treats as clearly-permissive (auto-pass for repo ingest). Anything else
148
+ * — including an absent license — is refused unless `override:true`. Kept deliberately small and
149
+ * conservative (ADR §8: repos carry their own licenses; the brain must not silently ingest
150
+ * unknown/incompatible source into a redistributable slice).
151
+ */
152
+ export declare const PERMISSIVE_LICENSES: readonly string[];
153
+ export declare function registerKusToBrain(opts: {
154
+ brainHome?: string;
155
+ depsRoot?: string;
156
+ kus: readonly BookKU[];
157
+ slug: string;
158
+ kind: 'repo' | 'book' | 'paper';
159
+ addedTs: string;
160
+ lang?: string;
161
+ license?: string;
162
+ override?: boolean;
163
+ }): Promise<{
164
+ kus: number;
165
+ error?: string;
166
+ }>;
70
167
  /**
71
168
  * Cross-source lexical recall over the whole brain — a thin, brain-home-scoped wrapper over
72
169
  * {@link queryBookKnowledge}. `source` narrows to one source; default is cross-source. Never throws.
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"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"}
package/dist/brain.js CHANGED
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * @packageDocumentation
16
16
  */
17
- import { join } from 'node:path';
17
+ import { join, dirname } from 'node:path';
18
18
  import { homedir } from 'node:os';
19
19
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
20
20
  import { pathToFileURL } from 'node:url';
@@ -82,27 +82,57 @@ function resolveSqlite(depsRoot) {
82
82
  return { error: 'better-sqlite3 not installed (run: dz setup --memory agentdb)' };
83
83
  }
84
84
  }
85
- /** Read the project's lexical book KB (all rows, or one `source`). Best-effort; honest errors. */
86
- async function readProjectRows(depsRoot, projectDbPath, source) {
87
- const sqlite = resolveSqlite(depsRoot);
88
- if ('error' in sqlite)
89
- return { error: sqlite.error };
85
+ /** Reconstruct a {@link BookKU} from a raw `book_knowledge` row (shared by every reader below). */
86
+ function rowToKu(r) {
87
+ const pages = jsonPages(r.pages);
88
+ const meta = jsonObj(r.metadata);
89
+ return {
90
+ book: r.book,
91
+ kuId: r.ku_id,
92
+ corpusVersion: r.corpus_version,
93
+ type: r.type,
94
+ name: r.name,
95
+ problem: r.problem,
96
+ content: r.content,
97
+ ...(r.chapter !== null ? { chapter: r.chapter } : {}),
98
+ ...(pages !== undefined ? { pages } : {}),
99
+ ...(Object.keys(meta).length > 0 ? { metadata: meta } : {}),
100
+ };
101
+ }
102
+ /**
103
+ * Read reconstructed KUs from ANY `books.sqlite`-format lexical store (a project store, the brain
104
+ * store, or a per-source slice) — the single shared reader behind {@link promoteProjectToBrain},
105
+ * {@link buildPrimer}, {@link exportBrainSlice}, and {@link importBrainSlice}. `source` narrows to
106
+ * one book; default reads all. Synchronous (native `better-sqlite3` via `createRequire`) and
107
+ * best-effort: an absent store or unresolved dependency returns an honest `error`, never throws.
108
+ */
109
+ export function readBookKus(opts) {
110
+ const depsRoot = opts.depsRoot ?? process.cwd();
111
+ if (!existsSync(opts.storePath))
112
+ return { kus: [], error: `no book store at ${opts.storePath}` };
113
+ let Database;
90
114
  try {
91
- const { default: Database } = (await import(sqlite.url));
92
- const db = new Database(projectDbPath, { readonly: true });
115
+ const req = createRequire(join(depsRoot, 'package.json'));
116
+ Database = req('better-sqlite3');
117
+ }
118
+ catch {
119
+ return { kus: [], error: 'better-sqlite3 not installed (run: dz setup --memory agentdb)' };
120
+ }
121
+ try {
122
+ const db = new Database(opts.storePath, { readonly: true });
93
123
  try {
94
124
  const cols = 'book, ku_id, corpus_version, type, name, problem, content, chapter, pages, metadata';
95
- const rows = (source !== undefined
96
- ? db.prepare(`SELECT ${cols} FROM book_knowledge WHERE book = ?`).all(source)
125
+ const rows = (opts.source !== undefined
126
+ ? db.prepare(`SELECT ${cols} FROM book_knowledge WHERE book = ?`).all(opts.source)
97
127
  : db.prepare(`SELECT ${cols} FROM book_knowledge`).all());
98
- return { rows };
128
+ return { kus: rows.map(rowToKu) };
99
129
  }
100
130
  finally {
101
131
  db.close();
102
132
  }
103
133
  }
104
134
  catch (err) {
105
- return { error: `read project book KB failed: ${err instanceof Error ? err.message : String(err)}` };
135
+ return { kus: [], error: `read book KB failed: ${err instanceof Error ? err.message : String(err)}` };
106
136
  }
107
137
  }
108
138
  /**
@@ -168,102 +198,299 @@ function worthScore(meta) {
168
198
  return 0.5;
169
199
  }
170
200
  }
201
+ // ──────────────────────────────────────── Primers ───────────────────────────────────────────
202
+ /** Clamp + whitespace-collapse a one-line problem for the primer (deterministic). */
203
+ function primerLine(s, max = 120) {
204
+ const flat = s.replace(/\s+/g, ' ').trim();
205
+ return flat.length <= max ? flat : `${flat.slice(0, max - 1).trimEnd()}…`;
206
+ }
171
207
  /**
172
- * Promote a PROJECT's digitized book KB into the durable cross-project brain (ADR-001 P0
173
- * `book-brain-register`). Reads the project's lexical `books.sqlite`, groups KUs by book, and for
174
- * each book mirrors them into the brain's lexical store ({@link putBookKnowledge}) and re-embeds
175
- * them into the brain's vector store ({@link indexPatternsToAgentdb}), then refreshes the registry.
208
+ * Render a source's capability card (ADR-001 §5.4) from its registry entry + KUs — PURE and
209
+ * DETERMINISTIC (no clock, no query): a header (slug/kind/kuCount/corpusVersion/isbn/lang/license),
210
+ * a KU-TYPE histogram (count per type, count-desc then type-asc), and the top ~8 decision/framework
211
+ * KUs (name + one-line problem, page-anchored), ranked by declared `worth` then `kuId`.
212
+ */
213
+ function buildPrimerMarkdown(source, kus) {
214
+ const lines = [`# Primer: ${source.slug}`, ''];
215
+ lines.push(`- kind: ${source.kind}`);
216
+ lines.push(`- KUs: ${source.kuCount}`);
217
+ if (source.corpusVersion !== undefined && source.corpusVersion !== '')
218
+ lines.push(`- corpusVersion: ${source.corpusVersion}`);
219
+ if (source.isbn !== undefined)
220
+ lines.push(`- isbn: ${source.isbn}`);
221
+ if (source.lang !== undefined)
222
+ lines.push(`- lang: ${source.lang}`);
223
+ if (source.license !== undefined)
224
+ lines.push(`- license: ${source.license}`);
225
+ lines.push('');
226
+ // KU-type histogram — count per type, count-desc then type-asc (stable, deterministic).
227
+ const counts = new Map();
228
+ for (const k of kus)
229
+ counts.set(k.type, (counts.get(k.type) ?? 0) + 1);
230
+ const hist = [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
231
+ lines.push('## KU types');
232
+ for (const [type, n] of hist)
233
+ lines.push(`- ${type}: ${n}`);
234
+ lines.push('');
235
+ // Top decision-grade KUs — worth-desc then kuId-asc, first 8; page-anchored provenance. Match the
236
+ // ACTUAL KU type vocabulary (decision-framework / tradeoff-table / methodology / heuristic), not the
237
+ // legacy 'decision'/'framework' shorthands that never occur in real KUs (primer showed _none_).
238
+ const DECISION_TYPES = new Set(['decision-framework', 'tradeoff-table', 'methodology', 'heuristic', 'decision', 'framework']);
239
+ const top = kus
240
+ .filter((k) => DECISION_TYPES.has(k.type))
241
+ .sort((a, b) => worthScore(b.metadata ?? {}) - worthScore(a.metadata ?? {}) || a.kuId.localeCompare(b.kuId))
242
+ .slice(0, 8);
243
+ lines.push('## Top decision moments');
244
+ if (top.length === 0) {
245
+ lines.push('_none_');
246
+ }
247
+ else {
248
+ top.forEach((k, i) => {
249
+ const ch = k.chapter !== undefined && k.chapter !== '' ? ` гл.${k.chapter}` : '';
250
+ const pg = k.pages !== undefined && k.pages.length > 0 ? ` с.${k.pages.join('–')}` : '';
251
+ lines.push(`${i + 1}. ${k.name} — ${primerLine(k.problem)}${ch}${pg}`);
252
+ });
253
+ }
254
+ lines.push('');
255
+ return lines.join('\n');
256
+ }
257
+ /** Synthesize a {@link BrainSource} for a primer when the registry has no entry yet (metadata-derived). */
258
+ function sourceFromKus(slug, kus) {
259
+ const meta0 = kus[0]?.metadata ?? {};
260
+ const corpusVersion = kus[0]?.corpusVersion ?? '';
261
+ return {
262
+ slug,
263
+ kind: 'book',
264
+ kuCount: kus.length,
265
+ addedTs: '',
266
+ ...(corpusVersion !== '' ? { corpusVersion } : {}),
267
+ ...(typeof meta0['lang'] === 'string' ? { lang: meta0['lang'] } : {}),
268
+ ...(typeof meta0['isbn'] === 'string' ? { isbn: meta0['isbn'] } : {}),
269
+ ...(typeof meta0['license'] === 'string' ? { license: meta0['license'] } : {}),
270
+ };
271
+ }
272
+ /**
273
+ * Build a source's capability card (ADR-001 §5.4) by reading its KUs from the brain lexical store
274
+ * ({@link readBookKus}) + its registry entry, then rendering {@link buildPrimerMarkdown}. Best-effort:
275
+ * a missing store/source returns an honest `error` with empty `markdown`, never throws.
276
+ */
277
+ export async function buildPrimer(opts) {
278
+ const home = opts.brainHome ?? brainHome();
279
+ const depsRoot = opts.depsRoot ?? process.cwd();
280
+ const read = readBookKus({ storePath: brainBooksPath(home), depsRoot, source: opts.slug });
281
+ if (read.error !== undefined)
282
+ return { markdown: '', error: read.error };
283
+ if (read.kus.length === 0)
284
+ return { markdown: '', error: `no KUs for source '${opts.slug}' in brain` };
285
+ const source = readRegistry(home).sources[opts.slug] ?? sourceFromKus(opts.slug, read.kus);
286
+ return { markdown: buildPrimerMarkdown(source, read.kus) };
287
+ }
288
+ /** Write a source's primer to `<brainHome>/primers/<slug>.md` (mkdir). Best-effort; honest error. */
289
+ export async function writePrimer(opts) {
290
+ const home = opts.brainHome ?? brainHome();
291
+ const path = join(home, 'primers', `${opts.slug}.md`);
292
+ const built = await buildPrimer(opts);
293
+ if (built.error !== undefined)
294
+ return { path, error: built.error };
295
+ try {
296
+ mkdirSync(dirname(path), { recursive: true });
297
+ writeFileSync(path, built.markdown);
298
+ return { path };
299
+ }
300
+ catch (err) {
301
+ return { path, error: `write primer failed: ${err instanceof Error ? err.message : String(err)}` };
302
+ }
303
+ }
304
+ // ──────────────────────────────────────── Mirror ────────────────────────────────────────────
305
+ /**
306
+ * The ONE shared "mirror KUs into the brain + register + primer" path behind
307
+ * {@link promoteProjectToBrain}, {@link importBrainSlice}, and {@link registerKusToBrain}. Groups
308
+ * the KUs by `book` and, per book: (1) lexical-mirrors via the idempotent {@link putBookKnowledge},
309
+ * (2) re-embeds via {@link indexPatternsToAgentdb} after pre-deleting the book's stale vectors, and
310
+ * (3) writes/refreshes the registry entry — then generates `primers/<slug>.md` best-effort (a primer
311
+ * failure never fails the mirror) and stores its relative path on the entry.
176
312
  *
177
- * **Non-clobbering:** promoting the same book twice does not duplicate — the lexical upsert keys on
313
+ * **Non-clobbering:** mirroring the same book twice does not duplicate — the lexical upsert keys on
178
314
  * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
179
315
  */
180
- export async function promoteProjectToBrain(opts) {
181
- const home = opts.brainHome ?? brainHome();
182
- const depsRoot = opts.depsRoot ?? opts.projectRoot;
183
- const projectDbPath = bookKbPath(opts.projectRoot);
184
- if (!existsSync(projectDbPath))
185
- return { sources: [], kus: 0, error: 'no project book KB' };
186
- const read = await readProjectRows(depsRoot, projectDbPath, opts.source);
187
- if ('error' in read)
188
- return { sources: [], kus: 0, error: read.error };
189
- if (read.rows.length === 0)
316
+ async function mirrorKusToBrain(opts) {
317
+ const { home, depsRoot } = opts;
318
+ if (opts.kus.length === 0)
190
319
  return { sources: [], kus: 0 };
191
- // Group rows by book (each book is one promote unit + one registry entry).
320
+ // Group KUs by book (each book is one mirror unit + one registry entry).
192
321
  const byBook = new Map();
193
- for (const r of read.rows) {
194
- const bucket = byBook.get(r.book);
322
+ for (const k of opts.kus) {
323
+ const bucket = byBook.get(k.book);
195
324
  if (bucket)
196
- bucket.push(r);
325
+ bucket.push(k);
197
326
  else
198
- byBook.set(r.book, [r]);
327
+ byBook.set(k.book, [k]);
199
328
  }
200
329
  const reg = readRegistry(home);
201
330
  const sources = { ...reg.sources };
202
- const promoted = [];
331
+ const mirrored = [];
203
332
  let totalKus = 0;
204
333
  let firstError;
205
- for (const [book, rows] of byBook) {
334
+ for (const [book, kus] of byBook) {
206
335
  // 1. Lexical mirror — reuse the idempotent upsert, pointed at the brain store.
207
- const kus = rows.map((r) => {
208
- const pages = jsonPages(r.pages);
209
- const meta = jsonObj(r.metadata);
210
- return {
211
- book: r.book,
212
- kuId: r.ku_id,
213
- corpusVersion: r.corpus_version,
214
- type: r.type,
215
- name: r.name,
216
- problem: r.problem,
217
- content: r.content,
218
- ...(r.chapter !== null ? { chapter: r.chapter } : {}),
219
- ...(pages !== undefined ? { pages } : {}),
220
- ...(Object.keys(meta).length > 0 ? { metadata: meta } : {}),
221
- };
222
- });
223
336
  const lex = await putBookKnowledge(depsRoot, kus, { dbPath: brainBooksPath(home) });
224
337
  if (lex.error !== undefined && firstError === undefined)
225
338
  firstError = lex.error;
226
339
  // 2. Vector re-embed — pre-delete this book's stale vectors (insert-only primitive), then index.
227
340
  await deleteBrainVectors(depsRoot, brainAgentdbPath(home), book);
228
- const vecRows = rows.map((r) => {
229
- const meta = jsonObj(r.metadata);
230
- return {
231
- taskType: 'book-knowledge',
232
- text: `${r.name}: ${r.problem}`,
233
- score: worthScore(meta),
234
- tags: ['book', r.book, r.type],
235
- metadata: {
236
- chapter: r.chapter,
237
- pages: jsonPages(r.pages) ?? null,
238
- ku_id: r.ku_id,
239
- corpus_version: r.corpus_version,
240
- },
241
- };
242
- });
341
+ const vecRows = kus.map((k) => ({
342
+ taskType: 'book-knowledge',
343
+ text: `${k.name}: ${k.problem}`,
344
+ score: worthScore(k.metadata ?? {}),
345
+ tags: ['book', k.book, k.type],
346
+ metadata: {
347
+ chapter: k.chapter ?? null,
348
+ pages: k.pages ?? null,
349
+ ku_id: k.kuId,
350
+ corpus_version: k.corpusVersion,
351
+ },
352
+ }));
243
353
  const vec = await indexPatternsToAgentdb(depsRoot, vecRows, { dbPath: brainAgentdbPath(home) });
244
354
  if (vec.error !== undefined && firstError === undefined)
245
355
  firstError = vec.error;
246
- // 3. Registry entry for this book — corpus_version/lang/isbn from the first row's metadata.
247
- const meta0 = jsonObj(rows[0].metadata);
248
- const corpusVersion = rows[0].corpus_version;
249
- const lang = typeof meta0['lang'] === 'string' ? meta0['lang'] : undefined;
356
+ // 3. Registry entry — corpus_version/lang/isbn/license from opts (explicit) then first KU's metadata.
357
+ const meta0 = kus[0].metadata ?? {};
358
+ const corpusVersion = kus[0].corpusVersion;
359
+ const lang = opts.lang ?? (typeof meta0['lang'] === 'string' ? meta0['lang'] : undefined);
250
360
  const isbn = typeof meta0['isbn'] === 'string' ? meta0['isbn'] : undefined;
251
- sources[book] = {
361
+ const license = opts.license ?? (typeof meta0['license'] === 'string' ? meta0['license'] : undefined);
362
+ const entry = {
252
363
  slug: book,
253
- kind: 'book',
254
- kuCount: rows.length,
364
+ kind: opts.kind,
365
+ kuCount: kus.length,
255
366
  addedTs: opts.addedTs,
256
367
  ...(corpusVersion !== undefined && corpusVersion !== '' ? { corpusVersion } : {}),
257
368
  ...(lang !== undefined ? { lang } : {}),
258
369
  ...(isbn !== undefined ? { isbn } : {}),
370
+ ...(license !== undefined ? { license } : {}),
259
371
  };
260
- promoted.push(book);
261
- totalKus += rows.length;
372
+ // 4. Primer — best-effort: a primer failure must not fail the mirror. Store the relative path.
373
+ let primerRel;
374
+ try {
375
+ const rel = join('primers', `${book}.md`);
376
+ const primerPath = join(home, rel);
377
+ mkdirSync(dirname(primerPath), { recursive: true });
378
+ writeFileSync(primerPath, buildPrimerMarkdown(entry, kus));
379
+ primerRel = rel;
380
+ }
381
+ catch {
382
+ /* primer is advisory — never fail the mirror on it */
383
+ }
384
+ sources[book] = primerRel !== undefined ? { ...entry, primer: primerRel } : entry;
385
+ mirrored.push(book);
386
+ totalKus += kus.length;
262
387
  }
263
388
  writeRegistry(home, { version: 1, sources });
264
389
  return firstError !== undefined
265
- ? { sources: promoted, kus: totalKus, error: firstError }
266
- : { sources: promoted, kus: totalKus };
390
+ ? { sources: mirrored, kus: totalKus, error: firstError }
391
+ : { sources: mirrored, kus: totalKus };
392
+ }
393
+ // ──────────────────────────────────────── Promote ───────────────────────────────────────────
394
+ /**
395
+ * Promote a PROJECT's digitized book KB into the durable cross-project brain (ADR-001 P0
396
+ * `book-brain-register`). Reads the project's lexical `books.sqlite` ({@link readBookKus}) and mirrors
397
+ * every KU into the brain via the shared {@link mirrorKusToBrain} path (lexical + vector + registry +
398
+ * primer). `kind: 'book'`.
399
+ *
400
+ * **Non-clobbering:** promoting the same book twice does not duplicate — the lexical upsert keys on
401
+ * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
402
+ */
403
+ export async function promoteProjectToBrain(opts) {
404
+ const home = opts.brainHome ?? brainHome();
405
+ const depsRoot = opts.depsRoot ?? opts.projectRoot;
406
+ const projectDbPath = bookKbPath(opts.projectRoot);
407
+ if (!existsSync(projectDbPath))
408
+ return { sources: [], kus: 0, error: 'no project book KB' };
409
+ const read = readBookKus({ storePath: projectDbPath, depsRoot, ...(opts.source !== undefined ? { source: opts.source } : {}) });
410
+ if (read.error !== undefined)
411
+ return { sources: [], kus: 0, error: read.error };
412
+ if (read.kus.length === 0)
413
+ return { sources: [], kus: 0 };
414
+ return mirrorKusToBrain({ home, depsRoot, kus: read.kus, kind: 'book', addedTs: opts.addedTs });
415
+ }
416
+ // ────────────────────────────────────── Slices / ingest ─────────────────────────────────────
417
+ /**
418
+ * Export ONE source's KUs from the brain as a STANDALONE lexical-only `books.sqlite` slice at
419
+ * `outPath` (ADR-001 §8.1). Reads via {@link readBookKus} and writes via {@link putBookKnowledge} —
420
+ * lexical only; vectors re-embed on import. This is the portable, per-book shareable unit.
421
+ */
422
+ export async function exportBrainSlice(opts) {
423
+ const home = opts.brainHome ?? brainHome();
424
+ const depsRoot = opts.depsRoot ?? process.cwd();
425
+ const read = readBookKus({ storePath: brainBooksPath(home), depsRoot, source: opts.slug });
426
+ if (read.error !== undefined)
427
+ return { kuCount: 0, error: read.error };
428
+ if (read.kus.length === 0)
429
+ return { kuCount: 0, error: `no KUs for source '${opts.slug}' in brain` };
430
+ const put = await putBookKnowledge(depsRoot, read.kus, { dbPath: opts.outPath });
431
+ if (put.error !== undefined)
432
+ return { kuCount: 0, error: put.error };
433
+ return { kuCount: read.kus.length };
434
+ }
435
+ /**
436
+ * Import a per-book slice ({@link exportBrainSlice} output, or a pack's `brain/<slug>.sqlite`) into
437
+ * the brain (ADR-001 §8.1). Reads the slice's KUs ({@link readBookKus}) and mirrors them via the same
438
+ * non-clobbering {@link mirrorKusToBrain} path as promote (upsert + re-embed + registry + primer).
439
+ */
440
+ export async function importBrainSlice(opts) {
441
+ const home = opts.brainHome ?? brainHome();
442
+ const depsRoot = opts.depsRoot ?? process.cwd();
443
+ const read = readBookKus({ storePath: opts.slicePath, depsRoot });
444
+ if (read.error !== undefined)
445
+ return { sources: [], kus: 0, error: read.error };
446
+ if (read.kus.length === 0)
447
+ return { sources: [], kus: 0 };
448
+ return mirrorKusToBrain({ home, depsRoot, kus: read.kus, kind: 'book', addedTs: opts.addedTs });
449
+ }
450
+ /**
451
+ * Register an array of already-shaped KUs (from a repo deep-walk, §6, or raw JSON) into the brain via
452
+ * the shared {@link mirrorKusToBrain} path — the CLI `--from-kus` backend. `slug` is authoritative:
453
+ * every KU is registered under it (so a repo's `book` field is normalized to the source slug). The
454
+ * registry entry carries `kind` and, for `repo`, `license`.
455
+ */
456
+ /**
457
+ * SPDX ids the license gate treats as clearly-permissive (auto-pass for repo ingest). Anything else
458
+ * — including an absent license — is refused unless `override:true`. Kept deliberately small and
459
+ * conservative (ADR §8: repos carry their own licenses; the brain must not silently ingest
460
+ * unknown/incompatible source into a redistributable slice).
461
+ */
462
+ export const PERMISSIVE_LICENSES = [
463
+ 'MIT', 'Apache-2.0', 'BSD-2-Clause', 'BSD-3-Clause', 'ISC', 'Unlicense', 'CC0-1.0', '0BSD', 'MIT-0',
464
+ ];
465
+ export async function registerKusToBrain(opts) {
466
+ const home = opts.brainHome ?? brainHome();
467
+ const depsRoot = opts.depsRoot ?? process.cwd();
468
+ if (opts.kus.length === 0)
469
+ return { kus: 0 };
470
+ // License gate (ADR §8) — repo/paper sources must declare a permissive license, else refuse unless
471
+ // explicitly overridden. Books promoted from a digitized pack are exempt (own CP5 flow). No writes
472
+ // happen before this check, so a refusal never leaves a partial brain.
473
+ if (opts.kind !== 'book' && opts.override !== true) {
474
+ const lic = opts.license;
475
+ if (lic === undefined || lic === '') {
476
+ return { kus: 0, error: `refusing to ingest '${opts.slug}' (${opts.kind}) with no --license; pass a permissive SPDX id (${PERMISSIVE_LICENSES.join(', ')}) or --override` };
477
+ }
478
+ if (!PERMISSIVE_LICENSES.includes(lic)) {
479
+ return { kus: 0, error: `refusing to ingest '${opts.slug}': license '${lic}' is not in the permissive allow-list (${PERMISSIVE_LICENSES.join(', ')}); pass --override to ingest anyway` };
480
+ }
481
+ }
482
+ // Normalize every KU under the source slug so the batch shares one `book` (putBookKnowledge's key).
483
+ const kus = opts.kus.map((k) => (k.book === opts.slug ? k : { ...k, book: opts.slug }));
484
+ const mirror = await mirrorKusToBrain({
485
+ home,
486
+ depsRoot,
487
+ kus,
488
+ kind: opts.kind,
489
+ addedTs: opts.addedTs,
490
+ ...(opts.lang !== undefined ? { lang: opts.lang } : {}),
491
+ ...(opts.license !== undefined ? { license: opts.license } : {}),
492
+ });
493
+ return mirror.error !== undefined ? { kus: mirror.kus, error: mirror.error } : { kus: mirror.kus };
267
494
  }
268
495
  // ───────────────────────────────────────── Query ────────────────────────────────────────────
269
496
  /**
package/dist/brain.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"brain.js","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAA+B,MAAM,cAAc,CAAC;AAC7G,OAAO,EAAE,sBAAsB,EAAmB,MAAM,oBAAoB,CAAC;AAE7E,+FAA+F;AAE/F,sFAAsF;AACtF,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AACpC,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAClC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAClC,CAAC;AAyBD,SAAS,eAAe;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;QACjE,IACE,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAC7C,OAAQ,MAAgC,CAAC,OAAO,KAAK,QAAQ;YAC5D,MAAgC,CAAC,OAAO,KAAK,IAAI,EAClD,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAG,MAAwB,CAAC,OAAO,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAkB;IAC5D,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAUD,8FAA8F;AAC9F,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,+DAA+D,EAAE,CAAC;IACpF,CAAC;AACH,CAAC;AAeD,mGAAmG;AACnG,SAAS,OAAO,CAAC,CAAU;IACzB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,KAAK;QACb,aAAa,EAAE,CAAC,CAAC,cAAc;QAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAI3B;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACjG,IAAI,QAAiD,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1D,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAA4C,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,+DAA+D,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,qFAAqF,CAAC;YACnG,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;gBACrC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,qCAAqC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClF,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAc,CAAC;YACzE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACxG,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,WAAmB,EAAE,IAAY;IACnF,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,sBAAsB;IAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAA6C,CAAC;QACrG,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACjC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC/B,EAAE,CAAC,OAAO,CACR,mFAAmF,CACpF,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC;AAED,+FAA+F;AAE/F,SAAS,OAAO,CAAC,CAAgB;IAC/B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAY,CAAC;QACnC,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAgB;IACjC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAY,CAAC;QACnC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oGAAoG;AACpG,SAAS,UAAU,CAAC,IAA6B;IAC/C,QAAQ,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,+FAA+F;AAE/F,qFAAqF;AACrF,SAAS,UAAU,CAAC,CAAS,EAAE,GAAG,GAAG,GAAG;IACtC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,MAAmB,EAAE,GAAsB;IACtE,MAAM,KAAK,GAAa,CAAC,aAAa,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9H,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,wFAAwF;IACxF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kGAAkG;IAClG,qGAAqG;IACrG,gGAAgG;IAChG,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9H,MAAM,GAAG,GAAG,GAAG;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC3G,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2GAA2G;AAC3G,SAAS,aAAa,CAAC,IAAY,EAAE,GAAsB;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,EAAE,CAAC;IAClD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,GAAG,CAAC,MAAM;QACnB,OAAO,EAAE,EAAE;QACX,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAIjC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACzE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;IACvG,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAIjC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACnE,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACrG,CAAC;AACH,CAAC;AAED,+FAA+F;AAE/F;;;;;;;;;;GAUG;AACH,KAAK,UAAU,gBAAgB,CAAC,IAQ/B;IACC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAE1D,yEAAyE;IACzE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAgC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAA8B,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QACjC,+EAA+E;QAC/E,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAAE,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC;QAEhF,iGAAiG;QACjG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,OAAO,GAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE;YAC/B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YAC9B,QAAQ,EAAE;gBACR,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,KAAK,EAAE,CAAC,CAAC,IAAI;gBACb,cAAc,EAAE,CAAC,CAAC,aAAa;aAChC;SACF,CAAC,CAAC,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAAE,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC;QAEhF,sGAAsG;QACtG,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,MAAM,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtG,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,MAAM,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,SAAS,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClH,MAAM,KAAK,GAAgB;YACzB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;QAEF,+FAA+F;QAC/F,IAAI,SAA6B,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,SAAS,GAAG,GAAG,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAClF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,UAAU,KAAK,SAAS;QAC7B,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;QACzD,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,+FAA+F;AAE/F;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAM3C;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC;IACnD,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAE5F,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAChF,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAE1D,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,+FAA+F;AAE/F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACvE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,sBAAsB,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;IACrG,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAChF,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC1D,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAClG,CAAC;AAED;;;;;GAKG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO;CACpG,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAUxC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC7C,mGAAmG;IACnG,mGAAmG;IACnG,uEAAuE;IACvE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACpC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,mDAAmD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9K,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,IAAI,CAAC,IAAI,eAAe,GAAG,0CAA0C,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,CAAC;QAC5L,CAAC;IACH,CAAC;IACD,oGAAoG;IACpG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;QACpC,IAAI;QACJ,QAAQ;QACR,GAAG;QACH,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AACrG,CAAC;AAED,+FAA+F;AAE/F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAOhC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,KAAK,GAA6E,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IACzH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,+FAA+F;AAE/F;;;GAGG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS;IAChC,KAAK;IACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACzF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACzF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC9F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;IAC5F,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC/F,KAAK;IACL,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC3F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;IAC5F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACzF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;CAChG,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,4FAA4F;IAC5F,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAC/F,SAAS,OAAO,CAAC,CAAS,EAAE,GAAG,GAAG,GAAG;IACnC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;AAC5E,CAAC;AAED,oEAAoE;AACpE,MAAM,mBAAmB,GACvB,sFAAsF;IACtF,mGAAmG,CAAC;AAEtG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAMlC;IACC,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAW,CAAC;IACnE,IAAI,CAAC;QACH,wFAAwF;QACxF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QAEpC,gGAAgG;QAChG,8FAA8F;QAC9F,gGAAgG;QAChG,gEAAgE;QAChE,MAAM,KAAK,GAA2G;YACpH,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,KAAK;SACb,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QAEpC,oFAAoF;QACpF,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEzC,2FAA2F;QAC3F,gGAAgG;QAChG,uFAAuF;QACvF,yFAAyF;QACzF,0FAA0F;QAC1F,kGAAkG;QAClG,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1E,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,MAAM,CAAC;QACjC,CAAC;QAED,mFAAmF;QACnF,MAAM,KAAK,GAAa,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,yFAAyF;QACzF,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -26,7 +26,7 @@ export { runSetup, generateHooksConfig, generateAgentdbWriter, writerVersionOf,
26
26
  export { indexPatternsToAgentdb, resolveAgentdbPath } from './agentdb-index.js';
27
27
  export { putBookKnowledge, queryBookKnowledge, bookKbPath } from './book-kb.js';
28
28
  export type { BookKU, BookKUHit } from './book-kb.js';
29
- export { brainHome, brainBooksPath, brainAgentdbPath, brainRegistryPath, readRegistry, writeRegistry, listBrain, promoteProjectToBrain, queryBrain, groundPrompt, } from './brain.js';
29
+ export { brainHome, brainBooksPath, brainAgentdbPath, brainRegistryPath, readRegistry, writeRegistry, listBrain, promoteProjectToBrain, queryBrain, groundPrompt, buildPrimer, writePrimer, readBookKus, exportBrainSlice, importBrainSlice, registerKusToBrain, } from './brain.js';
30
30
  export type { BrainRegistry, BrainSource } from './brain.js';
31
31
  export type { AgentdbRow, AgentdbIndexResult } from './agentdb-index.js';
32
32
  export { generatePlugin } from './plugin.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,EAAE,MACiD,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7E,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClH,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChP,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtM,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ export { loadPatterns, loadSessions, computePatternBoost, readLearningConfig, BO
22
22
  export { runSetup, generateHooksConfig, generateAgentdbWriter, writerVersionOf, AGENTDB_WRITER_VERSION } from './setup.js';
23
23
  export { indexPatternsToAgentdb, resolveAgentdbPath } from './agentdb-index.js';
24
24
  export { putBookKnowledge, queryBookKnowledge, bookKbPath } from './book-kb.js';
25
- export { brainHome, brainBooksPath, brainAgentdbPath, brainRegistryPath, readRegistry, writeRegistry, listBrain, promoteProjectToBrain, queryBrain, groundPrompt, } from './brain.js';
25
+ export { brainHome, brainBooksPath, brainAgentdbPath, brainRegistryPath, readRegistry, writeRegistry, listBrain, promoteProjectToBrain, queryBrain, groundPrompt, buildPrimer, writePrimer, readBookKus, exportBrainSlice, importBrainSlice, registerKusToBrain, } from './brain.js';
26
26
  export { generatePlugin } from './plugin.js';
27
27
  export { discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, orderByDependencies, syncReadmeVersion } from './publish.js';
28
28
  export { fetchAllDownloads } from './downloads.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAC9B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhP,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAC9B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhP,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.3.50",
3
+ "version": "0.3.52",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -31,8 +31,8 @@
31
31
  "@dzhechkov/adapter-opencode": "^0.2.0",
32
32
  "yaml": "^2.0.0",
33
33
  "@dzhechkov/adapter-copilot": "0.1.1",
34
- "@dzhechkov/memory": "0.2.7",
35
- "@dzhechkov/core": "0.2.4"
34
+ "@dzhechkov/core": "0.2.4",
35
+ "@dzhechkov/memory": "0.2.7"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^25.6.0",
package/src/brain.ts CHANGED
@@ -15,7 +15,7 @@
15
15
  * @packageDocumentation
16
16
  */
17
17
 
18
- import { join } from 'node:path';
18
+ import { join, dirname } from 'node:path';
19
19
  import { homedir } from 'node:os';
20
20
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
21
21
  import { pathToFileURL } from 'node:url';
@@ -56,6 +56,10 @@ export interface BrainSource {
56
56
  readonly corpusVersion?: string;
57
57
  readonly lang?: string;
58
58
  readonly isbn?: string;
59
+ /** SPDX-ish license id — carried for repo sources (§8: refuse promoting unknown-license repos). */
60
+ readonly license?: string;
61
+ /** Relative path (from the brain home) to this source's capability card, e.g. `primers/<slug>.md`. */
62
+ readonly primer?: string;
59
63
  readonly addedTs: string;
60
64
  }
61
65
 
@@ -133,28 +137,58 @@ interface ProjRow {
133
137
  metadata: string | null;
134
138
  }
135
139
 
136
- /** Read the project's lexical book KB (all rows, or one `source`). Best-effort; honest errors. */
137
- async function readProjectRows(
138
- depsRoot: string,
139
- projectDbPath: string,
140
- source: string | undefined,
141
- ): Promise<{ rows: ProjRow[] } | { error: string }> {
142
- const sqlite = resolveSqlite(depsRoot);
143
- if ('error' in sqlite) return { error: sqlite.error };
140
+ /** Reconstruct a {@link BookKU} from a raw `book_knowledge` row (shared by every reader below). */
141
+ function rowToKu(r: ProjRow): BookKU {
142
+ const pages = jsonPages(r.pages);
143
+ const meta = jsonObj(r.metadata);
144
+ return {
145
+ book: r.book,
146
+ kuId: r.ku_id,
147
+ corpusVersion: r.corpus_version,
148
+ type: r.type,
149
+ name: r.name,
150
+ problem: r.problem,
151
+ content: r.content,
152
+ ...(r.chapter !== null ? { chapter: r.chapter } : {}),
153
+ ...(pages !== undefined ? { pages } : {}),
154
+ ...(Object.keys(meta).length > 0 ? { metadata: meta } : {}),
155
+ };
156
+ }
157
+
158
+ /**
159
+ * Read reconstructed KUs from ANY `books.sqlite`-format lexical store (a project store, the brain
160
+ * store, or a per-source slice) — the single shared reader behind {@link promoteProjectToBrain},
161
+ * {@link buildPrimer}, {@link exportBrainSlice}, and {@link importBrainSlice}. `source` narrows to
162
+ * one book; default reads all. Synchronous (native `better-sqlite3` via `createRequire`) and
163
+ * best-effort: an absent store or unresolved dependency returns an honest `error`, never throws.
164
+ */
165
+ export function readBookKus(opts: {
166
+ storePath: string;
167
+ depsRoot?: string;
168
+ source?: string;
169
+ }): { kus: BookKU[]; error?: string } {
170
+ const depsRoot = opts.depsRoot ?? process.cwd();
171
+ if (!existsSync(opts.storePath)) return { kus: [], error: `no book store at ${opts.storePath}` };
172
+ let Database: new (p: string, o?: object) => NativeDb;
144
173
  try {
145
- const { default: Database } = (await import(sqlite.url)) as { default: new (p: string, o?: object) => NativeDb };
146
- const db = new Database(projectDbPath, { readonly: true });
174
+ const req = createRequire(join(depsRoot, 'package.json'));
175
+ Database = req('better-sqlite3') as new (p: string, o?: object) => NativeDb;
176
+ } catch {
177
+ return { kus: [], error: 'better-sqlite3 not installed (run: dz setup --memory agentdb)' };
178
+ }
179
+ try {
180
+ const db = new Database(opts.storePath, { readonly: true });
147
181
  try {
148
182
  const cols = 'book, ku_id, corpus_version, type, name, problem, content, chapter, pages, metadata';
149
- const rows = (source !== undefined
150
- ? db.prepare(`SELECT ${cols} FROM book_knowledge WHERE book = ?`).all(source)
183
+ const rows = (opts.source !== undefined
184
+ ? db.prepare(`SELECT ${cols} FROM book_knowledge WHERE book = ?`).all(opts.source)
151
185
  : db.prepare(`SELECT ${cols} FROM book_knowledge`).all()) as ProjRow[];
152
- return { rows };
186
+ return { kus: rows.map(rowToKu) };
153
187
  } finally {
154
188
  db.close();
155
189
  }
156
190
  } catch (err) {
157
- return { error: `read project book KB failed: ${err instanceof Error ? err.message : String(err)}` };
191
+ return { kus: [], error: `read book KB failed: ${err instanceof Error ? err.message : String(err)}` };
158
192
  }
159
193
  }
160
194
 
@@ -220,108 +254,341 @@ function worthScore(meta: Record<string, unknown>): number {
220
254
  }
221
255
  }
222
256
 
257
+ // ──────────────────────────────────────── Primers ───────────────────────────────────────────
258
+
259
+ /** Clamp + whitespace-collapse a one-line problem for the primer (deterministic). */
260
+ function primerLine(s: string, max = 120): string {
261
+ const flat = s.replace(/\s+/g, ' ').trim();
262
+ return flat.length <= max ? flat : `${flat.slice(0, max - 1).trimEnd()}…`;
263
+ }
264
+
223
265
  /**
224
- * Promote a PROJECT's digitized book KB into the durable cross-project brain (ADR-001 P0
225
- * `book-brain-register`). Reads the project's lexical `books.sqlite`, groups KUs by book, and for
226
- * each book mirrors them into the brain's lexical store ({@link putBookKnowledge}) and re-embeds
227
- * them into the brain's vector store ({@link indexPatternsToAgentdb}), then refreshes the registry.
228
- *
229
- * **Non-clobbering:** promoting the same book twice does not duplicate — the lexical upsert keys on
230
- * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
266
+ * Render a source's capability card (ADR-001 §5.4) from its registry entry + KUs — PURE and
267
+ * DETERMINISTIC (no clock, no query): a header (slug/kind/kuCount/corpusVersion/isbn/lang/license),
268
+ * a KU-TYPE histogram (count per type, count-desc then type-asc), and the top ~8 decision/framework
269
+ * KUs (name + one-line problem, page-anchored), ranked by declared `worth` then `kuId`.
231
270
  */
232
- export async function promoteProjectToBrain(opts: {
233
- projectRoot: string;
271
+ function buildPrimerMarkdown(source: BrainSource, kus: readonly BookKU[]): string {
272
+ const lines: string[] = [`# Primer: ${source.slug}`, ''];
273
+ lines.push(`- kind: ${source.kind}`);
274
+ lines.push(`- KUs: ${source.kuCount}`);
275
+ if (source.corpusVersion !== undefined && source.corpusVersion !== '') lines.push(`- corpusVersion: ${source.corpusVersion}`);
276
+ if (source.isbn !== undefined) lines.push(`- isbn: ${source.isbn}`);
277
+ if (source.lang !== undefined) lines.push(`- lang: ${source.lang}`);
278
+ if (source.license !== undefined) lines.push(`- license: ${source.license}`);
279
+ lines.push('');
280
+
281
+ // KU-type histogram — count per type, count-desc then type-asc (stable, deterministic).
282
+ const counts = new Map<string, number>();
283
+ for (const k of kus) counts.set(k.type, (counts.get(k.type) ?? 0) + 1);
284
+ const hist = [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
285
+ lines.push('## KU types');
286
+ for (const [type, n] of hist) lines.push(`- ${type}: ${n}`);
287
+ lines.push('');
288
+
289
+ // Top decision-grade KUs — worth-desc then kuId-asc, first 8; page-anchored provenance. Match the
290
+ // ACTUAL KU type vocabulary (decision-framework / tradeoff-table / methodology / heuristic), not the
291
+ // legacy 'decision'/'framework' shorthands that never occur in real KUs (primer showed _none_).
292
+ const DECISION_TYPES = new Set(['decision-framework', 'tradeoff-table', 'methodology', 'heuristic', 'decision', 'framework']);
293
+ const top = kus
294
+ .filter((k) => DECISION_TYPES.has(k.type))
295
+ .sort((a, b) => worthScore(b.metadata ?? {}) - worthScore(a.metadata ?? {}) || a.kuId.localeCompare(b.kuId))
296
+ .slice(0, 8);
297
+ lines.push('## Top decision moments');
298
+ if (top.length === 0) {
299
+ lines.push('_none_');
300
+ } else {
301
+ top.forEach((k, i) => {
302
+ const ch = k.chapter !== undefined && k.chapter !== '' ? ` гл.${k.chapter}` : '';
303
+ const pg = k.pages !== undefined && k.pages.length > 0 ? ` с.${k.pages.join('–')}` : '';
304
+ lines.push(`${i + 1}. ${k.name} — ${primerLine(k.problem)}${ch}${pg}`);
305
+ });
306
+ }
307
+ lines.push('');
308
+ return lines.join('\n');
309
+ }
310
+
311
+ /** Synthesize a {@link BrainSource} for a primer when the registry has no entry yet (metadata-derived). */
312
+ function sourceFromKus(slug: string, kus: readonly BookKU[]): BrainSource {
313
+ const meta0 = kus[0]?.metadata ?? {};
314
+ const corpusVersion = kus[0]?.corpusVersion ?? '';
315
+ return {
316
+ slug,
317
+ kind: 'book',
318
+ kuCount: kus.length,
319
+ addedTs: '',
320
+ ...(corpusVersion !== '' ? { corpusVersion } : {}),
321
+ ...(typeof meta0['lang'] === 'string' ? { lang: meta0['lang'] as string } : {}),
322
+ ...(typeof meta0['isbn'] === 'string' ? { isbn: meta0['isbn'] as string } : {}),
323
+ ...(typeof meta0['license'] === 'string' ? { license: meta0['license'] as string } : {}),
324
+ };
325
+ }
326
+
327
+ /**
328
+ * Build a source's capability card (ADR-001 §5.4) by reading its KUs from the brain lexical store
329
+ * ({@link readBookKus}) + its registry entry, then rendering {@link buildPrimerMarkdown}. Best-effort:
330
+ * a missing store/source returns an honest `error` with empty `markdown`, never throws.
331
+ */
332
+ export async function buildPrimer(opts: {
333
+ brainHome?: string;
234
334
  depsRoot?: string;
335
+ slug: string;
336
+ }): Promise<{ markdown: string; error?: string }> {
337
+ const home = opts.brainHome ?? brainHome();
338
+ const depsRoot = opts.depsRoot ?? process.cwd();
339
+ const read = readBookKus({ storePath: brainBooksPath(home), depsRoot, source: opts.slug });
340
+ if (read.error !== undefined) return { markdown: '', error: read.error };
341
+ if (read.kus.length === 0) return { markdown: '', error: `no KUs for source '${opts.slug}' in brain` };
342
+ const source = readRegistry(home).sources[opts.slug] ?? sourceFromKus(opts.slug, read.kus);
343
+ return { markdown: buildPrimerMarkdown(source, read.kus) };
344
+ }
345
+
346
+ /** Write a source's primer to `<brainHome>/primers/<slug>.md` (mkdir). Best-effort; honest error. */
347
+ export async function writePrimer(opts: {
235
348
  brainHome?: string;
236
- source?: string;
237
- addedTs: string;
238
- }): Promise<{ sources: string[]; kus: number; error?: string }> {
349
+ depsRoot?: string;
350
+ slug: string;
351
+ }): Promise<{ path: string; error?: string }> {
239
352
  const home = opts.brainHome ?? brainHome();
240
- const depsRoot = opts.depsRoot ?? opts.projectRoot;
241
- const projectDbPath = bookKbPath(opts.projectRoot);
242
- if (!existsSync(projectDbPath)) return { sources: [], kus: 0, error: 'no project book KB' };
353
+ const path = join(home, 'primers', `${opts.slug}.md`);
354
+ const built = await buildPrimer(opts);
355
+ if (built.error !== undefined) return { path, error: built.error };
356
+ try {
357
+ mkdirSync(dirname(path), { recursive: true });
358
+ writeFileSync(path, built.markdown);
359
+ return { path };
360
+ } catch (err) {
361
+ return { path, error: `write primer failed: ${err instanceof Error ? err.message : String(err)}` };
362
+ }
363
+ }
243
364
 
244
- const read = await readProjectRows(depsRoot, projectDbPath, opts.source);
245
- if ('error' in read) return { sources: [], kus: 0, error: read.error };
246
- if (read.rows.length === 0) return { sources: [], kus: 0 };
365
+ // ──────────────────────────────────────── Mirror ────────────────────────────────────────────
247
366
 
248
- // Group rows by book (each book is one promote unit + one registry entry).
249
- const byBook = new Map<string, ProjRow[]>();
250
- for (const r of read.rows) {
251
- const bucket = byBook.get(r.book);
252
- if (bucket) bucket.push(r);
253
- else byBook.set(r.book, [r]);
367
+ /**
368
+ * The ONE shared "mirror KUs into the brain + register + primer" path behind
369
+ * {@link promoteProjectToBrain}, {@link importBrainSlice}, and {@link registerKusToBrain}. Groups
370
+ * the KUs by `book` and, per book: (1) lexical-mirrors via the idempotent {@link putBookKnowledge},
371
+ * (2) re-embeds via {@link indexPatternsToAgentdb} after pre-deleting the book's stale vectors, and
372
+ * (3) writes/refreshes the registry entry — then generates `primers/<slug>.md` best-effort (a primer
373
+ * failure never fails the mirror) and stores its relative path on the entry.
374
+ *
375
+ * **Non-clobbering:** mirroring the same book twice does not duplicate — the lexical upsert keys on
376
+ * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
377
+ */
378
+ async function mirrorKusToBrain(opts: {
379
+ home: string;
380
+ depsRoot: string;
381
+ kus: readonly BookKU[];
382
+ kind: 'book' | 'repo' | 'paper';
383
+ addedTs: string;
384
+ lang?: string;
385
+ license?: string;
386
+ }): Promise<{ sources: string[]; kus: number; error?: string }> {
387
+ const { home, depsRoot } = opts;
388
+ if (opts.kus.length === 0) return { sources: [], kus: 0 };
389
+
390
+ // Group KUs by book (each book is one mirror unit + one registry entry).
391
+ const byBook = new Map<string, BookKU[]>();
392
+ for (const k of opts.kus) {
393
+ const bucket = byBook.get(k.book);
394
+ if (bucket) bucket.push(k);
395
+ else byBook.set(k.book, [k]);
254
396
  }
255
397
 
256
398
  const reg = readRegistry(home);
257
399
  const sources: Record<string, BrainSource> = { ...reg.sources };
258
- const promoted: string[] = [];
400
+ const mirrored: string[] = [];
259
401
  let totalKus = 0;
260
402
  let firstError: string | undefined;
261
403
 
262
- for (const [book, rows] of byBook) {
404
+ for (const [book, kus] of byBook) {
263
405
  // 1. Lexical mirror — reuse the idempotent upsert, pointed at the brain store.
264
- const kus: BookKU[] = rows.map((r) => {
265
- const pages = jsonPages(r.pages);
266
- const meta = jsonObj(r.metadata);
267
- return {
268
- book: r.book,
269
- kuId: r.ku_id,
270
- corpusVersion: r.corpus_version,
271
- type: r.type,
272
- name: r.name,
273
- problem: r.problem,
274
- content: r.content,
275
- ...(r.chapter !== null ? { chapter: r.chapter } : {}),
276
- ...(pages !== undefined ? { pages } : {}),
277
- ...(Object.keys(meta).length > 0 ? { metadata: meta } : {}),
278
- };
279
- });
280
406
  const lex = await putBookKnowledge(depsRoot, kus, { dbPath: brainBooksPath(home) });
281
407
  if (lex.error !== undefined && firstError === undefined) firstError = lex.error;
282
408
 
283
409
  // 2. Vector re-embed — pre-delete this book's stale vectors (insert-only primitive), then index.
284
410
  await deleteBrainVectors(depsRoot, brainAgentdbPath(home), book);
285
- const vecRows: AgentdbRow[] = rows.map((r) => {
286
- const meta = jsonObj(r.metadata);
287
- return {
288
- taskType: 'book-knowledge',
289
- text: `${r.name}: ${r.problem}`,
290
- score: worthScore(meta),
291
- tags: ['book', r.book, r.type],
292
- metadata: {
293
- chapter: r.chapter,
294
- pages: jsonPages(r.pages) ?? null,
295
- ku_id: r.ku_id,
296
- corpus_version: r.corpus_version,
297
- },
298
- };
299
- });
411
+ const vecRows: AgentdbRow[] = kus.map((k) => ({
412
+ taskType: 'book-knowledge',
413
+ text: `${k.name}: ${k.problem}`,
414
+ score: worthScore(k.metadata ?? {}),
415
+ tags: ['book', k.book, k.type],
416
+ metadata: {
417
+ chapter: k.chapter ?? null,
418
+ pages: k.pages ?? null,
419
+ ku_id: k.kuId,
420
+ corpus_version: k.corpusVersion,
421
+ },
422
+ }));
300
423
  const vec = await indexPatternsToAgentdb(depsRoot, vecRows, { dbPath: brainAgentdbPath(home) });
301
424
  if (vec.error !== undefined && firstError === undefined) firstError = vec.error;
302
425
 
303
- // 3. Registry entry for this book — corpus_version/lang/isbn from the first row's metadata.
304
- const meta0 = jsonObj(rows[0]!.metadata);
305
- const corpusVersion = rows[0]!.corpus_version;
306
- const lang = typeof meta0['lang'] === 'string' ? (meta0['lang'] as string) : undefined;
426
+ // 3. Registry entry — corpus_version/lang/isbn/license from opts (explicit) then first KU's metadata.
427
+ const meta0 = kus[0]!.metadata ?? {};
428
+ const corpusVersion = kus[0]!.corpusVersion;
429
+ const lang = opts.lang ?? (typeof meta0['lang'] === 'string' ? (meta0['lang'] as string) : undefined);
307
430
  const isbn = typeof meta0['isbn'] === 'string' ? (meta0['isbn'] as string) : undefined;
308
- sources[book] = {
431
+ const license = opts.license ?? (typeof meta0['license'] === 'string' ? (meta0['license'] as string) : undefined);
432
+ const entry: BrainSource = {
309
433
  slug: book,
310
- kind: 'book',
311
- kuCount: rows.length,
434
+ kind: opts.kind,
435
+ kuCount: kus.length,
312
436
  addedTs: opts.addedTs,
313
437
  ...(corpusVersion !== undefined && corpusVersion !== '' ? { corpusVersion } : {}),
314
438
  ...(lang !== undefined ? { lang } : {}),
315
439
  ...(isbn !== undefined ? { isbn } : {}),
440
+ ...(license !== undefined ? { license } : {}),
316
441
  };
317
- promoted.push(book);
318
- totalKus += rows.length;
442
+
443
+ // 4. Primer — best-effort: a primer failure must not fail the mirror. Store the relative path.
444
+ let primerRel: string | undefined;
445
+ try {
446
+ const rel = join('primers', `${book}.md`);
447
+ const primerPath = join(home, rel);
448
+ mkdirSync(dirname(primerPath), { recursive: true });
449
+ writeFileSync(primerPath, buildPrimerMarkdown(entry, kus));
450
+ primerRel = rel;
451
+ } catch {
452
+ /* primer is advisory — never fail the mirror on it */
453
+ }
454
+
455
+ sources[book] = primerRel !== undefined ? { ...entry, primer: primerRel } : entry;
456
+ mirrored.push(book);
457
+ totalKus += kus.length;
319
458
  }
320
459
 
321
460
  writeRegistry(home, { version: 1, sources });
322
461
  return firstError !== undefined
323
- ? { sources: promoted, kus: totalKus, error: firstError }
324
- : { sources: promoted, kus: totalKus };
462
+ ? { sources: mirrored, kus: totalKus, error: firstError }
463
+ : { sources: mirrored, kus: totalKus };
464
+ }
465
+
466
+ // ──────────────────────────────────────── Promote ───────────────────────────────────────────
467
+
468
+ /**
469
+ * Promote a PROJECT's digitized book KB into the durable cross-project brain (ADR-001 P0
470
+ * `book-brain-register`). Reads the project's lexical `books.sqlite` ({@link readBookKus}) and mirrors
471
+ * every KU into the brain via the shared {@link mirrorKusToBrain} path (lexical + vector + registry +
472
+ * primer). `kind: 'book'`.
473
+ *
474
+ * **Non-clobbering:** promoting the same book twice does not duplicate — the lexical upsert keys on
475
+ * `(book, ku_id, corpus_version)` and the vector rows are pre-deleted before re-index.
476
+ */
477
+ export async function promoteProjectToBrain(opts: {
478
+ projectRoot: string;
479
+ depsRoot?: string;
480
+ brainHome?: string;
481
+ source?: string;
482
+ addedTs: string;
483
+ }): Promise<{ sources: string[]; kus: number; error?: string }> {
484
+ const home = opts.brainHome ?? brainHome();
485
+ const depsRoot = opts.depsRoot ?? opts.projectRoot;
486
+ const projectDbPath = bookKbPath(opts.projectRoot);
487
+ if (!existsSync(projectDbPath)) return { sources: [], kus: 0, error: 'no project book KB' };
488
+
489
+ const read = readBookKus({ storePath: projectDbPath, depsRoot, ...(opts.source !== undefined ? { source: opts.source } : {}) });
490
+ if (read.error !== undefined) return { sources: [], kus: 0, error: read.error };
491
+ if (read.kus.length === 0) return { sources: [], kus: 0 };
492
+
493
+ return mirrorKusToBrain({ home, depsRoot, kus: read.kus, kind: 'book', addedTs: opts.addedTs });
494
+ }
495
+
496
+ // ────────────────────────────────────── Slices / ingest ─────────────────────────────────────
497
+
498
+ /**
499
+ * Export ONE source's KUs from the brain as a STANDALONE lexical-only `books.sqlite` slice at
500
+ * `outPath` (ADR-001 §8.1). Reads via {@link readBookKus} and writes via {@link putBookKnowledge} —
501
+ * lexical only; vectors re-embed on import. This is the portable, per-book shareable unit.
502
+ */
503
+ export async function exportBrainSlice(opts: {
504
+ brainHome?: string;
505
+ depsRoot?: string;
506
+ slug: string;
507
+ outPath: string;
508
+ }): Promise<{ kuCount: number; error?: string }> {
509
+ const home = opts.brainHome ?? brainHome();
510
+ const depsRoot = opts.depsRoot ?? process.cwd();
511
+ const read = readBookKus({ storePath: brainBooksPath(home), depsRoot, source: opts.slug });
512
+ if (read.error !== undefined) return { kuCount: 0, error: read.error };
513
+ if (read.kus.length === 0) return { kuCount: 0, error: `no KUs for source '${opts.slug}' in brain` };
514
+ const put = await putBookKnowledge(depsRoot, read.kus, { dbPath: opts.outPath });
515
+ if (put.error !== undefined) return { kuCount: 0, error: put.error };
516
+ return { kuCount: read.kus.length };
517
+ }
518
+
519
+ /**
520
+ * Import a per-book slice ({@link exportBrainSlice} output, or a pack's `brain/<slug>.sqlite`) into
521
+ * the brain (ADR-001 §8.1). Reads the slice's KUs ({@link readBookKus}) and mirrors them via the same
522
+ * non-clobbering {@link mirrorKusToBrain} path as promote (upsert + re-embed + registry + primer).
523
+ */
524
+ export async function importBrainSlice(opts: {
525
+ brainHome?: string;
526
+ depsRoot?: string;
527
+ slicePath: string;
528
+ addedTs: string;
529
+ }): Promise<{ sources: string[]; kus: number; error?: string }> {
530
+ const home = opts.brainHome ?? brainHome();
531
+ const depsRoot = opts.depsRoot ?? process.cwd();
532
+ const read = readBookKus({ storePath: opts.slicePath, depsRoot });
533
+ if (read.error !== undefined) return { sources: [], kus: 0, error: read.error };
534
+ if (read.kus.length === 0) return { sources: [], kus: 0 };
535
+ return mirrorKusToBrain({ home, depsRoot, kus: read.kus, kind: 'book', addedTs: opts.addedTs });
536
+ }
537
+
538
+ /**
539
+ * Register an array of already-shaped KUs (from a repo deep-walk, §6, or raw JSON) into the brain via
540
+ * the shared {@link mirrorKusToBrain} path — the CLI `--from-kus` backend. `slug` is authoritative:
541
+ * every KU is registered under it (so a repo's `book` field is normalized to the source slug). The
542
+ * registry entry carries `kind` and, for `repo`, `license`.
543
+ */
544
+ /**
545
+ * SPDX ids the license gate treats as clearly-permissive (auto-pass for repo ingest). Anything else
546
+ * — including an absent license — is refused unless `override:true`. Kept deliberately small and
547
+ * conservative (ADR §8: repos carry their own licenses; the brain must not silently ingest
548
+ * unknown/incompatible source into a redistributable slice).
549
+ */
550
+ export const PERMISSIVE_LICENSES: readonly string[] = [
551
+ 'MIT', 'Apache-2.0', 'BSD-2-Clause', 'BSD-3-Clause', 'ISC', 'Unlicense', 'CC0-1.0', '0BSD', 'MIT-0',
552
+ ];
553
+
554
+ export async function registerKusToBrain(opts: {
555
+ brainHome?: string;
556
+ depsRoot?: string;
557
+ kus: readonly BookKU[];
558
+ slug: string;
559
+ kind: 'repo' | 'book' | 'paper';
560
+ addedTs: string;
561
+ lang?: string;
562
+ license?: string;
563
+ override?: boolean;
564
+ }): Promise<{ kus: number; error?: string }> {
565
+ const home = opts.brainHome ?? brainHome();
566
+ const depsRoot = opts.depsRoot ?? process.cwd();
567
+ if (opts.kus.length === 0) return { kus: 0 };
568
+ // License gate (ADR §8) — repo/paper sources must declare a permissive license, else refuse unless
569
+ // explicitly overridden. Books promoted from a digitized pack are exempt (own CP5 flow). No writes
570
+ // happen before this check, so a refusal never leaves a partial brain.
571
+ if (opts.kind !== 'book' && opts.override !== true) {
572
+ const lic = opts.license;
573
+ if (lic === undefined || lic === '') {
574
+ return { kus: 0, error: `refusing to ingest '${opts.slug}' (${opts.kind}) with no --license; pass a permissive SPDX id (${PERMISSIVE_LICENSES.join(', ')}) or --override` };
575
+ }
576
+ if (!PERMISSIVE_LICENSES.includes(lic)) {
577
+ return { kus: 0, error: `refusing to ingest '${opts.slug}': license '${lic}' is not in the permissive allow-list (${PERMISSIVE_LICENSES.join(', ')}); pass --override to ingest anyway` };
578
+ }
579
+ }
580
+ // Normalize every KU under the source slug so the batch shares one `book` (putBookKnowledge's key).
581
+ const kus = opts.kus.map((k) => (k.book === opts.slug ? k : { ...k, book: opts.slug }));
582
+ const mirror = await mirrorKusToBrain({
583
+ home,
584
+ depsRoot,
585
+ kus,
586
+ kind: opts.kind,
587
+ addedTs: opts.addedTs,
588
+ ...(opts.lang !== undefined ? { lang: opts.lang } : {}),
589
+ ...(opts.license !== undefined ? { license: opts.license } : {}),
590
+ });
591
+ return mirror.error !== undefined ? { kus: mirror.kus, error: mirror.error } : { kus: mirror.kus };
325
592
  }
326
593
 
327
594
  // ───────────────────────────────────────── Query ────────────────────────────────────────────
package/src/index.ts CHANGED
@@ -42,6 +42,12 @@ export {
42
42
  promoteProjectToBrain,
43
43
  queryBrain,
44
44
  groundPrompt,
45
+ buildPrimer,
46
+ writePrimer,
47
+ readBookKus,
48
+ exportBrainSlice,
49
+ importBrainSlice,
50
+ registerKusToBrain,
45
51
  } from './brain.js';
46
52
  export type { BrainRegistry, BrainSource } from './brain.js';
47
53
  export type { AgentdbRow, AgentdbIndexResult } from './agentdb-index.js';