@soleri/core 9.2.0 → 9.3.1

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 (316) hide show
  1. package/data/flows/build.flow.yaml +8 -9
  2. package/data/flows/deliver.flow.yaml +9 -10
  3. package/data/flows/design.flow.yaml +3 -4
  4. package/data/flows/enhance.flow.yaml +5 -6
  5. package/data/flows/explore.flow.yaml +3 -4
  6. package/data/flows/fix.flow.yaml +5 -6
  7. package/data/flows/plan.flow.yaml +4 -5
  8. package/data/flows/review.flow.yaml +3 -4
  9. package/dist/curator/curator.d.ts.map +1 -1
  10. package/dist/curator/curator.js +98 -22
  11. package/dist/curator/curator.js.map +1 -1
  12. package/dist/engine/bin/soleri-engine.js.map +1 -1
  13. package/dist/engine/module-manifest.d.ts +2 -0
  14. package/dist/engine/module-manifest.d.ts.map +1 -1
  15. package/dist/engine/module-manifest.js +136 -1
  16. package/dist/engine/module-manifest.js.map +1 -1
  17. package/dist/engine/register-engine.d.ts.map +1 -1
  18. package/dist/engine/register-engine.js +25 -1
  19. package/dist/engine/register-engine.js.map +1 -1
  20. package/dist/flows/gate-evaluator.js.map +1 -1
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/operator/operator-profile.d.ts.map +1 -1
  26. package/dist/operator/operator-profile.js +11 -5
  27. package/dist/operator/operator-profile.js.map +1 -1
  28. package/dist/operator/operator-signals.d.ts.map +1 -1
  29. package/dist/operator/operator-signals.js.map +1 -1
  30. package/dist/planning/evidence-collector.js.map +1 -1
  31. package/dist/planning/gap-passes.d.ts.map +1 -1
  32. package/dist/planning/gap-passes.js +23 -6
  33. package/dist/planning/gap-passes.js.map +1 -1
  34. package/dist/planning/gap-patterns.d.ts.map +1 -1
  35. package/dist/planning/gap-patterns.js +57 -11
  36. package/dist/planning/gap-patterns.js.map +1 -1
  37. package/dist/planning/github-projection.d.ts.map +1 -1
  38. package/dist/planning/github-projection.js +39 -20
  39. package/dist/planning/github-projection.js.map +1 -1
  40. package/dist/planning/impact-analyzer.d.ts.map +1 -1
  41. package/dist/planning/impact-analyzer.js +20 -18
  42. package/dist/planning/impact-analyzer.js.map +1 -1
  43. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  44. package/dist/planning/plan-lifecycle.js +22 -9
  45. package/dist/planning/plan-lifecycle.js.map +1 -1
  46. package/dist/planning/planner.d.ts.map +1 -1
  47. package/dist/planning/planner.js +60 -17
  48. package/dist/planning/planner.js.map +1 -1
  49. package/dist/planning/rationalization-detector.d.ts.map +1 -1
  50. package/dist/planning/rationalization-detector.js.map +1 -1
  51. package/dist/planning/reconciliation-engine.d.ts.map +1 -1
  52. package/dist/planning/reconciliation-engine.js.map +1 -1
  53. package/dist/planning/task-complexity-assessor.d.ts +42 -0
  54. package/dist/planning/task-complexity-assessor.d.ts.map +1 -0
  55. package/dist/planning/task-complexity-assessor.js +132 -0
  56. package/dist/planning/task-complexity-assessor.js.map +1 -0
  57. package/dist/planning/task-verifier.d.ts.map +1 -1
  58. package/dist/planning/task-verifier.js +14 -6
  59. package/dist/planning/task-verifier.js.map +1 -1
  60. package/dist/runtime/admin-ops.d.ts.map +1 -1
  61. package/dist/runtime/admin-ops.js +18 -0
  62. package/dist/runtime/admin-ops.js.map +1 -1
  63. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  64. package/dist/runtime/admin-setup-ops.js +2 -1
  65. package/dist/runtime/admin-setup-ops.js.map +1 -1
  66. package/dist/runtime/branching-ops.d.ts +12 -0
  67. package/dist/runtime/branching-ops.d.ts.map +1 -0
  68. package/dist/runtime/branching-ops.js +100 -0
  69. package/dist/runtime/branching-ops.js.map +1 -0
  70. package/dist/runtime/context-health.d.ts.map +1 -1
  71. package/dist/runtime/context-health.js.map +1 -1
  72. package/dist/runtime/facades/branching-facade.d.ts +7 -0
  73. package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
  74. package/dist/runtime/facades/branching-facade.js +8 -0
  75. package/dist/runtime/facades/branching-facade.js.map +1 -0
  76. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
  77. package/dist/runtime/facades/chat-service-ops.js +3 -1
  78. package/dist/runtime/facades/chat-service-ops.js.map +1 -1
  79. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
  80. package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
  81. package/dist/runtime/facades/index.d.ts.map +1 -1
  82. package/dist/runtime/facades/index.js +42 -0
  83. package/dist/runtime/facades/index.js.map +1 -1
  84. package/dist/runtime/facades/intake-facade.d.ts +9 -0
  85. package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
  86. package/dist/runtime/facades/intake-facade.js +11 -0
  87. package/dist/runtime/facades/intake-facade.js.map +1 -0
  88. package/dist/runtime/facades/links-facade.d.ts +9 -0
  89. package/dist/runtime/facades/links-facade.d.ts.map +1 -0
  90. package/dist/runtime/facades/links-facade.js +10 -0
  91. package/dist/runtime/facades/links-facade.js.map +1 -0
  92. package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
  93. package/dist/runtime/facades/operator-facade.js.map +1 -1
  94. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  95. package/dist/runtime/facades/plan-facade.js +4 -1
  96. package/dist/runtime/facades/plan-facade.js.map +1 -1
  97. package/dist/runtime/facades/tier-facade.d.ts +7 -0
  98. package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
  99. package/dist/runtime/facades/tier-facade.js +8 -0
  100. package/dist/runtime/facades/tier-facade.js.map +1 -0
  101. package/dist/runtime/facades/vault-facade.d.ts +9 -1
  102. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  103. package/dist/runtime/facades/vault-facade.js +44 -187
  104. package/dist/runtime/facades/vault-facade.js.map +1 -1
  105. package/dist/runtime/github-integration.d.ts.map +1 -1
  106. package/dist/runtime/github-integration.js +11 -4
  107. package/dist/runtime/github-integration.js.map +1 -1
  108. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  109. package/dist/runtime/orchestrate-ops.js +75 -42
  110. package/dist/runtime/orchestrate-ops.js.map +1 -1
  111. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  112. package/dist/runtime/planning-extra-ops.js.map +1 -1
  113. package/dist/runtime/runtime.d.ts.map +1 -1
  114. package/dist/runtime/runtime.js +3 -1
  115. package/dist/runtime/runtime.js.map +1 -1
  116. package/dist/runtime/session-briefing.d.ts.map +1 -1
  117. package/dist/runtime/session-briefing.js +5 -1
  118. package/dist/runtime/session-briefing.js.map +1 -1
  119. package/dist/runtime/tier-ops.d.ts +13 -0
  120. package/dist/runtime/tier-ops.d.ts.map +1 -0
  121. package/dist/runtime/tier-ops.js +110 -0
  122. package/dist/runtime/tier-ops.js.map +1 -0
  123. package/dist/skills/sync-skills.d.ts.map +1 -1
  124. package/dist/skills/sync-skills.js +1 -1
  125. package/dist/skills/sync-skills.js.map +1 -1
  126. package/dist/vault/linking.d.ts.map +1 -1
  127. package/dist/vault/linking.js +41 -5
  128. package/dist/vault/linking.js.map +1 -1
  129. package/dist/vault/vault-entries.d.ts.map +1 -1
  130. package/dist/vault/vault-entries.js +68 -26
  131. package/dist/vault/vault-entries.js.map +1 -1
  132. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  133. package/dist/vault/vault-maintenance.js +6 -2
  134. package/dist/vault/vault-maintenance.js.map +1 -1
  135. package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
  136. package/dist/vault/vault-markdown-sync.js.map +1 -1
  137. package/dist/vault/vault-memories.d.ts.map +1 -1
  138. package/dist/vault/vault-memories.js +3 -1
  139. package/dist/vault/vault-memories.js.map +1 -1
  140. package/dist/vault/vault-schema.js +36 -10
  141. package/dist/vault/vault-schema.js.map +1 -1
  142. package/dist/vault/vault.d.ts.map +1 -1
  143. package/dist/vault/vault.js +5 -1
  144. package/dist/vault/vault.js.map +1 -1
  145. package/package.json +7 -7
  146. package/src/agency/agency-manager.test.ts +60 -40
  147. package/src/agency/default-rules.test.ts +17 -9
  148. package/src/capabilities/registry.test.ts +2 -12
  149. package/src/chat/agent-loop.test.ts +33 -43
  150. package/src/chat/mcp-bridge.test.ts +7 -2
  151. package/src/claudemd/inject.test.ts +2 -12
  152. package/src/context/context-engine.test.ts +96 -51
  153. package/src/control/intent-router.test.ts +3 -3
  154. package/src/curator/classifier.test.ts +14 -8
  155. package/src/curator/contradiction-detector.test.ts +30 -5
  156. package/src/curator/curator.ts +278 -56
  157. package/src/curator/duplicate-detector.test.ts +77 -15
  158. package/src/curator/quality-gate.test.ts +71 -31
  159. package/src/curator/tag-manager.test.ts +12 -4
  160. package/src/domain-packs/knowledge-installer.test.ts +2 -10
  161. package/src/domain-packs/token-resolver.test.ts +1 -3
  162. package/src/domain-packs/types.test.ts +16 -2
  163. package/src/enforcement/registry.test.ts +2 -8
  164. package/src/engine/bin/soleri-engine.ts +3 -1
  165. package/src/engine/module-manifest.test.ts +48 -4
  166. package/src/engine/module-manifest.ts +138 -1
  167. package/src/engine/register-engine.test.ts +6 -1
  168. package/src/engine/register-engine.ts +26 -3
  169. package/src/errors/classify.test.ts +6 -2
  170. package/src/errors/retry.test.ts +1 -4
  171. package/src/facades/facade-factory.test.ts +110 -64
  172. package/src/flows/epilogue.test.ts +16 -10
  173. package/src/flows/gate-evaluator.test.ts +12 -6
  174. package/src/flows/gate-evaluator.ts +1 -3
  175. package/src/governance/governance.test.ts +137 -21
  176. package/src/health/health-registry.test.ts +8 -1
  177. package/src/index.ts +8 -0
  178. package/src/intake/content-classifier.test.ts +121 -51
  179. package/src/intake/dedup-gate.test.ts +38 -22
  180. package/src/intake/intake-pipeline.test.ts +5 -3
  181. package/src/intake/text-ingester.test.ts +26 -20
  182. package/src/llm/key-pool.test.ts +1 -3
  183. package/src/llm/llm-client.test.ts +1 -4
  184. package/src/llm/oauth-discovery.test.ts +16 -16
  185. package/src/llm/utils.test.ts +62 -18
  186. package/src/logging/logger.test.ts +4 -1
  187. package/src/loop/loop-manager.test.ts +2 -6
  188. package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
  189. package/src/operator/operator-profile-extended.test.ts +15 -5
  190. package/src/operator/operator-profile.test.ts +26 -8
  191. package/src/operator/operator-profile.ts +38 -22
  192. package/src/operator/operator-signals-extended.test.ts +35 -23
  193. package/src/operator/operator-signals.test.ts +6 -10
  194. package/src/operator/operator-signals.ts +2 -1
  195. package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
  196. package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
  197. package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
  198. package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
  199. package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
  200. package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
  201. package/src/persona/defaults.test.ts +1 -5
  202. package/src/planning/evidence-collector.test.ts +147 -38
  203. package/src/planning/evidence-collector.ts +1 -4
  204. package/src/planning/gap-analysis-alternatives.test.ts +41 -11
  205. package/src/planning/gap-passes.test.ts +215 -33
  206. package/src/planning/gap-passes.ts +115 -46
  207. package/src/planning/gap-patterns.test.ts +87 -13
  208. package/src/planning/gap-patterns.ts +114 -31
  209. package/src/planning/github-projection.test.ts +6 -1
  210. package/src/planning/github-projection.ts +41 -20
  211. package/src/planning/impact-analyzer.test.ts +10 -23
  212. package/src/planning/impact-analyzer.ts +33 -46
  213. package/src/planning/plan-lifecycle.test.ts +103 -36
  214. package/src/planning/plan-lifecycle.ts +49 -18
  215. package/src/planning/planner.test.ts +12 -2
  216. package/src/planning/planner.ts +198 -58
  217. package/src/planning/rationalization-detector.test.ts +5 -20
  218. package/src/planning/rationalization-detector.ts +14 -16
  219. package/src/planning/reconciliation-engine.test.ts +20 -3
  220. package/src/planning/reconciliation-engine.ts +1 -2
  221. package/src/planning/task-complexity-assessor.test.ts +298 -0
  222. package/src/planning/task-complexity-assessor.ts +183 -0
  223. package/src/planning/task-verifier.test.ts +59 -27
  224. package/src/planning/task-verifier.ts +15 -9
  225. package/src/playbooks/playbook-executor.test.ts +1 -3
  226. package/src/plugins/plugin-loader.test.ts +19 -14
  227. package/src/plugins/plugin-registry.test.ts +45 -33
  228. package/src/project/project-registry.test.ts +23 -12
  229. package/src/prompts/template-manager.test.ts +4 -1
  230. package/src/queue/job-queue.test.ts +10 -14
  231. package/src/runtime/admin-extra-ops.test.ts +5 -19
  232. package/src/runtime/admin-ops.test.ts +22 -1
  233. package/src/runtime/admin-ops.ts +19 -0
  234. package/src/runtime/admin-setup-ops.test.ts +3 -4
  235. package/src/runtime/admin-setup-ops.ts +9 -2
  236. package/src/runtime/archive-ops.test.ts +4 -1
  237. package/src/runtime/branching-ops.test.ts +144 -0
  238. package/src/runtime/branching-ops.ts +107 -0
  239. package/src/runtime/capture-ops.test.ts +7 -21
  240. package/src/runtime/chain-ops.test.ts +16 -6
  241. package/src/runtime/claude-md-helpers.test.ts +1 -3
  242. package/src/runtime/context-health.test.ts +1 -3
  243. package/src/runtime/context-health.ts +1 -3
  244. package/src/runtime/curator-extra-ops.test.ts +3 -1
  245. package/src/runtime/domain-ops.test.ts +46 -36
  246. package/src/runtime/facades/admin-facade.test.ts +1 -4
  247. package/src/runtime/facades/archive-facade.test.ts +21 -7
  248. package/src/runtime/facades/brain-facade.test.ts +176 -72
  249. package/src/runtime/facades/branching-facade.test.ts +43 -0
  250. package/src/runtime/facades/branching-facade.ts +11 -0
  251. package/src/runtime/facades/chat-facade.test.ts +81 -28
  252. package/src/runtime/facades/chat-service-ops.test.ts +178 -73
  253. package/src/runtime/facades/chat-service-ops.ts +3 -1
  254. package/src/runtime/facades/chat-session-ops.test.ts +25 -10
  255. package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
  256. package/src/runtime/facades/chat-transport-ops.ts +0 -1
  257. package/src/runtime/facades/context-facade.test.ts +19 -4
  258. package/src/runtime/facades/control-facade.test.ts +3 -3
  259. package/src/runtime/facades/index.ts +42 -0
  260. package/src/runtime/facades/intake-facade.test.ts +215 -0
  261. package/src/runtime/facades/intake-facade.ts +14 -0
  262. package/src/runtime/facades/links-facade.test.ts +203 -0
  263. package/src/runtime/facades/links-facade.ts +13 -0
  264. package/src/runtime/facades/loop-facade.test.ts +22 -5
  265. package/src/runtime/facades/memory-facade.test.ts +19 -5
  266. package/src/runtime/facades/operator-facade.test.ts +17 -4
  267. package/src/runtime/facades/operator-facade.ts +11 -3
  268. package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
  269. package/src/runtime/facades/plan-facade.test.ts +29 -12
  270. package/src/runtime/facades/plan-facade.ts +7 -2
  271. package/src/runtime/facades/tier-facade.test.ts +47 -0
  272. package/src/runtime/facades/tier-facade.ts +11 -0
  273. package/src/runtime/facades/vault-facade.test.ts +174 -242
  274. package/src/runtime/facades/vault-facade.ts +55 -199
  275. package/src/runtime/github-integration.ts +11 -8
  276. package/src/runtime/grading-ops.test.ts +39 -8
  277. package/src/runtime/intake-ops.test.ts +69 -16
  278. package/src/runtime/loop-ops.test.ts +16 -6
  279. package/src/runtime/memory-cross-project-ops.test.ts +25 -14
  280. package/src/runtime/orchestrate-ops.test.ts +204 -0
  281. package/src/runtime/orchestrate-ops.ts +103 -65
  282. package/src/runtime/pack-ops.test.ts +23 -6
  283. package/src/runtime/planning-extra-ops.test.ts +17 -7
  284. package/src/runtime/planning-extra-ops.ts +3 -1
  285. package/src/runtime/playbook-ops.test.ts +26 -3
  286. package/src/runtime/plugin-ops.test.ts +83 -25
  287. package/src/runtime/project-ops.test.ts +26 -6
  288. package/src/runtime/runtime.ts +3 -1
  289. package/src/runtime/session-briefing.test.ts +183 -54
  290. package/src/runtime/session-briefing.ts +8 -2
  291. package/src/runtime/sync-ops.test.ts +3 -12
  292. package/src/runtime/telemetry-ops.test.ts +31 -6
  293. package/src/runtime/tier-ops.test.ts +159 -0
  294. package/src/runtime/tier-ops.ts +119 -0
  295. package/src/runtime/vault-extra-ops.test.ts +32 -8
  296. package/src/runtime/vault-sharing-ops.test.ts +1 -4
  297. package/src/skills/sync-skills.ts +2 -12
  298. package/src/transport/ws-server.test.ts +7 -4
  299. package/src/vault/__tests__/vault-characterization.test.ts +492 -81
  300. package/src/vault/linking.test.ts +50 -17
  301. package/src/vault/linking.ts +48 -7
  302. package/src/vault/obsidian-sync.test.ts +6 -3
  303. package/src/vault/scope-detector.test.ts +1 -3
  304. package/src/vault/vault-branching.test.ts +9 -7
  305. package/src/vault/vault-entries.ts +209 -65
  306. package/src/vault/vault-maintenance.ts +7 -12
  307. package/src/vault/vault-manager.test.ts +10 -10
  308. package/src/vault/vault-markdown-sync.ts +4 -1
  309. package/src/vault/vault-memories.ts +7 -7
  310. package/src/vault/vault-scaling.test.ts +5 -5
  311. package/src/vault/vault-schema.ts +72 -15
  312. package/src/vault/vault.ts +55 -9
  313. package/src/brain/strength-scorer.ts +0 -404
  314. package/src/engine/index.ts +0 -21
  315. package/src/persona/index.ts +0 -9
  316. package/src/vault/vault-interfaces.ts +0 -56
