@soleri/core 2.0.2 → 2.4.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 (226) hide show
  1. package/dist/brain/brain.d.ts +14 -50
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +207 -16
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +86 -0
  6. package/dist/brain/intelligence.d.ts.map +1 -0
  7. package/dist/brain/intelligence.js +771 -0
  8. package/dist/brain/intelligence.js.map +1 -0
  9. package/dist/brain/types.d.ts +197 -0
  10. package/dist/brain/types.d.ts.map +1 -0
  11. package/dist/brain/types.js +2 -0
  12. package/dist/brain/types.js.map +1 -0
  13. package/dist/cognee/client.d.ts +35 -0
  14. package/dist/cognee/client.d.ts.map +1 -0
  15. package/dist/cognee/client.js +291 -0
  16. package/dist/cognee/client.js.map +1 -0
  17. package/dist/cognee/types.d.ts +46 -0
  18. package/dist/cognee/types.d.ts.map +1 -0
  19. package/dist/cognee/types.js +3 -0
  20. package/dist/cognee/types.js.map +1 -0
  21. package/dist/control/identity-manager.d.ts +22 -0
  22. package/dist/control/identity-manager.d.ts.map +1 -0
  23. package/dist/control/identity-manager.js +233 -0
  24. package/dist/control/identity-manager.js.map +1 -0
  25. package/dist/control/intent-router.d.ts +32 -0
  26. package/dist/control/intent-router.d.ts.map +1 -0
  27. package/dist/control/intent-router.js +242 -0
  28. package/dist/control/intent-router.js.map +1 -0
  29. package/dist/control/types.d.ts +68 -0
  30. package/dist/control/types.d.ts.map +1 -0
  31. package/dist/control/types.js +9 -0
  32. package/dist/control/types.js.map +1 -0
  33. package/dist/curator/curator.d.ts +29 -0
  34. package/dist/curator/curator.d.ts.map +1 -1
  35. package/dist/curator/curator.js +142 -5
  36. package/dist/curator/curator.js.map +1 -1
  37. package/dist/facades/types.d.ts +1 -1
  38. package/dist/governance/governance.d.ts +42 -0
  39. package/dist/governance/governance.d.ts.map +1 -0
  40. package/dist/governance/governance.js +488 -0
  41. package/dist/governance/governance.js.map +1 -0
  42. package/dist/governance/index.d.ts +3 -0
  43. package/dist/governance/index.d.ts.map +1 -0
  44. package/dist/governance/index.js +2 -0
  45. package/dist/governance/index.js.map +1 -0
  46. package/dist/governance/types.d.ts +102 -0
  47. package/dist/governance/types.d.ts.map +1 -0
  48. package/dist/governance/types.js +3 -0
  49. package/dist/governance/types.js.map +1 -0
  50. package/dist/index.d.ts +35 -3
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +32 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/llm/llm-client.d.ts.map +1 -1
  55. package/dist/llm/llm-client.js +9 -2
  56. package/dist/llm/llm-client.js.map +1 -1
  57. package/dist/logging/logger.d.ts +37 -0
  58. package/dist/logging/logger.d.ts.map +1 -0
  59. package/dist/logging/logger.js +145 -0
  60. package/dist/logging/logger.js.map +1 -0
  61. package/dist/logging/types.d.ts +19 -0
  62. package/dist/logging/types.d.ts.map +1 -0
  63. package/dist/logging/types.js +2 -0
  64. package/dist/logging/types.js.map +1 -0
  65. package/dist/loop/loop-manager.d.ts +49 -0
  66. package/dist/loop/loop-manager.d.ts.map +1 -0
  67. package/dist/loop/loop-manager.js +105 -0
  68. package/dist/loop/loop-manager.js.map +1 -0
  69. package/dist/loop/types.d.ts +35 -0
  70. package/dist/loop/types.d.ts.map +1 -0
  71. package/dist/loop/types.js +8 -0
  72. package/dist/loop/types.js.map +1 -0
  73. package/dist/planning/gap-analysis.d.ts +29 -0
  74. package/dist/planning/gap-analysis.d.ts.map +1 -0
  75. package/dist/planning/gap-analysis.js +265 -0
  76. package/dist/planning/gap-analysis.js.map +1 -0
  77. package/dist/planning/gap-types.d.ts +29 -0
  78. package/dist/planning/gap-types.d.ts.map +1 -0
  79. package/dist/planning/gap-types.js +28 -0
  80. package/dist/planning/gap-types.js.map +1 -0
  81. package/dist/planning/planner.d.ts +150 -1
  82. package/dist/planning/planner.d.ts.map +1 -1
  83. package/dist/planning/planner.js +365 -2
  84. package/dist/planning/planner.js.map +1 -1
  85. package/dist/project/project-registry.d.ts +79 -0
  86. package/dist/project/project-registry.d.ts.map +1 -0
  87. package/dist/project/project-registry.js +276 -0
  88. package/dist/project/project-registry.js.map +1 -0
  89. package/dist/project/types.d.ts +28 -0
  90. package/dist/project/types.d.ts.map +1 -0
  91. package/dist/project/types.js +5 -0
  92. package/dist/project/types.js.map +1 -0
  93. package/dist/runtime/admin-extra-ops.d.ts +13 -0
  94. package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
  95. package/dist/runtime/admin-extra-ops.js +284 -0
  96. package/dist/runtime/admin-extra-ops.js.map +1 -0
  97. package/dist/runtime/admin-ops.d.ts +15 -0
  98. package/dist/runtime/admin-ops.d.ts.map +1 -0
  99. package/dist/runtime/admin-ops.js +322 -0
  100. package/dist/runtime/admin-ops.js.map +1 -0
  101. package/dist/runtime/capture-ops.d.ts +15 -0
  102. package/dist/runtime/capture-ops.d.ts.map +1 -0
  103. package/dist/runtime/capture-ops.js +345 -0
  104. package/dist/runtime/capture-ops.js.map +1 -0
  105. package/dist/runtime/core-ops.d.ts +7 -3
  106. package/dist/runtime/core-ops.d.ts.map +1 -1
  107. package/dist/runtime/core-ops.js +646 -15
  108. package/dist/runtime/core-ops.js.map +1 -1
  109. package/dist/runtime/curator-extra-ops.d.ts +9 -0
  110. package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
  111. package/dist/runtime/curator-extra-ops.js +59 -0
  112. package/dist/runtime/curator-extra-ops.js.map +1 -0
  113. package/dist/runtime/domain-ops.d.ts.map +1 -1
  114. package/dist/runtime/domain-ops.js +59 -13
  115. package/dist/runtime/domain-ops.js.map +1 -1
  116. package/dist/runtime/grading-ops.d.ts +14 -0
  117. package/dist/runtime/grading-ops.d.ts.map +1 -0
  118. package/dist/runtime/grading-ops.js +105 -0
  119. package/dist/runtime/grading-ops.js.map +1 -0
  120. package/dist/runtime/loop-ops.d.ts +13 -0
  121. package/dist/runtime/loop-ops.d.ts.map +1 -0
  122. package/dist/runtime/loop-ops.js +179 -0
  123. package/dist/runtime/loop-ops.js.map +1 -0
  124. package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
  125. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
  126. package/dist/runtime/memory-cross-project-ops.js +165 -0
  127. package/dist/runtime/memory-cross-project-ops.js.map +1 -0
  128. package/dist/runtime/memory-extra-ops.d.ts +13 -0
  129. package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
  130. package/dist/runtime/memory-extra-ops.js +173 -0
  131. package/dist/runtime/memory-extra-ops.js.map +1 -0
  132. package/dist/runtime/orchestrate-ops.d.ts +17 -0
  133. package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
  134. package/dist/runtime/orchestrate-ops.js +240 -0
  135. package/dist/runtime/orchestrate-ops.js.map +1 -0
  136. package/dist/runtime/planning-extra-ops.d.ts +17 -0
  137. package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
  138. package/dist/runtime/planning-extra-ops.js +300 -0
  139. package/dist/runtime/planning-extra-ops.js.map +1 -0
  140. package/dist/runtime/project-ops.d.ts +15 -0
  141. package/dist/runtime/project-ops.d.ts.map +1 -0
  142. package/dist/runtime/project-ops.js +181 -0
  143. package/dist/runtime/project-ops.js.map +1 -0
  144. package/dist/runtime/runtime.d.ts.map +1 -1
  145. package/dist/runtime/runtime.js +48 -1
  146. package/dist/runtime/runtime.js.map +1 -1
  147. package/dist/runtime/types.d.ts +23 -0
  148. package/dist/runtime/types.d.ts.map +1 -1
  149. package/dist/runtime/vault-extra-ops.d.ts +9 -0
  150. package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
  151. package/dist/runtime/vault-extra-ops.js +195 -0
  152. package/dist/runtime/vault-extra-ops.js.map +1 -0
  153. package/dist/telemetry/telemetry.d.ts +48 -0
  154. package/dist/telemetry/telemetry.d.ts.map +1 -0
  155. package/dist/telemetry/telemetry.js +87 -0
  156. package/dist/telemetry/telemetry.js.map +1 -0
  157. package/dist/vault/vault.d.ts +94 -0
  158. package/dist/vault/vault.d.ts.map +1 -1
  159. package/dist/vault/vault.js +340 -1
  160. package/dist/vault/vault.js.map +1 -1
  161. package/package.json +1 -1
  162. package/src/__tests__/admin-extra-ops.test.ts +420 -0
  163. package/src/__tests__/admin-ops.test.ts +271 -0
  164. package/src/__tests__/brain-intelligence.test.ts +828 -0
  165. package/src/__tests__/brain.test.ts +396 -27
  166. package/src/__tests__/capture-ops.test.ts +509 -0
  167. package/src/__tests__/cognee-client.test.ts +524 -0
  168. package/src/__tests__/core-ops.test.ts +341 -49
  169. package/src/__tests__/curator-extra-ops.test.ts +359 -0
  170. package/src/__tests__/curator.test.ts +126 -31
  171. package/src/__tests__/domain-ops.test.ts +111 -9
  172. package/src/__tests__/governance.test.ts +522 -0
  173. package/src/__tests__/grading-ops.test.ts +340 -0
  174. package/src/__tests__/identity-manager.test.ts +243 -0
  175. package/src/__tests__/intent-router.test.ts +222 -0
  176. package/src/__tests__/logger.test.ts +200 -0
  177. package/src/__tests__/loop-ops.test.ts +398 -0
  178. package/src/__tests__/memory-cross-project-ops.test.ts +246 -0
  179. package/src/__tests__/memory-extra-ops.test.ts +352 -0
  180. package/src/__tests__/orchestrate-ops.test.ts +284 -0
  181. package/src/__tests__/planner.test.ts +331 -0
  182. package/src/__tests__/planning-extra-ops.test.ts +548 -0
  183. package/src/__tests__/project-ops.test.ts +367 -0
  184. package/src/__tests__/runtime.test.ts +13 -11
  185. package/src/__tests__/vault-extra-ops.test.ts +407 -0
  186. package/src/brain/brain.ts +308 -72
  187. package/src/brain/intelligence.ts +1230 -0
  188. package/src/brain/types.ts +214 -0
  189. package/src/cognee/client.ts +352 -0
  190. package/src/cognee/types.ts +62 -0
  191. package/src/control/identity-manager.ts +354 -0
  192. package/src/control/intent-router.ts +326 -0
  193. package/src/control/types.ts +102 -0
  194. package/src/curator/curator.ts +265 -15
  195. package/src/governance/governance.ts +698 -0
  196. package/src/governance/index.ts +18 -0
  197. package/src/governance/types.ts +111 -0
  198. package/src/index.ts +128 -3
  199. package/src/llm/llm-client.ts +18 -24
  200. package/src/logging/logger.ts +154 -0
  201. package/src/logging/types.ts +21 -0
  202. package/src/loop/loop-manager.ts +130 -0
  203. package/src/loop/types.ts +44 -0
  204. package/src/planning/gap-analysis.ts +506 -0
  205. package/src/planning/gap-types.ts +58 -0
  206. package/src/planning/planner.ts +478 -2
  207. package/src/project/project-registry.ts +358 -0
  208. package/src/project/types.ts +31 -0
  209. package/src/runtime/admin-extra-ops.ts +307 -0
  210. package/src/runtime/admin-ops.ts +329 -0
  211. package/src/runtime/capture-ops.ts +385 -0
  212. package/src/runtime/core-ops.ts +747 -26
  213. package/src/runtime/curator-extra-ops.ts +71 -0
  214. package/src/runtime/domain-ops.ts +65 -13
  215. package/src/runtime/grading-ops.ts +121 -0
  216. package/src/runtime/loop-ops.ts +194 -0
  217. package/src/runtime/memory-cross-project-ops.ts +192 -0
  218. package/src/runtime/memory-extra-ops.ts +186 -0
  219. package/src/runtime/orchestrate-ops.ts +272 -0
  220. package/src/runtime/planning-extra-ops.ts +327 -0
  221. package/src/runtime/project-ops.ts +196 -0
  222. package/src/runtime/runtime.ts +54 -1
  223. package/src/runtime/types.ts +23 -0
  224. package/src/runtime/vault-extra-ops.ts +225 -0
  225. package/src/telemetry/telemetry.ts +118 -0
  226. package/src/vault/vault.ts +412 -1
