@soleri/core 2.1.0 → 2.5.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 (377) hide show
  1. package/dist/brain/brain.d.ts +10 -1
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +116 -13
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/brain/intelligence.d.ts +36 -1
  6. package/dist/brain/intelligence.d.ts.map +1 -1
  7. package/dist/brain/intelligence.js +119 -14
  8. package/dist/brain/intelligence.js.map +1 -1
  9. package/dist/brain/types.d.ts +34 -2
  10. package/dist/brain/types.d.ts.map +1 -1
  11. package/dist/cognee/client.d.ts +3 -0
  12. package/dist/cognee/client.d.ts.map +1 -1
  13. package/dist/cognee/client.js +17 -0
  14. package/dist/cognee/client.js.map +1 -1
  15. package/dist/cognee/sync-manager.d.ts +94 -0
  16. package/dist/cognee/sync-manager.d.ts.map +1 -0
  17. package/dist/cognee/sync-manager.js +293 -0
  18. package/dist/cognee/sync-manager.js.map +1 -0
  19. package/dist/control/identity-manager.d.ts +22 -0
  20. package/dist/control/identity-manager.d.ts.map +1 -0
  21. package/dist/control/identity-manager.js +233 -0
  22. package/dist/control/identity-manager.js.map +1 -0
  23. package/dist/control/intent-router.d.ts +32 -0
  24. package/dist/control/intent-router.d.ts.map +1 -0
  25. package/dist/control/intent-router.js +242 -0
  26. package/dist/control/intent-router.js.map +1 -0
  27. package/dist/control/types.d.ts +68 -0
  28. package/dist/control/types.d.ts.map +1 -0
  29. package/dist/control/types.js +9 -0
  30. package/dist/control/types.js.map +1 -0
  31. package/dist/curator/curator.d.ts +37 -1
  32. package/dist/curator/curator.d.ts.map +1 -1
  33. package/dist/curator/curator.js +199 -1
  34. package/dist/curator/curator.js.map +1 -1
  35. package/dist/errors/classify.d.ts +13 -0
  36. package/dist/errors/classify.d.ts.map +1 -0
  37. package/dist/errors/classify.js +97 -0
  38. package/dist/errors/classify.js.map +1 -0
  39. package/dist/errors/index.d.ts +6 -0
  40. package/dist/errors/index.d.ts.map +1 -0
  41. package/dist/errors/index.js +4 -0
  42. package/dist/errors/index.js.map +1 -0
  43. package/dist/errors/retry.d.ts +40 -0
  44. package/dist/errors/retry.d.ts.map +1 -0
  45. package/dist/errors/retry.js +97 -0
  46. package/dist/errors/retry.js.map +1 -0
  47. package/dist/errors/types.d.ts +48 -0
  48. package/dist/errors/types.d.ts.map +1 -0
  49. package/dist/errors/types.js +59 -0
  50. package/dist/errors/types.js.map +1 -0
  51. package/dist/facades/types.d.ts +1 -1
  52. package/dist/governance/governance.d.ts +42 -0
  53. package/dist/governance/governance.d.ts.map +1 -0
  54. package/dist/governance/governance.js +488 -0
  55. package/dist/governance/governance.js.map +1 -0
  56. package/dist/governance/index.d.ts +3 -0
  57. package/dist/governance/index.d.ts.map +1 -0
  58. package/dist/governance/index.js +2 -0
  59. package/dist/governance/index.js.map +1 -0
  60. package/dist/governance/types.d.ts +102 -0
  61. package/dist/governance/types.d.ts.map +1 -0
  62. package/dist/governance/types.js +3 -0
  63. package/dist/governance/types.js.map +1 -0
  64. package/dist/index.d.ts +52 -3
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +47 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/intake/content-classifier.d.ts +14 -0
  69. package/dist/intake/content-classifier.d.ts.map +1 -0
  70. package/dist/intake/content-classifier.js +125 -0
  71. package/dist/intake/content-classifier.js.map +1 -0
  72. package/dist/intake/dedup-gate.d.ts +17 -0
  73. package/dist/intake/dedup-gate.d.ts.map +1 -0
  74. package/dist/intake/dedup-gate.js +66 -0
  75. package/dist/intake/dedup-gate.js.map +1 -0
  76. package/dist/intake/intake-pipeline.d.ts +63 -0
  77. package/dist/intake/intake-pipeline.d.ts.map +1 -0
  78. package/dist/intake/intake-pipeline.js +373 -0
  79. package/dist/intake/intake-pipeline.js.map +1 -0
  80. package/dist/intake/types.d.ts +65 -0
  81. package/dist/intake/types.d.ts.map +1 -0
  82. package/dist/intake/types.js +3 -0
  83. package/dist/intake/types.js.map +1 -0
  84. package/dist/intelligence/loader.js +1 -1
  85. package/dist/intelligence/loader.js.map +1 -1
  86. package/dist/intelligence/types.d.ts +3 -1
  87. package/dist/intelligence/types.d.ts.map +1 -1
  88. package/dist/logging/logger.d.ts +37 -0
  89. package/dist/logging/logger.d.ts.map +1 -0
  90. package/dist/logging/logger.js +145 -0
  91. package/dist/logging/logger.js.map +1 -0
  92. package/dist/logging/types.d.ts +19 -0
  93. package/dist/logging/types.d.ts.map +1 -0
  94. package/dist/logging/types.js +2 -0
  95. package/dist/logging/types.js.map +1 -0
  96. package/dist/loop/loop-manager.d.ts +100 -0
  97. package/dist/loop/loop-manager.d.ts.map +1 -0
  98. package/dist/loop/loop-manager.js +379 -0
  99. package/dist/loop/loop-manager.js.map +1 -0
  100. package/dist/loop/types.d.ts +103 -0
  101. package/dist/loop/types.d.ts.map +1 -0
  102. package/dist/loop/types.js +11 -0
  103. package/dist/loop/types.js.map +1 -0
  104. package/dist/persistence/index.d.ts +3 -0
  105. package/dist/persistence/index.d.ts.map +1 -0
  106. package/dist/persistence/index.js +2 -0
  107. package/dist/persistence/index.js.map +1 -0
  108. package/dist/persistence/sqlite-provider.d.ts +25 -0
  109. package/dist/persistence/sqlite-provider.d.ts.map +1 -0
  110. package/dist/persistence/sqlite-provider.js +59 -0
  111. package/dist/persistence/sqlite-provider.js.map +1 -0
  112. package/dist/persistence/types.d.ts +36 -0
  113. package/dist/persistence/types.d.ts.map +1 -0
  114. package/dist/persistence/types.js +8 -0
  115. package/dist/persistence/types.js.map +1 -0
  116. package/dist/planning/gap-analysis.d.ts +72 -0
  117. package/dist/planning/gap-analysis.d.ts.map +1 -0
  118. package/dist/planning/gap-analysis.js +442 -0
  119. package/dist/planning/gap-analysis.js.map +1 -0
  120. package/dist/planning/gap-types.d.ts +29 -0
  121. package/dist/planning/gap-types.d.ts.map +1 -0
  122. package/dist/planning/gap-types.js +28 -0
  123. package/dist/planning/gap-types.js.map +1 -0
  124. package/dist/planning/planner.d.ts +421 -4
  125. package/dist/planning/planner.d.ts.map +1 -1
  126. package/dist/planning/planner.js +949 -21
  127. package/dist/planning/planner.js.map +1 -1
  128. package/dist/playbooks/generic/brainstorming.d.ts +9 -0
  129. package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
  130. package/dist/playbooks/generic/brainstorming.js +105 -0
  131. package/dist/playbooks/generic/brainstorming.js.map +1 -0
  132. package/dist/playbooks/generic/code-review.d.ts +11 -0
  133. package/dist/playbooks/generic/code-review.d.ts.map +1 -0
  134. package/dist/playbooks/generic/code-review.js +176 -0
  135. package/dist/playbooks/generic/code-review.js.map +1 -0
  136. package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
  137. package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
  138. package/dist/playbooks/generic/subagent-execution.js +68 -0
  139. package/dist/playbooks/generic/subagent-execution.js.map +1 -0
  140. package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
  141. package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
  142. package/dist/playbooks/generic/systematic-debugging.js +87 -0
  143. package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
  144. package/dist/playbooks/generic/tdd.d.ts +9 -0
  145. package/dist/playbooks/generic/tdd.d.ts.map +1 -0
  146. package/dist/playbooks/generic/tdd.js +70 -0
  147. package/dist/playbooks/generic/tdd.js.map +1 -0
  148. package/dist/playbooks/generic/verification.d.ts +9 -0
  149. package/dist/playbooks/generic/verification.d.ts.map +1 -0
  150. package/dist/playbooks/generic/verification.js +74 -0
  151. package/dist/playbooks/generic/verification.js.map +1 -0
  152. package/dist/playbooks/index.d.ts +4 -0
  153. package/dist/playbooks/index.d.ts.map +1 -0
  154. package/dist/playbooks/index.js +5 -0
  155. package/dist/playbooks/index.js.map +1 -0
  156. package/dist/playbooks/playbook-registry.d.ts +42 -0
  157. package/dist/playbooks/playbook-registry.d.ts.map +1 -0
  158. package/dist/playbooks/playbook-registry.js +227 -0
  159. package/dist/playbooks/playbook-registry.js.map +1 -0
  160. package/dist/playbooks/playbook-seeder.d.ts +47 -0
  161. package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
  162. package/dist/playbooks/playbook-seeder.js +104 -0
  163. package/dist/playbooks/playbook-seeder.js.map +1 -0
  164. package/dist/playbooks/playbook-types.d.ts +132 -0
  165. package/dist/playbooks/playbook-types.d.ts.map +1 -0
  166. package/dist/playbooks/playbook-types.js +12 -0
  167. package/dist/playbooks/playbook-types.js.map +1 -0
  168. package/dist/project/project-registry.d.ts +79 -0
  169. package/dist/project/project-registry.d.ts.map +1 -0
  170. package/dist/project/project-registry.js +274 -0
  171. package/dist/project/project-registry.js.map +1 -0
  172. package/dist/project/types.d.ts +28 -0
  173. package/dist/project/types.d.ts.map +1 -0
  174. package/dist/project/types.js +5 -0
  175. package/dist/project/types.js.map +1 -0
  176. package/dist/prompts/index.d.ts +4 -0
  177. package/dist/prompts/index.d.ts.map +1 -0
  178. package/dist/prompts/index.js +3 -0
  179. package/dist/prompts/index.js.map +1 -0
  180. package/dist/prompts/parser.d.ts +17 -0
  181. package/dist/prompts/parser.d.ts.map +1 -0
  182. package/dist/prompts/parser.js +47 -0
  183. package/dist/prompts/parser.js.map +1 -0
  184. package/dist/prompts/template-manager.d.ts +25 -0
  185. package/dist/prompts/template-manager.d.ts.map +1 -0
  186. package/dist/prompts/template-manager.js +71 -0
  187. package/dist/prompts/template-manager.js.map +1 -0
  188. package/dist/prompts/types.d.ts +26 -0
  189. package/dist/prompts/types.d.ts.map +1 -0
  190. package/dist/prompts/types.js +5 -0
  191. package/dist/prompts/types.js.map +1 -0
  192. package/dist/runtime/admin-extra-ops.d.ts +15 -0
  193. package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
  194. package/dist/runtime/admin-extra-ops.js +595 -0
  195. package/dist/runtime/admin-extra-ops.js.map +1 -0
  196. package/dist/runtime/admin-ops.d.ts +15 -0
  197. package/dist/runtime/admin-ops.d.ts.map +1 -0
  198. package/dist/runtime/admin-ops.js +329 -0
  199. package/dist/runtime/admin-ops.js.map +1 -0
  200. package/dist/runtime/capture-ops.d.ts +15 -0
  201. package/dist/runtime/capture-ops.d.ts.map +1 -0
  202. package/dist/runtime/capture-ops.js +363 -0
  203. package/dist/runtime/capture-ops.js.map +1 -0
  204. package/dist/runtime/cognee-sync-ops.d.ts +12 -0
  205. package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
  206. package/dist/runtime/cognee-sync-ops.js +55 -0
  207. package/dist/runtime/cognee-sync-ops.js.map +1 -0
  208. package/dist/runtime/core-ops.d.ts +9 -3
  209. package/dist/runtime/core-ops.d.ts.map +1 -1
  210. package/dist/runtime/core-ops.js +693 -10
  211. package/dist/runtime/core-ops.js.map +1 -1
  212. package/dist/runtime/curator-extra-ops.d.ts +9 -0
  213. package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
  214. package/dist/runtime/curator-extra-ops.js +71 -0
  215. package/dist/runtime/curator-extra-ops.js.map +1 -0
  216. package/dist/runtime/domain-ops.d.ts.map +1 -1
  217. package/dist/runtime/domain-ops.js +61 -15
  218. package/dist/runtime/domain-ops.js.map +1 -1
  219. package/dist/runtime/grading-ops.d.ts +14 -0
  220. package/dist/runtime/grading-ops.d.ts.map +1 -0
  221. package/dist/runtime/grading-ops.js +105 -0
  222. package/dist/runtime/grading-ops.js.map +1 -0
  223. package/dist/runtime/intake-ops.d.ts +14 -0
  224. package/dist/runtime/intake-ops.d.ts.map +1 -0
  225. package/dist/runtime/intake-ops.js +110 -0
  226. package/dist/runtime/intake-ops.js.map +1 -0
  227. package/dist/runtime/loop-ops.d.ts +14 -0
  228. package/dist/runtime/loop-ops.d.ts.map +1 -0
  229. package/dist/runtime/loop-ops.js +251 -0
  230. package/dist/runtime/loop-ops.js.map +1 -0
  231. package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
  232. package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
  233. package/dist/runtime/memory-cross-project-ops.js +165 -0
  234. package/dist/runtime/memory-cross-project-ops.js.map +1 -0
  235. package/dist/runtime/memory-extra-ops.d.ts +13 -0
  236. package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
  237. package/dist/runtime/memory-extra-ops.js +173 -0
  238. package/dist/runtime/memory-extra-ops.js.map +1 -0
  239. package/dist/runtime/orchestrate-ops.d.ts +17 -0
  240. package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
  241. package/dist/runtime/orchestrate-ops.js +246 -0
  242. package/dist/runtime/orchestrate-ops.js.map +1 -0
  243. package/dist/runtime/planning-extra-ops.d.ts +25 -0
  244. package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
  245. package/dist/runtime/planning-extra-ops.js +663 -0
  246. package/dist/runtime/planning-extra-ops.js.map +1 -0
  247. package/dist/runtime/playbook-ops.d.ts +14 -0
  248. package/dist/runtime/playbook-ops.d.ts.map +1 -0
  249. package/dist/runtime/playbook-ops.js +141 -0
  250. package/dist/runtime/playbook-ops.js.map +1 -0
  251. package/dist/runtime/project-ops.d.ts +15 -0
  252. package/dist/runtime/project-ops.d.ts.map +1 -0
  253. package/dist/runtime/project-ops.js +186 -0
  254. package/dist/runtime/project-ops.js.map +1 -0
  255. package/dist/runtime/runtime.d.ts.map +1 -1
  256. package/dist/runtime/runtime.js +65 -3
  257. package/dist/runtime/runtime.js.map +1 -1
  258. package/dist/runtime/types.d.ts +29 -0
  259. package/dist/runtime/types.d.ts.map +1 -1
  260. package/dist/runtime/vault-extra-ops.d.ts +10 -0
  261. package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
  262. package/dist/runtime/vault-extra-ops.js +536 -0
  263. package/dist/runtime/vault-extra-ops.js.map +1 -0
  264. package/dist/telemetry/telemetry.d.ts +48 -0
  265. package/dist/telemetry/telemetry.d.ts.map +1 -0
  266. package/dist/telemetry/telemetry.js +87 -0
  267. package/dist/telemetry/telemetry.js.map +1 -0
  268. package/dist/vault/playbook.d.ts +34 -0
  269. package/dist/vault/playbook.d.ts.map +1 -0
  270. package/dist/vault/playbook.js +60 -0
  271. package/dist/vault/playbook.js.map +1 -0
  272. package/dist/vault/vault.d.ts +97 -4
  273. package/dist/vault/vault.d.ts.map +1 -1
  274. package/dist/vault/vault.js +424 -65
  275. package/dist/vault/vault.js.map +1 -1
  276. package/package.json +7 -3
  277. package/src/__tests__/admin-extra-ops.test.ts +467 -0
  278. package/src/__tests__/admin-ops.test.ts +271 -0
  279. package/src/__tests__/brain-intelligence.test.ts +205 -0
  280. package/src/__tests__/brain.test.ts +134 -3
  281. package/src/__tests__/capture-ops.test.ts +509 -0
  282. package/src/__tests__/cognee-integration.test.ts +80 -0
  283. package/src/__tests__/cognee-sync-manager.test.ts +103 -0
  284. package/src/__tests__/core-ops.test.ts +292 -2
  285. package/src/__tests__/curator-extra-ops.test.ts +381 -0
  286. package/src/__tests__/domain-ops.test.ts +66 -0
  287. package/src/__tests__/errors.test.ts +388 -0
  288. package/src/__tests__/governance.test.ts +522 -0
  289. package/src/__tests__/grading-ops.test.ts +361 -0
  290. package/src/__tests__/identity-manager.test.ts +243 -0
  291. package/src/__tests__/intake-pipeline.test.ts +162 -0
  292. package/src/__tests__/intent-router.test.ts +222 -0
  293. package/src/__tests__/logger.test.ts +200 -0
  294. package/src/__tests__/loop-ops.test.ts +469 -0
  295. package/src/__tests__/memory-cross-project-ops.test.ts +248 -0
  296. package/src/__tests__/memory-extra-ops.test.ts +352 -0
  297. package/src/__tests__/orchestrate-ops.test.ts +289 -0
  298. package/src/__tests__/persistence.test.ts +225 -0
  299. package/src/__tests__/planner.test.ts +416 -7
  300. package/src/__tests__/planning-extra-ops.test.ts +706 -0
  301. package/src/__tests__/playbook-registry.test.ts +326 -0
  302. package/src/__tests__/playbook-seeder.test.ts +163 -0
  303. package/src/__tests__/playbook.test.ts +389 -0
  304. package/src/__tests__/project-ops.test.ts +381 -0
  305. package/src/__tests__/template-manager.test.ts +222 -0
  306. package/src/__tests__/vault-extra-ops.test.ts +482 -0
  307. package/src/brain/brain.ts +185 -16
  308. package/src/brain/intelligence.ts +179 -10
  309. package/src/brain/types.ts +40 -2
  310. package/src/cognee/client.ts +18 -0
  311. package/src/cognee/sync-manager.ts +389 -0
  312. package/src/control/identity-manager.ts +354 -0
  313. package/src/control/intent-router.ts +326 -0
  314. package/src/control/types.ts +102 -0
  315. package/src/curator/curator.ts +295 -1
  316. package/src/errors/classify.ts +102 -0
  317. package/src/errors/index.ts +5 -0
  318. package/src/errors/retry.ts +132 -0
  319. package/src/errors/types.ts +81 -0
  320. package/src/governance/governance.ts +698 -0
  321. package/src/governance/index.ts +18 -0
  322. package/src/governance/types.ts +111 -0
  323. package/src/index.ts +213 -2
  324. package/src/intake/content-classifier.ts +146 -0
  325. package/src/intake/dedup-gate.ts +92 -0
  326. package/src/intake/intake-pipeline.ts +503 -0
  327. package/src/intake/types.ts +69 -0
  328. package/src/intelligence/loader.ts +1 -1
  329. package/src/intelligence/types.ts +3 -1
  330. package/src/logging/logger.ts +154 -0
  331. package/src/logging/types.ts +21 -0
  332. package/src/loop/loop-manager.ts +448 -0
  333. package/src/loop/types.ts +115 -0
  334. package/src/persistence/index.ts +7 -0
  335. package/src/persistence/sqlite-provider.ts +62 -0
  336. package/src/persistence/types.ts +44 -0
  337. package/src/planning/gap-analysis.ts +775 -0
  338. package/src/planning/gap-types.ts +61 -0
  339. package/src/planning/planner.ts +1273 -24
  340. package/src/playbooks/generic/brainstorming.ts +110 -0
  341. package/src/playbooks/generic/code-review.ts +181 -0
  342. package/src/playbooks/generic/subagent-execution.ts +74 -0
  343. package/src/playbooks/generic/systematic-debugging.ts +92 -0
  344. package/src/playbooks/generic/tdd.ts +75 -0
  345. package/src/playbooks/generic/verification.ts +79 -0
  346. package/src/playbooks/index.ts +27 -0
  347. package/src/playbooks/playbook-registry.ts +284 -0
  348. package/src/playbooks/playbook-seeder.ts +119 -0
  349. package/src/playbooks/playbook-types.ts +162 -0
  350. package/src/project/project-registry.ts +370 -0
  351. package/src/project/types.ts +31 -0
  352. package/src/prompts/index.ts +3 -0
  353. package/src/prompts/parser.ts +59 -0
  354. package/src/prompts/template-manager.ts +77 -0
  355. package/src/prompts/types.ts +28 -0
  356. package/src/runtime/admin-extra-ops.ts +652 -0
  357. package/src/runtime/admin-ops.ts +340 -0
  358. package/src/runtime/capture-ops.ts +404 -0
  359. package/src/runtime/cognee-sync-ops.ts +63 -0
  360. package/src/runtime/core-ops.ts +787 -9
  361. package/src/runtime/curator-extra-ops.ts +85 -0
  362. package/src/runtime/domain-ops.ts +67 -15
  363. package/src/runtime/grading-ops.ts +130 -0
  364. package/src/runtime/intake-ops.ts +126 -0
  365. package/src/runtime/loop-ops.ts +277 -0
  366. package/src/runtime/memory-cross-project-ops.ts +191 -0
  367. package/src/runtime/memory-extra-ops.ts +186 -0
  368. package/src/runtime/orchestrate-ops.ts +278 -0
  369. package/src/runtime/planning-extra-ops.ts +718 -0
  370. package/src/runtime/playbook-ops.ts +169 -0
  371. package/src/runtime/project-ops.ts +202 -0
  372. package/src/runtime/runtime.ts +77 -3
  373. package/src/runtime/types.ts +29 -0
  374. package/src/runtime/vault-extra-ops.ts +606 -0
  375. package/src/telemetry/telemetry.ts +118 -0
  376. package/src/vault/playbook.ts +87 -0
  377. package/src/vault/vault.ts +575 -98
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Generic core operations factory — 37 ops that every agent gets.
2
+ * Generic core operations factory — 158 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)
@@ -10,15 +10,53 @@ import { z } from 'zod';
10
10
  import type { OpDefinition } from '../facades/types.js';
