@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.
- package/dist/access/manifest.d.ts +59 -0
- package/dist/access/manifest.d.ts.map +1 -0
- package/dist/access/manifest.js +251 -0
- package/dist/access/manifest.js.map +1 -0
- package/dist/activity/log.d.ts +1 -1
- package/dist/activity/log.d.ts.map +1 -1
- package/dist/agents/autonomous.d.ts.map +1 -1
- package/dist/agents/autonomous.js +38 -0
- package/dist/agents/autonomous.js.map +1 -1
- package/dist/agents/governance.d.ts +70 -0
- package/dist/agents/governance.d.ts.map +1 -0
- package/dist/agents/governance.js +220 -0
- package/dist/agents/governance.js.map +1 -0
- package/dist/agents/governed-spawn.d.ts +83 -0
- package/dist/agents/governed-spawn.d.ts.map +1 -0
- package/dist/agents/governed-spawn.js +186 -0
- package/dist/agents/governed-spawn.js.map +1 -0
- package/dist/agents/heartbeat.d.ts +91 -0
- package/dist/agents/heartbeat.d.ts.map +1 -0
- package/dist/agents/heartbeat.js +323 -0
- package/dist/agents/heartbeat.js.map +1 -0
- package/dist/agents/index.d.ts +4 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +6 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/spawn-policy.d.ts +45 -0
- package/dist/agents/spawn-policy.d.ts.map +1 -0
- package/dist/agents/spawn-policy.js +202 -0
- package/dist/agents/spawn-policy.js.map +1 -0
- package/dist/alert.d.ts +16 -0
- package/dist/alert.d.ts.map +1 -0
- package/dist/alert.js +70 -0
- package/dist/alert.js.map +1 -0
- package/dist/cli.js +261 -32
- package/dist/cli.js.map +1 -1
- package/dist/credentials/store.d.ts +1 -1
- package/dist/credentials/store.d.ts.map +1 -1
- package/dist/credentials/store.js +14 -3
- package/dist/credentials/store.js.map +1 -1
- package/dist/crystallizer.d.ts +56 -0
- package/dist/crystallizer.d.ts.map +1 -0
- package/dist/crystallizer.js +159 -0
- package/dist/crystallizer.js.map +1 -0
- package/dist/distiller.d.ts +48 -0
- package/dist/distiller.d.ts.map +1 -0
- package/dist/distiller.js +140 -0
- package/dist/distiller.js.map +1 -0
- package/dist/files/deep-index.d.ts +59 -0
- package/dist/files/deep-index.d.ts.map +1 -0
- package/dist/files/deep-index.js +337 -0
- package/dist/files/deep-index.js.map +1 -0
- package/dist/files/import.d.ts +44 -0
- package/dist/files/import.d.ts.map +1 -0
- package/dist/files/import.js +213 -0
- package/dist/files/import.js.map +1 -0
- package/dist/files/index-local.d.ts +37 -0
- package/dist/files/index-local.d.ts.map +1 -0
- package/dist/files/index-local.js +198 -0
- package/dist/files/index-local.js.map +1 -0
- package/dist/google/auth.d.ts +2 -0
- package/dist/google/auth.d.ts.map +1 -1
- package/dist/google/auth.js +2 -0
- package/dist/google/auth.js.map +1 -1
- package/dist/integrations/gate.d.ts +40 -0
- package/dist/integrations/gate.d.ts.map +1 -0
- package/dist/integrations/gate.js +100 -0
- package/dist/integrations/gate.js.map +1 -0
- package/dist/lib/audit.d.ts +43 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +120 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/brain-io.d.ts.map +1 -1
- package/dist/lib/brain-io.js +52 -0
- package/dist/lib/brain-io.js.map +1 -1
- package/dist/lib/dpapi.d.ts +14 -0
- package/dist/lib/dpapi.d.ts.map +1 -0
- package/dist/lib/dpapi.js +104 -0
- package/dist/lib/dpapi.js.map +1 -0
- package/dist/lib/glob-match.d.ts +22 -0
- package/dist/lib/glob-match.d.ts.map +1 -0
- package/dist/lib/glob-match.js +64 -0
- package/dist/lib/glob-match.js.map +1 -0
- package/dist/lib/locked.d.ts +40 -0
- package/dist/lib/locked.d.ts.map +1 -0
- package/dist/lib/locked.js +130 -0
- package/dist/lib/locked.js.map +1 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +5 -2
- package/dist/llm/complete.js.map +1 -1
- package/dist/llm/fetch-guard.d.ts +16 -0
- package/dist/llm/fetch-guard.d.ts.map +1 -0
- package/dist/llm/fetch-guard.js +61 -0
- package/dist/llm/fetch-guard.js.map +1 -0
- package/dist/llm/guard.d.ts +40 -0
- package/dist/llm/guard.d.ts.map +1 -0
- package/dist/llm/guard.js +88 -0
- package/dist/llm/guard.js.map +1 -0
- package/dist/llm/membrane.d.ts +46 -0
- package/dist/llm/membrane.d.ts.map +1 -0
- package/dist/llm/membrane.js +123 -0
- package/dist/llm/membrane.js.map +1 -0
- package/dist/llm/providers/index.d.ts +5 -1
- package/dist/llm/providers/index.d.ts.map +1 -1
- package/dist/llm/providers/index.js +8 -1
- package/dist/llm/providers/index.js.map +1 -1
- package/dist/llm/redact.d.ts +39 -0
- package/dist/llm/redact.d.ts.map +1 -0
- package/dist/llm/redact.js +155 -0
- package/dist/llm/redact.js.map +1 -0
- package/dist/llm/sensitive-registry.d.ts +33 -0
- package/dist/llm/sensitive-registry.d.ts.map +1 -0
- package/dist/llm/sensitive-registry.js +106 -0
- package/dist/llm/sensitive-registry.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +520 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mdns.d.ts +17 -0
- package/dist/mdns.d.ts.map +1 -0
- package/dist/mdns.js +110 -0
- package/dist/mdns.js.map +1 -0
- package/dist/nerve/push.d.ts +26 -0
- package/dist/nerve/push.d.ts.map +1 -0
- package/dist/nerve/push.js +170 -0
- package/dist/nerve/push.js.map +1 -0
- package/dist/nerve/state.d.ts +35 -0
- package/dist/nerve/state.d.ts.map +1 -0
- package/dist/nerve/state.js +257 -0
- package/dist/nerve/state.js.map +1 -0
- package/dist/posture/engine.d.ts +41 -0
- package/dist/posture/engine.d.ts.map +1 -0
- package/dist/posture/engine.js +217 -0
- package/dist/posture/engine.js.map +1 -0
- package/dist/posture/index.d.ts +11 -0
- package/dist/posture/index.d.ts.map +1 -0
- package/dist/posture/index.js +10 -0
- package/dist/posture/index.js.map +1 -0
- package/dist/posture/middleware.d.ts +30 -0
- package/dist/posture/middleware.d.ts.map +1 -0
- package/dist/posture/middleware.js +92 -0
- package/dist/posture/middleware.js.map +1 -0
- package/dist/posture/types.d.ts +61 -0
- package/dist/posture/types.d.ts.map +1 -0
- package/dist/posture/types.js +48 -0
- package/dist/posture/types.js.map +1 -0
- package/dist/resend/inbox.d.ts +23 -0
- package/dist/resend/inbox.d.ts.map +1 -0
- package/dist/resend/inbox.js +198 -0
- package/dist/resend/inbox.js.map +1 -0
- package/dist/resend/webhooks.d.ts +30 -0
- package/dist/resend/webhooks.d.ts.map +1 -0
- package/dist/resend/webhooks.js +244 -0
- package/dist/resend/webhooks.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +773 -58
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +14 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +32 -1
- package/dist/settings.js.map +1 -1
- package/dist/tier/bond.d.ts +51 -0
- package/dist/tier/bond.d.ts.map +1 -0
- package/dist/tier/bond.js +154 -0
- package/dist/tier/bond.js.map +1 -0
- package/dist/tier/freeze.d.ts +21 -0
- package/dist/tier/freeze.d.ts.map +1 -0
- package/dist/tier/freeze.js +73 -0
- package/dist/tier/freeze.js.map +1 -0
- package/dist/tier/gate.d.ts +11 -0
- package/dist/tier/gate.d.ts.map +1 -0
- package/dist/tier/gate.js +25 -0
- package/dist/tier/gate.js.map +1 -0
- package/dist/tier/heartbeat.d.ts +22 -0
- package/dist/tier/heartbeat.d.ts.map +1 -0
- package/dist/tier/heartbeat.js +128 -0
- package/dist/tier/heartbeat.js.map +1 -0
- package/dist/tier/token.d.ts +22 -0
- package/dist/tier/token.d.ts.map +1 -0
- package/dist/tier/token.js +100 -0
- package/dist/tier/token.js.map +1 -0
- package/dist/tier/types.d.ts +44 -0
- package/dist/tier/types.d.ts.map +1 -0
- package/dist/tier/types.js +61 -0
- package/dist/tier/types.js.map +1 -0
- package/dist/updater.d.ts +32 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +145 -0
- package/dist/updater.js.map +1 -0
- package/dist/vault/policy.d.ts +42 -0
- package/dist/vault/policy.d.ts.map +1 -0
- package/dist/vault/policy.js +159 -0
- package/dist/vault/policy.js.map +1 -0
- package/dist/vault/store.d.ts +6 -0
- package/dist/vault/store.d.ts.map +1 -1
- package/dist/vault/store.js +15 -5
- package/dist/vault/store.js.map +1 -1
- package/dist/vault/transfer.d.ts +33 -0
- package/dist/vault/transfer.d.ts.map +1 -0
- package/dist/vault/transfer.js +187 -0
- package/dist/vault/transfer.js.map +1 -0
- package/dist/voucher.d.ts +39 -0
- package/dist/voucher.d.ts.map +1 -0
- package/dist/voucher.js +105 -0
- package/dist/voucher.js.map +1 -0
- package/dist/webhooks/handlers.d.ts +10 -0
- package/dist/webhooks/handlers.d.ts.map +1 -1
- package/dist/webhooks/handlers.js +53 -0
- package/dist/webhooks/handlers.js.map +1 -1
- package/dist/webhooks/index.d.ts +2 -2
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +2 -2
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/verify.d.ts +8 -0
- package/dist/webhooks/verify.d.ts.map +1 -1
- package/dist/webhooks/verify.js +56 -0
- package/dist/webhooks/verify.js.map +1 -1
- package/package.json +8 -2
- package/public/board.html +8 -3
- package/public/browser.html +8 -3
- package/public/library.html +8 -3
- package/public/observatory.html +8 -3
- package/public/ops.html +8 -3
- package/public/registry.html +627 -0
- 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"}
|