@@ -1,19 +1,35 @@
1
1
  /**
2
- * Generic core operations factory — 26 ops that every agent gets.
2
+ * Generic core operations factory — 147 ops that every agent gets.
3
3
  *
4
4
  * These ops are agent-agnostic (no persona, no activation).
5
5
  * The 5 agent-specific ops (health, identity, activate, inject_claude_md, setup)
6
6
  * stay in generated code because they reference agent-specific modules.
7
7
  */
8
8
  import { z } from 'zod';
9
+ import { createPlanningExtraOps } from './planning-extra-ops.js';
10
+ import { createMemoryExtraOps } from './memory-extra-ops.js';
11
+ import { createVaultExtraOps } from './vault-extra-ops.js';
12
+ import { createAdminOps } from './admin-ops.js';
13
+ import { createAdminExtraOps } from './admin-extra-ops.js';
14
+ import { createLoopOps } from './loop-ops.js';
15
+ import { createOrchestrateOps } from './orchestrate-ops.js';
16
+ import { createGradingOps } from './grading-ops.js';
17
+ import { createCaptureOps } from './capture-ops.js';
18
+ import { createCuratorExtraOps } from './curator-extra-ops.js';
19
+ import { createProjectOps } from './project-ops.js';
20
+ import { createMemoryCrossProjectOps } from './memory-cross-project-ops.js';
9
21
  /**
10
- * Create the 26 generic core operations for an agent runtime.
22
+ * Create the 147 generic core operations for an agent runtime.
11
23
  *
12
24
  * Groups: search/vault (4), memory (4), export (1), planning (5),
13
- * brain (4), curator (8).
25
+ * brain (7), brain intelligence (11), cognee (5),
26
+ * llm (2), curator (8), control (8), governance (5),
27
+ * planning-extra (9), memory-extra (8), vault-extra (12),
28
+ * admin (8), admin-extra (10), loop (7), orchestrate (5),
29
+ * grading (5), capture (4), curator-extra (4), project (12).
14
30
  */