11
11
  import type { IntelligenceEntry } from '../intelligence/types.js';
12
12
  import type { AgentRuntime } from './types.js';
13
+ import type { GuidelineCategory, OperationalMode } from '../control/types.js';
14
+ import type { PolicyType, PolicyPreset } from '../governance/types.js';
15
+ import type { CogneeSearchType } from '../cognee/types.js';
16
+ import { createPlanningExtraOps } from './planning-extra-ops.js';
17
+ import { createMemoryExtraOps } from './memory-extra-ops.js';
18
+ import { createVaultExtraOps } from './vault-extra-ops.js';
19
+ import { createAdminOps } from './admin-ops.js';
20
+ import { createAdminExtraOps } from './admin-extra-ops.js';
21
+ import { createLoopOps } from './loop-ops.js';
22
+ import { createOrchestrateOps } from './orchestrate-ops.js';
23
+ import { createGradingOps } from './grading-ops.js';
24
+ import { createCaptureOps } from './capture-ops.js';
25
+ import { createCuratorExtraOps } from './curator-extra-ops.js';
26
+ import { createProjectOps } from './project-ops.js';
27
+ import { createMemoryCrossProjectOps } from './memory-cross-project-ops.js';
28
+ import { createPlaybookOps } from './playbook-ops.js';
29
+ import { createCogneeSyncOps } from './cognee-sync-ops.js';
30
+ import { createIntakeOps } from './intake-ops.js';
13
31
 
