@soleri/core 9.2.0 → 9.3.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 (298) 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.map +1 -1
  14. package/dist/engine/module-manifest.js +21 -1
  15. package/dist/engine/module-manifest.js.map +1 -1
  16. package/dist/engine/register-engine.d.ts.map +1 -1
  17. package/dist/engine/register-engine.js +25 -1
  18. package/dist/engine/register-engine.js.map +1 -1
  19. package/dist/flows/gate-evaluator.js.map +1 -1
  20. package/dist/operator/operator-profile.d.ts.map +1 -1
  21. package/dist/operator/operator-profile.js +11 -5
  22. package/dist/operator/operator-profile.js.map +1 -1
  23. package/dist/operator/operator-signals.d.ts.map +1 -1
  24. package/dist/operator/operator-signals.js.map +1 -1
  25. package/dist/planning/evidence-collector.js.map +1 -1
  26. package/dist/planning/gap-passes.d.ts.map +1 -1
  27. package/dist/planning/gap-passes.js +23 -6
  28. package/dist/planning/gap-passes.js.map +1 -1
  29. package/dist/planning/gap-patterns.d.ts.map +1 -1
  30. package/dist/planning/gap-patterns.js +57 -11
  31. package/dist/planning/gap-patterns.js.map +1 -1
  32. package/dist/planning/github-projection.d.ts.map +1 -1
  33. package/dist/planning/github-projection.js +39 -20
  34. package/dist/planning/github-projection.js.map +1 -1
  35. package/dist/planning/impact-analyzer.d.ts.map +1 -1
  36. package/dist/planning/impact-analyzer.js +20 -18
  37. package/dist/planning/impact-analyzer.js.map +1 -1
  38. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  39. package/dist/planning/plan-lifecycle.js +22 -9
  40. package/dist/planning/plan-lifecycle.js.map +1 -1
  41. package/dist/planning/planner.d.ts.map +1 -1
  42. package/dist/planning/planner.js +60 -17
  43. package/dist/planning/planner.js.map +1 -1
  44. package/dist/planning/rationalization-detector.d.ts.map +1 -1
  45. package/dist/planning/rationalization-detector.js.map +1 -1
  46. package/dist/planning/reconciliation-engine.d.ts.map +1 -1
  47. package/dist/planning/reconciliation-engine.js.map +1 -1
  48. package/dist/planning/task-verifier.d.ts.map +1 -1
  49. package/dist/planning/task-verifier.js +14 -6
  50. package/dist/planning/task-verifier.js.map +1 -1
  51. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  52. package/dist/runtime/admin-setup-ops.js +2 -1
  53. package/dist/runtime/admin-setup-ops.js.map +1 -1
  54. package/dist/runtime/branching-ops.d.ts +12 -0
  55. package/dist/runtime/branching-ops.d.ts.map +1 -0
  56. package/dist/runtime/branching-ops.js +100 -0
  57. package/dist/runtime/branching-ops.js.map +1 -0
  58. package/dist/runtime/context-health.d.ts.map +1 -1
  59. package/dist/runtime/context-health.js.map +1 -1
  60. package/dist/runtime/facades/branching-facade.d.ts +7 -0
  61. package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
  62. package/dist/runtime/facades/branching-facade.js +8 -0
  63. package/dist/runtime/facades/branching-facade.js.map +1 -0
  64. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
  65. package/dist/runtime/facades/chat-service-ops.js +3 -1
  66. package/dist/runtime/facades/chat-service-ops.js.map +1 -1
  67. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
  68. package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
  69. package/dist/runtime/facades/index.d.ts.map +1 -1
  70. package/dist/runtime/facades/index.js +42 -0
  71. package/dist/runtime/facades/index.js.map +1 -1
  72. package/dist/runtime/facades/intake-facade.d.ts +9 -0
  73. package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
  74. package/dist/runtime/facades/intake-facade.js +11 -0
  75. package/dist/runtime/facades/intake-facade.js.map +1 -0
  76. package/dist/runtime/facades/links-facade.d.ts +9 -0
  77. package/dist/runtime/facades/links-facade.d.ts.map +1 -0
  78. package/dist/runtime/facades/links-facade.js +10 -0
  79. package/dist/runtime/facades/links-facade.js.map +1 -0
  80. package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
  81. package/dist/runtime/facades/operator-facade.js.map +1 -1
  82. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  83. package/dist/runtime/facades/plan-facade.js +4 -1
  84. package/dist/runtime/facades/plan-facade.js.map +1 -1
  85. package/dist/runtime/facades/tier-facade.d.ts +7 -0
  86. package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
  87. package/dist/runtime/facades/tier-facade.js +8 -0
  88. package/dist/runtime/facades/tier-facade.js.map +1 -0
  89. package/dist/runtime/facades/vault-facade.d.ts +9 -1
  90. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  91. package/dist/runtime/facades/vault-facade.js +44 -187
  92. package/dist/runtime/facades/vault-facade.js.map +1 -1
  93. package/dist/runtime/github-integration.d.ts.map +1 -1
  94. package/dist/runtime/github-integration.js +11 -4
  95. package/dist/runtime/github-integration.js.map +1 -1
  96. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  97. package/dist/runtime/orchestrate-ops.js +32 -10
  98. package/dist/runtime/orchestrate-ops.js.map +1 -1
  99. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  100. package/dist/runtime/planning-extra-ops.js.map +1 -1
  101. package/dist/runtime/runtime.d.ts.map +1 -1
  102. package/dist/runtime/runtime.js +3 -1
  103. package/dist/runtime/runtime.js.map +1 -1
  104. package/dist/runtime/session-briefing.d.ts.map +1 -1
  105. package/dist/runtime/session-briefing.js +5 -1
  106. package/dist/runtime/session-briefing.js.map +1 -1
  107. package/dist/runtime/tier-ops.d.ts +13 -0
  108. package/dist/runtime/tier-ops.d.ts.map +1 -0
  109. package/dist/runtime/tier-ops.js +110 -0
  110. package/dist/runtime/tier-ops.js.map +1 -0
  111. package/dist/skills/sync-skills.d.ts.map +1 -1
  112. package/dist/skills/sync-skills.js +1 -1
  113. package/dist/skills/sync-skills.js.map +1 -1
  114. package/dist/vault/linking.d.ts.map +1 -1
  115. package/dist/vault/linking.js +41 -5
  116. package/dist/vault/linking.js.map +1 -1
  117. package/dist/vault/vault-entries.d.ts.map +1 -1
  118. package/dist/vault/vault-entries.js +68 -26
  119. package/dist/vault/vault-entries.js.map +1 -1
  120. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  121. package/dist/vault/vault-maintenance.js +6 -2
  122. package/dist/vault/vault-maintenance.js.map +1 -1
  123. package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
  124. package/dist/vault/vault-markdown-sync.js.map +1 -1
  125. package/dist/vault/vault-memories.d.ts.map +1 -1
  126. package/dist/vault/vault-memories.js +3 -1
  127. package/dist/vault/vault-memories.js.map +1 -1
  128. package/dist/vault/vault-schema.js +36 -10
  129. package/dist/vault/vault-schema.js.map +1 -1
  130. package/dist/vault/vault.d.ts.map +1 -1
  131. package/dist/vault/vault.js +5 -1
  132. package/dist/vault/vault.js.map +1 -1
  133. package/package.json +7 -7
  134. package/src/agency/agency-manager.test.ts +60 -40
  135. package/src/agency/default-rules.test.ts +17 -9
  136. package/src/capabilities/registry.test.ts +2 -12
  137. package/src/chat/agent-loop.test.ts +33 -43
  138. package/src/chat/mcp-bridge.test.ts +7 -2
  139. package/src/claudemd/inject.test.ts +2 -12
  140. package/src/context/context-engine.test.ts +96 -51
  141. package/src/control/intent-router.test.ts +3 -3
  142. package/src/curator/classifier.test.ts +14 -8
  143. package/src/curator/contradiction-detector.test.ts +30 -5
  144. package/src/curator/curator.ts +278 -56
  145. package/src/curator/duplicate-detector.test.ts +77 -15
  146. package/src/curator/quality-gate.test.ts +71 -31
  147. package/src/curator/tag-manager.test.ts +12 -4
  148. package/src/domain-packs/knowledge-installer.test.ts +2 -10
  149. package/src/domain-packs/token-resolver.test.ts +1 -3
  150. package/src/domain-packs/types.test.ts +16 -2
  151. package/src/enforcement/registry.test.ts +2 -8
  152. package/src/engine/bin/soleri-engine.ts +3 -1
  153. package/src/engine/module-manifest.test.ts +5 -4
  154. package/src/engine/module-manifest.ts +21 -1
  155. package/src/engine/register-engine.test.ts +6 -1
  156. package/src/engine/register-engine.ts +26 -3
  157. package/src/errors/classify.test.ts +6 -2
  158. package/src/errors/retry.test.ts +1 -4
  159. package/src/facades/facade-factory.test.ts +110 -64
  160. package/src/flows/epilogue.test.ts +16 -10
  161. package/src/flows/gate-evaluator.test.ts +12 -6
  162. package/src/flows/gate-evaluator.ts +1 -3
  163. package/src/governance/governance.test.ts +137 -21
  164. package/src/health/health-registry.test.ts +8 -1
  165. package/src/intake/content-classifier.test.ts +121 -51
  166. package/src/intake/dedup-gate.test.ts +38 -22
  167. package/src/intake/intake-pipeline.test.ts +5 -3
  168. package/src/intake/text-ingester.test.ts +26 -20
  169. package/src/llm/key-pool.test.ts +1 -3
  170. package/src/llm/llm-client.test.ts +1 -4
  171. package/src/llm/oauth-discovery.test.ts +16 -16
  172. package/src/llm/utils.test.ts +62 -18
  173. package/src/logging/logger.test.ts +4 -1
  174. package/src/loop/loop-manager.test.ts +2 -6
  175. package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
  176. package/src/operator/operator-profile-extended.test.ts +15 -5
  177. package/src/operator/operator-profile.test.ts +26 -8
  178. package/src/operator/operator-profile.ts +38 -22
  179. package/src/operator/operator-signals-extended.test.ts +35 -23
  180. package/src/operator/operator-signals.test.ts +6 -10
  181. package/src/operator/operator-signals.ts +2 -1
  182. package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
  183. package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
  184. package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
  185. package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
  186. package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
  187. package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
  188. package/src/persona/defaults.test.ts +1 -5
  189. package/src/planning/evidence-collector.test.ts +147 -38
  190. package/src/planning/evidence-collector.ts +1 -4
  191. package/src/planning/gap-analysis-alternatives.test.ts +41 -11
  192. package/src/planning/gap-passes.test.ts +215 -33
  193. package/src/planning/gap-passes.ts +115 -46
  194. package/src/planning/gap-patterns.test.ts +87 -13
  195. package/src/planning/gap-patterns.ts +114 -31
  196. package/src/planning/github-projection.test.ts +6 -1
  197. package/src/planning/github-projection.ts +41 -20
  198. package/src/planning/impact-analyzer.test.ts +10 -23
  199. package/src/planning/impact-analyzer.ts +33 -46
  200. package/src/planning/plan-lifecycle.test.ts +103 -36
  201. package/src/planning/plan-lifecycle.ts +49 -18
  202. package/src/planning/planner.test.ts +12 -2
  203. package/src/planning/planner.ts +198 -58
  204. package/src/planning/rationalization-detector.test.ts +5 -20
  205. package/src/planning/rationalization-detector.ts +14 -16
  206. package/src/planning/reconciliation-engine.test.ts +20 -3
  207. package/src/planning/reconciliation-engine.ts +1 -2
  208. package/src/planning/task-verifier.test.ts +59 -27
  209. package/src/planning/task-verifier.ts +15 -9
  210. package/src/playbooks/playbook-executor.test.ts +1 -3
  211. package/src/plugins/plugin-loader.test.ts +19 -14
  212. package/src/plugins/plugin-registry.test.ts +45 -33
  213. package/src/project/project-registry.test.ts +23 -12
  214. package/src/prompts/template-manager.test.ts +4 -1
  215. package/src/queue/job-queue.test.ts +10 -14
  216. package/src/runtime/admin-extra-ops.test.ts +5 -19
  217. package/src/runtime/admin-ops.test.ts +1 -3
  218. package/src/runtime/admin-setup-ops.test.ts +3 -4
  219. package/src/runtime/admin-setup-ops.ts +9 -2
  220. package/src/runtime/archive-ops.test.ts +4 -1
  221. package/src/runtime/branching-ops.test.ts +144 -0
  222. package/src/runtime/branching-ops.ts +107 -0
  223. package/src/runtime/capture-ops.test.ts +7 -21
  224. package/src/runtime/chain-ops.test.ts +16 -6
  225. package/src/runtime/claude-md-helpers.test.ts +1 -3
  226. package/src/runtime/context-health.test.ts +1 -3
  227. package/src/runtime/context-health.ts +1 -3
  228. package/src/runtime/curator-extra-ops.test.ts +3 -1
  229. package/src/runtime/domain-ops.test.ts +46 -36
  230. package/src/runtime/facades/admin-facade.test.ts +1 -4
  231. package/src/runtime/facades/archive-facade.test.ts +21 -7
  232. package/src/runtime/facades/brain-facade.test.ts +176 -72
  233. package/src/runtime/facades/branching-facade.test.ts +43 -0
  234. package/src/runtime/facades/branching-facade.ts +11 -0
  235. package/src/runtime/facades/chat-facade.test.ts +81 -28
  236. package/src/runtime/facades/chat-service-ops.test.ts +178 -73
  237. package/src/runtime/facades/chat-service-ops.ts +3 -1
  238. package/src/runtime/facades/chat-session-ops.test.ts +25 -10
  239. package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
  240. package/src/runtime/facades/chat-transport-ops.ts +0 -1
  241. package/src/runtime/facades/context-facade.test.ts +19 -4
  242. package/src/runtime/facades/control-facade.test.ts +3 -3
  243. package/src/runtime/facades/index.ts +42 -0
  244. package/src/runtime/facades/intake-facade.test.ts +215 -0
  245. package/src/runtime/facades/intake-facade.ts +14 -0
  246. package/src/runtime/facades/links-facade.test.ts +203 -0
  247. package/src/runtime/facades/links-facade.ts +13 -0
  248. package/src/runtime/facades/loop-facade.test.ts +22 -5
  249. package/src/runtime/facades/memory-facade.test.ts +19 -5
  250. package/src/runtime/facades/operator-facade.test.ts +17 -4
  251. package/src/runtime/facades/operator-facade.ts +11 -3
  252. package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
  253. package/src/runtime/facades/plan-facade.test.ts +29 -12
  254. package/src/runtime/facades/plan-facade.ts +7 -2
  255. package/src/runtime/facades/tier-facade.test.ts +47 -0
  256. package/src/runtime/facades/tier-facade.ts +11 -0
  257. package/src/runtime/facades/vault-facade.test.ts +174 -242
  258. package/src/runtime/facades/vault-facade.ts +55 -199
  259. package/src/runtime/github-integration.ts +11 -8
  260. package/src/runtime/grading-ops.test.ts +39 -8
  261. package/src/runtime/intake-ops.test.ts +69 -16
  262. package/src/runtime/loop-ops.test.ts +16 -6
  263. package/src/runtime/memory-cross-project-ops.test.ts +25 -14
  264. package/src/runtime/orchestrate-ops.ts +54 -27
  265. package/src/runtime/pack-ops.test.ts +23 -6
  266. package/src/runtime/planning-extra-ops.test.ts +17 -7
  267. package/src/runtime/planning-extra-ops.ts +3 -1
  268. package/src/runtime/playbook-ops.test.ts +26 -3
  269. package/src/runtime/plugin-ops.test.ts +83 -25
  270. package/src/runtime/project-ops.test.ts +26 -6
  271. package/src/runtime/runtime.ts +3 -1
  272. package/src/runtime/session-briefing.test.ts +183 -54
  273. package/src/runtime/session-briefing.ts +8 -2
  274. package/src/runtime/sync-ops.test.ts +3 -12
  275. package/src/runtime/telemetry-ops.test.ts +31 -6
  276. package/src/runtime/tier-ops.test.ts +159 -0
  277. package/src/runtime/tier-ops.ts +119 -0
  278. package/src/runtime/vault-extra-ops.test.ts +32 -8
  279. package/src/runtime/vault-sharing-ops.test.ts +1 -4
  280. package/src/skills/sync-skills.ts +2 -12
  281. package/src/transport/ws-server.test.ts +7 -4
  282. package/src/vault/__tests__/vault-characterization.test.ts +492 -81
  283. package/src/vault/linking.test.ts +50 -17
  284. package/src/vault/linking.ts +48 -7
  285. package/src/vault/obsidian-sync.test.ts +6 -3
  286. package/src/vault/scope-detector.test.ts +1 -3
  287. package/src/vault/vault-branching.test.ts +9 -7
  288. package/src/vault/vault-entries.ts +209 -65
  289. package/src/vault/vault-maintenance.ts +7 -12
  290. package/src/vault/vault-manager.test.ts +10 -10
  291. package/src/vault/vault-markdown-sync.ts +4 -1
  292. package/src/vault/vault-memories.ts +7 -7
  293. package/src/vault/vault-schema.ts +72 -15
  294. package/src/vault/vault.ts +55 -9
  295. package/src/brain/strength-scorer.ts +0 -404
  296. package/src/engine/index.ts +0 -21
  297. package/src/persona/index.ts +0 -9
  298. package/src/vault/vault-interfaces.ts +0 -56
