@soleri/core 8.0.0 → 9.0.0

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 (239) hide show
  1. package/dist/brain/brain.d.ts +1 -8
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +5 -134
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/knowledge-synthesizer.d.ts.map +1 -1
  6. package/dist/brain/knowledge-synthesizer.js +0 -2
  7. package/dist/brain/knowledge-synthesizer.js.map +1 -1
  8. package/dist/cognee/client.d.ts +5 -0
  9. package/dist/cognee/client.d.ts.map +1 -1
  10. package/dist/cognee/client.js +83 -16
  11. package/dist/cognee/client.js.map +1 -1
  12. package/dist/cognee/sync-manager.d.ts +67 -8
  13. package/dist/cognee/sync-manager.d.ts.map +1 -1
  14. package/dist/cognee/sync-manager.js +129 -32
  15. package/dist/cognee/sync-manager.js.map +1 -1
  16. package/dist/cognee/types.d.ts +16 -0
  17. package/dist/cognee/types.d.ts.map +1 -1
  18. package/dist/context/context-engine.d.ts +2 -5
  19. package/dist/context/context-engine.d.ts.map +1 -1
  20. package/dist/context/context-engine.js +4 -31
  21. package/dist/context/context-engine.js.map +1 -1
  22. package/dist/curator/classifier.d.ts.map +1 -1
  23. package/dist/curator/classifier.js +0 -2
  24. package/dist/curator/classifier.js.map +1 -1
  25. package/dist/curator/curator.d.ts +2 -5
  26. package/dist/curator/curator.d.ts.map +1 -1
  27. package/dist/curator/curator.js +4 -23
  28. package/dist/curator/curator.js.map +1 -1
  29. package/dist/curator/quality-gate.d.ts.map +1 -1
  30. package/dist/curator/quality-gate.js +0 -2
  31. package/dist/curator/quality-gate.js.map +1 -1
  32. package/dist/domain-packs/index.d.ts +0 -3
  33. package/dist/domain-packs/index.d.ts.map +1 -1
  34. package/dist/domain-packs/index.js +0 -3
  35. package/dist/domain-packs/index.js.map +1 -1
  36. package/dist/domain-packs/loader.d.ts.map +1 -1
  37. package/dist/domain-packs/loader.js +20 -4
  38. package/dist/domain-packs/loader.js.map +1 -1
  39. package/dist/domain-packs/pack-runtime.d.ts +5 -5
  40. package/dist/domain-packs/pack-runtime.d.ts.map +1 -1
  41. package/dist/domain-packs/pack-runtime.js +2 -2
  42. package/dist/domain-packs/pack-runtime.js.map +1 -1
  43. package/dist/domain-packs/types.d.ts +8 -2
  44. package/dist/domain-packs/types.d.ts.map +1 -1
  45. package/dist/domain-packs/types.js.map +1 -1
  46. package/dist/engine/bin/soleri-engine.js +18 -7
  47. package/dist/engine/bin/soleri-engine.js.map +1 -1
  48. package/dist/engine/core-ops.d.ts.map +1 -1
  49. package/dist/engine/core-ops.js +11 -6
  50. package/dist/engine/core-ops.js.map +1 -1
  51. package/dist/engine/index.d.ts +2 -0
  52. package/dist/engine/index.d.ts.map +1 -1
  53. package/dist/engine/index.js +1 -0
  54. package/dist/engine/index.js.map +1 -1
  55. package/dist/engine/module-manifest.d.ts +28 -0
  56. package/dist/engine/module-manifest.d.ts.map +1 -0
  57. package/dist/engine/module-manifest.js +85 -0
  58. package/dist/engine/module-manifest.js.map +1 -0
  59. package/dist/engine/register-engine.d.ts +19 -0
  60. package/dist/engine/register-engine.d.ts.map +1 -1
  61. package/dist/engine/register-engine.js +15 -9
  62. package/dist/engine/register-engine.js.map +1 -1
  63. package/dist/index.d.ts +5 -6
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -5
  66. package/dist/index.js.map +1 -1
  67. package/dist/intake/content-classifier.d.ts.map +1 -1
  68. package/dist/intake/content-classifier.js +0 -2
  69. package/dist/intake/content-classifier.js.map +1 -1
  70. package/dist/intelligence/types.d.ts +7 -0
  71. package/dist/intelligence/types.d.ts.map +1 -1
  72. package/dist/llm/llm-client.d.ts.map +1 -1
  73. package/dist/llm/llm-client.js +8 -4
  74. package/dist/llm/llm-client.js.map +1 -1
  75. package/dist/llm/oauth-discovery.d.ts +0 -8
  76. package/dist/llm/oauth-discovery.d.ts.map +1 -1
  77. package/dist/llm/oauth-discovery.js +0 -19
  78. package/dist/llm/oauth-discovery.js.map +1 -1
  79. package/dist/llm/types.d.ts +4 -2
  80. package/dist/llm/types.d.ts.map +1 -1
  81. package/dist/packs/pack-installer.d.ts +2 -1
  82. package/dist/packs/pack-installer.d.ts.map +1 -1
  83. package/dist/packs/pack-installer.js +10 -1
  84. package/dist/packs/pack-installer.js.map +1 -1
  85. package/dist/persistence/index.d.ts +0 -1
  86. package/dist/persistence/index.d.ts.map +1 -1
  87. package/dist/persistence/index.js +0 -1
  88. package/dist/persistence/index.js.map +1 -1
  89. package/dist/persistence/types.d.ts +2 -6
  90. package/dist/persistence/types.d.ts.map +1 -1
  91. package/dist/persona/defaults.d.ts +16 -0
  92. package/dist/persona/defaults.d.ts.map +1 -0
  93. package/dist/persona/defaults.js +78 -0
  94. package/dist/persona/defaults.js.map +1 -0
  95. package/dist/persona/index.d.ts +5 -0
  96. package/dist/persona/index.d.ts.map +1 -0
  97. package/dist/persona/index.js +4 -0
  98. package/dist/persona/index.js.map +1 -0
  99. package/dist/persona/loader.d.ts +11 -0
  100. package/dist/persona/loader.d.ts.map +1 -0
  101. package/dist/persona/loader.js +45 -0
  102. package/dist/persona/loader.js.map +1 -0
  103. package/dist/persona/prompt-generator.d.ts +13 -0
  104. package/dist/persona/prompt-generator.d.ts.map +1 -0
  105. package/dist/persona/prompt-generator.js +89 -0
  106. package/dist/persona/prompt-generator.js.map +1 -0
  107. package/dist/persona/types.d.ts +56 -0
  108. package/dist/persona/types.d.ts.map +1 -0
  109. package/dist/persona/types.js +9 -0
  110. package/dist/persona/types.js.map +1 -0
  111. package/dist/plugins/index.d.ts +4 -0
  112. package/dist/plugins/index.d.ts.map +1 -1
  113. package/dist/plugins/index.js +4 -0
  114. package/dist/plugins/index.js.map +1 -1
  115. package/dist/plugins/plugin-registry.d.ts +4 -0
  116. package/dist/plugins/plugin-registry.d.ts.map +1 -1
  117. package/dist/plugins/plugin-registry.js +4 -0
  118. package/dist/plugins/plugin-registry.js.map +1 -1
  119. package/dist/plugins/types.d.ts +36 -31
  120. package/dist/plugins/types.d.ts.map +1 -1
  121. package/dist/plugins/types.js +6 -3
  122. package/dist/plugins/types.js.map +1 -1
  123. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  124. package/dist/runtime/admin-extra-ops.js +5 -27
  125. package/dist/runtime/admin-extra-ops.js.map +1 -1
  126. package/dist/runtime/admin-ops.d.ts.map +1 -1
  127. package/dist/runtime/admin-ops.js +5 -37
  128. package/dist/runtime/admin-ops.js.map +1 -1
  129. package/dist/runtime/capture-ops.d.ts.map +1 -1
  130. package/dist/runtime/capture-ops.js +32 -16
  131. package/dist/runtime/capture-ops.js.map +1 -1
  132. package/dist/runtime/claude-md-helpers.d.ts +0 -9
  133. package/dist/runtime/claude-md-helpers.d.ts.map +1 -1
  134. package/dist/runtime/claude-md-helpers.js +1 -14
  135. package/dist/runtime/claude-md-helpers.js.map +1 -1
  136. package/dist/runtime/cognee-sync-ops.d.ts +2 -2
  137. package/dist/runtime/cognee-sync-ops.d.ts.map +1 -1
  138. package/dist/runtime/cognee-sync-ops.js +45 -7
  139. package/dist/runtime/cognee-sync-ops.js.map +1 -1
  140. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  141. package/dist/runtime/facades/admin-facade.js +1 -2
  142. package/dist/runtime/facades/admin-facade.js.map +1 -1
  143. package/dist/runtime/facades/index.d.ts +1 -1
  144. package/dist/runtime/facades/index.d.ts.map +1 -1
  145. package/dist/runtime/facades/index.js +1 -10
  146. package/dist/runtime/facades/index.js.map +1 -1
  147. package/dist/runtime/pack-ops.d.ts +3 -0
  148. package/dist/runtime/pack-ops.d.ts.map +1 -1
  149. package/dist/runtime/pack-ops.js +18 -1
  150. package/dist/runtime/pack-ops.js.map +1 -1
  151. package/dist/runtime/plugin-ops.d.ts.map +1 -1
  152. package/dist/runtime/plugin-ops.js +3 -0
  153. package/dist/runtime/plugin-ops.js.map +1 -1
  154. package/dist/runtime/runtime.d.ts.map +1 -1
  155. package/dist/runtime/runtime.js +14 -53
  156. package/dist/runtime/runtime.js.map +1 -1
  157. package/dist/runtime/session-briefing.d.ts.map +1 -1
  158. package/dist/runtime/session-briefing.js +14 -0
  159. package/dist/runtime/session-briefing.js.map +1 -1
  160. package/dist/runtime/types.d.ts +6 -8
  161. package/dist/runtime/types.d.ts.map +1 -1
  162. package/dist/runtime/vault-linking-ops.d.ts.map +1 -1
  163. package/dist/runtime/vault-linking-ops.js +42 -4
  164. package/dist/runtime/vault-linking-ops.js.map +1 -1
  165. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
  166. package/dist/runtime/vault-sharing-ops.js +53 -3
  167. package/dist/runtime/vault-sharing-ops.js.map +1 -1
  168. package/dist/vault/linking.d.ts +37 -0
  169. package/dist/vault/linking.d.ts.map +1 -1
  170. package/dist/vault/linking.js +73 -0
  171. package/dist/vault/linking.js.map +1 -1
  172. package/dist/vault/vault.d.ts +9 -2
  173. package/dist/vault/vault.d.ts.map +1 -1
  174. package/dist/vault/vault.js +21 -12
  175. package/dist/vault/vault.js.map +1 -1
  176. package/package.json +6 -4
  177. package/src/__tests__/curator-pipeline-e2e.test.ts +187 -0
  178. package/src/__tests__/module-manifest-drift.test.ts +59 -0
  179. package/src/brain/brain.ts +4 -157
  180. package/src/brain/knowledge-synthesizer.ts +0 -2
  181. package/src/context/context-engine.ts +3 -31
  182. package/src/curator/classifier.ts +0 -2
  183. package/src/curator/curator.ts +5 -28
  184. package/src/curator/quality-gate.ts +0 -2
  185. package/src/domain-packs/index.ts +0 -6
  186. package/src/domain-packs/loader.ts +25 -5
  187. package/src/domain-packs/pack-runtime.ts +6 -6
  188. package/src/domain-packs/types.ts +8 -2
  189. package/src/engine/bin/soleri-engine.ts +23 -7
  190. package/src/engine/core-ops.ts +11 -6
  191. package/src/engine/index.ts +2 -0
  192. package/src/engine/module-manifest.ts +99 -0
  193. package/src/engine/register-engine.ts +21 -9
  194. package/src/index.ts +20 -17
  195. package/src/intake/content-classifier.ts +0 -2
  196. package/src/intelligence/types.ts +8 -0
  197. package/src/llm/llm-client.ts +12 -6
  198. package/src/llm/oauth-discovery.ts +0 -18
  199. package/src/llm/types.ts +4 -2
  200. package/src/packs/pack-installer.ts +16 -1
  201. package/src/persistence/index.ts +0 -1
  202. package/src/persistence/types.ts +2 -6
  203. package/src/persona/defaults.ts +96 -0
  204. package/src/persona/index.ts +9 -0
  205. package/src/persona/loader.ts +50 -0
  206. package/src/persona/prompt-generator.ts +109 -0
  207. package/src/persona/types.ts +72 -0
  208. package/src/plugins/index.ts +4 -0
  209. package/src/plugins/plugin-registry.ts +6 -1
  210. package/src/plugins/types.ts +10 -5
  211. package/src/runtime/admin-extra-ops.ts +5 -28
  212. package/src/runtime/admin-ops.ts +5 -38
  213. package/src/runtime/capture-ops.ts +33 -14
  214. package/src/runtime/claude-md-helpers.ts +1 -19
  215. package/src/runtime/facades/admin-facade.ts +1 -2
  216. package/src/runtime/facades/index.ts +1 -11
  217. package/src/runtime/pack-ops.ts +26 -1
  218. package/src/runtime/plugin-ops.ts +3 -0
  219. package/src/runtime/runtime.ts +14 -54
  220. package/src/runtime/session-briefing.ts +14 -0
  221. package/src/runtime/types.ts +6 -8
  222. package/src/runtime/vault-linking-ops.ts +43 -4
  223. package/src/runtime/vault-sharing-ops.ts +63 -4
  224. package/src/vault/linking.ts +94 -0
  225. package/src/vault/vault.ts +24 -12
  226. package/src/__tests__/cognee-client-gaps.test.ts +0 -474
  227. package/src/__tests__/cognee-client.test.ts +0 -524
  228. package/src/__tests__/cognee-hybrid-search.test.ts +0 -492
  229. package/src/__tests__/cognee-integration.test.ts +0 -80
  230. package/src/__tests__/cognee-sync-manager-deep.test.ts +0 -654
  231. package/src/__tests__/cognee-sync-manager.test.ts +0 -104
  232. package/src/__tests__/postgres-provider.test.ts +0 -116
  233. package/src/cognee/client.ts +0 -370
  234. package/src/cognee/sync-manager.ts +0 -389
  235. package/src/cognee/types.ts +0 -62
  236. package/src/health/doctor-checks.ts +0 -115
  237. package/src/persistence/postgres-provider.ts +0 -310
  238. package/src/runtime/cognee-sync-ops.ts +0 -63
  239. package/src/runtime/facades/cognee-facade.ts +0 -164
