@mono-agent/memory 0.4.1

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.
Files changed (150) hide show
  1. package/README.md +61 -0
  2. package/dist/bujo/capture.d.ts +20 -0
  3. package/dist/bujo/capture.d.ts.map +1 -0
  4. package/dist/bujo/capture.js +77 -0
  5. package/dist/bujo/capture.js.map +1 -0
  6. package/dist/bujo/cli-env.d.ts +11 -0
  7. package/dist/bujo/cli-env.d.ts.map +1 -0
  8. package/dist/bujo/cli-env.js +30 -0
  9. package/dist/bujo/cli-env.js.map +1 -0
  10. package/dist/bujo/cli.d.ts +3 -0
  11. package/dist/bujo/cli.d.ts.map +1 -0
  12. package/dist/bujo/cli.js +98 -0
  13. package/dist/bujo/cli.js.map +1 -0
  14. package/dist/bujo/consolidate.d.ts +15 -0
  15. package/dist/bujo/consolidate.d.ts.map +1 -0
  16. package/dist/bujo/consolidate.js +61 -0
  17. package/dist/bujo/consolidate.js.map +1 -0
  18. package/dist/bujo/daily.d.ts +17 -0
  19. package/dist/bujo/daily.d.ts.map +1 -0
  20. package/dist/bujo/daily.js +47 -0
  21. package/dist/bujo/daily.js.map +1 -0
  22. package/dist/bujo/distill.d.ts +10 -0
  23. package/dist/bujo/distill.d.ts.map +1 -0
  24. package/dist/bujo/distill.js +50 -0
  25. package/dist/bujo/distill.js.map +1 -0
  26. package/dist/bujo/entities.d.ts +24 -0
  27. package/dist/bujo/entities.d.ts.map +1 -0
  28. package/dist/bujo/entities.js +80 -0
  29. package/dist/bujo/entities.js.map +1 -0
  30. package/dist/bujo/grammar.d.ts +18 -0
  31. package/dist/bujo/grammar.d.ts.map +1 -0
  32. package/dist/bujo/grammar.js +147 -0
  33. package/dist/bujo/grammar.js.map +1 -0
  34. package/dist/bujo/graph.d.ts +17 -0
  35. package/dist/bujo/graph.d.ts.map +1 -0
  36. package/dist/bujo/graph.js +96 -0
  37. package/dist/bujo/graph.js.map +1 -0
  38. package/dist/bujo/ids.d.ts +9 -0
  39. package/dist/bujo/ids.d.ts.map +1 -0
  40. package/dist/bujo/ids.js +23 -0
  41. package/dist/bujo/ids.js.map +1 -0
  42. package/dist/bujo/index.d.ts +26 -0
  43. package/dist/bujo/index.d.ts.map +1 -0
  44. package/dist/bujo/index.js +20 -0
  45. package/dist/bujo/index.js.map +1 -0
  46. package/dist/bujo/json.d.ts +3 -0
  47. package/dist/bujo/json.d.ts.map +1 -0
  48. package/dist/bujo/json.js +58 -0
  49. package/dist/bujo/json.js.map +1 -0
  50. package/dist/bujo/llm.d.ts +14 -0
  51. package/dist/bujo/llm.d.ts.map +1 -0
  52. package/dist/bujo/llm.js +2 -0
  53. package/dist/bujo/llm.js.map +1 -0
  54. package/dist/bujo/migrate.d.ts +12 -0
  55. package/dist/bujo/migrate.d.ts.map +1 -0
  56. package/dist/bujo/migrate.js +136 -0
  57. package/dist/bujo/migrate.js.map +1 -0
  58. package/dist/bujo/model-error.d.ts +16 -0
  59. package/dist/bujo/model-error.d.ts.map +1 -0
  60. package/dist/bujo/model-error.js +20 -0
  61. package/dist/bujo/model-error.js.map +1 -0
  62. package/dist/bujo/ollama-llm.d.ts +7 -0
  63. package/dist/bujo/ollama-llm.d.ts.map +1 -0
  64. package/dist/bujo/ollama-llm.js +43 -0
  65. package/dist/bujo/ollama-llm.js.map +1 -0
  66. package/dist/bujo/projections.d.ts +8 -0
  67. package/dist/bujo/projections.d.ts.map +1 -0
  68. package/dist/bujo/projections.js +53 -0
  69. package/dist/bujo/projections.js.map +1 -0
  70. package/dist/bujo/rebuild.d.ts +12 -0
  71. package/dist/bujo/rebuild.d.ts.map +1 -0
  72. package/dist/bujo/rebuild.js +73 -0
  73. package/dist/bujo/rebuild.js.map +1 -0
  74. package/dist/bujo/recall.d.ts +7 -0
  75. package/dist/bujo/recall.d.ts.map +1 -0
  76. package/dist/bujo/recall.js +33 -0
  77. package/dist/bujo/recall.js.map +1 -0
  78. package/dist/bujo/reconcile.d.ts +37 -0
  79. package/dist/bujo/reconcile.d.ts.map +1 -0
  80. package/dist/bujo/reconcile.js +190 -0
  81. package/dist/bujo/reconcile.js.map +1 -0
  82. package/dist/bujo/reflect.d.ts +30 -0
  83. package/dist/bujo/reflect.d.ts.map +1 -0
  84. package/dist/bujo/reflect.js +100 -0
  85. package/dist/bujo/reflect.js.map +1 -0
  86. package/dist/bujo/store.d.ts +77 -0
  87. package/dist/bujo/store.d.ts.map +1 -0
  88. package/dist/bujo/store.js +222 -0
  89. package/dist/bujo/store.js.map +1 -0
  90. package/dist/bujo/types.d.ts +39 -0
  91. package/dist/bujo/types.d.ts.map +1 -0
  92. package/dist/bujo/types.js +2 -0
  93. package/dist/bujo/types.js.map +1 -0
  94. package/dist/search/chunks.d.ts +14 -0
  95. package/dist/search/chunks.d.ts.map +1 -0
  96. package/dist/search/chunks.js +75 -0
  97. package/dist/search/chunks.js.map +1 -0
  98. package/dist/search/circuit-breaker.d.ts +34 -0
  99. package/dist/search/circuit-breaker.d.ts.map +1 -0
  100. package/dist/search/circuit-breaker.js +89 -0
  101. package/dist/search/circuit-breaker.js.map +1 -0
  102. package/dist/search/embeddings.d.ts +44 -0
  103. package/dist/search/embeddings.d.ts.map +1 -0
  104. package/dist/search/embeddings.js +141 -0
  105. package/dist/search/embeddings.js.map +1 -0
  106. package/dist/search/index.d.ts +8 -0
  107. package/dist/search/index.d.ts.map +1 -0
  108. package/dist/search/index.js +5 -0
  109. package/dist/search/index.js.map +1 -0
  110. package/dist/search/types.d.ts +41 -0
  111. package/dist/search/types.d.ts.map +1 -0
  112. package/dist/search/types.js +2 -0
  113. package/dist/search/types.js.map +1 -0
  114. package/dist/search/vector-index.d.ts +28 -0
  115. package/dist/search/vector-index.d.ts.map +1 -0
  116. package/dist/search/vector-index.js +214 -0
  117. package/dist/search/vector-index.js.map +1 -0
  118. package/dist/store/contract.d.ts +2 -0
  119. package/dist/store/contract.d.ts.map +1 -0
  120. package/dist/store/contract.js +2 -0
  121. package/dist/store/contract.js.map +1 -0
  122. package/dist/store/db.d.ts +84 -0
  123. package/dist/store/db.d.ts.map +1 -0
  124. package/dist/store/db.js +471 -0
  125. package/dist/store/db.js.map +1 -0
  126. package/dist/store/fts.d.ts +3 -0
  127. package/dist/store/fts.d.ts.map +1 -0
  128. package/dist/store/fts.js +6 -0
  129. package/dist/store/fts.js.map +1 -0
  130. package/dist/store/index.d.ts +5 -0
  131. package/dist/store/index.d.ts.map +1 -0
  132. package/dist/store/index.js +3 -0
  133. package/dist/store/index.js.map +1 -0
  134. package/dist/store/ranking.d.ts +16 -0
  135. package/dist/store/ranking.d.ts.map +1 -0
  136. package/dist/store/ranking.js +32 -0
  137. package/dist/store/ranking.js.map +1 -0
  138. package/dist/store/schema.d.ts +3 -0
  139. package/dist/store/schema.d.ts.map +1 -0
  140. package/dist/store/schema.js +61 -0
  141. package/dist/store/schema.js.map +1 -0
  142. package/dist/store/types.d.ts +102 -0
  143. package/dist/store/types.d.ts.map +1 -0
  144. package/dist/store/types.js +25 -0
  145. package/dist/store/types.js.map +1 -0
  146. package/dist/store/vec.d.ts +12 -0
  147. package/dist/store/vec.d.ts.map +1 -0
  148. package/dist/store/vec.js +20 -0
  149. package/dist/store/vec.js.map +1 -0
  150. package/package.json +45 -0