@@ -1,24 +1,31 @@
1
1
  /**
2
2
  * Vault facade — knowledge management ops.
3
- * search, CRUD, import/export, intake, sharing, linking.
3
+ * search, CRUD, capture, sharing scope.
4
4
  * Archival and lifecycle ops are in archive-facade.ts.
5
5
  * Sync ops (git, obsidian, packs) are in sync-facade.ts.
6
6
  * Review ops are in review-facade.ts.
7
+ *
8
+ * Backward-compat stubs are appended at the end for ops that moved
9
+ * to new facades, so existing agents/CLAUDE.md files keep working.
7
10
  */
8
11
 
9
12
  import { z } from 'zod';
10
13
  import type { OpDefinition } from '../../facades/types.js';
11
14
  import type { IntelligenceEntry } from '../../intelligence/types.js';
12
- import type { VaultTier } from '../../vault/vault-types.js';
13
15
  import type { AgentRuntime } from '../types.js';
14
16
  import { createVaultExtraOps } from '../vault-extra-ops.js';
15
17
  import { createCaptureOps } from '../capture-ops.js';
16
- import { createIntakeOps } from '../intake-ops.js';
17
18
  import { createVaultSharingOps } from '../vault-sharing-ops.js';
19
+ import { createArchiveOps } from '../archive-ops.js';
20
+ import { createSyncOps } from '../sync-ops.js';
21
+ import { createReviewOps } from '../review-ops.js';
18
22
  import { createVaultLinkingOps } from '../vault-linking-ops.js';
