@runcore-sh/runcore 0.1.8 → 0.1.10

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 (225) hide show
  1. package/dist/access/manifest.d.ts +59 -0
  2. package/dist/access/manifest.d.ts.map +1 -0
  3. package/dist/access/manifest.js +251 -0
  4. package/dist/access/manifest.js.map +1 -0
  5. package/dist/activity/log.d.ts +1 -1
  6. package/dist/activity/log.d.ts.map +1 -1
  7. package/dist/agents/autonomous.d.ts.map +1 -1
  8. package/dist/agents/autonomous.js +38 -0
  9. package/dist/agents/autonomous.js.map +1 -1
  10. package/dist/agents/governance.d.ts +70 -0
  11. package/dist/agents/governance.d.ts.map +1 -0
  12. package/dist/agents/governance.js +220 -0
  13. package/dist/agents/governance.js.map +1 -0
  14. package/dist/agents/governed-spawn.d.ts +83 -0
  15. package/dist/agents/governed-spawn.d.ts.map +1 -0
  16. package/dist/agents/governed-spawn.js +186 -0
  17. package/dist/agents/governed-spawn.js.map +1 -0
  18. package/dist/agents/heartbeat.d.ts +91 -0
  19. package/dist/agents/heartbeat.d.ts.map +1 -0
  20. package/dist/agents/heartbeat.js +323 -0
  21. package/dist/agents/heartbeat.js.map +1 -0
  22. package/dist/agents/index.d.ts +4 -1
  23. package/dist/agents/index.d.ts.map +1 -1
  24. package/dist/agents/index.js +6 -1
  25. package/dist/agents/index.js.map +1 -1
  26. package/dist/agents/spawn-policy.d.ts +45 -0
  27. package/dist/agents/spawn-policy.d.ts.map +1 -0
  28. package/dist/agents/spawn-policy.js +202 -0
  29. package/dist/agents/spawn-policy.js.map +1 -0
  30. package/dist/alert.d.ts +16 -0
  31. package/dist/alert.d.ts.map +1 -0
  32. package/dist/alert.js +70 -0
  33. package/dist/alert.js.map +1 -0
  34. package/dist/cli.js +261 -32
  35. package/dist/cli.js.map +1 -1
  36. package/dist/credentials/store.d.ts +1 -1
  37. package/dist/credentials/store.d.ts.map +1 -1
  38. package/dist/credentials/store.js +14 -3
  39. package/dist/credentials/store.js.map +1 -1
  40. package/dist/crystallizer.d.ts +56 -0
  41. package/dist/crystallizer.d.ts.map +1 -0
  42. package/dist/crystallizer.js +159 -0
  43. package/dist/crystallizer.js.map +1 -0
  44. package/dist/distiller.d.ts +48 -0
  45. package/dist/distiller.d.ts.map +1 -0
  46. package/dist/distiller.js +140 -0
  47. package/dist/distiller.js.map +1 -0
  48. package/dist/files/deep-index.d.ts +59 -0
  49. package/dist/files/deep-index.d.ts.map +1 -0
  50. package/dist/files/deep-index.js +337 -0
  51. package/dist/files/deep-index.js.map +1 -0
  52. package/dist/files/import.d.ts +44 -0
  53. package/dist/files/import.d.ts.map +1 -0
  54. package/dist/files/import.js +213 -0
  55. package/dist/files/import.js.map +1 -0
  56. package/dist/files/index-local.d.ts +37 -0
  57. package/dist/files/index-local.d.ts.map +1 -0
  58. package/dist/files/index-local.js +198 -0
  59. package/dist/files/index-local.js.map +1 -0
  60. package/dist/google/auth.d.ts +2 -0
  61. package/dist/google/auth.d.ts.map +1 -1
  62. package/dist/google/auth.js +2 -0
  63. package/dist/google/auth.js.map +1 -1
  64. package/dist/integrations/gate.d.ts +40 -0
  65. package/dist/integrations/gate.d.ts.map +1 -0
  66. package/dist/integrations/gate.js +100 -0
  67. package/dist/integrations/gate.js.map +1 -0
  68. package/dist/lib/audit.d.ts +43 -0
  69. package/dist/lib/audit.d.ts.map +1 -0
  70. package/dist/lib/audit.js +120 -0
  71. package/dist/lib/audit.js.map +1 -0
  72. package/dist/lib/brain-io.d.ts.map +1 -1
  73. package/dist/lib/brain-io.js +52 -0
  74. package/dist/lib/brain-io.js.map +1 -1
  75. package/dist/lib/dpapi.d.ts +14 -0
  76. package/dist/lib/dpapi.d.ts.map +1 -0
  77. package/dist/lib/dpapi.js +104 -0
  78. package/dist/lib/dpapi.js.map +1 -0
  79. package/dist/lib/glob-match.d.ts +22 -0
  80. package/dist/lib/glob-match.d.ts.map +1 -0
  81. package/dist/lib/glob-match.js +64 -0
  82. package/dist/lib/glob-match.js.map +1 -0
  83. package/dist/lib/locked.d.ts +40 -0
  84. package/dist/lib/locked.d.ts.map +1 -0
  85. package/dist/lib/locked.js +130 -0
  86. package/dist/lib/locked.js.map +1 -0
  87. package/dist/llm/complete.d.ts.map +1 -1
  88. package/dist/llm/complete.js +5 -2
  89. package/dist/llm/complete.js.map +1 -1
  90. package/dist/llm/fetch-guard.d.ts +16 -0
  91. package/dist/llm/fetch-guard.d.ts.map +1 -0
  92. package/dist/llm/fetch-guard.js +61 -0
  93. package/dist/llm/fetch-guard.js.map +1 -0
  94. package/dist/llm/guard.d.ts +40 -0
  95. package/dist/llm/guard.d.ts.map +1 -0
  96. package/dist/llm/guard.js +88 -0
  97. package/dist/llm/guard.js.map +1 -0
  98. package/dist/llm/membrane.d.ts +46 -0
  99. package/dist/llm/membrane.d.ts.map +1 -0
  100. package/dist/llm/membrane.js +123 -0
  101. package/dist/llm/membrane.js.map +1 -0
  102. package/dist/llm/providers/index.d.ts +5 -1
  103. package/dist/llm/providers/index.d.ts.map +1 -1
  104. package/dist/llm/providers/index.js +8 -1
  105. package/dist/llm/providers/index.js.map +1 -1
  106. package/dist/llm/redact.d.ts +39 -0
  107. package/dist/llm/redact.d.ts.map +1 -0
  108. package/dist/llm/redact.js +155 -0
  109. package/dist/llm/redact.js.map +1 -0
  110. package/dist/llm/sensitive-registry.d.ts +33 -0
  111. package/dist/llm/sensitive-registry.d.ts.map +1 -0
  112. package/dist/llm/sensitive-registry.js +106 -0
  113. package/dist/llm/sensitive-registry.js.map +1 -0
  114. package/dist/mcp-server.d.ts +11 -0
  115. package/dist/mcp-server.d.ts.map +1 -0
  116. package/dist/mcp-server.js +520 -0
  117. package/dist/mcp-server.js.map +1 -0
  118. package/dist/mdns.d.ts +17 -0
  119. package/dist/mdns.d.ts.map +1 -0
  120. package/dist/mdns.js +110 -0
  121. package/dist/mdns.js.map +1 -0
  122. package/dist/nerve/push.d.ts +26 -0
  123. package/dist/nerve/push.d.ts.map +1 -0
  124. package/dist/nerve/push.js +170 -0
  125. package/dist/nerve/push.js.map +1 -0
  126. package/dist/nerve/state.d.ts +35 -0
  127. package/dist/nerve/state.d.ts.map +1 -0
  128. package/dist/nerve/state.js +257 -0
  129. package/dist/nerve/state.js.map +1 -0
  130. package/dist/posture/engine.d.ts +41 -0
  131. package/dist/posture/engine.d.ts.map +1 -0
  132. package/dist/posture/engine.js +217 -0
  133. package/dist/posture/engine.js.map +1 -0
  134. package/dist/posture/index.d.ts +11 -0
  135. package/dist/posture/index.d.ts.map +1 -0
  136. package/dist/posture/index.js +10 -0
  137. package/dist/posture/index.js.map +1 -0
  138. package/dist/posture/middleware.d.ts +30 -0
  139. package/dist/posture/middleware.d.ts.map +1 -0
  140. package/dist/posture/middleware.js +92 -0
  141. package/dist/posture/middleware.js.map +1 -0
  142. package/dist/posture/types.d.ts +61 -0
  143. package/dist/posture/types.d.ts.map +1 -0
  144. package/dist/posture/types.js +48 -0
  145. package/dist/posture/types.js.map +1 -0
  146. package/dist/resend/inbox.d.ts +23 -0
  147. package/dist/resend/inbox.d.ts.map +1 -0
  148. package/dist/resend/inbox.js +198 -0
  149. package/dist/resend/inbox.js.map +1 -0
  150. package/dist/resend/webhooks.d.ts +30 -0
  151. package/dist/resend/webhooks.d.ts.map +1 -0
  152. package/dist/resend/webhooks.js +244 -0
  153. package/dist/resend/webhooks.js.map +1 -0
  154. package/dist/server.d.ts +5 -1
  155. package/dist/server.d.ts.map +1 -1
  156. package/dist/server.js +773 -58
  157. package/dist/server.js.map +1 -1
  158. package/dist/settings.d.ts +14 -1
  159. package/dist/settings.d.ts.map +1 -1
  160. package/dist/settings.js +32 -1
  161. package/dist/settings.js.map +1 -1
  162. package/dist/tier/bond.d.ts +51 -0
  163. package/dist/tier/bond.d.ts.map +1 -0
  164. package/dist/tier/bond.js +154 -0
  165. package/dist/tier/bond.js.map +1 -0
  166. package/dist/tier/freeze.d.ts +21 -0
  167. package/dist/tier/freeze.d.ts.map +1 -0
  168. package/dist/tier/freeze.js +73 -0
  169. package/dist/tier/freeze.js.map +1 -0
  170. package/dist/tier/gate.d.ts +11 -0
  171. package/dist/tier/gate.d.ts.map +1 -0
  172. package/dist/tier/gate.js +25 -0
  173. package/dist/tier/gate.js.map +1 -0
  174. package/dist/tier/heartbeat.d.ts +22 -0
  175. package/dist/tier/heartbeat.d.ts.map +1 -0
  176. package/dist/tier/heartbeat.js +128 -0
  177. package/dist/tier/heartbeat.js.map +1 -0
  178. package/dist/tier/token.d.ts +22 -0
  179. package/dist/tier/token.d.ts.map +1 -0
  180. package/dist/tier/token.js +100 -0
  181. package/dist/tier/token.js.map +1 -0
  182. package/dist/tier/types.d.ts +44 -0
  183. package/dist/tier/types.d.ts.map +1 -0
  184. package/dist/tier/types.js +61 -0
  185. package/dist/tier/types.js.map +1 -0
  186. package/dist/updater.d.ts +32 -0
  187. package/dist/updater.d.ts.map +1 -0
  188. package/dist/updater.js +145 -0
  189. package/dist/updater.js.map +1 -0
  190. package/dist/vault/policy.d.ts +42 -0
  191. package/dist/vault/policy.d.ts.map +1 -0
  192. package/dist/vault/policy.js +159 -0
  193. package/dist/vault/policy.js.map +1 -0
  194. package/dist/vault/store.d.ts +6 -0
  195. package/dist/vault/store.d.ts.map +1 -1
  196. package/dist/vault/store.js +15 -5
  197. package/dist/vault/store.js.map +1 -1
  198. package/dist/vault/transfer.d.ts +33 -0
  199. package/dist/vault/transfer.d.ts.map +1 -0
  200. package/dist/vault/transfer.js +187 -0
  201. package/dist/vault/transfer.js.map +1 -0
  202. package/dist/voucher.d.ts +39 -0
  203. package/dist/voucher.d.ts.map +1 -0
  204. package/dist/voucher.js +105 -0
  205. package/dist/voucher.js.map +1 -0
  206. package/dist/webhooks/handlers.d.ts +10 -0
  207. package/dist/webhooks/handlers.d.ts.map +1 -1
  208. package/dist/webhooks/handlers.js +53 -0
  209. package/dist/webhooks/handlers.js.map +1 -1
  210. package/dist/webhooks/index.d.ts +2 -2
  211. package/dist/webhooks/index.d.ts.map +1 -1
  212. package/dist/webhooks/index.js +2 -2
  213. package/dist/webhooks/index.js.map +1 -1
  214. package/dist/webhooks/verify.d.ts +8 -0
  215. package/dist/webhooks/verify.d.ts.map +1 -1
  216. package/dist/webhooks/verify.js +56 -0
  217. package/dist/webhooks/verify.js.map +1 -1
  218. package/package.json +8 -2
  219. package/public/board.html +8 -3
  220. package/public/browser.html +8 -3
  221. package/public/library.html +8 -3
  222. package/public/observatory.html +8 -3
  223. package/public/ops.html +8 -3
  224. package/public/registry.html +627 -0
  225. package/public/roadmap.html +975 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Crystallizer — open loops as standing queries against the memory stream.
