@cleocode/brain 2026.5.3 → 2026.5.4

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 (46) hide show
  1. package/dist/src/adapters/brain.d.ts +35 -0
  2. package/dist/src/adapters/brain.d.ts.map +1 -0
  3. package/dist/src/adapters/brain.js +303 -0
  4. package/dist/src/adapters/brain.js.map +1 -0
  5. package/dist/src/adapters/conduit.d.ts +25 -0
  6. package/dist/src/adapters/conduit.d.ts.map +1 -0
  7. package/dist/src/adapters/conduit.js +94 -0
  8. package/dist/src/adapters/conduit.js.map +1 -0
  9. package/dist/src/adapters/index.d.ts +32 -0
  10. package/dist/src/adapters/index.d.ts.map +1 -0
  11. package/dist/src/adapters/index.js +194 -0
  12. package/dist/src/adapters/index.js.map +1 -0
  13. package/dist/src/adapters/nexus.d.ts +24 -0
  14. package/dist/src/adapters/nexus.d.ts.map +1 -0
  15. package/dist/src/adapters/nexus.js +83 -0
  16. package/dist/src/adapters/nexus.js.map +1 -0
  17. package/dist/src/adapters/signaldock.d.ts +25 -0
  18. package/dist/src/adapters/signaldock.d.ts.map +1 -0
  19. package/dist/src/adapters/signaldock.js +86 -0
  20. package/dist/src/adapters/signaldock.js.map +1 -0
  21. package/dist/src/adapters/tasks.d.ts +23 -0
  22. package/dist/src/adapters/tasks.d.ts.map +1 -0
  23. package/dist/src/adapters/tasks.js +143 -0
  24. package/dist/src/adapters/tasks.js.map +1 -0
  25. package/dist/src/cleo-home.d.ts +46 -0
  26. package/dist/src/cleo-home.d.ts.map +1 -0
  27. package/dist/src/cleo-home.js +79 -0
  28. package/dist/src/cleo-home.js.map +1 -0
  29. package/dist/src/db-connections.d.ts +94 -0
  30. package/dist/src/db-connections.d.ts.map +1 -0
  31. package/dist/src/db-connections.js +130 -0
  32. package/dist/src/db-connections.js.map +1 -0
  33. package/dist/src/index.d.ts +26 -0
  34. package/dist/src/index.d.ts.map +1 -0
  35. package/dist/src/index.js +29 -0
  36. package/dist/src/index.js.map +1 -0
  37. package/dist/src/project-context.d.ts +41 -0
  38. package/dist/src/project-context.d.ts.map +1 -0
  39. package/dist/src/project-context.js +42 -0
  40. package/dist/src/project-context.js.map +1 -0
  41. package/dist/src/types.d.ts +22 -0
  42. package/dist/src/types.d.ts.map +1 -0
  43. package/dist/src/types.js +22 -0
  44. package/dist/src/types.js.map +1 -0
  45. package/dist/tsconfig.build.tsbuildinfo +1 -0
  46. package/package.json +2 -2
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Barrel for all substrate adapters.
3
+ *
4
+ * Re-exports individual adapter functions and provides the unified
5
+ * `getAllSubstrates()` function that merges results from all five databases
6
+ * into a single BrainGraph.
7
+ */
8
+ export { getBrainSubstrate } from './brain.js';
9
+ export { getConduitSubstrate } from './conduit.js';
10
+ export { getNexusSubstrate } from './nexus.js';
11
+ export { getSignaldockSubstrate } from './signaldock.js';
12
+ export { getTasksSubstrate } from './tasks.js';
13
+ import { allTyped, getNexusDb } from '../db-connections.js';
14
+ import { getBrainSubstrate } from './brain.js';
15
+ import { getConduitSubstrate } from './conduit.js';
16
+ import { getNexusSubstrate } from './nexus.js';
17
+ import { getSignaldockSubstrate } from './signaldock.js';
18
+ import { getTasksSubstrate } from './tasks.js';
19
+ /** Substrate names ordered for iteration. */
20
+ const ALL_SUBSTRATES = ['brain', 'nexus', 'tasks', 'conduit', 'signaldock'];
21
+ /** Maps substrate name to its adapter function. */
22
+ const ADAPTER_MAP = {
23
+ brain: getBrainSubstrate,
24
+ nexus: getNexusSubstrate,
25
+ tasks: getTasksSubstrate,
26
+ conduit: getConduitSubstrate,
27
+ signaldock: getSignaldockSubstrate,
28
+ };
29
+ /**
30
+ * Loads minimal stub nodes for any edge target IDs not already loaded.
31
+ *
32
+ * This second-pass loader ensures that cross-substrate edges
33
+ * (particularly brain→nexus bridges) don't reference unloaded target nodes.
34
+ *
35
+ * Stub nodes carry only minimal metadata: {id, substrate, kind, label}.
36
+ * Full details defer to side-panel click or future full-load request.
37
+ *
38
+ * @param loadedNodeIds - Set of already-loaded node IDs (substrate-prefixed).
39
+ * @param edges - All edges collected from substrates (may reference unloaded targets).
40
+ * @returns Array of stub BrainNode objects for missing targets.
41
+ */
42
+ function loadStubNodesForEdgeTargets(loadedNodeIds, edges) {
43
+ // Collect all target IDs referenced by edges but not yet loaded
44
+ const missingTargetIds = new Set();
45
+ for (const edge of edges) {
46
+ if (!loadedNodeIds.has(edge.target)) {
47
+ missingTargetIds.add(edge.target);
48
+ }
49
+ }
50
+ if (missingTargetIds.size === 0)
51
+ return [];
52
+ // Partition missing target IDs by substrate
53
+ const stubsBySubstrate = new Map();
54
+ for (const nodeId of missingTargetIds) {
55
+ const sep = nodeId.indexOf(':');
56
+ if (sep === -1)
57
+ continue;
58
+ const substrateStr = nodeId.slice(0, sep);
59
+ const substrate = substrateStr;
60
+ if (!['brain', 'nexus', 'tasks', 'conduit', 'signaldock'].includes(substrate)) {
61
+ continue;
62
+ }
63
+ if (!stubsBySubstrate.has(substrate)) {
64
+ stubsBySubstrate.set(substrate, []);
65
+ }
66
+ stubsBySubstrate.get(substrate).push(nodeId);
67
+ }
68
+ const stubs = [];
69
+ // Load stubs for nexus targets (most common cross-substrate case)
70
+ const nexusStubs = stubsBySubstrate.get('nexus');
71
+ if (nexusStubs && nexusStubs.length > 0) {
72
+ const db = getNexusDb();
73
+ if (db) {
74
+ try {
75
+ const rawNexusIds = nexusStubs.map((id) => id.replace(/^nexus:/, ''));
76
+ const placeholders = rawNexusIds.map(() => '?').join(',');
77
+ // Query minimal node data: id, kind, name
78
+ const stubRows = allTyped(db.prepare(`SELECT id, kind, name
79
+ FROM nexus_nodes
80
+ WHERE id IN (${placeholders})`), ...rawNexusIds);
81
+ for (const row of stubRows) {
82
+ const kind = row.kind === 'file' || row.kind === 'folder' || row.kind === 'module'
83
+ ? 'file'
84
+ : 'symbol';
85
+ stubs.push({
86
+ id: `nexus:${row.id}`,
87
+ kind,
88
+ substrate: 'nexus',
89
+ label: row.name,
90
+ weight: undefined,
91
+ createdAt: null,
92
+ meta: { nexus_kind: row.kind, isStub: true },
93
+ });
94
+ }
95
+ }
96
+ catch {
97
+ // Silently continue on error; stubs are supplemental
98
+ }
99
+ }
100
+ }
101
+ // For other substrates (tasks, brain, conduit, signaldock), create minimal stubs
102
+ // without DB queries — they are rare as cross-substrate edge targets.
103
+ for (const [substrate, nodeIds] of stubsBySubstrate) {
104
+ if (substrate === 'nexus')
105
+ continue; // already handled above
106
+ for (const nodeId of nodeIds) {
107
+ const rawId = nodeId.replace(new RegExp(`^${substrate}:`), '');
108
+ stubs.push({
109
+ id: nodeId,
110
+ kind: 'observation', // generic fallback kind
111
+ substrate,
112
+ label: rawId,
113
+ weight: undefined,
114
+ createdAt: null,
115
+ meta: { isStub: true },
116
+ });
117
+ }
118
+ }
119
+ return stubs;
120
+ }
121
+ /**
122
+ * Queries all five substrates and merges the results into a unified BrainGraph.
123
+ *
124
+ * When `options.substrates` is provided, only those substrates are queried.
125
+ * Node IDs are substrate-prefixed, so deduplication is safe to perform
126
+ * by ID equality alone.
127
+ *
128
+ * After all substrates are loaded, performs a second-pass stub-node load:
129
+ * any edge target ID not yet in the loaded node set is fetched as a minimal
130
+ * stub (id, substrate, kind, label). This recovers cross-substrate edges
131
+ * that would otherwise be silently dropped.
132
+ *
133
+ * Stub nodes carry `meta.isStub: true` for optional UI differentiation.
134
+ *
135
+ * @param options - Query options forwarded to each substrate adapter.
136
+ * @returns Merged BrainGraph across all requested substrates, with stub nodes for unresolved edge targets.
137
+ */
138
+ export function getAllSubstrates(options = {}) {
139
+ const substrates = options.substrates ?? ALL_SUBSTRATES;
140
+ const limit = options.limit ?? 500;
141
+ const allNodes = [];
142
+ const allEdges = [];
143
+ const nodeCounts = Object.fromEntries(ALL_SUBSTRATES.map((s) => [s, 0]));
144
+ const edgeCounts = Object.fromEntries([...ALL_SUBSTRATES, 'cross'].map((s) => [s, 0]));
145
+ for (const substrate of substrates) {
146
+ const adapter = ADAPTER_MAP[substrate];
147
+ if (!adapter)
148
+ continue;
149
+ const { nodes, edges } = adapter({ ...options, limit });
150
+ allNodes.push(...nodes);
151
+ allEdges.push(...edges);
152
+ nodeCounts[substrate] = nodes.length;
153
+ for (const edge of edges) {
154
+ edgeCounts[edge.substrate] = (edgeCounts[edge.substrate] ?? 0) + 1;
155
+ }
156
+ }
157
+ // Deduplicate nodes by ID (substrate-prefix guarantees uniqueness across
158
+ // substrates; duplicates can only occur within a substrate on malformed data)
159
+ const seenIds = new Set();
160
+ const uniqueNodes = [];
161
+ for (const node of allNodes) {
162
+ if (!seenIds.has(node.id)) {
163
+ seenIds.add(node.id);
164
+ uniqueNodes.push(node);
165
+ }
166
+ }
167
+ // Second pass: load stub nodes for any edge target IDs not yet loaded.
168
+ // This recovers cross-substrate edges that would otherwise be silently dropped
169
+ // (e.g. brain→nexus bridges to low-in-degree symbols).
170
+ //
171
+ // When a substrates filter is explicitly provided, only add stubs for substrates
172
+ // within the requested set — never inject nodes from excluded substrates, as that
173
+ // would violate the caller's filter contract.
174
+ const requestedSubstrateSet = options.substrates ? new Set(options.substrates) : null;
175
+ const stubNodes = loadStubNodesForEdgeTargets(seenIds, allEdges);
176
+ for (const stubNode of stubNodes) {
177
+ if (!seenIds.has(stubNode.id)) {
178
+ // Skip stubs from substrates not in the requested set
179
+ if (requestedSubstrateSet && !requestedSubstrateSet.has(stubNode.substrate)) {
180
+ continue;
181
+ }
182
+ seenIds.add(stubNode.id);
183
+ uniqueNodes.push(stubNode);
184
+ }
185
+ }
186
+ const truncated = uniqueNodes.length >= limit;
187
+ return {
188
+ nodes: truncated ? uniqueNodes.slice(0, limit) : uniqueNodes,
189
+ edges: allEdges,
190
+ counts: { nodes: nodeCounts, edges: edgeCounts },
191
+ truncated,
192
+ };
193
+ }
194
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * NEXUS substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries nexus.db (global) and returns BrainNodes/BrainEdges for code symbols and files.
5
+ * Prioritises high-in-degree nodes (most-called functions, most-imported files)
6
+ * since the full nexus graph can exceed 10k nodes.
7
+ *
8
+ * Node IDs are prefixed with "nexus:" to prevent collisions.
9
+ */
10
+ import type { BrainEdge, BrainNode, BrainQueryOptions } from '../types.js';
11
+ /**
12
+ * Returns all BrainNodes and BrainEdges sourced from nexus.db.
13
+ *
14
+ * Fetches the highest in-degree nodes (capped at perSubstrateLimit) and
15
+ * all relations between those nodes.
16
+ *
17
+ * @param options - Query options (limit, minWeight).
18
+ * @returns Nodes and edges from the NEXUS substrate.
19
+ */
20
+ export declare function getNexusSubstrate(options?: BrainQueryOptions): {
21
+ nodes: BrainNode[];
22
+ edges: BrainEdge[];
23
+ };
24
+ //# sourceMappingURL=nexus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus.d.ts","sourceRoot":"","sources":["../../../src/adapters/nexus.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAiB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAyB1F;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG;IAClE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAyEA"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * NEXUS substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries nexus.db (global) and returns BrainNodes/BrainEdges for code symbols and files.
5
+ * Prioritises high-in-degree nodes (most-called functions, most-imported files)
6
+ * since the full nexus graph can exceed 10k nodes.
7
+ *
8
+ * Node IDs are prefixed with "nexus:" to prevent collisions.
9
+ */
10
+ import { allTyped, getNexusDb } from '../db-connections.js';
11
+ /** Maps nexus node kinds to BrainNodeKind. */
12
+ function mapKind(nexusKind) {
13
+ if (nexusKind === 'file' || nexusKind === 'folder' || nexusKind === 'module')
14
+ return 'file';
15
+ return 'symbol';
16
+ }
17
+ /**
18
+ * Returns all BrainNodes and BrainEdges sourced from nexus.db.
19
+ *
20
+ * Fetches the highest in-degree nodes (capped at perSubstrateLimit) and
21
+ * all relations between those nodes.
22
+ *
23
+ * @param options - Query options (limit, minWeight).
24
+ * @returns Nodes and edges from the NEXUS substrate.
25
+ */
26
+ export function getNexusSubstrate(options = {}) {
27
+ const db = getNexusDb();
28
+ if (!db)
29
+ return { nodes: [], edges: [] };
30
+ const perSubstrateLimit = Math.ceil((options.limit ?? 500) / 5);
31
+ const nodes = [];
32
+ const edges = [];
33
+ try {
34
+ // Count in-degree for each node to use as weight
35
+ const nodeRows = allTyped(db.prepare(`SELECT n.id, n.kind, n.name, n.indexed_at,
36
+ COUNT(r.target_id) AS in_degree
37
+ FROM nexus_nodes n
38
+ LEFT JOIN nexus_relations r ON r.target_id = n.id
39
+ WHERE n.kind IN (
40
+ 'file', 'function', 'method', 'class', 'interface',
41
+ 'type_alias', 'constant', 'module', 'enum'
42
+ )
43
+ GROUP BY n.id
44
+ ORDER BY in_degree DESC
45
+ LIMIT ?`), perSubstrateLimit);
46
+ for (const row of nodeRows) {
47
+ nodes.push({
48
+ id: `nexus:${row.id}`,
49
+ kind: mapKind(row.kind),
50
+ substrate: 'nexus',
51
+ label: row.name,
52
+ weight: row.in_degree > 0 ? Math.min(1, row.in_degree / 50) : undefined,
53
+ createdAt: row.indexed_at ?? null,
54
+ meta: { nexus_kind: row.kind, in_degree: row.in_degree },
55
+ });
56
+ }
57
+ // Edges between loaded nodes only
58
+ const nodeIds = new Set(nodes.map((n) => n.id));
59
+ const rawIds = new Set([...nodeIds].map((id) => id.replace(/^nexus:/, '')));
60
+ // Fetch all relations touching these nodes (both directions)
61
+ const placeholders = [...rawIds].map(() => '?').join(',');
62
+ if (rawIds.size === 0)
63
+ return { nodes, edges };
64
+ const relRows = allTyped(db.prepare(`SELECT source_id, target_id, type, confidence
65
+ FROM nexus_relations
66
+ WHERE source_id IN (${placeholders})
67
+ AND target_id IN (${placeholders})`), ...rawIds, ...rawIds);
68
+ for (const row of relRows) {
69
+ edges.push({
70
+ source: `nexus:${row.source_id}`,
71
+ target: `nexus:${row.target_id}`,
72
+ type: row.type,
73
+ weight: row.confidence ?? 0.5,
74
+ substrate: 'nexus',
75
+ });
76
+ }
77
+ }
78
+ catch {
79
+ // Return partial results on error
80
+ }
81
+ return { nodes, edges };
82
+ }
83
+ //# sourceMappingURL=nexus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus.js","sourceRoot":"","sources":["../../../src/adapters/nexus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SIGNALDOCK substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries signaldock.db (global) and returns BrainNodes/BrainEdges for agents
5
+ * and agent-to-agent social connections.
6
+ *
7
+ * Node IDs are prefixed with "signaldock:" to prevent collisions.
8
+ * Agents are the cross-substrate identity bridge — they appear in TASKS
9
+ * (assignee), CONDUIT (from/to), and BRAIN (source agent).
10
+ */
11
+ import type { BrainEdge, BrainNode, BrainQueryOptions } from '../types.js';
12
+ /**
13
+ * Returns all BrainNodes and BrainEdges sourced from signaldock.db.
14
+ *
15
+ * Fetches all active agents plus their declared connections.
16
+ * Agent nodes serve as the cross-substrate identity anchors.
17
+ *
18
+ * @param options - Query options (limit).
19
+ * @returns Nodes and edges from the SIGNALDOCK substrate.
20
+ */
21
+ export declare function getSignaldockSubstrate(options?: BrainQueryOptions): {
22
+ nodes: BrainNode[];
23
+ edges: BrainEdge[];
24
+ };
25
+ //# sourceMappingURL=signaldock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signaldock.d.ts","sourceRoot":"","sources":["../../../src/adapters/signaldock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA+B3E;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,iBAAsB,GAAG;IACvE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAoEA"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * SIGNALDOCK substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries signaldock.db (global) and returns BrainNodes/BrainEdges for agents
5
+ * and agent-to-agent social connections.
6
+ *
7
+ * Node IDs are prefixed with "signaldock:" to prevent collisions.
8
+ * Agents are the cross-substrate identity bridge — they appear in TASKS
9
+ * (assignee), CONDUIT (from/to), and BRAIN (source agent).
10
+ */
11
+ import { allTyped, getSignaldockDb } from '../db-connections.js';
12
+ /**
13
+ * Converts a UNIX epoch seconds value to an ISO-8601 string.
14
+ * Returns null when the value is not a finite positive number.
15
+ *
16
+ * @param epoch - UNIX timestamp in seconds, or null.
17
+ * @returns ISO-8601 string or null.
18
+ */
19
+ function epochToIso(epoch) {
20
+ if (epoch === null || !Number.isFinite(epoch) || epoch <= 0)
21
+ return null;
22
+ return new Date(epoch * 1000).toISOString();
23
+ }
24
+ /**
25
+ * Returns all BrainNodes and BrainEdges sourced from signaldock.db.
26
+ *
27
+ * Fetches all active agents plus their declared connections.
28
+ * Agent nodes serve as the cross-substrate identity anchors.
29
+ *
30
+ * @param options - Query options (limit).
31
+ * @returns Nodes and edges from the SIGNALDOCK substrate.
32
+ */
33
+ export function getSignaldockSubstrate(options = {}) {
34
+ const db = getSignaldockDb();
35
+ if (!db)
36
+ return { nodes: [], edges: [] };
37
+ const perSubstrateLimit = Math.ceil((options.limit ?? 500) / 5);
38
+ const nodes = [];
39
+ const edges = [];
40
+ try {
41
+ // Active agents
42
+ const agentRows = allTyped(db.prepare(`SELECT agent_id, name, status, created_at
43
+ FROM agents
44
+ WHERE status != 'deleted'
45
+ ORDER BY created_at DESC
46
+ LIMIT ?`), perSubstrateLimit);
47
+ const agentIds = new Set();
48
+ for (const row of agentRows) {
49
+ agentIds.add(row.agent_id);
50
+ nodes.push({
51
+ id: `signaldock:${row.agent_id}`,
52
+ kind: 'agent',
53
+ substrate: 'signaldock',
54
+ label: row.name,
55
+ weight: row.status === 'active' ? 1.0 : 0.5,
56
+ createdAt: epochToIso(row.created_at),
57
+ meta: {
58
+ status: row.status,
59
+ created_at: row.created_at,
60
+ },
61
+ });
62
+ }
63
+ // Agent connections (declared social graph)
64
+ if (agentIds.size > 0) {
65
+ const placeholders = [...agentIds].map(() => '?').join(',');
66
+ const connRows = allTyped(db.prepare(`SELECT from_agent_id, to_agent_id, connection_type, strength
67
+ FROM agent_connections
68
+ WHERE from_agent_id IN (${placeholders})
69
+ AND to_agent_id IN (${placeholders})`), ...agentIds, ...agentIds);
70
+ for (const row of connRows) {
71
+ edges.push({
72
+ source: `signaldock:${row.from_agent_id}`,
73
+ target: `signaldock:${row.to_agent_id}`,
74
+ type: row.connection_type,
75
+ weight: row.strength ?? 0.5,
76
+ substrate: 'signaldock',
77
+ });
78
+ }
79
+ }
80
+ }
81
+ catch {
82
+ // Return partial results on error
83
+ }
84
+ return { nodes, edges };
85
+ }
86
+ //# sourceMappingURL=signaldock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signaldock.js","sourceRoot":"","sources":["../../../src/adapters/signaldock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAYjE;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,KAAoB;IACtC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B,EAAE;IAIpE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAEzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,SAAS,GAAG,QAAQ,CACxB,EAAE,CAAC,OAAO,CACR;;;;iBAIS,CACV,EACD,iBAAiB,CAClB,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,cAAc,GAAG,CAAC,QAAQ,EAAE;gBAChC,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,YAAY;gBACvB,KAAK,EAAE,GAAG,CAAC,IAAI;gBACf,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBAC3C,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;gBACrC,IAAI,EAAE;oBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B;aACF,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,QAAQ,CACvB,EAAE,CAAC,OAAO,CACR;;qCAE2B,YAAY;mCACd,YAAY,GAAG,CACzC,EACD,GAAG,QAAQ,EACX,GAAG,QAAQ,CACZ,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,cAAc,GAAG,CAAC,aAAa,EAAE;oBACzC,MAAM,EAAE,cAAc,GAAG,CAAC,WAAW,EAAE;oBACvC,IAAI,EAAE,GAAG,CAAC,eAAe;oBACzB,MAAM,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG;oBAC3B,SAAS,EAAE,YAAY;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TASKS substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries tasks.db and returns BrainNodes/BrainEdges for tasks and sessions.
5
+ * Prioritises critical/high priority tasks and active sessions.
6
+ *
7
+ * Node IDs are prefixed with "tasks:" to prevent collisions.
8
+ */
9
+ import type { BrainEdge, BrainNode, BrainQueryOptions } from '../types.js';
10
+ /**
11
+ * Returns all BrainNodes and BrainEdges sourced from tasks.db.
12
+ *
13
+ * Fetches tasks ordered by priority, plus recent sessions.
14
+ * Synthesizes parent→child, dependency, and relation edges.
15
+ *
16
+ * @param options - Query options (limit, minWeight).
17
+ * @returns Nodes and edges from the TASKS substrate.
18
+ */
19
+ export declare function getTasksSubstrate(options?: BrainQueryOptions): {
20
+ nodes: BrainNode[];
21
+ edges: BrainEdge[];
22
+ };
23
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/adapters/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA6C3E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG;IAClE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CA+IA"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * TASKS substrate adapter for the Living Brain API.
3
+ *
4
+ * Queries tasks.db and returns BrainNodes/BrainEdges for tasks and sessions.
5
+ * Prioritises critical/high priority tasks and active sessions.
6
+ *
7
+ * Node IDs are prefixed with "tasks:" to prevent collisions.
8
+ */
9
+ import { allTyped, getTasksDb } from '../db-connections.js';
10
+ import { resolveDefaultProjectContext } from '../project-context.js';
11
+ /** Maps priority string to numeric weight for BrainNode.weight. */
12
+ function priorityWeight(priority) {
13
+ const map = {
14
+ critical: 1.0,
15
+ high: 0.75,
16
+ medium: 0.5,
17
+ low: 0.25,
18
+ };
19
+ return map[priority] ?? 0.25;
20
+ }
21
+ /**
22
+ * Returns all BrainNodes and BrainEdges sourced from tasks.db.
23
+ *
24
+ * Fetches tasks ordered by priority, plus recent sessions.
25
+ * Synthesizes parent→child, dependency, and relation edges.
26
+ *
27
+ * @param options - Query options (limit, minWeight).
28
+ * @returns Nodes and edges from the TASKS substrate.
29
+ */
30
+ export function getTasksSubstrate(options = {}) {
31
+ const ctx = options.projectCtx ?? resolveDefaultProjectContext();
32
+ const db = getTasksDb(ctx);
33
+ if (!db)
34
+ return { nodes: [], edges: [] };
35
+ const perSubstrateLimit = Math.ceil((options.limit ?? 500) / 5);
36
+ const minWeight = options.minWeight ?? 0;
37
+ const nodes = [];
38
+ const edges = [];
39
+ try {
40
+ // Tasks (prioritised by severity, then recency)
41
+ const taskRows = allTyped(db.prepare(`SELECT id, title, status, priority, type, parent_id, created_at
42
+ FROM tasks
43
+ WHERE status NOT IN ('archived', 'cancelled')
44
+ ORDER BY
45
+ CASE priority
46
+ WHEN 'critical' THEN 0 WHEN 'high' THEN 1 WHEN 'medium' THEN 2 ELSE 3
47
+ END,
48
+ created_at DESC
49
+ LIMIT ?`), Math.ceil(perSubstrateLimit * 0.8));
50
+ const taskIds = new Set();
51
+ for (const row of taskRows) {
52
+ const weight = priorityWeight(row.priority);
53
+ if (weight < minWeight)
54
+ continue;
55
+ taskIds.add(row.id);
56
+ nodes.push({
57
+ id: `tasks:${row.id}`,
58
+ kind: 'task',
59
+ substrate: 'tasks',
60
+ label: row.title,
61
+ weight,
62
+ createdAt: row.created_at,
63
+ meta: {
64
+ status: row.status,
65
+ priority: row.priority,
66
+ type: row.type,
67
+ parent_id: row.parent_id,
68
+ created_at: row.created_at,
69
+ },
70
+ });
71
+ }
72
+ // Sessions (most recent)
73
+ const sessionRows = allTyped(db.prepare(`SELECT id, status, started_at, ended_at
74
+ FROM sessions
75
+ ORDER BY started_at DESC
76
+ LIMIT ?`), Math.ceil(perSubstrateLimit * 0.2));
77
+ const sessionIds = new Set();
78
+ for (const row of sessionRows) {
79
+ sessionIds.add(row.id);
80
+ nodes.push({
81
+ id: `tasks:${row.id}`,
82
+ kind: 'session',
83
+ substrate: 'tasks',
84
+ label: `Session ${row.id.slice(-8)}`,
85
+ weight: row.status === 'active' ? 0.9 : 0.4,
86
+ createdAt: row.started_at,
87
+ meta: {
88
+ status: row.status,
89
+ started_at: row.started_at,
90
+ ended_at: row.ended_at,
91
+ },
92
+ });
93
+ }
94
+ // Parent → child task edges
95
+ for (const row of taskRows) {
96
+ if (row.parent_id && taskIds.has(row.parent_id)) {
97
+ edges.push({
98
+ source: `tasks:${row.parent_id}`,
99
+ target: `tasks:${row.id}`,
100
+ type: 'parent_of',
101
+ weight: 0.9,
102
+ substrate: 'tasks',
103
+ });
104
+ }
105
+ }
106
+ // Task relations
107
+ if (taskIds.size > 0) {
108
+ const placeholders = [...taskIds].map(() => '?').join(',');
109
+ const relRows = allTyped(db.prepare(`SELECT task_id, related_task_id, relation_type
110
+ FROM task_relations
111
+ WHERE task_id IN (${placeholders})
112
+ AND related_task_id IN (${placeholders})`), ...taskIds, ...taskIds);
113
+ for (const row of relRows) {
114
+ edges.push({
115
+ source: `tasks:${row.task_id}`,
116
+ target: `tasks:${row.related_task_id}`,
117
+ type: row.relation_type,
118
+ weight: 0.7,
119
+ substrate: 'tasks',
120
+ });
121
+ }
122
+ // Task dependencies
123
+ const depRows = allTyped(db.prepare(`SELECT task_id, depends_on_task_id
124
+ FROM task_dependencies
125
+ WHERE task_id IN (${placeholders})
126
+ AND depends_on_task_id IN (${placeholders})`), ...taskIds, ...taskIds);
127
+ for (const row of depRows) {
128
+ edges.push({
129
+ source: `tasks:${row.task_id}`,
130
+ target: `tasks:${row.depends_on_task_id}`,
131
+ type: 'depends_on',
132
+ weight: 0.85,
133
+ substrate: 'tasks',
134
+ });
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // Return partial results on error
140
+ }
141
+ return { nodes, edges };
142
+ }
143
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/adapters/tasks.ts"],"names":[],"mappings":"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"}