23
+ import { createBranchingOps } from '../branching-ops.js';
24
+ import { createTierOps } from '../tier-ops.js';
25
+ import { deprecationWarning } from '../deprecation.js';
19
26
 
20
27
  export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
21
- const { vault, brain, intakePipeline, textIngester, vaultManager } = runtime;
28
+ const { vault, brain } = runtime;
22
29
 
23
30
  return [
24
31
  // ─── Search / Vault (inline from core-ops.ts) ───────────────
@@ -101,9 +108,21 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
101
108
  return entries;
102
109
  }
103
110
  // Return lightweight summaries to reduce response size
104
- return (entries as Array<{ id: string; title: string; type: string; domain: string; tags?: string[] }>).map(
105
- (e) => ({ id: e.id, title: e.title, type: e.type, domain: e.domain, tags: e.tags ?? [] }),
106
- );
111
+ return (
112
+ entries as Array<{
113
+ id: string;
114
+ title: string;
115
+ type: string;
116
+ domain: string;
117
+ tags?: string[];
118
+ }>
119
+ ).map((e) => ({
120
+ id: e.id,
121
+ title: e.title,
122
+ type: e.type,
123
+ domain: e.domain,
124
+ tags: e.tags ?? [],
125
+ }));
107
126
  },
108
127
  },