3
+ *
4
+ * An open loop is a question with a shape. Every new memory entry flows
5
+ * past all active loops. If the entry's content matches the loop's query
6
+ * geometry (word boundaries, concentration, co-occurrence), it sticks as
7
+ * evidence. When enough evidence accumulates, the loop precipitates —
8
+ * surfacing as a notification.
9
+ *
10
+ * The loop doesn't scan. It filters. The river moves. The net holds still.
11
+ */
12
+ import type { MemoryEntry } from "./types.js";
13
+ export interface OpenLoop {
14
+ id: string;
15
+ query: string;
16
+ context: string;
17
+ evidence: EvidenceHit[];
18
+ threshold: number;
19
+ minScore: number;
20
+ status: "open" | "precipitated" | "resolved";
21
+ createdAt: string;
22
+ updatedAt: string;
23
+ }
24
+ export interface EvidenceHit {
25
+ memoryId: string;
26
+ score: number;
27
+ snippet: string;
28
+ matchedAt: string;
29
+ }
30
+ export interface PrecipitationEvent {
31
+ loopId: string;
32
+ query: string;
33
+ context: string;
34
+ evidenceCount: number;
35
+ evidence: EvidenceHit[];
36
+ }
37
+ export declare function scoreEntry(queryTerms: string[], queryLower: string, text: string): number;
38
+ export declare class Crystallizer {
39
+ private loops;
40
+ private filePath;
41
+ private onPrecipitate?;
42
+ constructor(memoryDir: string, onPrecipitate?: (event: PrecipitationEvent) => void);
43
+ /** Load all open loops from disk. Call once at startup. */
44
+ init(): Promise<void>;
45
+ /** Create a new open loop. Returns the loop. */
46
+ open(query: string, context: string, threshold?: number, minScore?: number): Promise<OpenLoop>;
47
+ /** Test a new memory entry against all open loops. Returns any precipitations. */
48
+ test(entry: MemoryEntry): Promise<PrecipitationEvent[]>;
49
+ /** Manually resolve a loop (close it). */
50
+ resolve(loopId: string): Promise<OpenLoop | null>;
51
+ /** List loops by status. */
52
+ list(status?: "open" | "precipitated" | "resolved"): OpenLoop[];
53
+ /** Get a specific loop by ID. */
54
+ get(loopId: string): OpenLoop | null;
55
+ }
56
+ //# sourceMappingURL=crystallizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crystallizer.d.ts","sourceRoot":"","sources":["../src/crystallizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,UAAU,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAID,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBzF;AAUD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAC,CAAsC;gBAEhD,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI;IAKlF,2DAA2D;IACrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,gDAAgD;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,QAAQ,SAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiB5F,kFAAkF;IAC5E,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAqD7D,0CAA0C;IACpC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IASvD,4BAA4B;IAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,EAAE;IAK/D,iCAAiC;IACjC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;CAGrC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Crystallizer — open loops as standing queries against the memory stream.
3
+ *
4
+ * An open loop is a question with a shape. Every new memory entry flows
5
+ * past all active loops. If the entry's content matches the loop's query
6
+ * geometry (word boundaries, concentration, co-occurrence), it sticks as
7
+ * evidence. When enough evidence accumulates, the loop precipitates —
8
+ * surfacing as a notification.
9
+ *
10
+ * The loop doesn't scan. It filters. The river moves. The net holds still.
11
+ */
12
+ import { join } from "node:path";
13
+ import { readBrainLines, appendBrainLine, ensureBrainJsonl } from "./lib/brain-io.js";
14
+ // ── Scoring (shared geometry with memory_retrieve) ───────────────────────────
15
+ export function scoreEntry(queryTerms, queryLower, text) {
16
+ if (!text)
17
+ return 0;
18
+ // Word boundary matching
19
+ const matched = queryTerms.filter((t) => {
20
+ const re = new RegExp(`\\b${t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`);
21
+ return re.test(text);
22
+ });
23
+ if (matched.length === 0)
24
+ return 0;
25
+ const termScore = matched.length / queryTerms.length;
26
+ const allTerms = matched.length === queryTerms.length ? 0.3 : 0;
27
+ const phraseBonus = text.includes(queryLower) ? 0.5 : 0;
28
+ const concentration = Math.min(1, 200 / Math.max(text.length, 1)) * 0.4;
29
+ let proximityBonus = 0;
30
+ if (matched.length >= 2) {
31
+ const positions = matched.map((t) => text.indexOf(t));
32
+ const span = Math.max(...positions) - Math.min(...positions);
33
+ if (span < 100)
34
+ proximityBonus = 0.2;
35
+ else if (span < 300)
36
+ proximityBonus = 0.1;
37
+ }
38
+ return termScore + allTerms + phraseBonus + concentration + proximityBonus;
39
+ }
40
+ // ── Crystallizer ─────────────────────────────────────────────────────────────
41
+ const SCHEMA_LINE = JSON.stringify({ _schema: "open-loops", _version: "1.0" });
42
+ function generateLoopId() {
43
+ return `loop_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;
44
+ }
45
+ export class Crystallizer {
46
+ loops = [];
47
+ filePath;
48
+ onPrecipitate;
49
+ constructor(memoryDir, onPrecipitate) {
50
+ this.filePath = join(memoryDir, "open-loops.jsonl");
51
+ this.onPrecipitate = onPrecipitate;
52
+ }
53
+ /** Load all open loops from disk. Call once at startup. */
54
+ async init() {
55
+ await ensureBrainJsonl(this.filePath, SCHEMA_LINE);
56
+ const lines = await readBrainLines(this.filePath);
57
+ this.loops = [];
58
+ // Build latest state: later lines override earlier ones (same id)
59
+ const loopMap = new Map();
60
+ for (const line of lines) {
61
+ try {
62
+ const obj = JSON.parse(line);
63
+ if (obj._schema)
64
+ continue;
65
+ if (obj.id)
66
+ loopMap.set(obj.id, obj);
67
+ }
68
+ catch {
69
+ continue;
70
+ }
71
+ }
72
+ this.loops = Array.from(loopMap.values());
73
+ }
74
+ /** Create a new open loop. Returns the loop. */
75
+ async open(query, context, threshold = 3, minScore = 0.4) {
76
+ const loop = {
77
+ id: generateLoopId(),
78
+ query,
79
+ context,
80
+ evidence: [],
81
+ threshold,
82
+ minScore,
83
+ status: "open",
84
+ createdAt: new Date().toISOString(),
85
+ updatedAt: new Date().toISOString(),
86
+ };
87
+ await appendBrainLine(this.filePath, JSON.stringify(loop));
88
+ this.loops.push(loop);
89
+ return loop;
90
+ }
91
+ /** Test a new memory entry against all open loops. Returns any precipitations. */
92
+ async test(entry) {
93
+ const precipitations = [];
94
+ const activeLoops = this.loops.filter((l) => l.status === "open");
95
+ for (const loop of activeLoops) {
96
+ // Already have this memory as evidence?
97
+ if (loop.evidence.some((e) => e.memoryId === entry.id))
98
+ continue;
99
+ const queryLower = loop.query.toLowerCase();
100
+ const terms = queryLower.split(/\s+/).filter((t) => t.length > 1);
101
+ if (terms.length === 0)
102
+ continue;
103
+ const text = [
104
+ entry.content ?? "",
105
+ entry.meta ? JSON.stringify(entry.meta) : "",
106
+ entry.summary ?? "",
107
+ entry.title ?? "",
108
+ ].join(" ").toLowerCase();
109
+ const score = scoreEntry(terms, queryLower, text);
110
+ if (score >= loop.minScore) {
111
+ const hit = {
112
+ memoryId: entry.id,
113
+ score,
114
+ snippet: text.slice(0, 200),
115
+ matchedAt: new Date().toISOString(),
116
+ };
117
+ loop.evidence.push(hit);
118
+ loop.updatedAt = new Date().toISOString();
119
+ // Check precipitation
120
+ if (loop.evidence.length >= loop.threshold) {
121
+ loop.status = "precipitated";
122
+ const event = {
123
+ loopId: loop.id,
124
+ query: loop.query,
125
+ context: loop.context,
126
+ evidenceCount: loop.evidence.length,
127
+ evidence: loop.evidence,
128
+ };
129
+ precipitations.push(event);
130
+ this.onPrecipitate?.(event);
131
+ }
132
+ // Persist updated loop state
133
+ await appendBrainLine(this.filePath, JSON.stringify(loop));
134
+ }
135
+ }
136
+ return precipitations;
137
+ }
138
+ /** Manually resolve a loop (close it). */
139
+ async resolve(loopId) {
140
+ const loop = this.loops.find((l) => l.id === loopId);
141
+ if (!loop)
142
+ return null;
143
+ loop.status = "resolved";
144
+ loop.updatedAt = new Date().toISOString();
145
+ await appendBrainLine(this.filePath, JSON.stringify(loop));
146
+ return loop;
147
+ }
148
+ /** List loops by status. */
149
+ list(status) {
150
+ if (status)
151
+ return this.loops.filter((l) => l.status === status);
152
+ return [...this.loops];
153
+ }
154
+ /** Get a specific loop by ID. */
155
+ get(loopId) {
156
+ return this.loops.find((l) => l.id === loopId) ?? null;
157
+ }
158
+ }
159
+ //# sourceMappingURL=crystallizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crystallizer.js","sourceRoot":"","sources":["../src/crystallizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Distiller — convert live brain files into templates and back.
3
+ *
4
+ * Replaces identity-specific values (names, roles) with {{TOKEN}} placeholders,
5
+ * producing reusable templates. Hydrate reverses the process for new instances.
6
+ *
7
+ * Token map is built from instances.yaml + vault.policy.yaml.
8
+ */
9
+ /** Map of TOKEN_NAME → value (e.g. { OWNER: "Bryant", CHIEF_OF_STAFF: "dash" }) */
10
+ export type TokenMap = Record<string, string>;
11
+ /**
12
+ * Build a token map from brain files.
13
+ *
14
+ * Reads instances.yaml and vault.policy.yaml to extract:
15
+ * OWNER — vault policy owner
16
+ * CHIEF_OF_STAFF — instance with role chief-of-staff
17
+ * ADMIN — instance with role administration
18
+ * BRAND — instance with role brand
19
+ * COMMERCIAL — instance with role commercial
20
+ * LOSS_PREVENTION — instance with role loss-prevention
21
+ */
22
+ export declare function buildTokenMap(brainRoot?: string): Promise<TokenMap>;
23
+ /**
24
+ * Distill content — replace identity values with {{TOKEN}} placeholders.
25
+ * Replacements are applied longest-first to avoid partial matches.
26
+ */
27
+ export declare function distill(content: string, tokenMap: TokenMap): string;
28
+ /**
29
+ * Hydrate a template — replace {{TOKEN}} placeholders with values.
30
+ */
31
+ export declare function hydrate(template: string, tokenMap: TokenMap): string;
32
+ /**
33
+ * Distill a brain file into a template and write to brain/templates/.
34
+ *
35
+ * @param sourcePath - Brain-relative path of the source file (e.g. "identity/instances.yaml")
36
+ * @param templateName - Output filename in brain/templates/ (e.g. "instances.yaml")
37
+ * @param tokenMap - Token map for replacement
38
+ */
39
+ export declare function distillFile(sourcePath: string, templateName: string, tokenMap: TokenMap): Promise<string>;
40
+ /**
41
+ * Hydrate a template from brain/templates/ and write to a target path.
42
+ *
43
+ * @param templateName - Filename in brain/templates/ (e.g. "instances.yaml")
44
+ * @param targetPath - Brain-relative path for the output (e.g. "identity/instances.yaml")
45
+ * @param tokenMap - Token map for hydration
46
+ */
47
+ export declare function hydrateFile(templateName: string, targetPath: string, tokenMap: TokenMap): Promise<string>;
48
+ //# sourceMappingURL=distiller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distiller.d.ts","sourceRoot":"","sources":["../src/distiller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAI9C;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsDzE;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAcnE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAMpE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Distiller — convert live brain files into templates and back.
3
+ *
4
+ * Replaces identity-specific values (names, roles) with {{TOKEN}} placeholders,
5
+ * producing reusable templates. Hydrate reverses the process for new instances.
6
+ *
7
+ * Token map is built from instances.yaml + vault.policy.yaml.
8
+ */
9
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
10
+ import { join, resolve, dirname } from "node:path";
11
+ import { createLogger } from "./utils/logger.js";
12
+ const log = createLogger("distiller");
13
+ const BRAIN_DIR = resolve(process.cwd(), "brain");
14
+ // ── Token map builder ────────────────────────────────────────────────────────
15
+ /**
16
+ * Build a token map from brain files.
17
+ *
18
+ * Reads instances.yaml and vault.policy.yaml to extract:
19
+ * OWNER — vault policy owner
20
+ * CHIEF_OF_STAFF — instance with role chief-of-staff
21
+ * ADMIN — instance with role administration
22
+ * BRAND — instance with role brand
23
+ * COMMERCIAL — instance with role commercial
24
+ * LOSS_PREVENTION — instance with role loss-prevention
25
+ */
26
+ export async function buildTokenMap(brainRoot) {
27
+ const root = brainRoot ?? BRAIN_DIR;
28
+ const tokens = {};
29
+ // Read vault.policy.yaml for owner
30
+ try {
31
+ const vaultRaw = await readFile(join(root, "vault.policy.yaml"), "utf-8");
32
+ const ownerMatch = vaultRaw.match(/^owner\s*:\s*(.+)$/m);
33
+ if (ownerMatch) {
34
+ tokens.OWNER = ownerMatch[1].replace(/^["']|["']$/g, "").trim();
35
+ }
36
+ }
37
+ catch {
38
+ log.debug("Could not read vault.policy.yaml for token map");
39
+ }
40
+ // Read instances.yaml for role→name mapping
41
+ try {
42
+ const instancesRaw = await readFile(join(root, "identity", "instances.yaml"), "utf-8");
43
+ // Simple parser: find instance blocks and extract name + role
44
+ const roleMap = {
45
+ "chief-of-staff": "CHIEF_OF_STAFF",
46
+ "administration": "ADMIN",
47
+ "brand": "BRAND",
48
+ "commercial": "COMMERCIAL",
49
+ "loss-prevention": "LOSS_PREVENTION",
50
+ };
51
+ // Parse instance names and their roles
52
+ let currentInstance = "";
53
+ for (const line of instancesRaw.split("\n")) {
54
+ // Instance name (indent 2, key followed by colon)
55
+ const instanceMatch = line.match(/^ (\w[\w-]*)\s*:\s*$/);
56
+ if (instanceMatch) {
57
+ currentInstance = instanceMatch[1];
58
+ continue;
59
+ }
60
+ // Role line (indent 4)
61
+ const roleMatch = line.match(/^\s{4}role\s*:\s*(.+)$/);
62
+ if (roleMatch && currentInstance) {
63
+ const role = roleMatch[1].replace(/^["']|["']$/g, "").trim();
64
+ const tokenName = roleMap[role];
65
+ if (tokenName) {
66
+ tokens[tokenName] = currentInstance;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ log.debug("Could not read instances.yaml for token map");
73
+ }
74
+ log.info("Token map built", { tokens: Object.keys(tokens) });
75
+ return tokens;
76
+ }
77
+ // ── Core operations ──────────────────────────────────────────────────────────
78
+ /**
79
+ * Distill content — replace identity values with {{TOKEN}} placeholders.
80
+ * Replacements are applied longest-first to avoid partial matches.
81
+ */
82
+ export function distill(content, tokenMap) {
83
+ // Sort by value length descending (longest first)
84
+ const entries = Object.entries(tokenMap)
85
+ .filter(([, value]) => value.length > 0)
86
+ .sort((a, b) => b[1].length - a[1].length);
87
+ let result = content;
88
+ for (const [token, value] of entries) {
89
+ // Replace all occurrences (case-sensitive)
90
+ const escaped = value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
91
+ result = result.replace(new RegExp(escaped, "g"), `{{${token}}}`);
92
+ }
93
+ return result;
94
+ }
95
+ /**
96
+ * Hydrate a template — replace {{TOKEN}} placeholders with values.
97
+ */
98
+ export function hydrate(template, tokenMap) {
99
+ let result = template;
100
+ for (const [token, value] of Object.entries(tokenMap)) {
101
+ result = result.replace(new RegExp(`\\{\\{${token}\\}\\}`, "g"), value);
102
+ }
103
+ return result;
104
+ }
105
+ /**
106
+ * Distill a brain file into a template and write to brain/templates/.
107
+ *
108
+ * @param sourcePath - Brain-relative path of the source file (e.g. "identity/instances.yaml")
109
+ * @param templateName - Output filename in brain/templates/ (e.g. "instances.yaml")
110
+ * @param tokenMap - Token map for replacement
111
+ */
112
+ export async function distillFile(sourcePath, templateName, tokenMap) {
113
+ const fullSource = join(BRAIN_DIR, sourcePath);
114
+ const content = await readFile(fullSource, "utf-8");
115
+ const distilled = distill(content, tokenMap);
116
+ const templateDir = join(BRAIN_DIR, "templates");
117
+ const templatePath = join(templateDir, templateName);
118
+ await mkdir(templateDir, { recursive: true });
119
+ await writeFile(templatePath, distilled, "utf-8");
120
+ log.info("File distilled to template", { source: sourcePath, template: templateName });
121
+ return templatePath;
122
+ }
123
+ /**
124
+ * Hydrate a template from brain/templates/ and write to a target path.
125
+ *
126
+ * @param templateName - Filename in brain/templates/ (e.g. "instances.yaml")
127
+ * @param targetPath - Brain-relative path for the output (e.g. "identity/instances.yaml")
128
+ * @param tokenMap - Token map for hydration
129
+ */
130
+ export async function hydrateFile(templateName, targetPath, tokenMap) {
131
+ const templatePath = join(BRAIN_DIR, "templates", templateName);
132
+ const template = await readFile(templatePath, "utf-8");
133
+ const hydrated = hydrate(template, tokenMap);
134
+ const fullTarget = join(BRAIN_DIR, targetPath);
135
+ await mkdir(dirname(fullTarget), { recursive: true });
136
+ await writeFile(fullTarget, hydrated, "utf-8");
137
+ log.info("Template hydrated to file", { template: templateName, target: targetPath });
138
+ return fullTarget;
139
+ }
140
+ //# sourceMappingURL=distiller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distiller.js","sourceRoot":"","sources":["../src/distiller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Deep indexing — background worker for thorough document understanding.
3
+ *
4
+ * Runs after the fast pass (index-local.ts) completes. Processes files
5
+ * through local Ollama at whatever pace the device allows.
6
+ *
7
+ * Pipeline:
8
+ * 1. Entity extraction — people, projects, dates, organizations
9
+ * 2. Theme discovery — recurring topics across documents
10
+ * 3. Cross-referencing — connections between imported docs and existing memory
11
+ * 4. Flags — documents needing human review (conflicts, outdated info)
12
+ *
13
+ * Results feed the nerve state:
14
+ * - Work dot goes green during processing
15
+ * - Joy dot goes green when patterns emerge
16
+ *
17
+ * All processing local. Membrane protects any outbound call.
18
+ */
19
+ interface Entity {
20
+ name: string;
21
+ type: "person" | "org" | "project" | "date" | "place" | "concept";
22
+ source: string;
23
+ context: string;
24
+ }
25
+ interface Theme {
26
+ label: string;
27
+ confidence: number;
28
+ sources: string[];
29
+ summary: string;
30
+ }
31
+ interface CrossRef {
32
+ sourceFile: string;
33
+ targetFile: string;
34
+ relationship: string;
35
+ detail: string;
36
+ }
37
+ interface Flag {
38
+ file: string;
39
+ reason: string;
40
+ type: "conflict" | "outdated" | "incomplete" | "review";
41
+ }
42
+ interface DeepIndexResult {
43
+ entities: Entity[];
44
+ themes: Theme[];
45
+ crossRefs: CrossRef[];
46
+ flags: Flag[];
47
+ filesProcessed: number;
48
+ }
49
+ export declare function getDeepIndexProgress(): {
50
+ running: boolean;
51
+ total: number;
52
+ done: number;
53
+ phase: string;
54
+ };
55
+ export declare function runDeepIndex(options?: {
56
+ batchSize?: number;
57
+ }): Promise<DeepIndexResult>;
58
+ export {};
59
+ //# sourceMappingURL=deep-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-index.d.ts","sourceRoot":"","sources":["../../src/files/deep-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,QAAQ;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;CACzD;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAkBD,wBAAgB,oBAAoB;;;;WAFiB,MAAM;EAI1D;AAiMD,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6I3B"}