@@ -1,310 +0,0 @@
1
- /**
2
- * PostgreSQL persistence provider.
3
- *
4
- * Implements PersistenceProvider with pg.Pool. The translateSql() function
5
- * converts SQLite-style queries to PostgreSQL-compatible syntax.
6
- *
7
- * Architecture: Dual interface — sync methods implement PersistenceProvider
8
- * for drop-in compatibility, async methods provide the real implementation.
9
- *
10
- * Sync methods use execFileSync (safe, no shell injection) to run queries
11
- * in a subprocess. This is slower than native async but maintains interface
12
- * compliance with zero additional dependencies.
13
- *
14
- * For high-performance use, prefer the async methods directly:
15
- * await provider.queryAsync(sql, params)
16
- * await provider.runAsync(sql, params)
17
- */
18
-
19
- import { execFileSync } from 'node:child_process';
20
- import type {
21
- PersistenceProvider,
22
- PersistenceParams,
23
- RunResult,
24
- FtsSearchOptions,
25
- } from './types.js';
26
-
27
- // =============================================================================
28
- // SQL TRANSLATION
29
- // =============================================================================
30
-
31
- /**
32
- * Translate SQLite-style SQL to PostgreSQL-compatible SQL.
33
- *
34
- * - Converts positional `?` params to `$1, $2, ...`
35
- * - Converts named `@name` params to `$N` positional, returns ordered values
36
- * - Replaces `unixepoch()` with `EXTRACT(EPOCH FROM NOW())::integer`
37
- * - Replaces `INTEGER PRIMARY KEY AUTOINCREMENT` with `SERIAL PRIMARY KEY`
38
- * - Strips SQLite `PRAGMA` statements
39
- * - Converts `INSERT OR IGNORE` to `INSERT ... ON CONFLICT DO NOTHING`
40
- * - Converts `INSERT OR REPLACE` to PostgreSQL upsert syntax
41
- */
42
- export function translateSql(
43
- sql: string,
44
- params?: PersistenceParams,
45
- ): { sql: string; values: unknown[] } {
46
- let translated = sql
47
- .replace(/unixepoch\(\)/gi, 'EXTRACT(EPOCH FROM NOW())::integer')
48
- .replace(/INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/gi, 'SERIAL PRIMARY KEY')
49
- .replace(/PRAGMA\s+[^;]+;?/gi, '-- pragma removed')
50
- .replace(/INSERT\s+OR\s+IGNORE/gi, 'INSERT')
51
- .replace(/INSERT\s+OR\s+REPLACE/gi, 'INSERT');
52
-
53
- if (!params) return { sql: translated, values: [] };
54
-
55
- if (Array.isArray(params)) {
56
- let idx = 0;
57
- translated = translated.replace(/\?/g, () => `$${++idx}`);
58
- return { sql: translated, values: params };
59
- }
60
-
61
- // Named params: @name -> $N
62
- const values: unknown[] = [];
63
- const nameMap = new Map<string, number>();
64
- translated = translated.replace(/@(\w+)/g, (_match, name: string) => {
65
- if (!nameMap.has(name)) {
66
- nameMap.set(name, values.length + 1);
67
- values.push(params[name]);
68
- }
69
- return `$${nameMap.get(name)}`;
70
- });
71
- return { sql: translated, values };
72
- }
73
-
74
- // =============================================================================
75
- // POSTGRESQL PROVIDER
76
- // =============================================================================
77
-
78
- /**
79
- * PostgreSQL persistence provider.
80
- *
81
- * Uses `pg` (optional peer dependency) via subprocess for sync interface compliance.
82
- * Created via async factory `PostgresPersistenceProvider.create()`.
83
- *
84
- * For production use, prefer the async methods directly:
85
- * ```ts
86
- * const rows = await provider.queryAsync('SELECT * FROM entries WHERE domain = $1', ['design']);
87
- * ```
88
- */
89
- export class PostgresPersistenceProvider implements PersistenceProvider {
90
- readonly backend = 'postgres' as const;
91
- private connectionString: string;
92
- private pool: unknown = null;
93
- private inTransaction = false;
94
-
95
- private constructor(connectionString: string) {
96
- this.connectionString = connectionString;
97
- }
98
-
99
- /**
100
- * Async factory. Dynamically imports `pg` (optional dependency).
101
- * Verifies connection before returning.
102
- */
103
- static async create(
104
- connectionString: string,
105
- poolSize = 10,
106
- ): Promise<PostgresPersistenceProvider> {
107
- const provider = new PostgresPersistenceProvider(connectionString);
108
-
109
- // Dynamically import pg and create pool
110
- const { default: pg } = await import('pg');
111
- provider.pool = new pg.Pool({
112
- connectionString,
113
- max: poolSize,
114
- idleTimeoutMillis: 30_000,
115
- });
116
-
117
- // Verify connection
118
- const client = await (
119
- provider.pool as {
120
- connect(): Promise<{ release(): void; query(s: string): Promise<unknown> }>;
121
- }
122
- ).connect();
123
- await client.query('SELECT 1');
124
- client.release();
125
-
126
- return provider;
127
- }
128
-
129
- /**
130
- * Create a provider for sync-only use (no pg pool needed).
131
- * Uses subprocess execution for all queries.
132
- */
133
- static createSync(connectionString: string): PostgresPersistenceProvider {
134
- return new PostgresPersistenceProvider(connectionString);
135
- }
136
-
137
- // ─── Async methods (preferred for performance) ─────────
138
-
139
- /**
140
- * Execute a query asynchronously. Returns rows.
141
- */
142
- async queryAsync<T = Record<string, unknown>>(sql: string, values?: unknown[]): Promise<T[]> {
143
- if (!this.pool)
144
- throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
145
- const result = await (
146
- this.pool as { query(s: string, v?: unknown[]): Promise<{ rows: T[] }> }
147
- ).query(sql, values);
148
- return result.rows;
149
- }
150
-
151
- /**
152
- * Execute a command asynchronously. Returns row count.
153
- */
154
- async runAsync(sql: string, values?: unknown[]): Promise<number> {
155
- if (!this.pool)
156
- throw new Error('Pool not initialized. Use PostgresPersistenceProvider.create()');
157
- const result = await (
158
- this.pool as { query(s: string, v?: unknown[]): Promise<{ rowCount: number }> }
159
- ).query(sql, values);
160
- return result.rowCount ?? 0;
161
- }
162
-
163
- // ─── Sync PersistenceProvider interface ─────────────────
164
- // Uses execFileSync subprocess bridge for sync compliance.
165
- // Safe: execFileSync does not use shell (no injection risk).
166
-
167
- execSql(sql: string): void {
168
- const statements = sql
169
- .split(';')
170
- .map((s) => s.trim())
171
- .filter((s) => s.length > 0 && !s.startsWith('--'));
172
-
173
- for (const stmt of statements) {
174
- const { sql: pgSql } = translateSql(stmt);
175
- if (pgSql.includes('CREATE VIRTUAL TABLE') || pgSql.includes('CREATE TRIGGER')) continue;
176
- if (pgSql.trim().startsWith('--')) continue;
177
- this.execSyncQuery(pgSql);
178
- }
179
- }
180
-
181
- run(sql: string, params?: PersistenceParams): RunResult {
182
- const { sql: pgSql, values } = translateSql(sql, params);
183
- const result = this.execSyncQuery(pgSql, values);
184
- return {
185
- changes: result.rowCount ?? 0,
186
- lastInsertRowid: 0,
187
- };
188
- }
189
-
190
- get<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T | undefined {
191
- const { sql: pgSql, values } = translateSql(sql, params);
192
- const result = this.execSyncQuery(pgSql, values);
193
- return result.rows?.[0] as T | undefined;
194
- }
195
-
196
- all<T = Record<string, unknown>>(sql: string, params?: PersistenceParams): T[] {
197
- const { sql: pgSql, values } = translateSql(sql, params);
198
- const result = this.execSyncQuery(pgSql, values);
199
- return (result.rows ?? []) as T[];
200
- }
201
-
202
- transaction<T>(fn: () => T): T {
203
- this.execSyncQuery('BEGIN');
204
- this.inTransaction = true;
205
- try {
206
- const result = fn();
207
- this.execSyncQuery('COMMIT');
208
- this.inTransaction = false;
209
- return result;
210
- } catch (err) {
211
- this.execSyncQuery('ROLLBACK');
212
- this.inTransaction = false;
213
- throw err;
214
- }
215
- }
216
-
217
- ftsSearch<T = Record<string, unknown>>(
218
- table: string,
219
- query: string,
220
- options?: FtsSearchOptions,
221
- ): T[] {
222
- const limit = options?.limit ?? 50;
223
- const offset = options?.offset ?? 0;
224
- const filters = options?.filters ?? {};
225
- const values: unknown[] = [query];
226
- let paramIdx = 2;
227
-
228
- const filterClauses: string[] = [];
229
- for (const [key, value] of Object.entries(filters)) {
230
- filterClauses.push(`${key} = $${paramIdx}`);
231
- values.push(value);
232
- paramIdx++;
233
- }
234
-
235
- const whereExtra = filterClauses.length > 0 ? `AND ${filterClauses.join(' AND ')}` : '';
236
- const orderClause =
237
- options?.orderByRank !== false
238
- ? "ORDER BY ts_rank(to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')), plainto_tsquery('english', $1)) DESC"
239
- : '';
240
-
241
- const sql = `SELECT * FROM ${table} WHERE to_tsvector('english', COALESCE(title,'') || ' ' || COALESCE(description,'')) @@ plainto_tsquery('english', $1) ${whereExtra} ${orderClause} LIMIT $${paramIdx} OFFSET $${paramIdx + 1}`;
242
- values.push(limit, offset);
243
-
244
- const result = this.execSyncQuery(sql, values);
245
- return (result.rows ?? []) as T[];
246
- }
247
-
248
- ftsRebuild(_table: string): void {
249
- // PostgreSQL GIN indexes are maintained automatically
250
- }
251
-
252
- close(): void {
253
- if (this.pool) {
254
- void (this.pool as { end(): Promise<void> }).end();
255
- this.pool = null;
256
- }
257
- }
258
-
259
- /** Get the connection string (for diagnostics). */
260
- getConnectionString(): string {
261
- return this.connectionString;
262
- }
263
-
264
- // ─── Sync subprocess bridge ────────────────────────────
265
- // Uses execFileSync (no shell, safe from injection).
266
- // SQL and values are passed via environment variables, not shell arguments.
267
-
268
- private execSyncQuery(sql: string, values?: unknown[]): { rows: unknown[]; rowCount: number } {
269
- // Build a Node.js script that connects, queries, and outputs JSON
270
- const script = [
271
- "const pg = require('pg');",
272
- 'const client = new pg.Client({ connectionString: process.env.PG_CONN });',
273
- '(async () => {',
274
- ' await client.connect();',
275
- ' try {',
276
- ' const result = await client.query(',
277
- ` ${JSON.stringify(sql)},`,
278
- " JSON.parse(process.env.PG_VALUES || '[]')",
279
- ' );',
280
- ' process.stdout.write(JSON.stringify({',
281
- ' rows: result.rows || [],',
282
- ' rowCount: result.rowCount || 0',
283
- ' }));',
284
- ' } finally {',
285
- ' await client.end();',
286
- ' }',
287
- '})().catch(err => {',
288
- ' process.stderr.write(err.message);',
289
- ' process.exit(1);',
290
- '});',
291
- ].join('\n');
292
-
293
- try {
294
- // execFileSync with array args — no shell, safe from injection
295
- const output = execFileSync('node', ['-e', script], {
296
- encoding: 'utf-8',
297
- timeout: 30_000,
298
- env: {
299
- ...process.env,
300
- PG_CONN: this.connectionString,
301
- PG_VALUES: JSON.stringify(values ?? []),
302
- },
303
- });
304
- return JSON.parse(output || '{"rows":[],"rowCount":0}');
305
- } catch (err) {
306
- const msg = err instanceof Error ? err.message : String(err);
307
- throw new Error(`PostgreSQL query failed: ${msg}`, { cause: err });
308
- }
309
- }
310
- }
@@ -1,63 +0,0 @@
1
- /**
2
- * Cognee sync operations — 3 ops for queue visibility and control.
3
- */
4
-
5
- import { z } from 'zod';
6
- import type { OpDefinition } from '../facades/types.js';
7
- import type { CogneeSyncManager } from '../cognee/sync-manager.js';
8
-
9
- /**
10
- * Create the 3 cognee-sync operations.
11
- *
12
- * The sync manager is optional — when null, all ops return a graceful error.
13
- */
14
- export function createCogneeSyncOps(syncManager: CogneeSyncManager | null): OpDefinition[] {
15
- return [
16
- // ─── Status ──────────────────────────────────────────────────
17
- {
18
- name: 'cognee_sync_status',
19
- description:
20
- 'Get current cognee sync queue stats — pending, processing, completed, failed counts.',
21
- auth: 'read',
22
- schema: z.object({}),
23
- handler: async () => {
24
- if (!syncManager) {
25
- return { error: 'Sync manager not configured' };
26
- }
27
- return syncManager.getStats();
28
- },
29
- },
30
-
31
- // ─── Drain ───────────────────────────────────────────────────
32
- {
33
- name: 'cognee_sync_drain',
34
- description:
35
- 'Process pending items in the cognee sync queue. Returns count of processed items and updated stats.',
36
- auth: 'write',
37
- schema: z.object({}),
38
- handler: async () => {
39
- if (!syncManager) {
40
- return { error: 'Sync manager not configured' };
41
- }
42
- const processed = await syncManager.drain();
43
- return { processed, stats: syncManager.getStats() };
44
- },
45
- },
46
-
47
- // ─── Reconcile ───────────────────────────────────────────────
48
- {
49
- name: 'cognee_sync_reconcile',
50
- description:
51
- 'Find vault entries with stale or missing cognee ingestion and enqueue them for sync.',
52
- auth: 'write',
53
- schema: z.object({}),
54
- handler: async () => {
55
- if (!syncManager) {
56
- return { error: 'Sync manager not configured' };
57
- }
58
- const enqueued = syncManager.reconcile();
59
- return { enqueued, stats: syncManager.getStats() };
60
- },
61
- },
62
- ];
63
- }
@@ -1,164 +0,0 @@
1
- /**
2
- * Cognee facade — knowledge graph ops.
3
- * Cognee search, sync, export, graph stats.
4
- */
5
-
6
- import { z } from 'zod';
7
- import type { OpDefinition } from '../../facades/types.js';
8
- import type { IntelligenceEntry } from '../../intelligence/types.js';
9
- import type { AgentRuntime } from '../types.js';
10
- import type { CogneeSearchType } from '../../cognee/types.js';
11
- import { createCogneeSyncOps } from '../cognee-sync-ops.js';
12
-
13
- export function createCogneeFacadeOps(runtime: AgentRuntime): OpDefinition[] {
14
- // Only called when runtime.cognee is non-null (guarded in createSemanticFacades)
15
- const cognee = runtime.cognee!;
16
- const { vault, syncManager } = runtime;
17
-
18
- return [
19
- // ─── Cognee (inline from core-ops.ts) ───────────────────────
20
- {
21
- name: 'cognee_status',
22
- description:
23
- 'Cognee vector search health — availability, URL, latency. Checks the Cognee API endpoint.',
24
- auth: 'read',
25
- handler: async () => {
26
- return cognee.healthCheck();
27
- },
28
- },
29
- {
30
- name: 'cognee_search',
31
- description:
32
- 'Vector similarity search via Cognee. Complements TF-IDF vault search with semantic understanding.',
33
- auth: 'read',
34
- schema: z.object({
35
- query: z.string(),
36
- searchType: z
37
- .enum([
38
- 'SUMMARIES',
39
- 'CHUNKS',
40
- 'RAG_COMPLETION',
41
- 'TRIPLET_COMPLETION',
42
- 'GRAPH_COMPLETION',
43
- 'GRAPH_SUMMARY_COMPLETION',
44
- 'NATURAL_LANGUAGE',
45
- 'GRAPH_COMPLETION_COT',
46
- 'FEELING_LUCKY',
47
- 'CHUNKS_LEXICAL',
48
- ])
49
- .optional()
50
- .describe('Cognee search type. Default CHUNKS (pure vector similarity).'),
51
- limit: z.number().optional(),
52
- }),
53
- handler: async (params) => {
54
- return cognee.search(params.query as string, {
55
- searchType: params.searchType as CogneeSearchType | undefined,
56
- limit: (params.limit as number) ?? 10,
57
- });
58
- },
59
- },
60
- {
61
- name: 'cognee_add',
62
- description:
63
- 'Ingest vault entries into Cognee for vector indexing. Auto-schedules cognify after ingest.',
64
- auth: 'write',
65
- schema: z.object({
66
- entryIds: z.array(z.string()).describe('Vault entry IDs to ingest into Cognee.'),
67
- }),
68
- handler: async (params) => {
69
- const ids = params.entryIds as string[];
70
- const entries = ids
71
- .map((id) => vault.get(id))
72
- .filter((e): e is IntelligenceEntry => e !== null && e !== undefined);
73
- if (entries.length === 0) return { added: 0, error: 'No matching vault entries found' };
74
- return cognee.addEntries(entries);
75
- },
76
- },
77
- {
78
- name: 'cognee_cognify',
79
- description:
80
- 'Trigger Cognee knowledge graph processing on the vault dataset. Usually auto-scheduled after add.',
81
- auth: 'write',
82
- handler: async () => {
83
- return cognee.cognify();
84
- },
85
- },
86
- {
87
- name: 'cognee_config',
88
- description: 'Get current Cognee client configuration and cached health status.',
89
- auth: 'read',
90
- handler: async () => {
91
- return { config: cognee.getConfig(), cachedStatus: cognee.getStatus() };
92
- },
93
- },
94
- // ─── Cognee Graph ────────────────────────────────────────────
95
- {
96
- name: 'cognee_get_node',
97
- description: 'Get a specific Cognee graph node by UUID with all properties and connections.',
98
- auth: 'read',
99
- schema: z.object({
100
- nodeId: z.string().describe('UUID of the graph node'),
101
- }),
102
- handler: async (params) => {
103
- try {
104
- const results = await cognee.search(params.nodeId as string, {
105
- searchType: 'GRAPH_COMPLETION' as CogneeSearchType,
106
- limit: 1,
107
- });
108
- if (!results || (Array.isArray(results) && results.length === 0)) {
109
- return { found: false, nodeId: params.nodeId };
110
- }
111
- return {
112
- found: true,
113
- nodeId: params.nodeId,
114
- node: Array.isArray(results) ? results[0] : results,
115
- };
116
- } catch (err) {
117
- return { error: (err as Error).message };
118
- }
119
- },
120
- },
121
- {
122
- name: 'cognee_graph_stats',
123
- description:
124
- 'Cognee graph statistics — availability, endpoint, latency from last health check.',
125
- auth: 'read',
126
- handler: async () => {
127
- try {
128
- const status = cognee.getStatus();
129
- const health = await cognee.healthCheck();
130
- return {
131
- available: status?.available ?? false,
132
- url: status?.url ?? cognee.getConfig().baseUrl,
133
- latencyMs: status?.latencyMs ?? health.latencyMs ?? null,
134
- error: status?.error ?? health.error ?? null,
135
- };
136
- } catch (err) {
137
- return { error: (err as Error).message };
138
- }
139
- },
140
- },
141
- {
142
- name: 'cognee_export_status',
143
- description: 'Check Cognee dataset and processing status — availability, pending operations.',
144
- auth: 'read',
145
- handler: async () => {
146
- try {
147
- const status = cognee.getStatus();
148
- const config = cognee.getConfig();
149
- return {
150
- available: status?.available ?? false,
151
- dataset: config.dataset ?? 'default',
152
- pendingCognify: false,
153
- url: status?.url ?? config.baseUrl,
154
- };
155
- } catch (err) {
156
- return { error: (err as Error).message };
157
- }
158
- },
159
- },
160
-
161
- // ─── Satellite ops ───────────────────────────────────────────
162
- ...createCogneeSyncOps(syncManager),
163
- ];
164
- }