109
128
  {
@@ -253,201 +272,38 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
253
272
  },
254
273
  },
255
274
 
256
- // ─── Multi-vault ops ────────────────────────────────────────
257
- {
258
- name: 'vault_connect',
259
- description:
260
- 'Connect an additional vault tier (project or team). Opens a separate SQLite database.',
261
- auth: 'admin',
262
- schema: z.object({
263
- tier: z.enum(['project', 'team']).describe('Vault tier to connect'),
264
- path: z.string().describe('Path to the SQLite database file'),
265
- }),
266
- handler: async (params) => {
267
- const tier = params.tier as VaultTier;
268
- const path = params.path as string;
269
- vaultManager.open(tier, path);
270
- return { connected: true, tier, path };
271
- },
272
- },
273
- {
274
- name: 'vault_disconnect',
275
- description: 'Disconnect a vault tier. Cannot disconnect the agent tier.',
276
- auth: 'admin',
277
- schema: z.object({
278
- tier: z.enum(['project', 'team']).describe('Vault tier to disconnect'),
279
- }),
280
- handler: async (params) => {
281
- const tier = params.tier as VaultTier;
282
- const removed = vaultManager.disconnect(tier);
283
- return { disconnected: removed, tier };
284
- },
285
- },
286
- {
287
- name: 'vault_tiers',
288
- description: 'List all vault tiers with connection status and entry counts.',
289
- auth: 'read',
290
- handler: async () => {
291
- return { tiers: vaultManager.listTiers() };
292
- },
293
- },
294
- {
295
- name: 'vault_search_all',
296
- description:
297
- 'Search across all connected vault tiers with priority-weighted cascading. Agent tier results ranked highest.',
298
- auth: 'read',
299
- schema: z.object({
300
- query: z.string(),
301
- limit: z.number().optional(),
302
- }),
303
- handler: async (params) => {
304
- const results = vaultManager.search(params.query as string, (params.limit as number) ?? 20);
305
- return { results, count: results.length };
306
- },
307
- },
308
-
309
- // ─── Named vault connections ────────────────────────────────
310
- {
311
- name: 'vault_connect_source',
312
- description:
313
- 'Connect a named vault source (e.g., shared team knowledge base) with a configurable search priority.',
314
- auth: 'admin',
315
- schema: z.object({
316
- name: z.string().describe('Unique name for this vault connection'),
317
- path: z.string().describe('Path to the SQLite database file'),
318
- priority: z
319
- .number()
320
- .min(0)
321
- .max(2)
322
- .optional()
323
- .describe('Search priority weight (default: 0.5)'),
324
- }),
325
- handler: async (params) => {
326
- const name = params.name as string;
327
- const path = params.path as string;
328
- const priority = (params.priority as number) ?? 0.5;
329
- vaultManager.connect(name, path, priority);
330
- return { connected: true, name, path, priority };
331
- },
332
- },
333
- {
334
- name: 'vault_disconnect_source',
335
- description: 'Disconnect a named vault source.',
336
- auth: 'admin',
337
- schema: z.object({
338
- name: z.string().describe('Name of the vault connection to remove'),
339
- }),
340
- handler: async (params) => {
341
- const name = params.name as string;
342
- const removed = vaultManager.disconnectNamed(name);
343
- return { disconnected: removed, name };
344
- },
345
- },
346
- {
347
- name: 'vault_list_sources',
348
- description: 'List all dynamically connected vault sources with their priorities.',
349
- auth: 'read',
350
- handler: async () => {
351
- return { sources: vaultManager.listConnected() };
352
- },
353
- },
354
-
355
- // ─── Branching ─────────────────────────────────────────────
356
- {
357
- name: 'vault_branch',
358
- description:
359
- 'Create a named vault branch for experimentation. Changes can be reviewed and merged later.',
360
- auth: 'write',
361
- schema: z.object({
362
- name: z.string().describe('Unique branch name'),
363
- }),
364
- handler: async (params) => {
365
- const { vaultBranching } = runtime;
366
- try {
367
- vaultBranching.branch(params.name as string);
368
- return { created: true, name: params.name };
369
- } catch (err) {
370
- return { error: (err as Error).message };
371
- }
372
- },
373
- },
374
- {
375
- name: 'vault_branch_add',
376
- description: 'Add an operation (add/modify/remove) to a vault branch.',
377
- auth: 'write',
378
- schema: z.object({
379
- branchName: z.string().describe('Branch to add the operation to'),
380
- entryId: z.string().describe('Entry ID'),
381
- action: z.enum(['add', 'modify', 'remove']).describe('Operation type'),
382
- entryData: z
383
- .record(z.unknown())
384
- .optional()
385
- .describe('Full entry data (required for add/modify)'),
386
- }),
387
- handler: async (params) => {
388
- const { vaultBranching } = runtime;
389
- try {
390
- vaultBranching.addOperation(
391
- params.branchName as string,
392
- params.entryId as string,
393
- params.action as 'add' | 'modify' | 'remove',
394
- params.entryData as IntelligenceEntry | undefined,
395
- );
396
- return {
397
- added: true,
398
- branchName: params.branchName,
399
- entryId: params.entryId,
400
- action: params.action,
401
- };
402
- } catch (err) {
403
- return { error: (err as Error).message };
404
- }
405
- },
406
- },
407
- {
408
- name: 'vault_branch_list',
409
- description: 'List all vault branches with entry counts and merge status.',
410
- auth: 'read',
411
- handler: async () => {
412
- const { vaultBranching } = runtime;
413
- return { branches: vaultBranching.listBranches() };
414
- },
415
- },
416
- {
417
- name: 'vault_merge_branch',
418
- description: 'Merge a branch into the main vault. Branch entries win on conflict.',
419
- auth: 'admin',
420
- schema: z.object({
421
- branchName: z.string().describe('Branch to merge'),
422
- }),
423
- handler: async (params) => {
424
- const { vaultBranching } = runtime;
425
- try {
426
- return vaultBranching.merge(params.branchName as string);
427
- } catch (err) {
428
- return { error: (err as Error).message };
429
- }
430
- },
431
- },
432
- {
433
- name: 'vault_delete_branch',
434
- description: 'Delete a vault branch and all its operations.',
435
- auth: 'admin',
436
- schema: z.object({
437
- branchName: z.string().describe('Branch to delete'),
438
- }),
439
- handler: async (params) => {
440
- const { vaultBranching } = runtime;
441
- const deleted = vaultBranching.deleteBranch(params.branchName as string);
442
- return { deleted, branchName: params.branchName };
443
- },
444
- },
445
-
446
275
  // ─── Satellite ops ───────────────────────────────────────────