14
32
  /**
15
- * Create the 37 generic core operations for an agent runtime.
33
+ * Create the 203 generic core operations for an agent runtime.
16
34
  *
17
35
  * Groups: search/vault (4), memory (4), export (1), planning (5),
18
- * brain (4), brain intelligence (11), curator (8).
36
+ * brain (8), brain intelligence (11), cognee (5),
37
+ * llm (2), curator (8), control (8), governance (5),
38
+ * playbook (5), prompt templates (2),
39
+ * planning-extra (22), memory-extra (8), vault-extra (20),
40
+ * admin (8), admin-extra (23), loop (9), orchestrate (5),
41
+ * grading (5), capture (4), curator-extra (5), project (12),
42
+ * cognee-sync (3), intake (4).
19
43
  */
20
44
  export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
21
- const { vault, brain, brainIntelligence, planner, curator, llmClient, keyPool } = runtime;
45
+ const {
46
+ vault,
47
+ brain,
48
+ brainIntelligence,
49
+ planner,
50
+ curator,
51
+ governance,
52
+ cognee,
53
+ identityManager,
54
+ intentRouter,
55
+ llmClient,
56
+ keyPool,
57
+ syncManager,
58
+ intakePipeline,
59
+ } = runtime;
22
60
 
23
61
  return [
24
62
  // ─── Search / Vault ──────────────────────────────────────────
@@ -30,7 +68,7 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
30
68
  schema: z.object({
31
69
  query: z.string(),
32
70
  domain: z.string().optional(),
33
- type: z.enum(['pattern', 'anti-pattern', 'rule']).optional(),
71
+ type: z.enum(['pattern', 'anti-pattern', 'rule', 'playbook']).optional(),
34
72
  severity: z.enum(['critical', 'warning', 'suggestion']).optional(),
35
73
  tags: z.array(z.string()).optional(),
36
74
  limit: z.number().optional(),
@@ -57,7 +95,7 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
57
95
  auth: 'read',
58
96
  schema: z.object({
59
97
  domain: z.string().optional(),
60
- type: z.enum(['pattern', 'anti-pattern', 'rule']).optional(),
98
+ type: z.enum(['pattern', 'anti-pattern', 'rule', 'playbook']).optional(),
61
99
  severity: z.enum(['critical', 'warning', 'suggestion']).optional(),
62
100
  tags: z.array(z.string()).optional(),
63
101
  limit: z.number().optional(),
@@ -87,9 +125,18 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
87
125
  const { resolve } = await import('node:path');
88
126
  const projectPath = resolve((params.projectPath as string) ?? '.');
89
127
  const project = vault.registerProject(projectPath, params.name as string | undefined);
128
+ // Also track in project registry for cross-project features
129
+ runtime.projectRegistry.register(projectPath, params.name as string | undefined);
90
130
  const stats = vault.stats();
91
131
  const isNew = project.sessionCount === 1;
92
132
 
133
+ // Expire stale proposals on session start (fire-and-forget)
134
+ const policy = governance.getPolicy(projectPath);
135
+ const expired = governance.expireStaleProposals(policy.autoCapture.autoExpireDays);
136
+
137
+ const proposalStats = governance.getProposalStats(projectPath);
138
+ const quotaStatus = governance.getQuotaStatus(projectPath);
139
+
93
140
  return {
94
141
  project,
95
142
  is_new: isNew,
@@ -97,6 +144,15 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
97
144
  ? 'Welcome! New project registered.'
98
145
  : 'Welcome back! Session #' + project.sessionCount + ' for ' + project.name + '.',
99
146
  vault: { entries: stats.totalEntries, domains: Object.keys(stats.byDomain) },
147
+ governance: {
148
+ pendingProposals: proposalStats.pending,
149
+ quotaPercent:
150
+ quotaStatus.maxTotal > 0
151
+ ? Math.round((quotaStatus.total / quotaStatus.maxTotal) * 100)
152
+ : 0,
153
+ isQuotaWarning: quotaStatus.isWarning,
154
+ expiredThisSession: expired,
155
+ },
100
156
  };
101
157
  },
102
158
  },
@@ -346,6 +402,52 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
346
402
  };
347
403
  },
348
404
  },