@@ -54,7 +54,10 @@ describe('createPackOps', () => {
54
54
  runtime = makeMockRuntime();
55
55
  ops = createPackOps(runtime);
56
56
  expect(ops.map((o) => o.name)).toEqual([
57
- 'pack_validate', 'pack_install', 'pack_list', 'pack_uninstall',
57
+ 'pack_validate',
58
+ 'pack_install',
59
+ 'pack_list',
60
+ 'pack_uninstall',
58
61
  ]);
59
62
  });
60
63
 
@@ -91,7 +94,10 @@ describe('createPackOps', () => {
91
94
  const hotRegister = vi.fn();
92
95
  setHotRegister(hotRegister);
93
96
  ops = createPackOps(runtime);
94
- const result = (await findOp('pack_install').handler({ packDir: '/packs/test' })) as Record<string, unknown>;
97
+ const result = (await findOp('pack_install').handler({ packDir: '/packs/test' })) as Record<
98
+ string,
99
+ unknown
100
+ >;
95
101
  expect(hotRegister).toHaveBeenCalledWith('test-agent_design', 'Design facade', []);
96
102
  expect(result.hotReloaded).toBe(true);
97
103
  });
@@ -99,14 +105,19 @@ describe('createPackOps', () => {
99
105
  it('skips hot-register when no callback set', async () => {
100
106
  runtime = makeMockRuntime();
101
107
  ops = createPackOps(runtime);
102
- const result = (await findOp('pack_install').handler({ packDir: '/packs/test' })) as Record<string, unknown>;
108
+ const result = (await findOp('pack_install').handler({ packDir: '/packs/test' })) as Record<
109
+ string,
110
+ unknown
111
+ >;
103
112
  expect(result.hotReloaded).toBeUndefined();
104
113
  });
105
114
 
106
115
  it('skips hot-register when no facades', async () => {
107
116
  runtime = makeMockRuntime();
108
117
  (runtime.packInstaller.install as ReturnType<typeof vi.fn>).mockResolvedValue({
109
- installed: true, id: 'pack-1', facades: 0,
118
+ installed: true,
119
+ id: 'pack-1',
120
+ facades: 0,
110
121
  });
111
122
  const hotRegister = vi.fn();
112
123
  setHotRegister(hotRegister);
@@ -142,7 +153,10 @@ describe('createPackOps', () => {
142
153
  it('uninstalls a pack', async () => {
143
154
  runtime = makeMockRuntime();
144
155
  ops = createPackOps(runtime);
145
- const result = (await findOp('pack_uninstall').handler({ packId: 'pack-1' })) as Record<string, unknown>;
156
+ const result = (await findOp('pack_uninstall').handler({ packId: 'pack-1' })) as Record<
157
+ string,
158
+ unknown
159
+ >;
146
160
  expect(result.uninstalled).toBe(true);
147
161
  expect(result.id).toBe('pack-1');
148
162
  });
@@ -151,7 +165,10 @@ describe('createPackOps', () => {
151
165
  runtime = makeMockRuntime();
152
166
  (runtime.packInstaller.uninstall as ReturnType<typeof vi.fn>).mockReturnValue(false);
153
167
  ops = createPackOps(runtime);
154
- const result = (await findOp('pack_uninstall').handler({ packId: 'missing' })) as Record<string, unknown>;
168
+ const result = (await findOp('pack_uninstall').handler({ packId: 'missing' })) as Record<
169
+ string,
170
+ unknown
171
+ >;
155
172
  expect(result.error).toContain('Pack not found');
156
173
  });
157
174
  });
@@ -70,11 +70,17 @@ function createMockRuntime(): AgentRuntime {
70
70
  return {
71
71
  planner: {
72
72
  iterate: vi.fn(() => plan),
73
- splitTasks: vi.fn(() => ({ ...plan, tasks: [plan.tasks[0], { id: 'task-2', title: 'Task 2' }] })),
73
+ splitTasks: vi.fn(() => ({
74
+ ...plan,
75
+ tasks: [plan.tasks[0], { id: 'task-2', title: 'Task 2' }],
76
+ })),
74
77
  reconcile: vi.fn(() => ({
75
78
  ...plan,
76
79
  status: 'reconciling',
77
- reconciliation: { accuracy: 85, driftItems: [{ type: 'added', description: 'Extra test' }] },
80
+ reconciliation: {
81
+ accuracy: 85,
82
+ driftItems: [{ type: 'added', description: 'Extra test' }],
83
+ },
78
84
  })),
79
85
  get: vi.fn(() => plan),
80
86
  getDispatch: vi.fn(() => ({ task: plan.tasks[0], ready: true, unmetDeps: [] })),
@@ -147,14 +153,20 @@ describe('createPlanningExtraOps', () => {
147
153
  objective: 'New objective',
148
154
  })) as Record<string, unknown>;
149
155
  expect(result.iterated).toBe(true);
150
- expect(runtime.planner.iterate).toHaveBeenCalledWith('plan-1', expect.objectContaining({ objective: 'New objective' }));
156
+ expect(runtime.planner.iterate).toHaveBeenCalledWith(
157
+ 'plan-1',
158
+ expect.objectContaining({ objective: 'New objective' }),
159
+ );
151
160
  });
152
161
 
153
162
  it('returns error on failure', async () => {
154
163
  vi.mocked(runtime.planner.iterate).mockImplementation(() => {
155
164
  throw new Error('Not a draft');
156
165
  });
157
- const result = (await findOp(ops, 'plan_iterate').handler({ planId: 'x' })) as Record<string, unknown>;
166
+ const result = (await findOp(ops, 'plan_iterate').handler({ planId: 'x' })) as Record<
167
+ string,
168
+ unknown
169
+ >;
158
170
  expect(result.error).toBe('Not a draft');
159
171
  });
160
172
  });
@@ -569,9 +581,7 @@ describe('createPlanningExtraOps', () => {
569
581
  });
570
582
 
571
583
  it('purges specific plans by ID', async () => {
572
- vi.mocked(runtime.planner.list).mockReturnValue([
573
- makePlan({ id: 'plan-1' }),
574
- ] as unknown);
584
+ vi.mocked(runtime.planner.list).mockReturnValue([makePlan({ id: 'plan-1' })] as unknown);
575
585
  const result = (await findOp(ops, 'plan_purge').handler({
576
586
  mode: 'specific',
577
587
  planIds: ['plan-1'],
@@ -46,7 +46,9 @@ export function createPlanningExtraOps(runtime: AgentRuntime): OpDefinition[] {
46
46
  decisions: z
47
47
  .array(z.union([z.string(), z.object({ decision: z.string(), rationale: z.string() })]))
48
48
  .optional()
49
- .describe('New decisions list (replaces existing) — strings or {decision, rationale} objects'),
49
+ .describe(
50
+ 'New decisions list (replaces existing) — strings or {decision, rationale} objects',
51
+ ),
50
52
  addTasks: z
51
53
  .array(z.object({ title: z.string(), description: z.string() }))
52
54
  .optional()
@@ -9,7 +9,19 @@ import type { AgentRuntime } from './types.js';
9
9
 
10
10
  /** Minimal vault stub that stores entries in memory. */
11
11
  function makeVaultStub() {
12
- const entries = new Map<string, { id: string; type: string; domain?: string; title: string; description: string; context?: string; tags?: string[]; severity?: string }>();
12
+ const entries = new Map<
13
+ string,
14
+ {
15
+ id: string;
16
+ type: string;
17
+ domain?: string;
18
+ title: string;
19
+ description: string;
20
+ context?: string;
21
+ tags?: string[];
22
+ severity?: string;
23
+ }
24
+ >();
13
25
  return {
14
26
  list: (opts: { type?: string; domain?: string; limit?: number }) => {
15
27
  let arr = [...entries.values()];
@@ -18,7 +30,16 @@ function makeVaultStub() {
18
30
  return arr.slice(0, opts.limit ?? 50);
19
31
  },
20
32
  get: (id: string) => entries.get(id) ?? null,
21
- add: (entry: { id: string; type: string; title: string; description: string; domain?: string; context?: string; tags?: string[]; severity?: string }) => {
33
+ add: (entry: {
34
+ id: string;
35
+ type: string;
36
+ title: string;
37
+ description: string;
38
+ domain?: string;
39
+ context?: string;
40
+ tags?: string[];
41
+ severity?: string;
42
+ }) => {
22
43
  entries.set(entry.id, entry);
23
44
  },
24
45
  _entries: entries,
@@ -77,7 +98,9 @@ describe('playbook-ops', () => {
77
98
  domain: 'testing',
78
99
  title: 'TDD Workflow',
79
100
  description: 'Test-driven development playbook',
80
- context: JSON.stringify({ steps: [{ order: 1, title: 'Write test', description: 'Write failing test' }] }),
101
+ context: JSON.stringify({
102
+ steps: [{ order: 1, title: 'Write test', description: 'Write failing test' }],
103
+ }),
81
104
  tags: ['tdd'],
82
105
  });
83
106
 
@@ -10,17 +10,28 @@ import type { OpDefinition } from '../facades/types.js';
10
10
 
11
11
  /** Minimal plugin registry stub. */
12
12
  function makePluginRegistryStub() {
13
- const plugins = new Map<string, {
14
- id: string;
15
- manifest: { id: string; name: string; version: string; domain: string; description: string; dependencies: string[]; intelligence: unknown[] };
16
- status: string;
17
- provenance: string;
18
- directory: string;
19
- error?: string;
20
- facades: Array<{ name: string; description: string; ops: OpDefinition[] }>;
21
- registeredAt: number;
22
- activatedAt?: number;
23
- }>();
13
+ const plugins = new Map<
14
+ string,
15
+ {
16
+ id: string;
17
+ manifest: {
18
+ id: string;
19
+ name: string;
20
+ version: string;
21
+ domain: string;
22
+ description: string;
23
+ dependencies: string[];
24
+ intelligence: unknown[];
25
+ };
26
+ status: string;
27
+ provenance: string;
28
+ directory: string;
29
+ error?: string;
30
+ facades: Array<{ name: string; description: string; ops: OpDefinition[] }>;
31
+ registeredAt: number;
32
+ activatedAt?: number;
33
+ }
34
+ >();
24
35
 
25
36
  return {
26
37
  get: (id: string) => plugins.get(id) ?? null,
@@ -43,10 +54,24 @@ function makePluginRegistryStub() {
43
54
  plugin.status = 'registered';
44
55
  return true;
45
56
  }),
46
- _seed: (id: string, overrides?: Partial<{ status: string; facades: Array<{ name: string; description: string; ops: OpDefinition[] }> }>) => {
57
+ _seed: (
58
+ id: string,
59
+ overrides?: Partial<{
60
+ status: string;
61
+ facades: Array<{ name: string; description: string; ops: OpDefinition[] }>;
62
+ }>,
63
+ ) => {
47
64
  plugins.set(id, {
48
65
  id,
49
- manifest: { id, name: `Plugin ${id}`, version: '1.0.0', domain: 'test', description: 'Test plugin', dependencies: [], intelligence: [] },
66
+ manifest: {
67
+ id,
68
+ name: `Plugin ${id}`,
69
+ version: '1.0.0',
70
+ domain: 'test',
71
+ description: 'Test plugin',
72
+ dependencies: [],
73
+ intelligence: [],
74
+ },
50
75
  status: overrides?.status ?? 'registered',
51
76
  provenance: 'local',
52
77
  directory: `/plugins/${id}`,
@@ -63,10 +88,7 @@ describe('plugin-ops', () => {
63
88
  const config = { agentId: 'test-agent' };
64
89
  const opSink = opts?.opSink;
65
90
  const ops = captureOps(
66
- createPluginOps(
67
- { pluginRegistry, config } as unknown as AgentRuntime,
68
- opSink,
69
- ),
91
+ createPluginOps({ pluginRegistry, config } as unknown as AgentRuntime, opSink),
70
92
  );
71
93
  return { pluginRegistry, ops, opSink };
72
94
  }
@@ -83,11 +105,24 @@ describe('plugin-ops', () => {
83
105
 
84
106
  it('lists registered plugins with status', async () => {
85
107
  const { ops, pluginRegistry } = setup();
86
- pluginRegistry._seed('plug-a', { status: 'active', facades: [{ name: 'f1', description: 'F1', ops: [{ name: 'op1', handler: async () => ({}), auth: 'read', description: '' }] }] });
108
+ pluginRegistry._seed('plug-a', {
109
+ status: 'active',
110
+ facades: [
111
+ {
112
+ name: 'f1',
113
+ description: 'F1',
114
+ ops: [{ name: 'op1', handler: async () => ({}), auth: 'read', description: '' }],
115
+ },
116
+ ],
117
+ });
87
118
  pluginRegistry._seed('plug-b', { status: 'registered' });
88
119
 
89
120
  const res = await executeOp(ops, 'plugin_list');
90
- const data = res.data as { count: number; active: number; plugins: Array<{ id: string; status: string; facades: number; ops: number }> };
121
+ const data = res.data as {
122
+ count: number;
123
+ active: number;
124
+ plugins: Array<{ id: string; status: string; facades: number; ops: number }>;
125
+ };
91
126
  expect(data.count).toBe(2);
92
127
  expect(data.active).toBe(1);
93
128
  expect(data.plugins[0].facades).toBe(1);
@@ -108,7 +143,13 @@ describe('plugin-ops', () => {
108
143
  pluginRegistry._seed('my-plug');
109
144
 
110
145
  const res = await executeOp(ops, 'plugin_status', { pluginId: 'my-plug' });
111
- const data = res.data as { id: string; name: string; version: string; status: string; directory: string };
146
+ const data = res.data as {
147
+ id: string;
148
+ name: string;
149
+ version: string;
150
+ status: string;
151
+ directory: string;
152
+ };
112
153
  expect(data.id).toBe('my-plug');
113
154
  expect(data.version).toBe('1.0.0');
114
155
  expect(data.directory).toBe('/plugins/my-plug');
@@ -140,7 +181,10 @@ describe('plugin-ops', () => {
140
181
  pluginRegistry._seed('p2', { status: 'registered', facades: [] });
141
182
 
142
183
  const res = await executeOp(ops, 'plugin_activate', {});
143
- const data = res.data as { activated: number; results: Array<{ id: string; status: string }> };
184
+ const data = res.data as {
185
+ activated: number;
186
+ results: Array<{ id: string; status: string }>;
187
+ };
144
188
  expect(data.activated).toBe(2);
145
189
  expect(data.results).toHaveLength(2);
146
190
  });
@@ -148,8 +192,15 @@ describe('plugin-ops', () => {
148
192
  it('injects plugin ops into opSink on activation', async () => {
149
193
  const opSink: OpDefinition[] = [];
150
194
  const { ops, pluginRegistry } = setup({ opSink });
151
- const testOp: OpDefinition = { name: 'injected_op', handler: async () => 'hi', auth: 'read', description: 'test' };
152
- pluginRegistry._seed('plug-inject', { facades: [{ name: 'test-facade', description: 'TF', ops: [testOp] }] });
195
+ const testOp: OpDefinition = {
196
+ name: 'injected_op',
197
+ handler: async () => 'hi',
198
+ auth: 'read',
199
+ description: 'test',
200
+ };
201
+ pluginRegistry._seed('plug-inject', {
202
+ facades: [{ name: 'test-facade', description: 'TF', ops: [testOp] }],
203
+ });
153
204
 
154
205
  await executeOp(ops, 'plugin_activate', { pluginId: 'plug-inject' });
155
206
  expect(opSink.some((o) => o.name === 'injected_op')).toBe(true);
@@ -177,8 +228,15 @@ describe('plugin-ops', () => {
177
228
  it('removes injected ops from opSink on deactivation', async () => {
178
229
  const opSink: OpDefinition[] = [];
179
230
  const { ops, pluginRegistry } = setup({ opSink });
180
- const testOp: OpDefinition = { name: 'to_remove', handler: async () => 'hi', auth: 'read', description: 'test' };
181
- pluginRegistry._seed('plug-rm', { facades: [{ name: 'f', description: 'F', ops: [testOp] }] });
231
+ const testOp: OpDefinition = {
232
+ name: 'to_remove',
233
+ handler: async () => 'hi',
234
+ auth: 'read',
235
+ description: 'test',
236
+ };
237
+ pluginRegistry._seed('plug-rm', {
238
+ facades: [{ name: 'f', description: 'F', ops: [testOp] }],
239
+ });
182
240
 
183
241
  await executeOp(ops, 'plugin_activate', { pluginId: 'plug-rm' });
184
242
  expect(opSink.some((o) => o.name === 'to_remove')).toBe(true);
@@ -10,7 +10,10 @@ import type { AgentRuntime } from './types.js';
10
10
  /** Minimal in-memory project registry stub. */
11
11
  function makeProjectRegistryStub() {
12
12
  const projects = new Map<string, { id: string; name: string; lastAccessed: number }>();
13
- const rules = new Map<string, Array<{ id: string; category: string; text: string; priority: number }>>();
13
+ const rules = new Map<
14
+ string,
15
+ Array<{ id: string; category: string; text: string; priority: number }>
16
+ >();
14
17
  const links: Array<{ sourceId: string; targetId: string; linkType: string }> = [];
15
18
  let ruleCounter = 0;
16
19
 
@@ -39,7 +42,10 @@ function makeProjectRegistryStub() {
39
42
  removeRule: (ruleId: string) => {
40
43
  for (const [, arr] of rules) {
41
44
  const idx = arr.findIndex((r) => r.id === ruleId);
42
- if (idx >= 0) { arr.splice(idx, 1); return true; }
45
+ if (idx >= 0) {
46
+ arr.splice(idx, 1);
47
+ return true;
48
+ }
43
49
  }
44
50
  return false;
45
51
  },
@@ -52,14 +58,19 @@ function makeProjectRegistryStub() {
52
58
  let count = 0;
53
59
  for (let i = links.length - 1; i >= 0; i--) {
54
60
  const l = links[i];
55
- if (l.sourceId === sourceId && l.targetId === targetId && (!linkType || l.linkType === linkType)) {
61
+ if (
62
+ l.sourceId === sourceId &&
63
+ l.targetId === targetId &&
64
+ (!linkType || l.linkType === linkType)
65
+ ) {
56
66
  links.splice(i, 1);
57
67
  count++;
58
68
  }
59
69
  }
60
70
  return count;
61
71
  },
62
- getLinks: (projectId: string) => links.filter((l) => l.sourceId === projectId || l.targetId === projectId),
72
+ getLinks: (projectId: string) =>
73
+ links.filter((l) => l.sourceId === projectId || l.targetId === projectId),
63
74
  getLinkedProjects: (projectId: string) => {
64
75
  return links
65
76
  .filter((l) => l.sourceId === projectId || l.targetId === projectId)
@@ -181,7 +192,12 @@ describe('project-ops', () => {
181
192
  const { ops, registry } = setup();
182
193
  registry._seed('a', 'A');
183
194
  registry._seed('b', 'B');
184
- await executeOp(ops, 'project_add_rule', { projectId: 'a', category: 'behavior', text: 'r1', priority: 0 });
195
+ await executeOp(ops, 'project_add_rule', {
196
+ projectId: 'a',
197
+ category: 'behavior',
198
+ text: 'r1',
199
+ priority: 0,
200
+ });
185
201
 
186
202
  const res = await executeOp(ops, 'project_list_rules');
187
203
  const data = res.data as { count: number; projects: Array<{ ruleCount: number }> };
@@ -207,7 +223,11 @@ describe('project-ops', () => {
207
223
  registry._seed('b', 'B');
208
224
  await executeOp(ops, 'project_link', { sourceId: 'a', targetId: 'b', linkType: 'parent' });
209
225
 
210
- const res = await executeOp(ops, 'project_unlink', { sourceId: 'a', targetId: 'b', linkType: 'parent' });
226
+ const res = await executeOp(ops, 'project_unlink', {
227
+ sourceId: 'a',
228
+ targetId: 'b',
229
+ linkType: 'parent',
230
+ });
211
231
  expect((res.data as { removed: number }).removed).toBe(1);
212
232
  });
213
233
 
@@ -210,7 +210,9 @@ export function createAgentRuntime(config: AgentRuntimeConfig): AgentRuntime {
210
210
  logger.info(`Markdown sync: ${result.synced} entries synced, ${result.skipped} skipped`);
211
211
  }
212
212
  },
213
- () => { /* best-effort — never block boot */ },
213
+ () => {
214
+ /* best-effort — never block boot */
215
+ },
214
216
  );
215
217
 
216
218
  // ─── Auto-signal pipeline wiring ───────────────────────────────────