447
276
  ...createVaultExtraOps(runtime),
448
277
  ...createCaptureOps(runtime),
449
- ...createIntakeOps(intakePipeline, textIngester),
450
278
  ...createVaultSharingOps(runtime),
451
- ...createVaultLinkingOps(runtime),
279
+
280
+ // ─── Backward-compat stubs for ops that moved to new facades ─
281
+ ...deprecateOps(createArchiveOps(runtime), 'archive'),
282
+ ...deprecateOps(createSyncOps(runtime), 'sync'),
283
+ ...deprecateOps(createReviewOps(runtime), 'review'),
284
+ ...deprecateOps(createVaultLinkingOps(runtime), 'links'),
285
+ ...deprecateOps(createBranchingOps(runtime), 'branching'),
286
+ ...deprecateOps(createTierOps(runtime), 'tier'),
452
287
  ];
453
288
  }
289
+
290
+ // ─── Deprecation wrapper ────────────────────────────────────────────
291
+
292
+ /**
293
+ * Wrap an array of ops with deprecation warnings.
294
+ * Each op's handler logs a one-time warning before forwarding to the real handler.
295
+ */
296
+ export function deprecateOps(ops: OpDefinition[], newFacade: string): OpDefinition[] {
297
+ return ops.map((op) => ({
298
+ ...op,
299
+ handler: async (params: Record<string, unknown>) => {
300
+ deprecationWarning({
301
+ name: op.name,
302
+ since: '0.5.0',
303
+ replacement: `${newFacade}.${op.name}`,
304
+ message: `Op "${op.name}" has moved to the ${newFacade} facade. Update your calls.`,
305
+ });
306
+ return op.handler(params);
307
+ },
308
+ }));
309
+ }
@@ -102,9 +102,13 @@ export async function getIssueDetails(
102
102
  const { stdout } = await execFileAsync(
103
103
  'gh',
104
104
  [
105
- 'issue', 'view', String(issueNumber),
106
- '--repo', `${owner}/${repo}`,
107
- '--json', 'title,body,labels',
105
+ 'issue',
106
+ 'view',
107
+ String(issueNumber),
108
+ '--repo',
109
+ `${owner}/${repo}`,
110
+ '--json',
111
+ 'title,body,labels',
108
112
  ],
109
113
  {
110
114
  timeout: 10_000,
@@ -148,11 +152,10 @@ export async function closeIssueWithComment(
148
152
  ['issue', 'comment', String(issueNumber), '--repo', repoSlug, '--body', comment],
149
153
  { timeout: 10_000, signal: AbortSignal.timeout(10_000) },
150
154
  );
151
- await execFileAsync(
152
- 'gh',
153
- ['issue', 'close', String(issueNumber), '--repo', repoSlug],
154
- { timeout: 10_000, signal: AbortSignal.timeout(10_000) },
155
- );
155
+ await execFileAsync('gh', ['issue', 'close', String(issueNumber), '--repo', repoSlug], {
156
+ timeout: 10_000,
157
+ signal: AbortSignal.timeout(10_000),
158
+ });
156
159
  } catch {
157
160
  // Graceful degradation — gh not available or auth expired
158
161
  }
@@ -11,9 +11,25 @@ function makeMockRuntime() {
11
11
  score: 82,
12
12
  iteration: 1,
13
13
  gaps: [
14
- { severity: 'major', category: 'scope', description: 'Missing scope', recommendation: 'Add scope', location: 'plan.scope' },
15
- { severity: 'minor', category: 'detail', description: 'Low detail', recommendation: 'Add detail' },
16
- { severity: 'critical', category: 'risk', description: 'No risk analysis', recommendation: 'Add risks' },
14
+ {
15
+ severity: 'major',
16
+ category: 'scope',
17
+ description: 'Missing scope',
18
+ recommendation: 'Add scope',
19
+ location: 'plan.scope',
20
+ },
21
+ {
22
+ severity: 'minor',
23
+ category: 'detail',
24
+ description: 'Low detail',
25
+ recommendation: 'Add detail',
26
+ },
27
+ {
28
+ severity: 'critical',
29
+ category: 'risk',
30
+ description: 'No risk analysis',
31
+ recommendation: 'Add risks',
32
+ },
17
33
  ],
18
34
  }),
19
35
  getCheckHistory: vi.fn().mockReturnValue([
@@ -77,7 +93,10 @@ describe('createGradingOps', () => {
77
93
  it('returns count and checks array', async () => {
78
94
  runtime = makeMockRuntime();
79
95
  ops = createGradingOps(runtime);
80
- const result = (await findOp('plan_check_history').handler({ planId: 'p1' })) as Record<string, unknown>;
96
+ const result = (await findOp('plan_check_history').handler({ planId: 'p1' })) as Record<
97
+ string,
98
+ unknown
99
+ >;
81
100
  expect(result.planId).toBe('p1');
82
101
  expect(result.count).toBe(2);
83
102
  expect(result.checks).toHaveLength(2);
@@ -96,7 +115,10 @@ describe('createGradingOps', () => {
96
115
  runtime = makeMockRuntime();
97
116
  (runtime.planner.getLatestCheck as ReturnType<typeof vi.fn>).mockReturnValue(null);
98
117
  ops = createGradingOps(runtime);
99
- const result = (await findOp('plan_latest_check').handler({ planId: 'p1' })) as Record<string, unknown>;
118
+ const result = (await findOp('plan_latest_check').handler({ planId: 'p1' })) as Record<
119
+ string,
120
+ unknown
121
+ >;
100
122
  expect(result.message).toBe('No checks found for this plan.');
101
123
  });
102
124
  });
@@ -115,7 +137,10 @@ describe('createGradingOps', () => {
115
137
  it('sorts gaps by severity and groups them', async () => {
116
138
  runtime = makeMockRuntime();
117
139
  ops = createGradingOps(runtime);
118
- const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<string, unknown>;
140
+ const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
141
+ string,
142
+ unknown
143
+ >;
119
144
  expect(result.grade).toBe('B');
120
145
  expect(result.score).toBe(82);
121
146
  expect(result.totalGaps).toBe(3);
@@ -130,10 +155,16 @@ describe('createGradingOps', () => {
130
155
  it('returns approve as nextAction when score >= 90', async () => {
131
156
  runtime = makeMockRuntime();
132
157
  (runtime.planner.grade as ReturnType<typeof vi.fn>).mockReturnValue({
133
- grade: 'A', score: 92, iteration: 3, gaps: [],
158
+ grade: 'A',
159
+ score: 92,
160
+ iteration: 3,
161
+ gaps: [],
134
162
  });
135
163
  ops = createGradingOps(runtime);
136
- const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<string, unknown>;
164
+ const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
165
+ string,
166
+ unknown
167
+ >;
137
168
  expect(result.nextAction).toBe('approve');
138
169
  expect(result.totalGaps).toBe(0);
139
170
  });
@@ -51,14 +51,19 @@ describe('createIntakeOps', () => {
51
51
  it('intake_ingest_book returns error', async () => {
52
52
  const ops = createIntakeOps(null);
53
53
  const result = (await findOp(ops, 'intake_ingest_book').handler({
54
- pdfPath: '/test.pdf', title: 'T', domain: 'd',
54
+ pdfPath: '/test.pdf',
55
+ title: 'T',
56
+ domain: 'd',
55
57
  })) as Record<string, unknown>;
56
58
  expect(result.error).toBe('Intake pipeline not configured');
57
59
  });
58
60
 
59
61
  it('intake_process returns error', async () => {
60
62
  const ops = createIntakeOps(null);
61
- const result = (await findOp(ops, 'intake_process').handler({ jobId: 'j1' })) as Record<string, unknown>;
63
+ const result = (await findOp(ops, 'intake_process').handler({ jobId: 'j1' })) as Record<
64
+ string,
65
+ unknown
66
+ >;
62
67
  expect(result.error).toBe('Intake pipeline not configured');
63
68
  });
64
69
 
@@ -71,7 +76,11 @@ describe('createIntakeOps', () => {
71
76
  it('intake_preview returns error', async () => {
72
77
  const ops = createIntakeOps(null);
73
78
  const result = (await findOp(ops, 'intake_preview').handler({
74
- pdfPath: '/x.pdf', title: 'T', domain: 'd', pageStart: 1, pageEnd: 5,
79
+ pdfPath: '/x.pdf',
80
+ title: 'T',
81
+ domain: 'd',
82
+ pageStart: 1,
83
+ pageEnd: 5,
75
84
  })) as Record<string, unknown>;
76
85
  expect(result.error).toBe('Intake pipeline not configured');
77
86
  });
@@ -80,14 +89,17 @@ describe('createIntakeOps', () => {
80
89
  describe('when textIngester is null', () => {
81
90
  it('ingest_url returns error', async () => {
82
91
  const ops = createIntakeOps(makeMockPipeline() as never, null);
83
- const result = (await findOp(ops, 'ingest_url').handler({ url: 'https://example.com' })) as Record<string, unknown>;
92
+ const result = (await findOp(ops, 'ingest_url').handler({
93
+ url: 'https://example.com',
94
+ })) as Record<string, unknown>;
84
95
  expect(result.error).toContain('Text ingester not configured');
85
96
  });
86
97
 
87
98
  it('ingest_text returns error', async () => {
88
99
  const ops = createIntakeOps(makeMockPipeline() as never, null);
89
100
  const result = (await findOp(ops, 'ingest_text').handler({
90
- text: 'hello', title: 'T',
101
+ text: 'hello',
102
+ title: 'T',
91
103
  })) as Record<string, unknown>;
92
104
  expect(result.error).toContain('Text ingester not configured');
93
105
  });
@@ -106,10 +118,20 @@ describe('createIntakeOps', () => {
106
118
  const pipeline = makeMockPipeline();
107
119
  const ops = createIntakeOps(pipeline as never);
108
120
  const result = await findOp(ops, 'intake_ingest_book').handler({
109
- pdfPath: '/book.pdf', title: 'My Book', domain: 'design', author: 'Author', chunkPageSize: 15, tags: ['tag1'],
121
+ pdfPath: '/book.pdf',
122
+ title: 'My Book',
123
+ domain: 'design',
124
+ author: 'Author',
125
+ chunkPageSize: 15,
126
+ tags: ['tag1'],
110
127
  });
111
128
  expect(pipeline.ingestBook).toHaveBeenCalledWith({
112
- pdfPath: '/book.pdf', title: 'My Book', domain: 'design', author: 'Author', chunkPageSize: 15, tags: ['tag1'],
129
+ pdfPath: '/book.pdf',
130
+ title: 'My Book',
131
+ domain: 'design',
132
+ author: 'Author',
133
+ chunkPageSize: 15,
134
+ tags: ['tag1'],
113
135
  });
114
136
  expect(result).toEqual({ jobId: 'j1', chunks: 5 });
115
137
  });
@@ -128,7 +150,10 @@ describe('createIntakeOps', () => {
128
150
  it('returns job and chunks when jobId provided', async () => {
129
151
  const pipeline = makeMockPipeline();
130
152
  const ops = createIntakeOps(pipeline as never);
131
- const result = (await findOp(ops, 'intake_status').handler({ jobId: 'j1' })) as Record<string, unknown>;
153
+ const result = (await findOp(ops, 'intake_status').handler({ jobId: 'j1' })) as Record<
154
+ string,
155
+ unknown
156
+ >;
132
157
  expect(result.job).toEqual({ id: 'j1', status: 'active' });
133
158
  expect(result.chunks).toHaveLength(2);
134
159
  });
@@ -137,7 +162,10 @@ describe('createIntakeOps', () => {
137
162
  const pipeline = makeMockPipeline();
138
163
  pipeline.getJob.mockReturnValue(null);
139
164
  const ops = createIntakeOps(pipeline as never);
140
- const result = (await findOp(ops, 'intake_status').handler({ jobId: 'missing' })) as Record<string, unknown>;
165
+ const result = (await findOp(ops, 'intake_status').handler({ jobId: 'missing' })) as Record<
166
+ string,
167
+ unknown
168
+ >;
141
169
  expect(result.error).toContain('Job not found');
142
170
  });
143
171
 
@@ -154,10 +182,16 @@ describe('createIntakeOps', () => {
154
182
  const pipeline = makeMockPipeline();
155
183
  const ops = createIntakeOps(pipeline as never);
156
184
  await findOp(ops, 'intake_preview').handler({
157
- pdfPath: '/x.pdf', title: 'T', domain: 'd', pageStart: 1, pageEnd: 10,
185
+ pdfPath: '/x.pdf',
186
+ title: 'T',
187
+ domain: 'd',
188
+ pageStart: 1,
189
+ pageEnd: 10,
158
190
  });
159
191
  expect(pipeline.preview).toHaveBeenCalledWith(
160
- { pdfPath: '/x.pdf', title: 'T', domain: 'd' }, 1, 10,
192
+ { pdfPath: '/x.pdf', title: 'T', domain: 'd' },
193
+ 1,
194
+ 10,
161
195
  );
162
196
  });
163
197
  });
@@ -167,9 +201,14 @@ describe('createIntakeOps', () => {
167
201
  const ingester = makeMockTextIngester();
168
202
  const ops = createIntakeOps(makeMockPipeline() as never, ingester as never);
169
203
  const result = await findOp(ops, 'ingest_url').handler({
170
- url: 'https://example.com', domain: 'test', tags: ['t1'],
204
+ url: 'https://example.com',
205
+ domain: 'test',
206
+ tags: ['t1'],
207
+ });
208
+ expect(ingester.ingestUrl).toHaveBeenCalledWith('https://example.com', {
209
+ domain: 'test',
210
+ tags: ['t1'],
171
211
  });
172
- expect(ingester.ingestUrl).toHaveBeenCalledWith('https://example.com', { domain: 'test', tags: ['t1'] });
173
212
  expect(result).toEqual({ ingested: 3, duplicates: 1 });
174
213
  });
175
214
  });
@@ -179,7 +218,13 @@ describe('createIntakeOps', () => {
179
218
  const ingester = makeMockTextIngester();
180
219
  const ops = createIntakeOps(makeMockPipeline() as never, ingester as never);
181
220
  await findOp(ops, 'ingest_text').handler({
182
- text: 'content', title: 'My Notes', sourceType: 'transcript', url: 'https://x.com', author: 'A', domain: 'd', tags: ['t'],
221
+ text: 'content',
222
+ title: 'My Notes',
223
+ sourceType: 'transcript',
224
+ url: 'https://x.com',
225
+ author: 'A',
226
+ domain: 'd',
227
+ tags: ['t'],
183
228
  });
184
229
  expect(ingester.ingestText).toHaveBeenCalledWith(
185
230
  'content',
@@ -200,8 +245,16 @@ describe('createIntakeOps', () => {
200
245
  ],
201
246
  });
202
247
  expect(ingester.ingestBatch).toHaveBeenCalledWith([
203
- { text: 'a', source: { type: 'article', title: 'A', url: undefined, author: undefined }, opts: { domain: 'x', tags: undefined } },
204
- { text: 'b', source: { type: 'notes', title: 'B', url: undefined, author: undefined }, opts: { domain: undefined, tags: undefined } },
248
+ {
249
+ text: 'a',
250
+ source: { type: 'article', title: 'A', url: undefined, author: undefined },
251
+ opts: { domain: 'x', tags: undefined },
252
+ },
253
+ {
254
+ text: 'b',
255
+ source: { type: 'notes', title: 'B', url: undefined, author: undefined },
256
+ opts: { domain: undefined, tags: undefined },
257
+ },
205
258
  ]);
206
259
  });
207
260
  });
@@ -61,9 +61,15 @@ describe('createLoopOps', () => {
61
61
  ops = createLoopOps(runtime);
62
62
  const names = ops.map((o) => o.name);
63
63
  expect(names).toEqual([
64
- 'loop_start', 'loop_iterate', 'loop_iterate_gate',
65
- 'loop_status', 'loop_cancel', 'loop_history',
66
- 'loop_is_active', 'loop_complete', 'loop_anomaly_check',
64
+ 'loop_start',
65
+ 'loop_iterate',
66
+ 'loop_iterate_gate',
67
+ 'loop_status',
68
+ 'loop_cancel',
69
+ 'loop_history',
70
+ 'loop_is_active',
71
+ 'loop_complete',
72
+ 'loop_anomaly_check',
67
73
  ]);
68
74
  });
69
75
 
@@ -72,7 +78,8 @@ describe('createLoopOps', () => {
72
78
  runtime = makeMockRuntime();
73
79
  ops = createLoopOps(runtime);
74
80
  const result = (await findOp('loop_start').handler({
75
- mode: 'custom', prompt: 'fix the thing',
81
+ mode: 'custom',
82
+ prompt: 'fix the thing',
76
83
  })) as Record<string, unknown>;
77
84
 
78
85
  expect(runtime.loop.startLoop).toHaveBeenCalledWith(
@@ -108,7 +115,8 @@ describe('createLoopOps', () => {
108
115
  runtime = makeMockRuntime();
109
116
  ops = createLoopOps(runtime);
110
117
  const result = (await findOp('loop_iterate').handler({
111
- passed: false, validationScore: 70,
118
+ passed: false,
119
+ validationScore: 70,
112
120
  })) as Record<string, unknown>;
113
121
 
114
122
  expect(result.iteration).toBe(1);
@@ -232,7 +240,9 @@ describe('createLoopOps', () => {
232
240
  const result = (await findOp('loop_anomaly_check').handler({})) as Record<string, unknown>;
233
241
  expect(result.active).toBe(true);
234
242
  expect(result.hasAnomalies).toBe(true);
235
- expect((result.anomalies as string[]).some((a) => a.includes('consecutive failing'))).toBe(true);
243
+ expect((result.anomalies as string[]).some((a) => a.includes('consecutive failing'))).toBe(
244
+ true,
245
+ );
236
246
  });
237
247
  });
238
248
  });