405
+ {
406
+ name: 'brain_feedback',
407
+ description:
408
+ 'Enhanced feedback with typed actions (accepted/dismissed/modified/failed), source tracking, confidence, duration, and reason.',
409
+ auth: 'write',
410
+ schema: z.object({
411
+ query: z.string().describe('The original search query'),
412
+ entryId: z.string().describe('The entry ID'),
413
+ action: z.enum(['accepted', 'dismissed', 'modified', 'failed']),
414
+ source: z
415
+ .enum(['search', 'recommendation', 'tool-execution', 'explicit'])
416
+ .optional()
417
+ .describe("Feedback source. Default 'search'."),
418
+ confidence: z.number().optional().describe('Confidence 0-1. Default 0.6.'),
419
+ duration: z.number().optional().describe('Duration in ms.'),
420
+ context: z.string().optional().describe("JSON context string. Default '{}'."),
421
+ reason: z.string().optional().describe('Human-readable reason.'),
422
+ }),
423
+ handler: async (params) => {
424
+ const entry = brain.recordFeedback({
425
+ query: params.query as string,
426
+ entryId: params.entryId as string,
427
+ action: params.action as 'accepted' | 'dismissed' | 'modified' | 'failed',
428
+ source: params.source as
429
+ | 'search'
430
+ | 'recommendation'
431
+ | 'tool-execution'
432
+ | 'explicit'
433
+ | undefined,
434
+ confidence: params.confidence as number | undefined,
435
+ duration: params.duration as number | undefined,
436
+ context: params.context as string | undefined,
437
+ reason: params.reason as string | undefined,
438
+ });
439
+ return entry;
440
+ },
441
+ },
442
+ {
443
+ name: 'brain_feedback_stats',
444
+ description:
445
+ 'Feedback statistics — counts by action and source, acceptance rate, average confidence.',
446
+ auth: 'read',
447
+ handler: async () => {
448
+ return brain.getFeedbackStats();
449
+ },
450
+ },
349
451
  {
350
452
  name: 'rebuild_vocabulary',
351
453
  description: 'Force rebuild the TF-IDF vocabulary from all vault entries.',
@@ -366,6 +468,23 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
366
468
  return { ...base, intelligence };
367
469
  },
