@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
@@ -80,7 +80,11 @@ export class Vault {
80
80
  static readonly FORMAT_VERSION = VAULT_FORMAT_VERSION;
81
81
 
82
82
  private getAutoLinkConfig(): AutoLinkConfig {
83
- return { linkManager: this.linkManager, enabled: this.autoLinkEnabled, maxLinks: this.autoLinkMaxLinks };
83
+ return {
84
+ linkManager: this.linkManager,
85
+ enabled: this.autoLinkEnabled,
86
+ maxLinks: this.autoLinkMaxLinks,
87
+ };
84
88
  }
85
89
 
86
90
  setLinkManager(mgr: LinkManager, opts?: { enabled?: boolean; maxLinks?: number }): void {
@@ -105,16 +109,37 @@ export class Vault {
105
109
  installPack(entryList: IntelligenceEntry[]): { installed: number; skipped: number } {
106
110
  return entries.installPack(this.provider, entryList, this.getAutoLinkConfig());
107
111
  }
108
- seedDedup(entryList: IntelligenceEntry[]): Array<{ id: string; action: 'inserted' | 'duplicate'; existingId?: string }> {
112
+ seedDedup(
113
+ entryList: IntelligenceEntry[],
114
+ ): Array<{ id: string; action: 'inserted' | 'duplicate'; existingId?: string }> {
109
115
  return entries.seedDedup(this.provider, entryList, this.getAutoLinkConfig());
110
116
  }
111
- search(query: string, options?: { domain?: string; type?: string; severity?: string; origin?: 'agent' | 'pack' | 'user'; limit?: number; includeExpired?: boolean }): SearchResult[] {
117
+ search(
118
+ query: string,
119
+ options?: {
120
+ domain?: string;
121
+ type?: string;
122
+ severity?: string;
123
+ origin?: 'agent' | 'pack' | 'user';
124
+ limit?: number;
125
+ includeExpired?: boolean;
126
+ },
127
+ ): SearchResult[] {
112
128
  return entries.search(this.provider, query, options);
113
129
  }
114
130
  get(id: string): IntelligenceEntry | null {
115
131
  return entries.get(this.provider, id);
116
132
  }
117
- list(options?: { domain?: string; type?: string; severity?: string; origin?: 'agent' | 'pack' | 'user'; tags?: string[]; limit?: number; offset?: number; includeExpired?: boolean }): IntelligenceEntry[] {
133
+ list(options?: {
134
+ domain?: string;
135
+ type?: string;
136
+ severity?: string;
137
+ origin?: 'agent' | 'pack' | 'user';
138
+ tags?: string[];
139
+ limit?: number;
140
+ offset?: number;
141
+ includeExpired?: boolean;
142
+ }): IntelligenceEntry[] {
118
143
  return entries.list(this.provider, options);
119
144
  }
120
145
  stats(): VaultStats {
@@ -162,7 +187,12 @@ export class Vault {
162
187
  exportAll(): { entries: IntelligenceEntry[]; exportedAt: number; count: number } {
163
188
  return maintenance.exportAll(this.provider);
164
189
  }
165
- getAgeReport(): { total: number; buckets: Array<{ label: string; count: number; minDays: number; maxDays: number }>; oldestTimestamp: number | null; newestTimestamp: number | null } {
190
+ getAgeReport(): {
191
+ total: number;
192
+ buckets: Array<{ label: string; count: number; minDays: number; maxDays: number }>;
193
+ oldestTimestamp: number | null;
194
+ newestTimestamp: number | null;
195
+ } {
166
196
  return maintenance.getAgeReport(this.provider);
167
197
  }
168
198
  archive(options: { olderThanDays: number; reason?: string }): { archived: number } {
@@ -201,19 +231,35 @@ export class Vault {
201
231
  deleteMemory(id: string): boolean {
202
232
  return memories.deleteMemory(this.provider, id);
203
233
  }
204
- searchMemories(query: string, options?: { type?: string; projectPath?: string; intent?: string; limit?: number }): Memory[] {
234
+ searchMemories(
235
+ query: string,
236
+ options?: { type?: string; projectPath?: string; intent?: string; limit?: number },
237
+ ): Memory[] {
205
238
  return memories.searchMemories(this.provider, query, options);
206
239
  }
207
- listMemories(options?: { type?: string; projectPath?: string; limit?: number; offset?: number }): Memory[] {
240
+ listMemories(options?: {
241
+ type?: string;
242
+ projectPath?: string;
243
+ limit?: number;
244
+ offset?: number;
245
+ }): Memory[] {
208
246
  return memories.listMemories(this.provider, options);
209
247
  }
210
248
  memoryStats(): MemoryStats {
211
249
  return memories.memoryStats(this.provider);
212
250
  }
213
- memoryStatsDetailed(options?: { projectPath?: string; fromDate?: number; toDate?: number }): MemoryStats & { oldest: number | null; newest: number | null; archivedCount: number } {
251
+ memoryStatsDetailed(options?: {
252
+ projectPath?: string;
253
+ fromDate?: number;
254
+ toDate?: number;
255
+ }): MemoryStats & { oldest: number | null; newest: number | null; archivedCount: number } {
214
256
  return memories.memoryStatsDetailed(this.provider, options);
215
257
  }
216
- exportMemories(options?: { projectPath?: string; type?: string; includeArchived?: boolean }): Memory[] {
258
+ exportMemories(options?: {
259
+ projectPath?: string;
260
+ type?: string;
261
+ includeArchived?: boolean;
262
+ }): Memory[] {
217
263
  return memories.exportMemories(this.provider, options);
218
264
  }
219
265
  importMemories(memoryList: Memory[]): { imported: number; skipped: number } {
@@ -1,404 +0,0 @@
1
- /**
2
- * Strength Scorer — computes pattern strength scores from brain feedback data.
3
- *
4
- * Extracted from intelligence.ts (Phase 1, Wave 1A).
5
- * Responsible for: computeStrengths, getStrengths, recommend, buildGlobalRegistry, buildDomainProfiles.
6
- */
7
-
8
- import type { Vault } from '../vault/vault.js';
9
- import type { PersistenceProvider } from '../persistence/types.js';
10
- import type { PatternStrength, StrengthsQuery, GlobalPattern, DomainProfile } from './types.js';
11
-
12
- // ─── Constants ──────────────────────────────────────────────────────
13
-
14
- const USAGE_MAX = 10;
15
- const SPREAD_MAX = 5;
16
- const RECENCY_DECAY_DAYS = 30;
17
-
18
- // ─── Row Types ──────────────────────────────────────────────────────
19
-
20
- interface FeedbackRow {
21
- entry_id: string;
22
- total: number;
23
- accepted: number;
24
- dismissed: number;
25
- modified: number;
26
- failed: number;
27
- last_used: string;
28
- }
29
-
30
- interface StrengthRow {
31
- pattern: string;
32
- domain: string;
33
- strength: number;
34
- usage_score: number;
35
- spread_score: number;
36
- success_score: number;
37
- recency_score: number;
38
- usage_count: number;
39
- unique_contexts: number;
40
- success_rate: number;
41
- last_used: string;
42
- }
43
-
44
- // ─── Helpers ────────────────────────────────────────────────────────
45
-
46
- function computeUsageScore(total: number): number {
47
- return Math.min(25, (total / USAGE_MAX) * 25);
48
- }
49
-
50
- function computeSpreadScore(uniqueDomainCount: number): number {
51
- const capped = Math.min(uniqueDomainCount, 5);
52
- return Math.min(25, (capped / SPREAD_MAX) * 25);
53
- }
54
-
55
- function computeSuccessRate(row: FeedbackRow): number {
56
- const relevantTotal = row.total - row.failed;
57
- if (relevantTotal <= 0) return 0;
58
- return (row.accepted + row.modified * 0.5) / relevantTotal;
59
- }
60
-
61
- function computeRecencyScore(lastUsed: string, now: number): number {
62
- const lastUsedMs = new Date(lastUsed).getTime();
63
- const daysSince = (now - lastUsedMs) / (1000 * 60 * 60 * 24);
64
- return Math.max(0, 25 * (1 - daysSince / RECENCY_DECAY_DAYS));
65
- }
66
-
67
- function rowToStrength(r: StrengthRow): PatternStrength {
68
- return {
69
- pattern: r.pattern,
70
- domain: r.domain,
71
- strength: r.strength,
72
- usageScore: r.usage_score,
73
- spreadScore: r.spread_score,
74
- successScore: r.success_score,
75
- recencyScore: r.recency_score,
76
- usageCount: r.usage_count,
77
- uniqueContexts: r.unique_contexts,
78
- successRate: r.success_rate,
79
- lastUsed: r.last_used,
80
- };
81
- }
82
-
83
- // ─── Class ──────────────────────────────────────────────────────────
84
-
85
- export class StrengthScorer {
86
- private vault: Vault;
87
- private provider: PersistenceProvider;
88
-
89
- constructor(vault: Vault) {
90
- this.vault = vault;
91
- this.provider = vault.getProvider();
92
- }
93
-
94
- computeStrengths(): PatternStrength[] {
95
- const feedbackRows = this.provider.all<FeedbackRow>(
96
- `SELECT entry_id,
97
- COUNT(*) as total,
98
- SUM(CASE WHEN action = 'accepted' THEN 1 ELSE 0 END) as accepted,
99
- SUM(CASE WHEN action = 'dismissed' THEN 1 ELSE 0 END) as dismissed,
100
- SUM(CASE WHEN action = 'modified' THEN 1 ELSE 0 END) as modified,
101
- SUM(CASE WHEN action = 'failed' THEN 1 ELSE 0 END) as failed,
102
- MAX(created_at) as last_used
103
- FROM brain_feedback
104
- GROUP BY entry_id`,
105
- );
106
-
107
- const sessionRows = this.provider.all<{ domain: string }>(
108
- 'SELECT DISTINCT domain FROM brain_sessions WHERE domain IS NOT NULL',
109
- );
110
- const uniqueDomainCount = new Set(sessionRows.map((r) => r.domain)).size;
111
-
112
- const now = Date.now();
113
- const strengths: PatternStrength[] = [];
114
-
115
- for (const row of feedbackRows) {
116
- const ps = this.scoreFromFeedback(row, uniqueDomainCount, now);
117
- strengths.push(ps);
118
- this.persistStrength(ps);
119
- }
120
-
121
- return strengths;
122
- }
123
-
124
- getStrengths(query?: StrengthsQuery): PatternStrength[] {
125
- const conditions: string[] = [];
126
- const values: unknown[] = [];
127
-
128
- if (query?.domain) {
129
- conditions.push('domain = ?');
130
- values.push(query.domain);
131
- }
132
- if (query?.minStrength !== undefined && query.minStrength !== null) {
133
- conditions.push('strength >= ?');
134
- values.push(query.minStrength);
135
- }
136
-
137
- const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
138
- const limit = query?.limit ?? 50;
139
- values.push(limit);
140
-
141
- const rows = this.provider.all<StrengthRow>(
142
- `SELECT * FROM brain_strengths ${where} ORDER BY strength DESC LIMIT ?`,
143
- values,
144
- );
145
-
146
- return rows.map(rowToStrength);
147
- }
148
-
149
- recommend(context: {
150
- domain?: string;
151
- task?: string;
152
- source?: string;
153
- limit?: number;
154
- }): PatternStrength[] {
155
- const limit = context.limit ?? 5;
156
-
157
- let strengths = this.getStrengths({
158
- domain: context.domain,
159
- minStrength: 20,
160
- limit: limit * 3,
161
- });
162
-
163
- if (strengths.length < limit && context.domain) {
164
- strengths = this.expandWithFallback(strengths, context.domain, limit);
165
- }
166
-
167
- if (context.task) {
168
- this.boostByTaskContext(strengths, context.task);
169
- }
170
-
171
- if (context.source) {
172
- this.boostBySource(strengths, context.source);
173
- }
174
-
175
- strengths.sort((a, b) => b.strength - a.strength);
176
- return strengths.slice(0, limit);
177
- }
178
-
179
- buildGlobalRegistry(strengths: PatternStrength[]): number {
180
- const patternMap = new Map<string, PatternStrength[]>();
181
- for (const s of strengths) {
182
- const list = patternMap.get(s.pattern) ?? [];
183
- list.push(s);
184
- patternMap.set(s.pattern, list);
185
- }
186
-
187
- this.provider.run('DELETE FROM brain_global_registry');
188
-
189
- let count = 0;
190
- for (const [pattern, entries] of patternMap) {
191
- const domains = [...new Set(entries.map((e) => e.domain))];
192
- const totalStrength = entries.reduce((sum, e) => sum + e.strength, 0);
193
- const avgStrength = totalStrength / entries.length;
194
-
195
- this.provider.run(
196
- `INSERT INTO brain_global_registry
197
- (pattern, domains, total_strength, avg_strength, domain_count, updated_at)
198
- VALUES (?, ?, ?, ?, ?, datetime('now'))`,
199
- [pattern, JSON.stringify(domains), totalStrength, avgStrength, domains.length],
200
- );
201
- count++;
202
- }
203
-
204
- return count;
205
- }
206
-
207
- buildDomainProfiles(strengths: PatternStrength[]): number {
208
- const domainMap = new Map<string, PatternStrength[]>();
209
- for (const s of strengths) {
210
- const list = domainMap.get(s.domain) ?? [];
211
- list.push(s);
212
- domainMap.set(s.domain, list);
213
- }
214
-
215
- this.provider.run('DELETE FROM brain_domain_profiles');
216
-
217
- let count = 0;
218
- for (const [domain, entries] of domainMap) {
219
- entries.sort((a, b) => b.strength - a.strength);
220
- const topPatterns = entries.slice(0, 10).map((e) => ({
221
- pattern: e.pattern,
222
- strength: e.strength,
223
- }));
224
-
225
- const sessionCount = this.provider.get<{ c: number }>(
226
- 'SELECT COUNT(*) as c FROM brain_sessions WHERE domain = ?',
227
- [domain],
228
- )!.c;
229
-
230
- const durationRow = this.provider.get<{ avg_min: number | null }>(
231
- `SELECT AVG(
232
- (julianday(ended_at) - julianday(started_at)) * 1440
233
- ) as avg_min
234
- FROM brain_sessions
235
- WHERE domain = ? AND ended_at IS NOT NULL`,
236
- [domain],
237
- )!;
238
-
239
- const lastActivity = entries.reduce(
240
- (latest, e) => (e.lastUsed > latest ? e.lastUsed : latest),
241
- '',
242
- );
243
-
244
- this.provider.run(
245
- `INSERT INTO brain_domain_profiles
246
- (domain, top_patterns, session_count, avg_session_duration, last_activity, updated_at)
247
- VALUES (?, ?, ?, ?, ?, datetime('now'))`,
248
- [
249
- domain,
250
- JSON.stringify(topPatterns),
251
- sessionCount,
252
- durationRow.avg_min ?? 0,
253
- lastActivity || new Date().toISOString(),
254
- ],
255
- );
256
- count++;
257
- }
258
-
259
- return count;
260
- }
261
-
262
- getGlobalPatterns(limit = 20): GlobalPattern[] {
263
- const rows = this.provider.all<{
264
- pattern: string;
265
- domains: string;
266
- total_strength: number;
267
- avg_strength: number;
268
- domain_count: number;
269
- }>('SELECT * FROM brain_global_registry ORDER BY total_strength DESC LIMIT ?', [limit]);
270
-
271
- return rows.map((r) => ({
272
- pattern: r.pattern,
273
- domains: JSON.parse(r.domains) as string[],
274
- totalStrength: r.total_strength,
275
- avgStrength: r.avg_strength,
276
- domainCount: r.domain_count,
277
- }));
278
- }
279
-
280
- getDomainProfile(domain: string): DomainProfile | null {
281
- const row = this.provider.get<{
282
- domain: string;
283
- top_patterns: string;
284
- session_count: number;
285
- avg_session_duration: number;
286
- last_activity: string;
287
- }>('SELECT * FROM brain_domain_profiles WHERE domain = ?', [domain]);
288
-
289
- if (!row) return null;
290
-
291
- return {
292
- domain: row.domain,
293
- topPatterns: JSON.parse(row.top_patterns) as Array<{ pattern: string; strength: number }>,
294
- sessionCount: row.session_count,
295
- avgSessionDuration: row.avg_session_duration,
296
- lastActivity: row.last_activity,
297
- };
298
- }
299
-
300
- // ─── Private ────────────────────────────────────────────────────
301
-
302
- private scoreFromFeedback(
303
- row: FeedbackRow,
304
- uniqueDomainCount: number,
305
- now: number,
306
- ): PatternStrength {
307
- const entry = this.vault.get(row.entry_id);
308
- const domain = entry?.domain ?? 'unknown';
309
- const pattern = entry?.title ?? row.entry_id;
310
-
311
- const usageScore = computeUsageScore(row.total);
312
- const spreadScore = computeSpreadScore(uniqueDomainCount);
313
- const successRate = computeSuccessRate(row);
314
- const successScore = 25 * successRate;
315
- const recencyScore = computeRecencyScore(row.last_used, now);
316
- const strength = usageScore + spreadScore + successScore + recencyScore;
317
-
318
- return {
319
- pattern,
320
- domain,
321
- strength,
322
- usageScore,
323
- spreadScore,
324
- successScore,
325
- recencyScore,
326
- usageCount: row.total,
327
- uniqueContexts: Math.min(uniqueDomainCount, 5),
328
- successRate,
329
- lastUsed: row.last_used,
330
- };
331
- }
332
-
333
- private persistStrength(ps: PatternStrength): void {
334
- this.provider.run(
335
- `INSERT OR REPLACE INTO brain_strengths
336
- (pattern, domain, strength, usage_score, spread_score, success_score, recency_score,
337
- usage_count, unique_contexts, success_rate, last_used, updated_at)
338
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`,
339
- [
340
- ps.pattern,
341
- ps.domain,
342
- ps.strength,
343
- ps.usageScore,
344
- ps.spreadScore,
345
- ps.successScore,
346
- ps.recencyScore,
347
- ps.usageCount,
348
- ps.uniqueContexts,
349
- ps.successRate,
350
- ps.lastUsed,
351
- ],
352
- );
353
- }
354
-
355
- private expandWithFallback(
356
- strengths: PatternStrength[],
357
- domain: string,
358
- limit: number,
359
- ): PatternStrength[] {
360
- const allStrengths = this.getStrengths({
361
- minStrength: 20,
362
- limit: limit * 5,
363
- });
364
- const additional = allStrengths.filter(
365
- (s) =>
366
- !strengths.some((existing) => existing.pattern === s.pattern) &&
367
- (s.domain === domain || s.domain === 'unknown'),
368
- );
369
- return [...strengths, ...additional];
370
- }
371
-
372
- private boostByTaskContext(strengths: PatternStrength[], task: string): void {
373
- const taskTerms = new Set(task.toLowerCase().split(/\W+/).filter(Boolean));
374
- for (const s of strengths) {
375
- const patternTerms = s.pattern.toLowerCase().split(/\W+/);
376
- const overlap = patternTerms.filter((t) => taskTerms.has(t)).length;
377
- if (overlap > 0) {
378
- (s as { strength: number }).strength += overlap * 5;
379
- }
380
- }
381
- }
382
-
383
- private boostBySource(strengths: PatternStrength[], source: string): void {
384
- for (const s of strengths) {
385
- const row = this.provider.get<{
386
- total: number;
387
- accepted: number;
388
- modified: number;
389
- }>(
390
- `SELECT COUNT(*) as total,
391
- SUM(CASE WHEN action = 'accepted' THEN 1 ELSE 0 END) as accepted,
392
- SUM(CASE WHEN action = 'modified' THEN 1 ELSE 0 END) as modified
393
- FROM brain_feedback
394
- WHERE entry_id = (SELECT id FROM entries WHERE title = ? LIMIT 1)
395
- AND source = ?`,
396
- [s.pattern, source],
397
- ) as { total: number; accepted: number; modified: number };
398
-
399
- if (row.total < 3) continue;
400
- const sourceRate = (row.accepted + row.modified * 0.5) / row.total;
401
- (s as { strength: number }).strength += sourceRate * 10;
402
- }
403
- }
404
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * Soleri Knowledge Engine — MCP Server Entry Point
3
- *
4
- * This is the standalone knowledge engine that file-tree agents connect to.
5
- * It reads agent.yaml, initializes the runtime, and registers all tools.
6
- *
7
- * Usage:
8
- * npx @soleri/engine --agent ./agent.yaml
9
- *
10
- * Or in .mcp.json:
11
- * { "command": "npx", "args": ["@soleri/engine", "--agent", "./agent.yaml"] }
12
- *
13
- * Binary entry point: ./bin/soleri-engine.ts
14
- */
15
-
16
- export { registerEngine } from './register-engine.js';
17
- export type { EngineRegistrationOptions, EngineRegistrationResult } from './register-engine.js';
18
- export { createCoreOps } from './core-ops.js';
19
- export type { AgentIdentityConfig } from './core-ops.js';
20
- export { ENGINE_MODULE_MANIFEST, CORE_KEY_OPS } from './module-manifest.js';
21
- export type { ModuleManifestEntry } from './module-manifest.js';
@@ -1,9 +0,0 @@
1
- export type {
2
- PersonaConfig,
3
- ArchivedPersona,
4
- PersonaCreateInput,
5
- PersonaSystemInstructions,
6
- } from './types.js';
7
- export { ITALIAN_CRAFTSPERSON, PERSONA_TEMPLATES, createDefaultPersona } from './defaults.js';
8
- export { loadPersona } from './loader.js';
9
- export { generatePersonaInstructions, getRandomSignoff } from './prompt-generator.js';
@@ -1,56 +0,0 @@
1
- /**
2
- * ISP interfaces for Vault decomposition.
3
- */
4
- import type { IntelligenceEntry } from '../intelligence/types.js';
5
- import type { SearchResult, VaultStats, Memory, MemoryStats } from './vault.js';
6
-
7
- export interface VaultReader {
8
- get(id: string): IntelligenceEntry | null;
9
- search(query: string, options?: { domain?: string; type?: string; severity?: string; origin?: 'agent' | 'pack' | 'user'; limit?: number; includeExpired?: boolean }): SearchResult[];
10
- list(options?: { domain?: string; type?: string; severity?: string; origin?: 'agent' | 'pack' | 'user'; tags?: string[]; limit?: number; offset?: number; includeExpired?: boolean }): IntelligenceEntry[];
11
- stats(): VaultStats;
12
- getTags(): Array<{ tag: string; count: number }>;
13
- getDomains(): Array<{ domain: string; count: number }>;
14
- getRecent(limit?: number): IntelligenceEntry[];
15
- findExpiring(withinDays: number): IntelligenceEntry[];
16
- findExpired(limit?: number): IntelligenceEntry[];
17
- findByContentHash(hash: string): string | null;
18
- contentHashStats(): { total: number; hashed: number; uniqueHashes: number };
19
- }
20
-
21
- export interface VaultWriter {
22
- seed(entries: IntelligenceEntry[]): number;
23
- seedDedup(entries: IntelligenceEntry[]): Array<{ id: string; action: 'inserted' | 'duplicate'; existingId?: string }>;
24
- installPack(entries: IntelligenceEntry[]): { installed: number; skipped: number };
25
- add(entry: IntelligenceEntry): void;
26
- remove(id: string): boolean;
27
- bulkRemove(ids: string[]): number;
28
- update(id: string, fields: Partial<Pick<IntelligenceEntry, 'title' | 'description' | 'context' | 'example' | 'counterExample' | 'why' | 'tags' | 'appliesTo' | 'severity' | 'type' | 'domain' | 'validFrom' | 'validUntil'>>): IntelligenceEntry | null;
29
- setTemporal(id: string, validFrom?: number, validUntil?: number): boolean;
30
- archive(options: { olderThanDays: number; reason?: string }): { archived: number };
31
- restore(id: string): boolean;
32
- }
33
-
34
- export interface VaultMemory {
35
- captureMemory(memory: Omit<Memory, 'id' | 'createdAt' | 'archivedAt'>): Memory;
36
- getMemory(id: string): Memory | null;
37
- deleteMemory(id: string): boolean;
38
- searchMemories(query: string, options?: { type?: string; projectPath?: string; intent?: string; limit?: number }): Memory[];
39
- listMemories(options?: { type?: string; projectPath?: string; limit?: number; offset?: number }): Memory[];
40
- memoryStats(): MemoryStats;
41
- memoryStatsDetailed(options?: { projectPath?: string; fromDate?: number; toDate?: number }): MemoryStats & { oldest: number | null; newest: number | null; archivedCount: number };
42
- exportMemories(options?: { projectPath?: string; type?: string; includeArchived?: boolean }): Memory[];
43
- importMemories(memories: Memory[]): { imported: number; skipped: number };
44
- pruneMemories(olderThanDays: number): { pruned: number };
45
- deduplicateMemories(): { removed: number; groups: Array<{ kept: string; removed: string[] }> };
46
- memoryTopics(): Array<{ topic: string; count: number }>;
47
- memoriesByProject(): Array<{ project: string; count: number; memories: Memory[] }>;
48
- }
49
-
50
- export interface VaultMaintenance {
51
- optimize(): { vacuumed: boolean; analyzed: boolean; ftsRebuilt: boolean };
52
- rebuildFtsIndex(): void;
53
- exportAll(): { entries: IntelligenceEntry[]; exportedAt: number; count: number };
54
- getAgeReport(): { total: number; buckets: Array<{ label: string; count: number; minDays: number; maxDays: number }>; oldestTimestamp: number | null; newestTimestamp: number | null };
55
- contentHashStats(): { total: number; hashed: number; uniqueHashes: number };
56
- }