@@ -0,0 +1,80 @@
1
+ import { parseJsonLoose } from "./json.js";
2
+ import { MemoryModelError } from "./model-error.js";
3
+ const EMPTY = { entities: [], relations: [] };
4
+ const PROMPT = (text) => `Extract named entities and their relations from the text below as JSON.
5
+ Return ONLY the following JSON structure with no additional text:
6
+ {"entities":[{"id":"type:name-kebab","name":"display name","type":"person|project|org|concept|..."}],"relations":[{"src":"entity-id","dst":"entity-id","relation":"verb phrase"}]}
7
+
8
+ Rules:
9
+ - Entity id must be a slug like "person:morgan-reberski" or "project:mono-agent"
10
+ - Include only entities clearly mentioned in the text
11
+ - Relations must reference entity ids present in the entities array
12
+ - Use lowercase kebab-case for ids
13
+
14
+ TEXT:
15
+ ${text}`;
16
+ function normalizeEntity(raw) {
17
+ if (typeof raw !== "object" || raw === null)
18
+ return undefined;
19
+ const rec = raw;
20
+ const id = typeof rec.id === "string" ? rec.id.trim() : "";
21
+ const name = typeof rec.name === "string" ? rec.name.trim() : "";
22
+ if (id.length === 0 || name.length === 0)
23
+ return undefined;
24
+ const result = { id, name };
25
+ if (typeof rec.type === "string" && rec.type.trim().length > 0) {
26
+ result.type = rec.type.trim();
27
+ }
28
+ return result;
29
+ }
30
+ function normalizeRelation(raw, entityIds) {
31
+ if (typeof raw !== "object" || raw === null)
32
+ return undefined;
33
+ const rec = raw;
34
+ const src = typeof rec.src === "string" ? rec.src.trim() : "";
35
+ const dst = typeof rec.dst === "string" ? rec.dst.trim() : "";
36
+ const relation = typeof rec.relation === "string" ? rec.relation.trim() : "";
37
+ if (src.length === 0 || dst.length === 0 || relation.length === 0)
38
+ return undefined;
39
+ if (!entityIds.has(src) || !entityIds.has(dst))
40
+ return undefined;
41
+ return { src, dst, relation };
42
+ }
43
+ /**
44
+ * Use the LLM to extract named entities and their relations from `text`.
45
+ * Empty/whitespace text → `{entities:[], relations:[]}`.
46
+ * Malformed LLM *output* is handled defensively (→ EMPTY), but a model *failure* (Ollama down,
47
+ * timeout, 5xx) is rethrown as a {@link MemoryModelError} so it surfaces rather than looking like
48
+ * "no entities found".
49
+ */
50
+ export async function extractEntities(text, llm) {
51
+ if (text.trim().length === 0)
52
+ return EMPTY;
53
+ let raw;
54
+ try {
55
+ raw = await llm.complete(PROMPT(text), { label: "capture:entities" });
56
+ }
57
+ catch (cause) {
58
+ throw new MemoryModelError("llm", "entities", cause);
59
+ }
60
+ const parsed = parseJsonLoose(raw);
61
+ if (parsed === undefined || typeof parsed !== "object" || parsed === null)
62
+ return EMPTY;
63
+ const rawEntities = Array.isArray(parsed.entities) ? parsed.entities : [];
64
+ const entities = [];
65
+ for (const item of rawEntities) {
66
+ const normalized = normalizeEntity(item);
67
+ if (normalized !== undefined)
68
+ entities.push(normalized);
69
+ }
70
+ const entityIds = new Set(entities.map((e) => e.id));
71
+ const rawRelations = Array.isArray(parsed.relations) ? parsed.relations : [];
72
+ const relations = [];
73
+ for (const item of rawRelations) {
74
+ const normalized = normalizeRelation(item, entityIds);
75
+ if (normalized !== undefined)
76
+ relations.push(normalized);
77
+ }
78
+ return { entities, relations };
79
+ }
80
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/bujo/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MemoryStatus, MemoryType } from "../store/index.js";
2
+ import type { Bullet } from "./types.js";
3
+ export declare const MARKER_FOR: (type: MemoryType, status: MemoryStatus) => string;
4
+ export declare function parseBullet(line: string): Bullet | undefined;
5
+ export declare function serializeBullet(bullet: Bullet): string;
6
+ export interface DailyLine {
7
+ readonly raw: string;
8
+ readonly lineNumber: number;
9
+ readonly bullet?: Bullet;
10
+ }
11
+ export interface DailyFile {
12
+ readonly lines: readonly DailyLine[];
13
+ }
14
+ export declare function parseDailyFile(content: string): DailyFile & {
15
+ bullets: Bullet[];
16
+ };
17
+ export declare function serializeDailyFile(file: DailyFile): string;
18
+ //# sourceMappingURL=grammar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../../src/bujo/grammar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAoBzC,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,EAAE,QAAQ,YAAY,KAAG,MAWnE,CAAC;AAaF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+B5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBtD;AA2BD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA0BjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,147 @@
1
+ const MARKERS = {
2
+ "[ ]": { type: "task", status: "open" },
3
+ "[x]": { type: "task", status: "done" },
4
+ "[>]": { type: "task", status: "migrated" },
5
+ "[<]": { type: "task", status: "scheduled" },
6
+ "[~]": { type: "task", status: "dropped" },
7
+ "◦": { type: "event", status: "open" },
8
+ "–": { type: "note", status: "open" },
9
+ };
10
+ const STATUS_MARKER = {
11
+ done: "[x]",
12
+ migrated: "[>]",
13
+ scheduled: "[<]",
14
+ dropped: "[~]",
15
+ invalidated: "[~]", // rendered struck like dropped; the comment metadata stays authoritative for the real status
16
+ };
17
+ export const MARKER_FOR = (type, status) => {
18
+ // For task-style statuses (done/migrated/scheduled/dropped), the visible marker encodes status.
19
+ const statusMarker = STATUS_MARKER[status];
20
+ if (statusMarker !== undefined)
21
+ return statusMarker;
22
+ // For open status, use the type-specific marker.
23
+ for (const [marker, m] of Object.entries(MARKERS)) {
24
+ if (m.type === type && m.status === status)
25
+ return marker;
26
+ }
27
+ // notes/events that have no direct marker fall back to the base marker
28
+ if (type === "event")
29
+ return "◦";
30
+ return "–";
31
+ };
32
+ // Allowed enum members (must mirror the SQLite CHECK constraints in ../store/index.js).
33
+ // A malformed daily line (`type=bogus`, `status=invalid`) must NOT produce an out-of-enum Bullet,
34
+ // or rebuild/upsert would fail the CHECK constraint.
35
+ const VALID_TYPES = new Set(["task", "event", "note"]);
36
+ const VALID_STATUSES = new Set(["open", "done", "scheduled", "migrated", "dropped", "invalidated"]);
37
+ const BULLET_MARKER = String.raw `(\[[ x><~]\]|◦|–)`;
38
+ const LEGACY_LINE_RE = new RegExp(`^- ${BULLET_MARKER} (.*?) <!--mem (.*)-->$`, "u");
39
+ const VISIBLE_LINE_RE = new RegExp(`^- ${BULLET_MARKER} (.*?)$`, "u");
40
+ const META_LINE_RE = /^\s+<!--mem (.*)-->$/u;
41
+ export function parseBullet(line) {
42
+ const match = parseBulletParts(line);
43
+ if (match === undefined)
44
+ return undefined;
45
+ const [, marker, text, meta] = match;
46
+ const fields = parseMeta(meta ?? "");
47
+ const base = MARKERS[marker ?? ""];
48
+ if (base === undefined)
49
+ return undefined;
50
+ // Validate enum membership before trusting metadata; an empty OR invalid value (e.g. `status=` or
51
+ // `status=bogus`) falls back to the marker-derived base value rather than corrupting the Bullet.
52
+ const status = (VALID_STATUSES.has(fields.status ?? "") ? fields.status : undefined) ?? base.status;
53
+ const type = (VALID_TYPES.has(fields.type ?? "") ? fields.type : undefined) ?? base.type;
54
+ // A bullet needs a stable id, a created timestamp, and non-empty text. Missing/blank values (e.g.
55
+ // `id=` or `created=`) would yield id="" — a primary-key collision on rebuild and impossible to
56
+ // rewrite-by-id. Treat such malformed lines as non-bullets rather than corrupting the index.
57
+ const id = (fields.id ?? "").trim();
58
+ const createdAt = (fields.created ?? "").trim();
59
+ const bulletText = (text ?? "").trim();
60
+ if (id === "" || createdAt === "" || bulletText === "")
61
+ return undefined;
62
+ const salienceNum = Number(fields.salience);
63
+ const bullet = {
64
+ id,
65
+ type,
66
+ status,
67
+ text: bulletText,
68
+ salience: fields.salience !== undefined && Number.isFinite(salienceNum) ? salienceNum : 0.5,
69
+ isInsight: fields.isInsight === "1",
70
+ createdAt,
71
+ refs: fields.refs === undefined || fields.refs.length === 0 ? [] : fields.refs.split(","),
72
+ ...(fields.due !== undefined ? { dueAt: fields.due } : {}),
73
+ };
74
+ return bullet;
75
+ }
76
+ export function serializeBullet(bullet) {
77
+ if (bullet.text.includes("\n") || bullet.text.includes("<!--mem")) {
78
+ throw new Error("memory-bujo: bullet text must not contain a newline or the '<!--mem' delimiter.");
79
+ }
80
+ const marker = MARKER_FOR(bullet.type, bullet.status);
81
+ const meta = [
82
+ `id=${bullet.id}`,
83
+ `type=${bullet.type}`,
84
+ `status=${bullet.status}`,
85
+ `salience=${bullet.salience}`,
86
+ `isInsight=${bullet.isInsight ? "1" : "0"}`,
87
+ `created=${bullet.createdAt}`,
88
+ `refs=${bullet.refs.join(",")}`,
89
+ ...(bullet.dueAt === undefined ? [] : [`due=${bullet.dueAt}`]),
90
+ ].join(" ");
91
+ return `- ${marker} ${bullet.text}\n <!--mem ${meta}-->`;
92
+ }
93
+ function parseBulletParts(line) {
94
+ const legacy = LEGACY_LINE_RE.exec(line);
95
+ if (legacy !== null)
96
+ return legacy;
97
+ const split = line.split("\n");
98
+ if (split.length !== 2)
99
+ return undefined;
100
+ const visible = VISIBLE_LINE_RE.exec(split[0] ?? "");
101
+ const meta = META_LINE_RE.exec(split[1] ?? "");
102
+ if (visible === null || meta === null)
103
+ return undefined;
104
+ const out = [line, visible[1] ?? "", visible[2] ?? "", meta[1] ?? ""];
105
+ out.index = 0;
106
+ out.input = line;
107
+ return out;
108
+ }
109
+ function parseMeta(meta) {
110
+ const out = {};
111
+ for (const pair of meta.trim().split(/\s+/u)) {
112
+ const eq = pair.indexOf("=");
113
+ if (eq === -1)
114
+ continue;
115
+ out[pair.slice(0, eq)] = pair.slice(eq + 1);
116
+ }
117
+ return out;
118
+ }
119
+ export function parseDailyFile(content) {
120
+ const rawLines = content.split("\n");
121
+ const lines = [];
122
+ for (let i = 0; i < rawLines.length; i += 1) {
123
+ const raw = rawLines[i] ?? "";
124
+ const lineNumber = i + 1;
125
+ const bullet = parseBullet(raw);
126
+ if (bullet !== undefined) {
127
+ lines.push({ raw, lineNumber, bullet });
128
+ continue;
129
+ }
130
+ const next = rawLines[i + 1];
131
+ if (next !== undefined) {
132
+ const splitRaw = `${raw}\n${next}`;
133
+ const splitBullet = parseBullet(splitRaw);
134
+ if (splitBullet !== undefined) {
135
+ lines.push({ raw: splitRaw, lineNumber, bullet: splitBullet });
136
+ i += 1;
137
+ continue;
138
+ }
139
+ }
140
+ lines.push({ raw, lineNumber });
141
+ }
142
+ return { lines, bullets: lines.flatMap((l) => (l.bullet ? [l.bullet] : [])) };
143
+ }
144
+ export function serializeDailyFile(file) {
145
+ return file.lines.map((l) => (l.bullet ? serializeBullet(l.bullet) : l.raw)).join("\n");
146
+ }
147
+ //# sourceMappingURL=grammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../../src/bujo/grammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { EntityRecord, EntityRelationRecord } from "../store/index.js";
2
+ /**
3
+ * Read the canonical graph.jsonl at `<root>/graph.jsonl`.
4
+ * Missing file → `{entities:[], relations:[]}`.
5
+ * Malformed lines are skipped defensively (never throws).
6
+ * Dedupes on read: entities by `id` keeping the LAST occurrence;
7
+ * relations by `src|dst|relation` keeping the last.
8
+ */
9
+ export declare function readGraph(root: string): {
10
+ entities: EntityRecord[];
11
+ relations: EntityRelationRecord[];
12
+ };
13
+ /** Append a single entity record to `<root>/graph.jsonl` (mkdir root if needed). */
14
+ export declare function appendEntity(root: string, record: EntityRecord): void;
15
+ /** Append a single relation record to `<root>/graph.jsonl` (mkdir root if needed). */
16
+ export declare function appendRelation(root: string, record: EntityRelationRecord): void;
17
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/bujo/graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAY5E;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,oBAAoB,EAAE,CAAA;CAAE,CA4CvG;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CASrE;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAa/E"}
@@ -0,0 +1,96 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const GRAPH_FILE = "graph.jsonl";
4
+ function graphPath(root) {
5
+ return join(root, GRAPH_FILE);
6
+ }
7
+ /**
8
+ * Read the canonical graph.jsonl at `<root>/graph.jsonl`.
9
+ * Missing file → `{entities:[], relations:[]}`.
10
+ * Malformed lines are skipped defensively (never throws).
11
+ * Dedupes on read: entities by `id` keeping the LAST occurrence;
12
+ * relations by `src|dst|relation` keeping the last.
13
+ */
14
+ export function readGraph(root) {
15
+ const path = graphPath(root);
16
+ if (!existsSync(path))
17
+ return { entities: [], relations: [] };
18
+ const raw = readFileSync(path, "utf8");
19
+ const entityMap = new Map();
20
+ const relationMap = new Map();
21
+ for (const line of raw.split("\n")) {
22
+ const trimmed = line.trim();
23
+ if (trimmed.length === 0)
24
+ continue;
25
+ let parsed;
26
+ try {
27
+ parsed = JSON.parse(trimmed);
28
+ }
29
+ catch {
30
+ // skip malformed lines
31
+ continue;
32
+ }
33
+ if (typeof parsed !== "object" || parsed === null)
34
+ continue;
35
+ const rec = parsed;
36
+ if (rec["kind"] === "entity") {
37
+ const { kind: _kind, ...rest } = rec;
38
+ const entity = rest;
39
+ if (typeof entity.id === "string" && entity.id.length > 0) {
40
+ entityMap.set(entity.id, entity);
41
+ }
42
+ }
43
+ else if (rec["kind"] === "relation") {
44
+ const { kind: _kind, ...rest } = rec;
45
+ const relation = rest;
46
+ if (typeof relation.src === "string" &&
47
+ typeof relation.dst === "string" &&
48
+ typeof relation.relation === "string") {
49
+ const key = `${relation.src}|${relation.dst}|${relation.relation}`;
50
+ relationMap.set(key, relation);
51
+ }
52
+ }
53
+ }
54
+ return {
55
+ entities: Array.from(entityMap.values()),
56
+ relations: Array.from(relationMap.values()),
57
+ };
58
+ }
59
+ /** Append a single entity record to `<root>/graph.jsonl` (mkdir root if needed). */
60
+ export function appendEntity(root, record) {
61
+ const current = readGraph(root).entities.find((entity) => entity.id === record.id);
62
+ const recordToAppend = current === undefined ? record : mergeEntityRecord(current, record);
63
+ if (current !== undefined && entityRecordsEqual(current, recordToAppend)) {
64
+ return;
65
+ }
66
+ mkdirSync(root, { recursive: true });
67
+ const line = { kind: "entity", ...recordToAppend };
68
+ appendFileSync(graphPath(root), `${JSON.stringify(line)}\n`, "utf8");
69
+ }
70
+ /** Append a single relation record to `<root>/graph.jsonl` (mkdir root if needed). */
71
+ export function appendRelation(root, record) {
72
+ const exists = readGraph(root).relations.some((relation) => relation.src === record.src &&
73
+ relation.dst === record.dst &&
74
+ relation.relation === record.relation);
75
+ if (exists) {
76
+ return;
77
+ }
78
+ mkdirSync(root, { recursive: true });
79
+ const line = { kind: "relation", ...record };
80
+ appendFileSync(graphPath(root), `${JSON.stringify(line)}\n`, "utf8");
81
+ }
82
+ function entityRecordsEqual(a, b) {
83
+ return (a.id === b.id &&
84
+ a.name === b.name &&
85
+ a.type === b.type &&
86
+ a.summary === b.summary);
87
+ }
88
+ function mergeEntityRecord(current, next) {
89
+ return {
90
+ ...next,
91
+ ...(next.type === undefined && current.type !== undefined ? { type: current.type } : {}),
92
+ ...(next.summary === undefined && current.summary !== undefined ? { summary: current.summary } : {}),
93
+ ...(next.updatedAt === undefined && current.updatedAt !== undefined ? { updatedAt: current.updatedAt } : {}),
94
+ };
95
+ }
96
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/bujo/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Minimal ULID-style id: a millisecond timestamp encoded as 10 Crockford base32 chars
3
+ * (50-bit capacity, monotonically sortable) + a 16-char random suffix. Injectable for tests.
4
+ */
5
+ export declare function createIdFactory(options?: {
6
+ clock?: () => Date;
7
+ random?: () => number;
8
+ }): () => string;
9
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/bujo/ids.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GAAG,MAAM,MAAM,CAgBzG"}
@@ -0,0 +1,23 @@
1
+ const ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; // Crockford base32
2
+ /**
3
+ * Minimal ULID-style id: a millisecond timestamp encoded as 10 Crockford base32 chars
4
+ * (50-bit capacity, monotonically sortable) + a 16-char random suffix. Injectable for tests.
5
+ */
6
+ export function createIdFactory(options = {}) {
7
+ const clock = options.clock ?? (() => new Date());
8
+ const random = options.random ?? Math.random;
9
+ return () => {
10
+ let time = clock().getTime();
11
+ const timeChars = [];
12
+ for (let i = 0; i < 10; i += 1) {
13
+ timeChars.unshift(ENCODING[time % 32] ?? "0");
14
+ time = Math.floor(time / 32);
15
+ }
16
+ let suffix = "";
17
+ for (let i = 0; i < 16; i += 1) {
18
+ suffix += ENCODING[Math.floor(random() * 32)] ?? "0";
19
+ }
20
+ return timeChars.join("") + suffix;
21
+ };
22
+ }
23
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/bujo/ids.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,kCAAkC,CAAC,CAAC,mBAAmB;AAExE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,UAAyD,EAAE;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC7C,OAAO,GAAG,EAAE;QACV,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;QACvD,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ export { createBujoMemoryStore, BujoMemoryStore } from "./store.js";
2
+ export { composeRecallBlock } from "./recall.js";
3
+ export { rebuildFromMarkdown } from "./rebuild.js";
4
+ export { parseBullet, serializeBullet, parseDailyFile, serializeDailyFile } from "./grammar.js";
5
+ export { appendBullet, dailyFilePath } from "./daily.js";
6
+ export { createIdFactory } from "./ids.js";
7
+ export type { Bullet, BujoOptions, BujoTier } from "./types.js";
8
+ export type { LlmComplete, LlmCompleteOptions } from "./llm.js";
9
+ export { MemoryModelError } from "./model-error.js";
10
+ export type { MemoryModelKind } from "./model-error.js";
11
+ export { captureTurn } from "./capture.js";
12
+ export type { CaptureTurnResult } from "./capture.js";
13
+ export { distill } from "./distill.js";
14
+ export type { CandidateMemory } from "./distill.js";
15
+ export { reconcile } from "./reconcile.js";
16
+ export type { ReconcileAction, ReconcileDeps } from "./reconcile.js";
17
+ export { extractEntities } from "./entities.js";
18
+ export type { Extraction, ExtractedEntity, ExtractedRelation } from "./entities.js";
19
+ export { readGraph } from "./graph.js";
20
+ export { createOllamaLlm } from "./ollama-llm.js";
21
+ export { reflect } from "./reflect.js";
22
+ export type { ReflectDeps, ReflectResult } from "./reflect.js";
23
+ export { migrate } from "./migrate.js";
24
+ export type { MigrateDeps, MigrateResult } from "./migrate.js";
25
+ export { writeFutureLog, writeIndex } from "./projections.js";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bujo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export { createBujoMemoryStore, BujoMemoryStore } from "./store.js";
2
+ export { composeRecallBlock } from "./recall.js";
3
+ export { rebuildFromMarkdown } from "./rebuild.js";
4
+ export { parseBullet, serializeBullet, parseDailyFile, serializeDailyFile } from "./grammar.js";
5
+ export { appendBullet, dailyFilePath } from "./daily.js";
6
+ export { createIdFactory } from "./ids.js";
7
+ export { MemoryModelError } from "./model-error.js";
8
+ // Phase 2 capture pipeline
9
+ export { captureTurn } from "./capture.js";
10
+ export { distill } from "./distill.js";
11
+ export { reconcile } from "./reconcile.js";
12
+ export { extractEntities } from "./entities.js";
13
+ export { readGraph } from "./graph.js";
14
+ // Phase 4 built-in LLM adapter
15
+ export { createOllamaLlm } from "./ollama-llm.js";
16
+ // Phase 3 rituals
17
+ export { reflect } from "./reflect.js";
18
+ export { migrate } from "./migrate.js";
19
+ export { writeFutureLog, writeIndex } from "./projections.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bujo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,2BAA2B;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,kBAAkB;AAClB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Extract the first top-level JSON value (object or array) from an LLM completion, tolerating prose/code fences. */
2
+ export declare function parseJsonLoose<T>(text: string): T | undefined;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/bujo/json.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAsB7D"}
@@ -0,0 +1,58 @@
1
+ /** Extract the first top-level JSON value (object or array) from an LLM completion, tolerating prose/code fences. */
2
+ export function parseJsonLoose(text) {
3
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/u);
4
+ const body = fenced?.[1] ?? text;
5
+ // Scan EVERY bracket-like start, not just the first: prose, markdown citations (`[1]`), or
6
+ // pseudocode can put a stray `[`/`{` ahead of the real payload. Keep the LARGEST value that
7
+ // actually parses, so a trivial "[1]" citation loses to the real object/array later on.
8
+ let best;
9
+ for (let i = 0; i < body.length; i += 1) {
10
+ const open = body[i];
11
+ if (open !== "[" && open !== "{")
12
+ continue;
13
+ const end = matchingClose(body, i, open);
14
+ if (end === -1)
15
+ continue;
16
+ const slice = body.slice(i, end + 1);
17
+ try {
18
+ const value = JSON.parse(slice);
19
+ if (best === undefined || slice.length > best.len)
20
+ best = { value, len: slice.length };
21
+ i = end; // this span parsed — skip the nested brackets it already covers
22
+ }
23
+ catch {
24
+ // Not valid JSON at this position; try the next bracket.
25
+ }
26
+ }
27
+ return best?.value;
28
+ }
29
+ /** Index of the bracket closing `body[start]` (an `[` or `{`), respecting strings/escapes; -1 if unbalanced. */
30
+ function matchingClose(body, start, open) {
31
+ const close = open === "[" ? "]" : "}";
32
+ let depth = 0, inStr = false, esc = false;
33
+ for (let i = start; i < body.length; i += 1) {
34
+ const ch = body[i];
35
+ if (ch === undefined)
36
+ break;
37
+ if (inStr) {
38
+ if (esc)
39
+ esc = false;
40
+ else if (ch === "\\")
41
+ esc = true;
42
+ else if (ch === '"')
43
+ inStr = false;
44
+ continue;
45
+ }
46
+ if (ch === '"')
47
+ inStr = true;
48
+ else if (ch === open)
49
+ depth += 1;
50
+ else if (ch === close) {
51
+ depth -= 1;
52
+ if (depth === 0)
53
+ return i;
54
+ }
55
+ }
56
+ return -1;
57
+ }
58
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/bujo/json.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,MAAM,UAAU,cAAc,CAAI,IAAY;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACjC,2FAA2F;IAC3F,4FAA4F;IAC5F,wFAAwF;IACxF,IAAI,IAAiD,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;YAC3C,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG;gBAAE,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YACvF,CAAC,GAAG,GAAG,CAAC,CAAC,gEAAgE;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,KAAsB,CAAC;AACtC,CAAC;AAED,gHAAgH;AAChH,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,IAAe;IACjE,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,SAAS;YAAE,MAAM;QAC5B,IAAI,KAAK,EAAE,CAAC;YAAC,IAAI,GAAG;gBAAE,GAAG,GAAG,KAAK,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI;gBAAE,GAAG,GAAG,IAAI,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,GAAG,KAAK,CAAC;YAAC,SAAS;QAAC,CAAC;QACpH,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI;YAAE,KAAK,IAAI,CAAC,CAAC;aAAM,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAAC,KAAK,IAAI,CAAC,CAAC;YAAC,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;QAAC,CAAC;IACnI,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Per-call hints for a completion. `label` tags the ritual (e.g. "capture:distill") so a recording host can group/name the run. */
2
+ export interface LlmCompleteOptions {
3
+ readonly label?: string;
4
+ }
5
+ /** Minimal injected LLM completion surface. Implementations adapt the host runtime (P4); tests use a fake. */
6
+ export interface LlmComplete {
7
+ readonly id: string;
8
+ /**
9
+ * Returns the model's text completion for the prompt. The optional `opts.label`
10
+ * is an advisory ritual tag; implementations that don't record may ignore it.
11
+ */
12
+ complete(prompt: string, opts?: LlmCompleteOptions): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/bujo/llm.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8GAA8G;AAC9G,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/bujo/llm.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ReflectDeps } from "./reflect.js";
2
+ export type MigrateDeps = ReflectDeps;
3
+ export interface MigrateResult {
4
+ readonly promoted: number;
5
+ readonly rescheduled: number;
6
+ readonly clustered: number;
7
+ readonly forgotten: number;
8
+ readonly reviewed: number;
9
+ }
10
+ /** Monthly BuJo migration ritual: review aging open memories and apply LLM decisions. */
11
+ export declare function migrate(deps: MigrateDeps): Promise<MigrateResult>;
12
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/bujo/migrate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AA4BD,yFAAyF;AACzF,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAmHvE"}