368
470
  },
471
+ {
472
+ name: 'brain_decay_report',
473
+ description:
474
+ 'Show temporal decay scores for entries matching a query — reveals which entries are expiring, active, or expired.',
475
+ auth: 'read',
476
+ schema: z.object({
477
+ query: z.string().describe('Search query to find entries'),
478
+ limit: z.number().optional().describe('Max results (default 10)'),
479
+ }),
480
+ handler: async (params) => {
481
+ const results = await brain.getDecayReport(
482
+ params.query as string,
483
+ (params.limit as number | undefined) ?? 10,
484
+ );
485
+ return { results, count: results.length };
486
+ },
487
+ },
369
488
  {
370
489
  name: 'llm_status',
371
490
  description:
@@ -435,17 +554,24 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
435
554
  {
436
555
  name: 'brain_recommend',
437
556
  description:
438
- 'Get pattern recommendations for a task context. Matches domain and task terms against known strengths.',
557
+ 'Get pattern recommendations for a task context. Matches domain, task terms, and source-specific acceptance rates against known strengths.',
439
558
  auth: 'read',
440
559
  schema: z.object({
441
560
  domain: z.string().optional(),
442
561
  task: z.string().optional().describe('Task description for contextual matching.'),
562
+ source: z
563
+ .string()
564
+ .optional()
565
+ .describe(
566
+ 'Feedback source to boost by (search, recommendation, tool-execution, explicit).',
567
+ ),
443
568
  limit: z.number().optional(),
444
569
  }),
445
570
  handler: async (params) => {
446
571
  return brainIntelligence.recommend({
447
572
  domain: params.domain as string | undefined,
448
573
  task: params.task as string | undefined,
574
+ source: params.source as string | undefined,
449
575
  limit: (params.limit as number) ?? 5,
450
576
  });
451
577
  },
@@ -507,13 +633,15 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
507
633
  {
508
634
  name: 'brain_promote_proposals',
509
635
  description:
510
- 'Promote knowledge proposals to vault entries. Creates intelligence entries from auto-extracted patterns.',
636
+ 'Promote knowledge proposals to vault entries. Creates intelligence entries from auto-extracted patterns. Gated by governance policies.',
511
637
  auth: 'write',
512
638
  schema: z.object({
513
639
  proposalIds: z.array(z.string()).describe('IDs of proposals to promote.'),
640
+ projectPath: z.string().optional().default('.'),
514
641
  }),
515
642
  handler: async (params) => {
516
- return brainIntelligence.promoteProposals(params.proposalIds as string[]);
643
+ const pp = (params.projectPath as string | undefined) ?? '.';
644
+ return brainIntelligence.promoteProposals(params.proposalIds as string[], governance, pp);
517
645
  },
518
646
  },
519
647
  {
@@ -548,6 +676,341 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
548
676
  },
549
677
  },
550
678
 
679
+ {
680
+ name: 'brain_reset_extracted',
681
+ description:
682
+ 'Reset extraction status on brain sessions, allowing re-extraction. Filter by sessionId, since date, or all.',
683
+ auth: 'write',
684
+ schema: z.object({
685
+ sessionId: z.string().optional().describe('Reset a specific session.'),
686
+ since: z.string().optional().describe('Reset sessions extracted since this ISO date.'),
687
+ all: z.boolean().optional().describe('Reset all extracted sessions.'),
688
+ }),
689
+ handler: async (params) => {
690
+ return brainIntelligence.resetExtracted({
691
+ sessionId: params.sessionId as string | undefined,
692
+ since: params.since as string | undefined,
693
+ all: params.all as boolean | undefined,
694
+ });
695
+ },
696
+ },
697
+
698
+ // ─── Cognee ──────────────────────────────────────────────────
699
+ {
700
+ name: 'cognee_status',
701
+ description:
702
+ 'Cognee vector search health — availability, URL, latency. Checks the Cognee API endpoint.',
703
+ auth: 'read',
704
+ handler: async () => {
705
+ return cognee.healthCheck();
706
+ },
707
+ },
708
+ {
709
+ name: 'cognee_search',
710
+ description:
711
+ 'Vector similarity search via Cognee. Complements TF-IDF vault search with semantic understanding.',
712
+ auth: 'read',
713
+ schema: z.object({
714
+ query: z.string(),
715
+ searchType: z
716
+ .enum([
717
+ 'SUMMARIES',
718
+ 'CHUNKS',
719
+ 'RAG_COMPLETION',
720
+ 'TRIPLET_COMPLETION',
721
+ 'GRAPH_COMPLETION',
722
+ 'GRAPH_SUMMARY_COMPLETION',
723
+ 'NATURAL_LANGUAGE',
724
+ 'GRAPH_COMPLETION_COT',
725
+ 'FEELING_LUCKY',
726
+ 'CHUNKS_LEXICAL',
727
+ ])
728
+ .optional()
729
+ .describe('Cognee search type. Default CHUNKS (pure vector similarity).'),
730
+ limit: z.number().optional(),
731
+ }),
732
+ handler: async (params) => {
733
+ return cognee.search(params.query as string, {
734
+ searchType: params.searchType as CogneeSearchType | undefined,
735
+ limit: (params.limit as number) ?? 10,
736
+ });
737
+ },
738
+ },
739
+ {
740
+ name: 'cognee_add',
741
+ description:
742
+ 'Ingest vault entries into Cognee for vector indexing. Auto-schedules cognify after ingest.',
743
+ auth: 'write',
744
+ schema: z.object({
745
+ entryIds: z.array(z.string()).describe('Vault entry IDs to ingest into Cognee.'),
746
+ }),
747
+ handler: async (params) => {
748
+ const ids = params.entryIds as string[];
749
+ const entries = ids
750
+ .map((id) => vault.get(id))
751
+ .filter((e): e is IntelligenceEntry => e !== null && e !== undefined);
752
+ if (entries.length === 0) return { added: 0, error: 'No matching vault entries found' };
753
+ return cognee.addEntries(entries);
754
+ },
755
+ },
756
+ {
757
+ name: 'cognee_cognify',
758
+ description:
759
+ 'Trigger Cognee knowledge graph processing on the vault dataset. Usually auto-scheduled after add.',
760
+ auth: 'write',
761
+ handler: async () => {
762
+ return cognee.cognify();
763
+ },
764
+ },
765
+ {
766
+ name: 'cognee_config',
767
+ description: 'Get current Cognee client configuration and cached health status.',
768
+ auth: 'read',
769
+ handler: async () => {
770
+ return { config: cognee.getConfig(), cachedStatus: cognee.getStatus() };
771
+ },
772
+ },
773
+ // ─── Cognee Graph (#156) ──────────────────────────────────────
774
+ {
775
+ name: 'cognee_get_node',
776
+ description: 'Get a specific Cognee graph node by UUID with all properties and connections.',
777
+ auth: 'read',
778
+ schema: z.object({
779
+ nodeId: z.string().describe('UUID of the graph node'),
780
+ }),
781
+ handler: async (params) => {
782
+ try {
783
+ // Use Cognee search with specific ID query — the graph node API is accessed via search
784
+ const results = await cognee.search(params.nodeId as string, {
785
+ searchType: 'GRAPH_COMPLETION' as CogneeSearchType,
786
+ limit: 1,
787
+ });
788
+ if (!results || (Array.isArray(results) && results.length === 0)) {
789
+ return { found: false, nodeId: params.nodeId };
790
+ }
791
+ return {
792
+ found: true,
793
+ nodeId: params.nodeId,
794
+ node: Array.isArray(results) ? results[0] : results,
795
+ };
796
+ } catch (err) {
797
+ return { error: (err as Error).message };
798
+ }
799
+ },
800
+ },
801
+ {
802
+ name: 'cognee_graph_stats',
803
+ description:
804
+ 'Cognee graph statistics — availability, endpoint, latency from last health check.',
805
+ auth: 'read',
806
+ handler: async () => {
807
+ try {
808
+ const status = cognee.getStatus();
809
+ const health = await cognee.healthCheck();
810
+ return {
811
+ available: status?.available ?? false,
812
+ url: status?.url ?? cognee.getConfig().baseUrl,
813
+ latencyMs: status?.latencyMs ?? health.latencyMs ?? null,
814
+ error: status?.error ?? health.error ?? null,
815
+ };
816
+ } catch (err) {
817
+ return { error: (err as Error).message };
818
+ }
819
+ },
820
+ },
821
+ {
822
+ name: 'cognee_export_status',
823
+ description: 'Check Cognee dataset and processing status — availability, pending operations.',
824
+ auth: 'read',
825
+ handler: async () => {
826
+ try {
827
+ const status = cognee.getStatus();
828
+ const config = cognee.getConfig();
829
+ return {
830
+ available: status?.available ?? false,
831
+ dataset: config.dataset ?? 'default',
832
+ pendingCognify: false, // CogneeClient tracks internally via flushPendingCognify
833
+ url: status?.url ?? config.baseUrl,
834
+ };
835
+ } catch (err) {
836
+ return { error: (err as Error).message };
837
+ }
838
+ },
839
+ },
840
+
841
+ // ─── Enriched Capture (#154) ─────────────────────────────────
842
+ {
843
+ name: 'capture_enriched',
844
+ description:
845
+ 'Unified LLM-enriched capture — accepts minimal fields (title, description, type), uses LLM to auto-infer tags, category, and severity.',
846
+ auth: 'write',
847
+ schema: z.object({
848
+ title: z.string().describe('Knowledge title'),
849
+ description: z.string().describe('Knowledge description'),
850
+ type: z
851
+ .enum(['pattern', 'anti-pattern', 'rule', 'playbook'])
852
+ .optional()
853
+ .describe('Entry type. If omitted, LLM infers from content.'),
854
+ domain: z.string().optional().describe('Domain. If omitted, LLM infers.'),
855
+ tags: z.array(z.string()).optional().describe('Tags. LLM adds more if needed.'),
856
+ }),
857
+ handler: async (params) => {
858
+ try {
859
+ const title = params.title as string;
860
+ const description = params.description as string;
861
+
862
+ // Try LLM enrichment for auto-tagging
863
+ let inferredTags: string[] = (params.tags as string[] | undefined) ?? [];
864
+ let inferredType = (params.type as IntelligenceEntry['type'] | undefined) ?? 'pattern';
865
+ const inferredDomain = (params.domain as string | undefined) ?? 'general';
866
+ let inferredSeverity: IntelligenceEntry['severity'] = 'suggestion';
867
+ const enriched = false;
868
+
869
+ try {
870
+ const captureId = `enriched-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
871
+ const enrichResult = brain.enrichAndCapture({
872
+ id: captureId,
873
+ title,
874
+ description,
875
+ type: inferredType,
876
+ domain: inferredDomain,
877
+ severity: inferredSeverity,
878
+ tags: inferredTags,
879
+ });
880
+
881
+ if (enrichResult.captured) {
882
+ return {
883
+ captured: true,
884
+ enriched: true,
885
+ entryId: enrichResult.id,
886
+ autoTags: enrichResult.autoTags,
887
+ duplicate: enrichResult.duplicate ?? null,
888
+ };
889
+ }
890
+ } catch {
891
+ // LLM enrichment failed — fall back to basic capture
892
+ }
893
+
894
+ // Fallback: basic capture without LLM enrichment
895
+ // Infer type from keywords
896
+ const lowerDesc = description.toLowerCase();
897
+ if (!params.type) {
898
+ if (
899
+ lowerDesc.includes('avoid') ||
900
+ lowerDesc.includes("don't") ||
901
+ lowerDesc.includes('anti-pattern')
902
+ )
903
+ inferredType = 'anti-pattern';
904
+ else if (
905
+ lowerDesc.includes('rule') ||
906
+ lowerDesc.includes('must') ||
907
+ lowerDesc.includes('always')
908
+ )
909
+ inferredType = 'rule';
910
+ }
911
+
912
+ // Infer severity from keywords
913
+ if (
914
+ lowerDesc.includes('critical') ||
915
+ lowerDesc.includes('security') ||
916
+ lowerDesc.includes('breaking')
917
+ )
918
+ inferredSeverity = 'critical';
919
+ else if (
920
+ lowerDesc.includes('warning') ||
921
+ lowerDesc.includes('careful') ||
922
+ lowerDesc.includes('avoid')
923
+ )
924
+ inferredSeverity = 'warning';
925
+
926
+ // Auto-generate tags from title words
927
+ if (inferredTags.length === 0) {
928
+ inferredTags = title
929
+ .toLowerCase()
930
+ .split(/\s+/)
931
+ .filter(
932
+ (w) =>
933
+ w.length > 3 && !['with', 'from', 'that', 'this', 'have', 'been'].includes(w),
934
+ )
935
+ .slice(0, 5);
936
+ }
937
+
938
+ const entry: IntelligenceEntry = {
939
+ id: `enriched-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
940
+ type: inferredType,
941
+ domain: inferredDomain,
942
+ title,
943
+ severity: inferredSeverity,
944
+ description,
945
+ tags: inferredTags,
946
+ };
947
+
948
+ vault.add(entry);
949
+
950
+ return {
951
+ captured: true,
952
+ enriched,
953
+ entry,
954
+ autoTags: inferredTags,
955
+ };
956
+ } catch (err) {
957
+ return { error: (err as Error).message };
958
+ }
959
+ },
960
+ },
961
+
962
+ // ─── LLM ─────────────────────────────────────────────────────
963
+ {
964
+ name: 'llm_rotate',
965
+ description:
966
+ 'Force rotate the active API key for a provider. Useful when rate-limited or key is failing.',
967
+ auth: 'write',
968
+ schema: z.object({
969
+ provider: z.enum(['openai', 'anthropic']),
970
+ }),
971
+ handler: async (params) => {
972
+ const provider = params.provider as 'openai' | 'anthropic';
973
+ const pool = keyPool[provider];
974
+ if (!pool.hasKeys) return { rotated: false, error: `No ${provider} keys configured` };
975
+ const newKey = pool.rotateOnError();
976
+ return {
977
+ rotated: newKey !== null,
978
+ activeKeyIndex: pool.activeKeyIndex,
979
+ poolSize: pool.poolSize,
980
+ exhausted: pool.exhausted,
981
+ };
982
+ },
983
+ },
984
+ {
985
+ name: 'llm_call',
986
+ description: 'Make an LLM completion call. Uses model routing config and key pool rotation.',
987
+ auth: 'write',
988
+ schema: z.object({
989
+ systemPrompt: z.string().describe('System prompt for the LLM.'),
990
+ userPrompt: z.string().describe('User prompt / task input.'),
991
+ model: z
992
+ .string()
993
+ .optional()
994
+ .describe('Model name. Routed via model-routing.json if omitted.'),
995
+ temperature: z.number().optional().describe('Sampling temperature (0-2). Default 0.3.'),
996
+ maxTokens: z.number().optional().describe('Max output tokens. Default 500.'),
997
+ caller: z.string().optional().describe('Caller name for routing. Default "core-ops".'),
998
+ task: z.string().optional().describe('Task name for routing.'),
999
+ }),
1000
+ handler: async (params) => {
1001
+ return llmClient.complete({
1002
+ provider: 'openai',
1003
+ model: (params.model as string) ?? '',
1004
+ systemPrompt: params.systemPrompt as string,
1005
+ userPrompt: params.userPrompt as string,
1006
+ temperature: params.temperature as number | undefined,
1007
+ maxTokens: params.maxTokens as number | undefined,
1008
+ caller: (params.caller as string) ?? 'core-ops',
1009
+ task: params.task as string | undefined,
1010
+ });
1011
+ },
1012
+ },
1013
+
551
1014
  // ─── Curator ─────────────────────────────────────────────────
552
1015
  {
553
1016
  name: 'curator_status',
@@ -661,5 +1124,320 @@ export function createCoreOps(runtime: AgentRuntime): OpDefinition[] {
661
1124
  return curator.healthAudit();
662
1125
  },
663
1126
  },
1127
+
1128
+ // ─── Control ──────────────────────────────────────────────────────
1129
+ {
1130
+ name: 'get_identity',
1131
+ description: 'Get current agent identity with guidelines.',
1132
+ auth: 'read',
1133
+ schema: z.object({
1134
+ agentId: z.string().describe('Agent identifier.'),
1135
+ }),
1136
+ handler: async (params) => {
1137
+ const identity = identityManager.getIdentity(params.agentId as string);
1138
+ if (!identity) return { found: false, agentId: params.agentId };
1139
+ return identity;
1140
+ },
1141
+ },
1142
+ {
1143
+ name: 'update_identity',
1144
+ description: 'Update identity fields. Auto-versions and snapshots previous state.',
1145
+ auth: 'write',
1146
+ schema: z.object({
1147
+ agentId: z.string(),
1148
+ name: z.string().optional(),
1149
+ role: z.string().optional(),
1150
+ description: z.string().optional(),
1151
+ personality: z.array(z.string()).optional(),
1152
+ changedBy: z.string().optional(),
1153
+ changeReason: z.string().optional(),
1154
+ }),
1155
+ handler: async (params) => {
1156
+ const identity = identityManager.setIdentity(params.agentId as string, {
1157
+ name: params.name as string | undefined,
1158
+ role: params.role as string | undefined,
1159
+ description: params.description as string | undefined,
1160
+ personality: params.personality as string[] | undefined,
1161
+ changedBy: params.changedBy as string | undefined,
1162
+ changeReason: params.changeReason as string | undefined,
1163
+ });
1164
+ return { updated: true, identity };
1165
+ },
1166
+ },
1167
+ {
1168
+ name: 'add_guideline',
1169
+ description: 'Add a behavioral guideline (behavior/preference/restriction/style).',
1170
+ auth: 'write',
1171
+ schema: z.object({
1172
+ agentId: z.string(),
1173
+ category: z.enum(['behavior', 'preference', 'restriction', 'style']),
1174
+ text: z.string(),
1175
+ priority: z.number().optional(),
1176
+ }),
1177
+ handler: async (params) => {
1178
+ const guideline = identityManager.addGuideline(params.agentId as string, {
1179
+ category: params.category as GuidelineCategory,
1180
+ text: params.text as string,
1181
+ priority: params.priority as number | undefined,
1182
+ });
1183
+ return { added: true, guideline };
1184
+ },
1185
+ },
1186
+ {
1187
+ name: 'remove_guideline',
1188
+ description: 'Remove a guideline by ID.',
1189
+ auth: 'write',
1190
+ schema: z.object({
1191
+ guidelineId: z.string(),
1192
+ }),
1193
+ handler: async (params) => {
1194
+ const removed = identityManager.removeGuideline(params.guidelineId as string);
1195
+ return { removed };
1196
+ },
1197
+ },
1198
+ {
1199
+ name: 'rollback_identity',
1200
+ description: 'Restore a previous identity version. Creates a new version with the old data.',
1201
+ auth: 'write',
1202
+ schema: z.object({
1203
+ agentId: z.string(),
1204
+ version: z.number().describe('Version number to roll back to.'),
1205
+ }),
1206
+ handler: async (params) => {
1207
+ const identity = identityManager.rollback(
1208
+ params.agentId as string,
1209
+ params.version as number,
1210
+ );
1211
+ return { rolledBack: true, identity };
1212
+ },
1213
+ },
1214
+ {
1215
+ name: 'route_intent',
1216
+ description: 'Classify a prompt into intent + operational mode via keyword matching.',
1217
+ auth: 'read',
1218
+ schema: z.object({
1219
+ prompt: z.string().describe('The user prompt to classify.'),
1220
+ }),
1221
+ handler: async (params) => {
1222
+ return intentRouter.routeIntent(params.prompt as string);
1223
+ },
1224
+ },
1225
+ {
1226
+ name: 'morph',
1227
+ description: 'Switch operational mode manually.',
1228
+ auth: 'write',
1229
+ schema: z.object({
1230
+ mode: z
1231
+ .string()
1232
+ .describe('The operational mode to switch to (e.g., BUILD-MODE, FIX-MODE).'),
1233
+ }),
1234
+ handler: async (params) => {
1235
+ return intentRouter.morph(params.mode as OperationalMode);
1236
+ },
1237
+ },
1238
+ {
1239
+ name: 'get_behavior_rules',
1240
+ description: 'Get behavior rules for current or specified mode.',
1241
+ auth: 'read',
1242
+ schema: z.object({
1243
+ mode: z.string().optional().describe('Mode to get rules for. Defaults to current mode.'),
1244
+ }),
1245
+ handler: async (params) => {
1246
+ const mode = params.mode as OperationalMode | undefined;
1247
+ const rules = intentRouter.getBehaviorRules(mode);
1248
+ const currentMode = intentRouter.getCurrentMode();
1249
+ return { mode: mode ?? currentMode, rules };
1250
+ },
1251
+ },
1252
+
1253
+ // ─── Governance ─────────────────────────────────────────────────
1254
+ {
1255
+ name: 'governance_policy',
1256
+ description:
1257
+ 'Get, set, or apply a preset to vault governance policies (quota, retention, auto-capture).',
1258
+ auth: 'write',
1259
+ schema: z.object({
1260
+ action: z.enum(['get', 'set', 'applyPreset']),
1261
+ projectPath: z.string(),
1262
+ policyType: z.enum(['quota', 'retention', 'auto-capture']).optional(),
1263
+ config: z.record(z.unknown()).optional(),
1264
+ preset: z.enum(['strict', 'moderate', 'permissive']).optional(),
1265
+ changedBy: z.string().optional(),
1266
+ }),
1267
+ handler: async (params) => {
1268
+ const action = params.action as string;
1269
+ const projectPath = params.projectPath as string;
1270
+ if (action === 'get') {
1271
+ return governance.getPolicy(projectPath);
1272
+ }
1273
+ if (action === 'set') {
1274
+ governance.setPolicy(
1275
+ projectPath,
1276
+ params.policyType as PolicyType,
1277
+ params.config as Record<string, unknown>,
1278
+ params.changedBy as string | undefined,
1279
+ );
1280
+ return { updated: true, policy: governance.getPolicy(projectPath) };
1281
+ }
1282
+ if (action === 'applyPreset') {
1283
+ governance.applyPreset(
1284
+ projectPath,
1285
+ params.preset as PolicyPreset,
1286
+ params.changedBy as string | undefined,
1287
+ );
1288
+ return {
1289
+ applied: true,
1290
+ preset: params.preset,
1291
+ policy: governance.getPolicy(projectPath),
1292
+ };
1293
+ }
1294
+ return { error: 'Unknown action: ' + action };
1295
+ },
1296
+ },
1297
+ {
1298
+ name: 'governance_proposals',
1299
+ description:
1300
+ 'Manage knowledge capture proposals — list, approve, reject, modify, get stats, or expire stale.',
1301
+ auth: 'write',
1302
+ schema: z.object({
1303
+ action: z.enum(['list', 'approve', 'reject', 'modify', 'stats', 'expire']),
1304
+ projectPath: z.string().optional(),
1305
+ proposalId: z.number().optional(),
1306
+ decidedBy: z.string().optional(),
1307
+ note: z.string().optional(),
1308
+ modifications: z.record(z.unknown()).optional(),
1309
+ maxAgeDays: z.number().optional(),
1310
+ limit: z.number().optional(),
1311
+ }),
1312
+ handler: async (params) => {
1313
+ const action = params.action as string;
1314
+ if (action === 'list') {
1315
+ return governance.listPendingProposals(
1316
+ params.projectPath as string | undefined,
1317
+ params.limit as number | undefined,
1318
+ );
1319
+ }
1320
+ if (action === 'approve') {
1321
+ return governance.approveProposal(
1322
+ params.proposalId as number,
1323
+ params.decidedBy as string | undefined,
1324
+ );
1325
+ }
1326
+ if (action === 'reject') {
1327
+ return governance.rejectProposal(
1328
+ params.proposalId as number,
1329
+ params.decidedBy as string | undefined,
1330
+ params.note as string | undefined,
1331
+ );
1332
+ }
1333
+ if (action === 'modify') {
1334
+ return governance.modifyProposal(
1335
+ params.proposalId as number,
1336
+ params.modifications as Record<string, unknown>,
1337
+ params.decidedBy as string | undefined,
1338
+ );
1339
+ }
1340
+ if (action === 'stats') {
1341
+ return governance.getProposalStats(params.projectPath as string | undefined);
1342
+ }
1343
+ if (action === 'expire') {
1344
+ const expired = governance.expireStaleProposals(params.maxAgeDays as number | undefined);
1345
+ return { expired };
1346
+ }
1347
+ return { error: 'Unknown action: ' + action };
1348
+ },
1349
+ },
1350
+ {
1351
+ name: 'governance_stats',
1352
+ description: 'Get governance statistics — quota status and proposal stats for a project.',
1353
+ auth: 'read',
1354
+ schema: z.object({
1355
+ projectPath: z.string(),
1356
+ }),
1357
+ handler: async (params) => {
1358
+ const projectPath = params.projectPath as string;
1359
+ return {
1360
+ quotaStatus: governance.getQuotaStatus(projectPath),
1361
+ proposalStats: governance.getProposalStats(projectPath),
1362
+ };
1363
+ },
1364
+ },
1365
+ {
1366
+ name: 'governance_expire',
1367
+ description: 'Expire stale pending proposals older than a threshold.',
1368
+ auth: 'write',
1369
+ schema: z.object({
1370
+ projectPath: z.string().optional(),
1371
+ maxAgeDays: z.number().optional().describe('Days threshold. Default 14.'),
1372
+ }),
1373
+ handler: async (params) => {
1374
+ const expired = governance.expireStaleProposals(params.maxAgeDays as number | undefined);
1375
+ return { expired };
1376
+ },
1377
+ },
1378
+ {
1379
+ name: 'governance_dashboard',
1380
+ description:
1381
+ 'Get governance dashboard — vault size, quota usage, pending proposals, acceptance rate, evaluation trend.',
1382
+ auth: 'read',
1383
+ schema: z.object({
1384
+ projectPath: z.string(),
1385
+ }),
1386
+ handler: async (params) => {
1387
+ return governance.getDashboard(params.projectPath as string);
1388
+ },
1389
+ },
1390
+
1391
+ // ─── Playbook ops (from dedicated module) ─────────────────────────
1392
+ ...createPlaybookOps(runtime),
1393
+
1394
+ // ─── Extra Ops (from dedicated modules) ─────────────────────────
1395
+ ...createPlanningExtraOps(runtime),
1396
+ ...createMemoryExtraOps(runtime),
1397
+ ...createVaultExtraOps(runtime),
1398
+ ...createAdminOps(runtime),
1399
+ ...createAdminExtraOps(runtime),
1400
+ ...createLoopOps(runtime),
1401
+ ...createOrchestrateOps(runtime),
1402
+ ...createGradingOps(runtime),
1403
+ ...createCaptureOps(runtime),
1404
+ ...createCuratorExtraOps(runtime),
1405
+ ...createProjectOps(runtime),
1406
+ ...createMemoryCrossProjectOps(runtime),
1407
+
1408
+ // ─── Cognee Sync ──────────────────────────────────────────────
1409
+ ...createCogneeSyncOps(syncManager),
1410
+
1411
+ // ─── Intake Pipeline ──────────────────────────────────────────
1412
+ ...createIntakeOps(intakePipeline),
1413
+
1414
+ // ─── Prompt Templates ─────────────────────────────────────────
1415
+ {
1416
+ name: 'render_prompt',
1417
+ description:
1418
+ 'Render a prompt template with variable substitution. Templates are .prompt files loaded from the templates directory.',
1419
+ auth: 'read' as const,
1420
+ schema: z.object({
1421
+ template: z.string().describe('Template name (without .prompt extension)'),
1422
+ variables: z.record(z.string()).optional().default({}),
1423
+ strict: z.boolean().optional().default(true),
1424
+ }),
1425
+ handler: async (params) => {
1426
+ const rendered = runtime.templateManager.render(
1427
+ params.template as string,
1428
+ (params.variables ?? {}) as Record<string, string>,
1429
+ { strict: params.strict as boolean },
1430
+ );
1431
+ return { rendered };
1432
+ },
1433
+ },
1434
+ {
1435
+ name: 'list_templates',
1436
+ description: 'List all loaded prompt templates.',
1437
+ auth: 'read' as const,
1438
+ handler: async () => ({
1439
+ templates: runtime.templateManager.listTemplates(),
1440
+ }),
1441
+ },
664
1442
  ];
665
1443
  }