15
31
  export function createCoreOps(runtime) {
16
- const { vault, brain, planner, curator, llmClient, keyPool } = runtime;
32
+ const { vault, brain, brainIntelligence, planner, curator, governance, cognee, identityManager, intentRouter, llmClient, keyPool, } = runtime;
17
33
  return [
18
34
  // ─── Search / Vault ──────────────────────────────────────────
19
35
  {
@@ -79,8 +95,15 @@ export function createCoreOps(runtime) {
79
95
  const { resolve } = await import('node:path');
80
96
  const projectPath = resolve(params.projectPath ?? '.');
81
97
  const project = vault.registerProject(projectPath, params.name);
98
+ // Also track in project registry for cross-project features
99
+ runtime.projectRegistry.register(projectPath, params.name);
82
100
  const stats = vault.stats();
83
101
  const isNew = project.sessionCount === 1;
102
+ // Expire stale proposals on session start (fire-and-forget)
103
+ const policy = governance.getPolicy(projectPath);
104
+ const expired = governance.expireStaleProposals(policy.autoCapture.autoExpireDays);
105
+ const proposalStats = governance.getProposalStats(projectPath);
106
+ const quotaStatus = governance.getQuotaStatus(projectPath);
84
107
  return {
85
108
  project,
86
109
  is_new: isNew,
@@ -88,6 +111,14 @@ export function createCoreOps(runtime) {
88
111
  ? 'Welcome! New project registered.'
89
112
  : 'Welcome back! Session #' + project.sessionCount + ' for ' + project.name + '.',
90
113
  vault: { entries: stats.totalEntries, domains: Object.keys(stats.byDomain) },
114
+ governance: {
115
+ pendingProposals: proposalStats.pending,
116
+ quotaPercent: quotaStatus.maxTotal > 0
117
+ ? Math.round((quotaStatus.total / quotaStatus.maxTotal) * 100)
118
+ : 0,
119
+ isQuotaWarning: quotaStatus.isWarning,
120
+ expiredThisSession: expired,
121
+ },
91
122
  };
92
123
  },
93
124
  },
@@ -193,9 +224,7 @@ export function createCoreOps(runtime) {
193
224
  }),
194
225
  handler: async (params) => {
195
226
  const stats = vault.stats();
196
- const domains = params.domain
197
- ? [params.domain]
198
- : Object.keys(stats.byDomain);
227
+ const domains = params.domain ? [params.domain] : Object.keys(stats.byDomain);
199
228
  const bundles = [];
200
229
  for (const d of domains) {
201
230
  const entries = vault.list({ domain: d, limit: 10000 });
@@ -218,7 +247,10 @@ export function createCoreOps(runtime) {
218
247
  objective: z.string().describe('What the plan aims to achieve'),
219
248
  scope: z.string().describe('Which parts of the codebase are affected'),
220
249
  decisions: z.array(z.string()).optional().default([]),
221
- tasks: z.array(z.object({ title: z.string(), description: z.string() })).optional().default([]),
250
+ tasks: z
251
+ .array(z.object({ title: z.string(), description: z.string() }))
252
+ .optional()
253
+ .default([]),
222
254
  }),
223
255
  handler: async (params) => {
224
256
  const plan = planner.create({
@@ -253,7 +285,11 @@ export function createCoreOps(runtime) {
253
285
  auth: 'write',
254
286
  schema: z.object({
255
287
  planId: z.string(),
256
- startExecution: z.boolean().optional().default(false).describe('If true, immediately start execution after approval'),
288
+ startExecution: z
289
+ .boolean()
290
+ .optional()
291
+ .default(false)
292
+ .describe('If true, immediately start execution after approval'),
257
293
  }),
258
294
  handler: async (params) => {
259
295
  let plan = planner.approve(params.planId);
@@ -308,7 +344,51 @@ export function createCoreOps(runtime) {
308
344
  }),
309
345
  handler: async (params) => {
310
346
  brain.recordFeedback(params.query, params.entryId, params.action);
311
- return { recorded: true, query: params.query, entryId: params.entryId, action: params.action };
347
+ return {
348
+ recorded: true,
349
+ query: params.query,
350
+ entryId: params.entryId,
351
+ action: params.action,
352
+ };
353
+ },
354
+ },
355
+ {
356
+ name: 'brain_feedback',
357
+ description: 'Enhanced feedback with typed actions (accepted/dismissed/modified/failed), source tracking, confidence, duration, and reason.',
358
+ auth: 'write',
359
+ schema: z.object({
360
+ query: z.string().describe('The original search query'),
361
+ entryId: z.string().describe('The entry ID'),
362
+ action: z.enum(['accepted', 'dismissed', 'modified', 'failed']),
363
+ source: z
364
+ .enum(['search', 'recommendation', 'tool-execution', 'explicit'])
365
+ .optional()
366
+ .describe("Feedback source. Default 'search'."),
367
+ confidence: z.number().optional().describe('Confidence 0-1. Default 0.6.'),
368
+ duration: z.number().optional().describe('Duration in ms.'),
369
+ context: z.string().optional().describe("JSON context string. Default '{}'."),
370
+ reason: z.string().optional().describe('Human-readable reason.'),
371
+ }),
372
+ handler: async (params) => {
373
+ const entry = brain.recordFeedback({
374
+ query: params.query,
375
+ entryId: params.entryId,
376
+ action: params.action,
377
+ source: params.source,
378
+ confidence: params.confidence,
379
+ duration: params.duration,
380
+ context: params.context,
381
+ reason: params.reason,
382
+ });
383
+ return entry;
384
+ },
385
+ },
386
+ {
387
+ name: 'brain_feedback_stats',
388
+ description: 'Feedback statistics — counts by action and source, acceptance rate, average confidence.',
389
+ auth: 'read',
390
+ handler: async () => {
391
+ return brain.getFeedbackStats();
312
392
  },
313
393
  },
314
394
  {
@@ -322,10 +402,12 @@ export function createCoreOps(runtime) {
322
402
  },
323
403
  {
324
404
  name: 'brain_stats',
325
- description: 'Get brain intelligence stats — vocabulary size, feedback count, current scoring weights.',
405
+ description: 'Get brain intelligence stats — vocabulary size, feedback count, current scoring weights, intelligence pipeline stats.',
326
406
  auth: 'read',
327
407
  handler: async () => {
328
- return brain.getStats();
408
+ const base = brain.getStats();
409
+ const intelligence = brainIntelligence.getStats();
410
+ return { ...base, intelligence };
329
411
  },
330
412
  },
331
413
  {
@@ -349,6 +431,300 @@ export function createCoreOps(runtime) {
349
431
  };
350
432
  },
351
433
  },
434
+ // ─── Brain Intelligence ───────────────────────────────────────
435
+ {
436
+ name: 'brain_session_context',
437
+ description: 'Get recent session context — sessions, tool usage frequency, file change frequency.',
438
+ auth: 'read',
439
+ schema: z.object({
440
+ limit: z.number().optional().describe('Number of recent sessions. Default 10.'),
441
+ }),
442
+ handler: async (params) => {
443
+ return brainIntelligence.getSessionContext(params.limit ?? 10);
444
+ },
445
+ },
446
+ {
447
+ name: 'brain_strengths',
448
+ description: 'Get pattern strength scores. 4-signal scoring: usage (0-25) + spread (0-25) + success (0-25) + recency (0-25).',
449
+ auth: 'read',
450
+ schema: z.object({
451
+ domain: z.string().optional(),
452
+ minStrength: z.number().optional().describe('Minimum strength score (0-100).'),
453
+ limit: z.number().optional(),
454
+ }),
455
+ handler: async (params) => {
456
+ return brainIntelligence.getStrengths({
457
+ domain: params.domain,
458
+ minStrength: params.minStrength,
459
+ limit: params.limit ?? 50,
460
+ });
461
+ },
462
+ },
463
+ {
464
+ name: 'brain_global_patterns',
465
+ description: 'Get cross-domain pattern registry — patterns that appear across multiple domains.',
466
+ auth: 'read',
467
+ schema: z.object({
468
+ limit: z.number().optional(),
469
+ }),
470
+ handler: async (params) => {
471
+ return brainIntelligence.getGlobalPatterns(params.limit ?? 20);
472
+ },
473
+ },
474
+ {
475
+ name: 'brain_recommend',
476
+ description: 'Get pattern recommendations for a task context. Matches domain, task terms, and source-specific acceptance rates against known strengths.',
477
+ auth: 'read',
478
+ schema: z.object({
479
+ domain: z.string().optional(),
480
+ task: z.string().optional().describe('Task description for contextual matching.'),
481
+ source: z
482
+ .string()
483
+ .optional()
484
+ .describe('Feedback source to boost by (search, recommendation, tool-execution, explicit).'),
485
+ limit: z.number().optional(),
486
+ }),
487
+ handler: async (params) => {
488
+ return brainIntelligence.recommend({
489
+ domain: params.domain,
490
+ task: params.task,
491
+ source: params.source,
492
+ limit: params.limit ?? 5,
493
+ });
494
+ },
495
+ },
496
+ {
497
+ name: 'brain_build_intelligence',
498
+ description: 'Run the full intelligence pipeline: compute strengths → build global registry → build domain profiles.',
499
+ auth: 'write',
500
+ handler: async () => {
501
+ return brainIntelligence.buildIntelligence();
502
+ },
503
+ },
504
+ {
505
+ name: 'brain_export',
506
+ description: 'Export all brain intelligence data — strengths, sessions, proposals, global patterns, domain profiles.',
507
+ auth: 'read',
508
+ handler: async () => {
509
+ return brainIntelligence.exportData();
510
+ },
511
+ },
512
+ {
513
+ name: 'brain_import',
514
+ description: 'Import brain intelligence data from a previous export.',
515
+ auth: 'write',
516
+ schema: z.object({
517
+ data: z.any().describe('BrainExportData object from brain_export.'),
518
+ }),
519
+ handler: async (params) => {
520
+ return brainIntelligence.importData(params.data);
521
+ },
522
+ },
523
+ {
524
+ name: 'brain_extract_knowledge',
525
+ description: 'Extract knowledge proposals from a session using 6 heuristic rules (repeated tools, multi-file edits, long sessions, plan outcomes, feedback ratios).',
526
+ auth: 'write',
527
+ schema: z.object({
528
+ sessionId: z.string().describe('Session ID to extract knowledge from.'),
529
+ }),
530
+ handler: async (params) => {
531
+ return brainIntelligence.extractKnowledge(params.sessionId);
532
+ },
533
+ },
534
+ {
535
+ name: 'brain_archive_sessions',
536
+ description: 'Archive (delete) completed sessions older than N days.',
537
+ auth: 'write',
538
+ schema: z.object({
539
+ olderThanDays: z.number().optional().describe('Days threshold. Default 30.'),
540
+ }),
541
+ handler: async (params) => {
542
+ return brainIntelligence.archiveSessions(params.olderThanDays ?? 30);
543
+ },
544
+ },
545
+ {
546
+ name: 'brain_promote_proposals',
547
+ description: 'Promote knowledge proposals to vault entries. Creates intelligence entries from auto-extracted patterns. Gated by governance policies.',
548
+ auth: 'write',
549
+ schema: z.object({
550
+ proposalIds: z.array(z.string()).describe('IDs of proposals to promote.'),
551
+ projectPath: z.string().optional().default('.'),
552
+ }),
553
+ handler: async (params) => {
554
+ const pp = params.projectPath ?? '.';
555
+ return brainIntelligence.promoteProposals(params.proposalIds, governance, pp);
556
+ },
557
+ },
558
+ {
559
+ name: 'brain_lifecycle',
560
+ description: 'Start or end a brain session. Sessions track tool usage, file changes, and plan context.',
561
+ auth: 'write',
562
+ schema: z.object({
563
+ action: z.enum(['start', 'end']),
564
+ sessionId: z
565
+ .string()
566
+ .optional()
567
+ .describe('Required for end. Auto-generated for start if omitted.'),
568
+ domain: z.string().optional(),
569
+ context: z.string().optional(),
570
+ toolsUsed: z.array(z.string()).optional(),
571
+ filesModified: z.array(z.string()).optional(),
572
+ planId: z.string().optional(),
573
+ planOutcome: z.string().optional(),
574
+ }),
575
+ handler: async (params) => {
576
+ return brainIntelligence.lifecycle({
577
+ action: params.action,
578
+ sessionId: params.sessionId,
579
+ domain: params.domain,
580
+ context: params.context,
581
+ toolsUsed: params.toolsUsed,
582
+ filesModified: params.filesModified,
583
+ planId: params.planId,
584
+ planOutcome: params.planOutcome,
585
+ });
586
+ },
587
+ },
588
+ {
589
+ name: 'brain_reset_extracted',
590
+ description: 'Reset extraction status on brain sessions, allowing re-extraction. Filter by sessionId, since date, or all.',
591
+ auth: 'write',
592
+ schema: z.object({
593
+ sessionId: z.string().optional().describe('Reset a specific session.'),
594
+ since: z.string().optional().describe('Reset sessions extracted since this ISO date.'),
595
+ all: z.boolean().optional().describe('Reset all extracted sessions.'),
596
+ }),
597
+ handler: async (params) => {
598
+ return brainIntelligence.resetExtracted({
599
+ sessionId: params.sessionId,
600
+ since: params.since,
601
+ all: params.all,
602
+ });
603
+ },
604
+ },
605
+ // ─── Cognee ──────────────────────────────────────────────────
606
+ {
607
+ name: 'cognee_status',
608
+ description: 'Cognee vector search health — availability, URL, latency. Checks the Cognee API endpoint.',
609
+ auth: 'read',
610
+ handler: async () => {
611
+ return cognee.healthCheck();
612
+ },
613
+ },
614
+ {
615
+ name: 'cognee_search',
616
+ description: 'Vector similarity search via Cognee. Complements TF-IDF vault search with semantic understanding.',
617
+ auth: 'read',
618
+ schema: z.object({
619
+ query: z.string(),
620
+ searchType: z
621
+ .enum([
622
+ 'SUMMARIES',
623
+ 'CHUNKS',
624
+ 'RAG_COMPLETION',
625
+ 'TRIPLET_COMPLETION',
626
+ 'GRAPH_COMPLETION',
627
+ 'GRAPH_SUMMARY_COMPLETION',
628
+ 'NATURAL_LANGUAGE',
629
+ 'GRAPH_COMPLETION_COT',
630
+ 'FEELING_LUCKY',
631
+ 'CHUNKS_LEXICAL',
632
+ ])
633
+ .optional()
634
+ .describe('Cognee search type. Default CHUNKS (pure vector similarity).'),
635
+ limit: z.number().optional(),
636
+ }),
637
+ handler: async (params) => {
638
+ return cognee.search(params.query, {
639
+ searchType: params.searchType,
640
+ limit: params.limit ?? 10,
641
+ });
642
+ },
643
+ },
644
+ {
645
+ name: 'cognee_add',
646
+ description: 'Ingest vault entries into Cognee for vector indexing. Auto-schedules cognify after ingest.',
647
+ auth: 'write',
648
+ schema: z.object({
649
+ entryIds: z.array(z.string()).describe('Vault entry IDs to ingest into Cognee.'),
650
+ }),
651
+ handler: async (params) => {
652
+ const ids = params.entryIds;
653
+ const entries = ids
654
+ .map((id) => vault.get(id))
655
+ .filter((e) => e !== null && e !== undefined);
656
+ if (entries.length === 0)
657
+ return { added: 0, error: 'No matching vault entries found' };
658
+ return cognee.addEntries(entries);
659
+ },
660
+ },
661
+ {
662
+ name: 'cognee_cognify',
663
+ description: 'Trigger Cognee knowledge graph processing on the vault dataset. Usually auto-scheduled after add.',
664
+ auth: 'write',
665
+ handler: async () => {
666
+ return cognee.cognify();
667
+ },
668
+ },
669
+ {
670
+ name: 'cognee_config',
671
+ description: 'Get current Cognee client configuration and cached health status.',
672
+ auth: 'read',
673
+ handler: async () => {
674
+ return { config: cognee.getConfig(), cachedStatus: cognee.getStatus() };
675
+ },
676
+ },
677
+ // ─── LLM ─────────────────────────────────────────────────────
678
+ {
679
+ name: 'llm_rotate',
680
+ description: 'Force rotate the active API key for a provider. Useful when rate-limited or key is failing.',
681
+ auth: 'write',
682
+ schema: z.object({
683
+ provider: z.enum(['openai', 'anthropic']),
684
+ }),
685
+ handler: async (params) => {
686
+ const provider = params.provider;
687
+ const pool = keyPool[provider];
688
+ if (!pool.hasKeys)
689
+ return { rotated: false, error: `No ${provider} keys configured` };
690
+ const newKey = pool.rotateOnError();
691
+ return {
692
+ rotated: newKey !== null,
693
+ activeKeyIndex: pool.activeKeyIndex,
694
+ poolSize: pool.poolSize,
695
+ exhausted: pool.exhausted,
696
+ };
697
+ },
698
+ },
699
+ {
700
+ name: 'llm_call',
701
+ description: 'Make an LLM completion call. Uses model routing config and key pool rotation.',
702
+ auth: 'write',
703
+ schema: z.object({
704
+ systemPrompt: z.string().describe('System prompt for the LLM.'),
705
+ userPrompt: z.string().describe('User prompt / task input.'),
706
+ model: z
707
+ .string()
708
+ .optional()
709
+ .describe('Model name. Routed via model-routing.json if omitted.'),
710
+ temperature: z.number().optional().describe('Sampling temperature (0-2). Default 0.3.'),
711
+ maxTokens: z.number().optional().describe('Max output tokens. Default 500.'),
712
+ caller: z.string().optional().describe('Caller name for routing. Default "core-ops".'),
713
+ task: z.string().optional().describe('Task name for routing.'),
714
+ }),
715
+ handler: async (params) => {
716
+ return llmClient.complete({
717
+ provider: 'openai',
718
+ model: params.model ?? '',
719
+ systemPrompt: params.systemPrompt,
720
+ userPrompt: params.userPrompt,
721
+ temperature: params.temperature,
722
+ maxTokens: params.maxTokens,
723
+ caller: params.caller ?? 'core-ops',
724
+ task: params.task,
725
+ });
726
+ },
727
+ },
352
728
  // ─── Curator ─────────────────────────────────────────────────
353
729
  {
354
730
  name: 'curator_status',
@@ -422,9 +798,18 @@ export function createCoreOps(runtime) {
422
798
  auth: 'write',
423
799
  schema: z.object({
424
800
  dryRun: z.boolean().optional().describe('Default true. Set false to apply mutations.'),
425
- staleDaysThreshold: z.number().optional().describe('Days before entry is stale. Default 90.'),
426
- duplicateThreshold: z.number().optional().describe('Cosine similarity threshold. Default 0.45.'),
427
- contradictionThreshold: z.number().optional().describe('Contradiction threshold. Default 0.4.'),
801
+ staleDaysThreshold: z
802
+ .number()
803
+ .optional()
804
+ .describe('Days before entry is stale. Default 90.'),
805
+ duplicateThreshold: z
806
+ .number()
807
+ .optional()
808
+ .describe('Cosine similarity threshold. Default 0.45.'),
809
+ contradictionThreshold: z
810
+ .number()
811
+ .optional()
812
+ .describe('Contradiction threshold. Default 0.4.'),
428
813
  }),
429
814
  handler: async (params) => {
430
815
  return curator.consolidate({
@@ -443,6 +828,252 @@ export function createCoreOps(runtime) {
443
828
  return curator.healthAudit();
444
829
  },
445
830
  },
831
+ // ─── Control ──────────────────────────────────────────────────────
832
+ {
833
+ name: 'get_identity',
834
+ description: 'Get current agent identity with guidelines.',
835
+ auth: 'read',
836
+ schema: z.object({
837
+ agentId: z.string().describe('Agent identifier.'),
838
+ }),
839
+ handler: async (params) => {
840
+ const identity = identityManager.getIdentity(params.agentId);
841
+ if (!identity)
842
+ return { found: false, agentId: params.agentId };
843
+ return identity;
844
+ },
845
+ },
846
+ {
847
+ name: 'update_identity',
848
+ description: 'Update identity fields. Auto-versions and snapshots previous state.',
849
+ auth: 'write',
850
+ schema: z.object({
851
+ agentId: z.string(),
852
+ name: z.string().optional(),
853
+ role: z.string().optional(),
854
+ description: z.string().optional(),
855
+ personality: z.array(z.string()).optional(),
856
+ changedBy: z.string().optional(),
857
+ changeReason: z.string().optional(),
858
+ }),
859
+ handler: async (params) => {
860
+ const identity = identityManager.setIdentity(params.agentId, {
861
+ name: params.name,
862
+ role: params.role,
863
+ description: params.description,
864
+ personality: params.personality,
865
+ changedBy: params.changedBy,
866
+ changeReason: params.changeReason,
867
+ });
868
+ return { updated: true, identity };
869
+ },
870
+ },
871
+ {
872
+ name: 'add_guideline',
873
+ description: 'Add a behavioral guideline (behavior/preference/restriction/style).',
874
+ auth: 'write',
875
+ schema: z.object({
876
+ agentId: z.string(),
877
+ category: z.enum(['behavior', 'preference', 'restriction', 'style']),
878
+ text: z.string(),
879
+ priority: z.number().optional(),
880
+ }),
881
+ handler: async (params) => {
882
+ const guideline = identityManager.addGuideline(params.agentId, {
883
+ category: params.category,
884
+ text: params.text,
885
+ priority: params.priority,
886
+ });
887
+ return { added: true, guideline };
888
+ },
889
+ },
890
+ {
891
+ name: 'remove_guideline',
892
+ description: 'Remove a guideline by ID.',
893
+ auth: 'write',
894
+ schema: z.object({
895
+ guidelineId: z.string(),
896
+ }),
897
+ handler: async (params) => {
898
+ const removed = identityManager.removeGuideline(params.guidelineId);
899
+ return { removed };
900
+ },
901
+ },
902
+ {
903
+ name: 'rollback_identity',
904
+ description: 'Restore a previous identity version. Creates a new version with the old data.',
905
+ auth: 'write',
906
+ schema: z.object({
907
+ agentId: z.string(),
908
+ version: z.number().describe('Version number to roll back to.'),
909
+ }),
910
+ handler: async (params) => {
911
+ const identity = identityManager.rollback(params.agentId, params.version);
912
+ return { rolledBack: true, identity };
913
+ },
914
+ },
915
+ {
916
+ name: 'route_intent',
917
+ description: 'Classify a prompt into intent + operational mode via keyword matching.',
918
+ auth: 'read',
919
+ schema: z.object({
920
+ prompt: z.string().describe('The user prompt to classify.'),
921
+ }),
922
+ handler: async (params) => {
923
+ return intentRouter.routeIntent(params.prompt);
924
+ },
925
+ },
926
+ {
927
+ name: 'morph',
928
+ description: 'Switch operational mode manually.',
929
+ auth: 'write',
930
+ schema: z.object({
931
+ mode: z
932
+ .string()
933
+ .describe('The operational mode to switch to (e.g., BUILD-MODE, FIX-MODE).'),
934
+ }),
935
+ handler: async (params) => {
936
+ return intentRouter.morph(params.mode);
937
+ },
938
+ },
939
+ {
940
+ name: 'get_behavior_rules',
941
+ description: 'Get behavior rules for current or specified mode.',
942
+ auth: 'read',
943
+ schema: z.object({
944
+ mode: z.string().optional().describe('Mode to get rules for. Defaults to current mode.'),
945
+ }),
946
+ handler: async (params) => {
947
+ const mode = params.mode;
948
+ const rules = intentRouter.getBehaviorRules(mode);
949
+ const currentMode = intentRouter.getCurrentMode();
950
+ return { mode: mode ?? currentMode, rules };
951
+ },
952
+ },
953
+ // ─── Governance ─────────────────────────────────────────────────
954
+ {
955
+ name: 'governance_policy',
956
+ description: 'Get, set, or apply a preset to vault governance policies (quota, retention, auto-capture).',
957
+ auth: 'write',
958
+ schema: z.object({
959
+ action: z.enum(['get', 'set', 'applyPreset']),
960
+ projectPath: z.string(),
961
+ policyType: z.enum(['quota', 'retention', 'auto-capture']).optional(),
962
+ config: z.record(z.unknown()).optional(),
963
+ preset: z.enum(['strict', 'moderate', 'permissive']).optional(),
964
+ changedBy: z.string().optional(),
965
+ }),
966
+ handler: async (params) => {
967
+ const action = params.action;
968
+ const projectPath = params.projectPath;
969
+ if (action === 'get') {
970
+ return governance.getPolicy(projectPath);
971
+ }
972
+ if (action === 'set') {
973
+ governance.setPolicy(projectPath, params.policyType, params.config, params.changedBy);
974
+ return { updated: true, policy: governance.getPolicy(projectPath) };
975
+ }
976
+ if (action === 'applyPreset') {
977
+ governance.applyPreset(projectPath, params.preset, params.changedBy);
978
+ return {
979
+ applied: true,
980
+ preset: params.preset,
981
+ policy: governance.getPolicy(projectPath),
982
+ };
983
+ }
984
+ return { error: 'Unknown action: ' + action };
985
+ },
986
+ },
987
+ {
988
+ name: 'governance_proposals',
989
+ description: 'Manage knowledge capture proposals — list, approve, reject, modify, get stats, or expire stale.',
990
+ auth: 'write',
991
+ schema: z.object({
992
+ action: z.enum(['list', 'approve', 'reject', 'modify', 'stats', 'expire']),
993
+ projectPath: z.string().optional(),
994
+ proposalId: z.number().optional(),
995
+ decidedBy: z.string().optional(),
996
+ note: z.string().optional(),
997
+ modifications: z.record(z.unknown()).optional(),
998
+ maxAgeDays: z.number().optional(),
999
+ limit: z.number().optional(),
1000
+ }),
1001
+ handler: async (params) => {
1002
+ const action = params.action;
1003
+ if (action === 'list') {
1004
+ return governance.listPendingProposals(params.projectPath, params.limit);
1005
+ }
1006
+ if (action === 'approve') {
1007
+ return governance.approveProposal(params.proposalId, params.decidedBy);
1008
+ }
1009
+ if (action === 'reject') {
1010
+ return governance.rejectProposal(params.proposalId, params.decidedBy, params.note);
1011
+ }
1012
+ if (action === 'modify') {
1013
+ return governance.modifyProposal(params.proposalId, params.modifications, params.decidedBy);
1014
+ }
1015
+ if (action === 'stats') {
1016
+ return governance.getProposalStats(params.projectPath);
1017
+ }
1018
+ if (action === 'expire') {
1019
+ const expired = governance.expireStaleProposals(params.maxAgeDays);
1020
+ return { expired };
1021
+ }
1022
+ return { error: 'Unknown action: ' + action };
1023
+ },
1024
+ },
1025
+ {
1026
+ name: 'governance_stats',
1027
+ description: 'Get governance statistics — quota status and proposal stats for a project.',
1028
+ auth: 'read',
1029
+ schema: z.object({
1030
+ projectPath: z.string(),
1031
+ }),
1032
+ handler: async (params) => {
1033
+ const projectPath = params.projectPath;
1034
+ return {
1035
+ quotaStatus: governance.getQuotaStatus(projectPath),
1036
+ proposalStats: governance.getProposalStats(projectPath),
1037
+ };
1038
+ },
1039
+ },
1040
+ {
1041
+ name: 'governance_expire',
1042
+ description: 'Expire stale pending proposals older than a threshold.',
1043
+ auth: 'write',
1044
+ schema: z.object({
1045
+ projectPath: z.string().optional(),
1046
+ maxAgeDays: z.number().optional().describe('Days threshold. Default 14.'),
1047
+ }),
1048
+ handler: async (params) => {
1049
+ const expired = governance.expireStaleProposals(params.maxAgeDays);
1050
+ return { expired };
1051
+ },
1052
+ },
1053
+ {
1054
+ name: 'governance_dashboard',
1055
+ description: 'Get governance dashboard — vault size, quota usage, pending proposals, acceptance rate, evaluation trend.',
1056
+ auth: 'read',
1057
+ schema: z.object({
1058
+ projectPath: z.string(),
1059
+ }),
1060
+ handler: async (params) => {
1061
+ return governance.getDashboard(params.projectPath);
1062
+ },
1063
+ },
1064
+ // ─── Extra Ops (from dedicated modules) ─────────────────────────
1065
+ ...createPlanningExtraOps(runtime),
1066
+ ...createMemoryExtraOps(runtime),
1067
+ ...createVaultExtraOps(runtime),
1068
+ ...createAdminOps(runtime),
1069
+ ...createAdminExtraOps(runtime),
1070
+ ...createLoopOps(runtime),
1071
+ ...createOrchestrateOps(runtime),
1072
+ ...createGradingOps(runtime),
1073
+ ...createCaptureOps(runtime),
1074
+ ...createCuratorExtraOps(runtime),
1075
+ ...createProjectOps(runtime),
1076
+ ...createMemoryCrossProjectOps(runtime),
446
1077
  ];
447
1078
  }
448
1079
  //# sourceMappingURL=core-ops.js.map