@soleri/core 2.9.0 → 2.11.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 (503) hide show
  1. package/dist/agency/agency-manager.d.ts +47 -0
  2. package/dist/agency/agency-manager.d.ts.map +1 -0
  3. package/dist/agency/agency-manager.js +281 -0
  4. package/dist/agency/agency-manager.js.map +1 -0
  5. package/dist/agency/index.d.ts +3 -0
  6. package/dist/agency/index.d.ts.map +1 -0
  7. package/dist/agency/index.js +2 -0
  8. package/dist/agency/index.js.map +1 -0
  9. package/dist/agency/types.d.ts +69 -0
  10. package/dist/agency/types.d.ts.map +1 -0
  11. package/dist/agency/types.js +5 -0
  12. package/dist/agency/types.js.map +1 -0
  13. package/dist/brain/brain.d.ts +0 -1
  14. package/dist/brain/brain.d.ts.map +1 -1
  15. package/dist/brain/brain.js +14 -0
  16. package/dist/brain/brain.js.map +1 -1
  17. package/dist/brain/intelligence.d.ts +5 -1
  18. package/dist/brain/intelligence.d.ts.map +1 -1
  19. package/dist/brain/intelligence.js +83 -0
  20. package/dist/brain/intelligence.js.map +1 -1
  21. package/dist/brain/types.d.ts +21 -0
  22. package/dist/brain/types.d.ts.map +1 -1
  23. package/dist/chat/agent-loop-types.d.ts +82 -0
  24. package/dist/chat/agent-loop-types.d.ts.map +1 -0
  25. package/dist/chat/agent-loop-types.js +8 -0
  26. package/dist/chat/agent-loop-types.js.map +1 -0
  27. package/dist/chat/agent-loop.d.ts +19 -0
  28. package/dist/chat/agent-loop.d.ts.map +1 -0
  29. package/dist/chat/agent-loop.js +261 -0
  30. package/dist/chat/agent-loop.js.map +1 -0
  31. package/dist/chat/auth-manager.d.ts +49 -0
  32. package/dist/chat/auth-manager.d.ts.map +1 -0
  33. package/dist/chat/auth-manager.js +152 -0
  34. package/dist/chat/auth-manager.js.map +1 -0
  35. package/dist/chat/browser-session.d.ts +86 -0
  36. package/dist/chat/browser-session.d.ts.map +1 -0
  37. package/dist/chat/browser-session.js +143 -0
  38. package/dist/chat/browser-session.js.map +1 -0
  39. package/dist/chat/cancellation.d.ts +54 -0
  40. package/dist/chat/cancellation.d.ts.map +1 -0
  41. package/dist/chat/cancellation.js +80 -0
  42. package/dist/chat/cancellation.js.map +1 -0
  43. package/dist/chat/chat-session.d.ts +86 -0
  44. package/dist/chat/chat-session.d.ts.map +1 -0
  45. package/dist/chat/chat-session.js +252 -0
  46. package/dist/chat/chat-session.js.map +1 -0
  47. package/dist/chat/file-handler.d.ts +63 -0
  48. package/dist/chat/file-handler.d.ts.map +1 -0
  49. package/dist/chat/file-handler.js +182 -0
  50. package/dist/chat/file-handler.js.map +1 -0
  51. package/dist/chat/fragment-buffer.d.ts +49 -0
  52. package/dist/chat/fragment-buffer.d.ts.map +1 -0
  53. package/dist/chat/fragment-buffer.js +130 -0
  54. package/dist/chat/fragment-buffer.js.map +1 -0
  55. package/dist/chat/index.d.ts +24 -0
  56. package/dist/chat/index.d.ts.map +1 -0
  57. package/dist/chat/index.js +15 -0
  58. package/dist/chat/index.js.map +1 -0
  59. package/dist/chat/mcp-bridge.d.ts +60 -0
  60. package/dist/chat/mcp-bridge.d.ts.map +1 -0
  61. package/dist/chat/mcp-bridge.js +111 -0
  62. package/dist/chat/mcp-bridge.js.map +1 -0
  63. package/dist/chat/notifications.d.ts +82 -0
  64. package/dist/chat/notifications.d.ts.map +1 -0
  65. package/dist/chat/notifications.js +119 -0
  66. package/dist/chat/notifications.js.map +1 -0
  67. package/dist/chat/output-compressor.d.ts +30 -0
  68. package/dist/chat/output-compressor.d.ts.map +1 -0
  69. package/dist/chat/output-compressor.js +95 -0
  70. package/dist/chat/output-compressor.js.map +1 -0
  71. package/dist/chat/queue.d.ts +91 -0
  72. package/dist/chat/queue.d.ts.map +1 -0
  73. package/dist/chat/queue.js +146 -0
  74. package/dist/chat/queue.js.map +1 -0
  75. package/dist/chat/response-chunker.d.ts +29 -0
  76. package/dist/chat/response-chunker.d.ts.map +1 -0
  77. package/dist/chat/response-chunker.js +163 -0
  78. package/dist/chat/response-chunker.js.map +1 -0
  79. package/dist/chat/self-update.d.ts +62 -0
  80. package/dist/chat/self-update.d.ts.map +1 -0
  81. package/dist/chat/self-update.js +90 -0
  82. package/dist/chat/self-update.js.map +1 -0
  83. package/dist/chat/types.d.ts +105 -0
  84. package/dist/chat/types.d.ts.map +1 -0
  85. package/dist/chat/types.js +8 -0
  86. package/dist/chat/types.js.map +1 -0
  87. package/dist/chat/voice.d.ts +39 -0
  88. package/dist/chat/voice.d.ts.map +1 -0
  89. package/dist/chat/voice.js +80 -0
  90. package/dist/chat/voice.js.map +1 -0
  91. package/dist/claudemd/compose.d.ts +31 -0
  92. package/dist/claudemd/compose.d.ts.map +1 -0
  93. package/dist/claudemd/compose.js +105 -0
  94. package/dist/claudemd/compose.js.map +1 -0
  95. package/dist/claudemd/index.d.ts +5 -0
  96. package/dist/claudemd/index.d.ts.map +1 -0
  97. package/dist/claudemd/index.js +3 -0
  98. package/dist/claudemd/index.js.map +1 -0
  99. package/dist/claudemd/inject.d.ts +31 -0
  100. package/dist/claudemd/inject.d.ts.map +1 -0
  101. package/dist/claudemd/inject.js +157 -0
  102. package/dist/claudemd/inject.js.map +1 -0
  103. package/dist/claudemd/types.d.ts +41 -0
  104. package/dist/claudemd/types.d.ts.map +1 -0
  105. package/dist/claudemd/types.js +5 -0
  106. package/dist/claudemd/types.js.map +1 -0
  107. package/dist/context/context-engine.d.ts +31 -0
  108. package/dist/context/context-engine.d.ts.map +1 -0
  109. package/dist/context/context-engine.js +245 -0
  110. package/dist/context/context-engine.js.map +1 -0
  111. package/dist/context/index.d.ts +3 -0
  112. package/dist/context/index.d.ts.map +1 -0
  113. package/dist/context/index.js +2 -0
  114. package/dist/context/index.js.map +1 -0
  115. package/dist/context/types.d.ts +54 -0
  116. package/dist/context/types.d.ts.map +1 -0
  117. package/dist/context/types.js +5 -0
  118. package/dist/context/types.js.map +1 -0
  119. package/dist/enforcement/adapters/claude-code.d.ts +18 -0
  120. package/dist/enforcement/adapters/claude-code.d.ts.map +1 -0
  121. package/dist/enforcement/adapters/claude-code.js +106 -0
  122. package/dist/enforcement/adapters/claude-code.js.map +1 -0
  123. package/dist/enforcement/adapters/index.d.ts +2 -0
  124. package/dist/enforcement/adapters/index.d.ts.map +1 -0
  125. package/dist/enforcement/adapters/index.js +2 -0
  126. package/dist/enforcement/adapters/index.js.map +1 -0
  127. package/dist/enforcement/index.d.ts +4 -0
  128. package/dist/enforcement/index.d.ts.map +1 -0
  129. package/dist/enforcement/index.js +3 -0
  130. package/dist/enforcement/index.js.map +1 -0
  131. package/dist/enforcement/registry.d.ts +23 -0
  132. package/dist/enforcement/registry.d.ts.map +1 -0
  133. package/dist/enforcement/registry.js +63 -0
  134. package/dist/enforcement/registry.js.map +1 -0
  135. package/dist/enforcement/types.d.ts +51 -0
  136. package/dist/enforcement/types.d.ts.map +1 -0
  137. package/dist/enforcement/types.js +8 -0
  138. package/dist/enforcement/types.js.map +1 -0
  139. package/dist/facades/facade-factory.d.ts +10 -3
  140. package/dist/facades/facade-factory.d.ts.map +1 -1
  141. package/dist/facades/facade-factory.js +94 -5
  142. package/dist/facades/facade-factory.js.map +1 -1
  143. package/dist/facades/types.d.ts +15 -1
  144. package/dist/facades/types.d.ts.map +1 -1
  145. package/dist/facades/types.js +6 -0
  146. package/dist/facades/types.js.map +1 -1
  147. package/dist/health/health-registry.d.ts +40 -0
  148. package/dist/health/health-registry.d.ts.map +1 -0
  149. package/dist/health/health-registry.js +134 -0
  150. package/dist/health/health-registry.js.map +1 -0
  151. package/dist/health/index.d.ts +5 -0
  152. package/dist/health/index.d.ts.map +1 -0
  153. package/dist/health/index.js +3 -0
  154. package/dist/health/index.js.map +1 -0
  155. package/dist/health/vault-integrity.d.ts +13 -0
  156. package/dist/health/vault-integrity.d.ts.map +1 -0
  157. package/dist/health/vault-integrity.js +49 -0
  158. package/dist/health/vault-integrity.js.map +1 -0
  159. package/dist/index.d.ts +67 -6
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +51 -3
  162. package/dist/index.js.map +1 -1
  163. package/dist/intake/intake-pipeline.d.ts +0 -7
  164. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  165. package/dist/intake/intake-pipeline.js +1 -1
  166. package/dist/intake/intake-pipeline.js.map +1 -1
  167. package/dist/intelligence/types.d.ts +1 -0
  168. package/dist/intelligence/types.d.ts.map +1 -1
  169. package/dist/migrations/index.d.ts +6 -0
  170. package/dist/migrations/index.d.ts.map +1 -0
  171. package/dist/migrations/index.js +5 -0
  172. package/dist/migrations/index.js.map +1 -0
  173. package/dist/migrations/migration-runner.d.ts +51 -0
  174. package/dist/migrations/migration-runner.d.ts.map +1 -0
  175. package/dist/migrations/migration-runner.js +141 -0
  176. package/dist/migrations/migration-runner.js.map +1 -0
  177. package/dist/packs/index.d.ts +10 -0
  178. package/dist/packs/index.d.ts.map +1 -0
  179. package/dist/packs/index.js +8 -0
  180. package/dist/packs/index.js.map +1 -0
  181. package/dist/packs/lockfile.d.ts +97 -0
  182. package/dist/packs/lockfile.d.ts.map +1 -0
  183. package/dist/packs/lockfile.js +129 -0
  184. package/dist/packs/lockfile.js.map +1 -0
  185. package/dist/packs/pack-installer.d.ts +41 -0
  186. package/dist/packs/pack-installer.d.ts.map +1 -0
  187. package/dist/packs/pack-installer.js +253 -0
  188. package/dist/packs/pack-installer.js.map +1 -0
  189. package/dist/packs/resolver.d.ts +51 -0
  190. package/dist/packs/resolver.d.ts.map +1 -0
  191. package/dist/packs/resolver.js +195 -0
  192. package/dist/packs/resolver.js.map +1 -0
  193. package/dist/packs/types.d.ts +186 -0
  194. package/dist/packs/types.d.ts.map +1 -0
  195. package/dist/packs/types.js +69 -0
  196. package/dist/packs/types.js.map +1 -0
  197. package/dist/persistence/postgres-provider.d.ts +42 -7
  198. package/dist/persistence/postgres-provider.d.ts.map +1 -1
  199. package/dist/persistence/postgres-provider.js +187 -46
  200. package/dist/persistence/postgres-provider.js.map +1 -1
  201. package/dist/planning/gap-analysis.d.ts.map +1 -1
  202. package/dist/planning/gap-analysis.js +3 -1
  203. package/dist/planning/gap-analysis.js.map +1 -1
  204. package/dist/playbooks/index.d.ts +2 -0
  205. package/dist/playbooks/index.d.ts.map +1 -1
  206. package/dist/playbooks/index.js +2 -0
  207. package/dist/playbooks/index.js.map +1 -1
  208. package/dist/playbooks/playbook-executor.d.ts +100 -0
  209. package/dist/playbooks/playbook-executor.d.ts.map +1 -0
  210. package/dist/playbooks/playbook-executor.js +207 -0
  211. package/dist/playbooks/playbook-executor.js.map +1 -0
  212. package/dist/plugins/index.d.ts +7 -0
  213. package/dist/plugins/index.d.ts.map +1 -0
  214. package/dist/plugins/index.js +7 -0
  215. package/dist/plugins/index.js.map +1 -0
  216. package/dist/plugins/plugin-loader.d.ts +28 -0
  217. package/dist/plugins/plugin-loader.d.ts.map +1 -0
  218. package/dist/plugins/plugin-loader.js +150 -0
  219. package/dist/plugins/plugin-loader.js.map +1 -0
  220. package/dist/plugins/plugin-registry.d.ts +58 -0
  221. package/dist/plugins/plugin-registry.d.ts.map +1 -0
  222. package/dist/plugins/plugin-registry.js +157 -0
  223. package/dist/plugins/plugin-registry.js.map +1 -0
  224. package/dist/plugins/types.d.ts +180 -0
  225. package/dist/plugins/types.d.ts.map +1 -0
  226. package/dist/plugins/types.js +48 -0
  227. package/dist/plugins/types.js.map +1 -0
  228. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  229. package/dist/runtime/admin-extra-ops.js +181 -8
  230. package/dist/runtime/admin-extra-ops.js.map +1 -1
  231. package/dist/runtime/capture-ops.d.ts.map +1 -1
  232. package/dist/runtime/capture-ops.js +106 -7
  233. package/dist/runtime/capture-ops.js.map +1 -1
  234. package/dist/runtime/deprecation.d.ts +33 -0
  235. package/dist/runtime/deprecation.d.ts.map +1 -0
  236. package/dist/runtime/deprecation.js +41 -0
  237. package/dist/runtime/deprecation.js.map +1 -0
  238. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  239. package/dist/runtime/facades/admin-facade.js +12 -1
  240. package/dist/runtime/facades/admin-facade.js.map +1 -1
  241. package/dist/runtime/facades/agency-facade.d.ts +7 -0
  242. package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
  243. package/dist/runtime/facades/agency-facade.js +103 -0
  244. package/dist/runtime/facades/agency-facade.js.map +1 -0
  245. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  246. package/dist/runtime/facades/brain-facade.js +58 -0
  247. package/dist/runtime/facades/brain-facade.js.map +1 -1
  248. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  249. package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
  250. package/dist/runtime/facades/chat-facade.js +808 -0
  251. package/dist/runtime/facades/chat-facade.js.map +1 -0
  252. package/dist/runtime/facades/context-facade.d.ts +7 -0
  253. package/dist/runtime/facades/context-facade.d.ts.map +1 -0
  254. package/dist/runtime/facades/context-facade.js +45 -0
  255. package/dist/runtime/facades/context-facade.js.map +1 -0
  256. package/dist/runtime/facades/index.d.ts.map +1 -1
  257. package/dist/runtime/facades/index.js +18 -0
  258. package/dist/runtime/facades/index.js.map +1 -1
  259. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  260. package/dist/runtime/facades/vault-facade.js +247 -1
  261. package/dist/runtime/facades/vault-facade.js.map +1 -1
  262. package/dist/runtime/feature-flags.d.ts +18 -0
  263. package/dist/runtime/feature-flags.d.ts.map +1 -0
  264. package/dist/runtime/feature-flags.js +90 -0
  265. package/dist/runtime/feature-flags.js.map +1 -0
  266. package/dist/runtime/pack-ops.d.ts +9 -0
  267. package/dist/runtime/pack-ops.d.ts.map +1 -0
  268. package/dist/runtime/pack-ops.js +76 -0
  269. package/dist/runtime/pack-ops.js.map +1 -0
  270. package/dist/runtime/playbook-ops.d.ts +3 -7
  271. package/dist/runtime/playbook-ops.d.ts.map +1 -1
  272. package/dist/runtime/playbook-ops.js +101 -10
  273. package/dist/runtime/playbook-ops.js.map +1 -1
  274. package/dist/runtime/plugin-ops.d.ts +9 -0
  275. package/dist/runtime/plugin-ops.d.ts.map +1 -0
  276. package/dist/runtime/plugin-ops.js +235 -0
  277. package/dist/runtime/plugin-ops.js.map +1 -0
  278. package/dist/runtime/runtime.d.ts.map +1 -1
  279. package/dist/runtime/runtime.js +72 -5
  280. package/dist/runtime/runtime.js.map +1 -1
  281. package/dist/runtime/telemetry-ops.d.ts +10 -0
  282. package/dist/runtime/telemetry-ops.d.ts.map +1 -0
  283. package/dist/runtime/telemetry-ops.js +53 -0
  284. package/dist/runtime/telemetry-ops.js.map +1 -0
  285. package/dist/runtime/types.d.ts +35 -0
  286. package/dist/runtime/types.d.ts.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +13 -0
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
  289. package/dist/runtime/vault-sharing-ops.js +345 -0
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -0
  291. package/dist/streams/index.d.ts +1 -1
  292. package/dist/streams/index.d.ts.map +1 -1
  293. package/dist/streams/index.js +1 -1
  294. package/dist/streams/index.js.map +1 -1
  295. package/dist/streams/replayable-stream.d.ts +13 -1
  296. package/dist/streams/replayable-stream.d.ts.map +1 -1
  297. package/dist/streams/replayable-stream.js +27 -3
  298. package/dist/streams/replayable-stream.js.map +1 -1
  299. package/dist/text/similarity.d.ts +0 -1
  300. package/dist/text/similarity.d.ts.map +1 -1
  301. package/dist/text/similarity.js +1 -1
  302. package/dist/text/similarity.js.map +1 -1
  303. package/dist/transport/http-server.d.ts +56 -0
  304. package/dist/transport/http-server.d.ts.map +1 -0
  305. package/dist/transport/http-server.js +210 -0
  306. package/dist/transport/http-server.js.map +1 -0
  307. package/dist/transport/index.d.ts +11 -0
  308. package/dist/transport/index.d.ts.map +1 -0
  309. package/dist/transport/index.js +10 -0
  310. package/dist/transport/index.js.map +1 -0
  311. package/dist/transport/lsp-server.d.ts +140 -0
  312. package/dist/transport/lsp-server.d.ts.map +1 -0
  313. package/dist/transport/lsp-server.js +239 -0
  314. package/dist/transport/lsp-server.js.map +1 -0
  315. package/dist/transport/rate-limiter.d.ts +35 -0
  316. package/dist/transport/rate-limiter.d.ts.map +1 -0
  317. package/dist/transport/rate-limiter.js +72 -0
  318. package/dist/transport/rate-limiter.js.map +1 -0
  319. package/dist/transport/session-manager.d.ts +49 -0
  320. package/dist/transport/session-manager.d.ts.map +1 -0
  321. package/dist/transport/session-manager.js +83 -0
  322. package/dist/transport/session-manager.js.map +1 -0
  323. package/dist/transport/token-auth.d.ts +29 -0
  324. package/dist/transport/token-auth.d.ts.map +1 -0
  325. package/dist/transport/token-auth.js +84 -0
  326. package/dist/transport/token-auth.js.map +1 -0
  327. package/dist/transport/types.d.ts +61 -0
  328. package/dist/transport/types.d.ts.map +1 -0
  329. package/dist/transport/types.js +5 -0
  330. package/dist/transport/types.js.map +1 -0
  331. package/dist/transport/ws-server.d.ts +78 -0
  332. package/dist/transport/ws-server.d.ts.map +1 -0
  333. package/dist/transport/ws-server.js +342 -0
  334. package/dist/transport/ws-server.js.map +1 -0
  335. package/dist/vault/git-vault-sync.d.ts +107 -0
  336. package/dist/vault/git-vault-sync.d.ts.map +1 -0
  337. package/dist/vault/git-vault-sync.js +251 -0
  338. package/dist/vault/git-vault-sync.js.map +1 -0
  339. package/dist/vault/knowledge-review.d.ts +67 -0
  340. package/dist/vault/knowledge-review.d.ts.map +1 -0
  341. package/dist/vault/knowledge-review.js +133 -0
  342. package/dist/vault/knowledge-review.js.map +1 -0
  343. package/dist/vault/obsidian-sync.d.ts +94 -0
  344. package/dist/vault/obsidian-sync.d.ts.map +1 -0
  345. package/dist/vault/obsidian-sync.js +247 -0
  346. package/dist/vault/obsidian-sync.js.map +1 -0
  347. package/dist/vault/scope-detector.d.ts +31 -0
  348. package/dist/vault/scope-detector.d.ts.map +1 -0
  349. package/dist/vault/scope-detector.js +182 -0
  350. package/dist/vault/scope-detector.js.map +1 -0
  351. package/dist/vault/vault-branching.d.ts +71 -0
  352. package/dist/vault/vault-branching.d.ts.map +1 -0
  353. package/dist/vault/vault-branching.js +180 -0
  354. package/dist/vault/vault-branching.js.map +1 -0
  355. package/dist/vault/vault-manager.d.ts +89 -0
  356. package/dist/vault/vault-manager.d.ts.map +1 -0
  357. package/dist/vault/vault-manager.js +199 -0
  358. package/dist/vault/vault-manager.js.map +1 -0
  359. package/dist/vault/vault-types.d.ts +30 -0
  360. package/dist/vault/vault-types.d.ts.map +1 -0
  361. package/dist/vault/vault-types.js +10 -0
  362. package/dist/vault/vault-types.js.map +1 -0
  363. package/dist/vault/vault.d.ts +10 -0
  364. package/dist/vault/vault.d.ts.map +1 -1
  365. package/dist/vault/vault.js +36 -3
  366. package/dist/vault/vault.js.map +1 -1
  367. package/package.json +1 -1
  368. package/src/__tests__/admin-extra-ops.test.ts +31 -11
  369. package/src/__tests__/agency-manager.test.ts +374 -0
  370. package/src/__tests__/agent-loop.test.ts +256 -0
  371. package/src/__tests__/capture-ops.test.ts +275 -0
  372. package/src/__tests__/chat-differentiators.test.ts +251 -0
  373. package/src/__tests__/chat-enhanced.test.ts +390 -0
  374. package/src/__tests__/chat-transport.test.ts +665 -0
  375. package/src/__tests__/claudemd.test.ts +282 -0
  376. package/src/__tests__/context-engine.test.ts +256 -0
  377. package/src/__tests__/core-ops.test.ts +97 -5
  378. package/src/__tests__/deprecation.test.ts +78 -0
  379. package/src/__tests__/enforcement.test.ts +153 -0
  380. package/src/__tests__/facade-factory.test.ts +271 -0
  381. package/src/__tests__/feature-flags.test.ts +138 -0
  382. package/src/__tests__/git-vault-sync.test.ts +230 -0
  383. package/src/__tests__/health-registry.test.ts +173 -0
  384. package/src/__tests__/knowledge-review.test.ts +104 -0
  385. package/src/__tests__/lsp-transport.test.ts +442 -0
  386. package/src/__tests__/migration-runner.test.ts +170 -0
  387. package/src/__tests__/normalize.test.ts +10 -0
  388. package/src/__tests__/obsidian-sync.test.ts +354 -0
  389. package/src/__tests__/pack-lockfile.test.ts +261 -0
  390. package/src/__tests__/pack-ops.test.ts +146 -0
  391. package/src/__tests__/pack-system.test.ts +423 -0
  392. package/src/__tests__/playbook-executor.test.ts +249 -0
  393. package/src/__tests__/playbook-ops-execution.test.ts +189 -0
  394. package/src/__tests__/plugin-ops.test.ts +411 -0
  395. package/src/__tests__/plugin-system.test.ts +509 -0
  396. package/src/__tests__/postgres-provider.test.ts +64 -6
  397. package/src/__tests__/replayable-stream.test.ts +112 -1
  398. package/src/__tests__/scope-detector.test.ts +121 -0
  399. package/src/__tests__/session-lifecycle.test.ts +259 -0
  400. package/src/__tests__/transport.test.ts +758 -0
  401. package/src/__tests__/vault-branching.test.ts +274 -0
  402. package/src/__tests__/vault-connect.test.ts +179 -0
  403. package/src/__tests__/vault-integrity.test.ts +71 -0
  404. package/src/__tests__/vault-manager.test.ts +238 -0
  405. package/src/__tests__/vault-scaling.test.ts +281 -0
  406. package/src/__tests__/vault-sharing.test.ts +270 -0
  407. package/src/__tests__/ws-transport.test.ts +479 -0
  408. package/src/agency/agency-manager.ts +326 -0
  409. package/src/agency/index.ts +13 -0
  410. package/src/agency/types.ts +88 -0
  411. package/src/brain/brain.ts +15 -11
  412. package/src/brain/intelligence.ts +103 -0
  413. package/src/brain/types.ts +26 -0
  414. package/src/chat/agent-loop-types.ts +99 -0
  415. package/src/chat/agent-loop.ts +357 -0
  416. package/src/chat/auth-manager.ts +171 -0
  417. package/src/chat/browser-session.ts +188 -0
  418. package/src/chat/cancellation.ts +99 -0
  419. package/src/chat/chat-session.ts +283 -0
  420. package/src/chat/file-handler.ts +230 -0
  421. package/src/chat/fragment-buffer.ts +160 -0
  422. package/src/chat/index.ts +72 -0
  423. package/src/chat/mcp-bridge.ts +135 -0
  424. package/src/chat/notifications.ts +164 -0
  425. package/src/chat/output-compressor.ts +116 -0
  426. package/src/chat/queue.ts +208 -0
  427. package/src/chat/response-chunker.ts +200 -0
  428. package/src/chat/self-update.ts +117 -0
  429. package/src/chat/types.ts +126 -0
  430. package/src/chat/voice.ts +134 -0
  431. package/src/claudemd/compose.ts +142 -0
  432. package/src/claudemd/index.ts +17 -0
  433. package/src/claudemd/inject.ts +170 -0
  434. package/src/claudemd/types.ts +45 -0
  435. package/src/context/context-engine.ts +302 -0
  436. package/src/context/index.ts +11 -0
  437. package/src/context/types.ts +69 -0
  438. package/src/enforcement/adapters/claude-code.ts +135 -0
  439. package/src/enforcement/adapters/index.ts +1 -0
  440. package/src/enforcement/index.ts +10 -0
  441. package/src/enforcement/registry.ts +82 -0
  442. package/src/enforcement/types.ts +56 -0
  443. package/src/facades/facade-factory.ts +138 -5
  444. package/src/facades/types.ts +21 -0
  445. package/src/health/health-registry.ts +165 -0
  446. package/src/health/index.ts +11 -0
  447. package/src/health/vault-integrity.ts +66 -0
  448. package/src/index.ts +294 -2
  449. package/src/intake/intake-pipeline.ts +1 -1
  450. package/src/intelligence/types.ts +1 -0
  451. package/src/migrations/index.ts +6 -0
  452. package/src/migrations/migration-runner.ts +185 -0
  453. package/src/packs/index.ts +20 -0
  454. package/src/packs/lockfile.ts +180 -0
  455. package/src/packs/pack-installer.ts +289 -0
  456. package/src/packs/resolver.ts +237 -0
  457. package/src/packs/types.ts +125 -0
  458. package/src/persistence/postgres-provider.ts +211 -58
  459. package/src/planning/gap-analysis.ts +52 -7
  460. package/src/playbooks/index.ts +11 -0
  461. package/src/playbooks/playbook-executor.ts +301 -0
  462. package/src/plugins/index.ts +19 -0
  463. package/src/plugins/plugin-loader.ts +183 -0
  464. package/src/plugins/plugin-registry.ts +187 -0
  465. package/src/plugins/types.ts +119 -0
  466. package/src/runtime/admin-extra-ops.ts +193 -8
  467. package/src/runtime/capture-ops.ts +113 -8
  468. package/src/runtime/deprecation.ts +58 -0
  469. package/src/runtime/facades/admin-facade.ts +16 -1
  470. package/src/runtime/facades/agency-facade.ts +111 -0
  471. package/src/runtime/facades/brain-facade.ts +60 -0
  472. package/src/runtime/facades/chat-facade.ts +918 -0
  473. package/src/runtime/facades/context-facade.ts +55 -0
  474. package/src/runtime/facades/index.ts +22 -1
  475. package/src/runtime/facades/vault-facade.ts +261 -1
  476. package/src/runtime/feature-flags.ts +101 -0
  477. package/src/runtime/pack-ops.ts +85 -0
  478. package/src/runtime/playbook-ops.ts +113 -9
  479. package/src/runtime/plugin-ops.ts +258 -0
  480. package/src/runtime/runtime.ts +84 -5
  481. package/src/runtime/telemetry-ops.ts +57 -0
  482. package/src/runtime/types.ts +35 -0
  483. package/src/runtime/vault-sharing-ops.ts +372 -0
  484. package/src/streams/index.ts +1 -1
  485. package/src/streams/replayable-stream.ts +34 -3
  486. package/src/text/similarity.ts +1 -1
  487. package/src/transport/http-server.ts +269 -0
  488. package/src/transport/index.ts +48 -0
  489. package/src/transport/lsp-server.ts +401 -0
  490. package/src/transport/rate-limiter.ts +97 -0
  491. package/src/transport/session-manager.ts +120 -0
  492. package/src/transport/token-auth.ts +96 -0
  493. package/src/transport/types.ts +66 -0
  494. package/src/transport/ws-server.ts +415 -0
  495. package/src/vault/git-vault-sync.ts +318 -0
  496. package/src/vault/knowledge-review.ts +221 -0
  497. package/src/vault/obsidian-sync.ts +346 -0
  498. package/src/vault/scope-detector.ts +219 -0
  499. package/src/vault/vault-branching.ts +264 -0
  500. package/src/vault/vault-manager.ts +237 -0
  501. package/src/vault/vault-types.ts +50 -0
  502. package/src/vault/vault.ts +41 -3
  503. package/src/governance/index.ts +0 -18
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Self-Update Manager — restart context persistence for chat-driven updates.
3
+ *
4
+ * Manages the restart lifecycle: save context before exit, load on startup,
5
+ * confirm success or trigger rollback. The actual process exit and rebuild
6
+ * are handled by the supervisor — this module only manages the context.
7
+ *
8
+ * Exit code 75 signals the supervisor to rebuild before restarting.
9
+ */
10
+
11
+ import { readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
12
+ import { dirname } from 'node:path';
13
+
14
+ /** Exit code that tells the supervisor to rebuild before restart. */
15
+ export const RESTART_EXIT_CODE = 75;
16
+
17
+ export interface RestartContext {
18
+ /** Why the restart was requested. */
19
+ reason: 'self-update' | 'rebuild' | 'manual';
20
+ /** Chat ID to send confirmation to after restart. */
21
+ chatId: string;
22
+ /** Git commit SHA that triggered the update (if applicable). */
23
+ commitSha?: string;
24
+ /** Unix timestamp ms when restart was requested. */
25
+ requestedAt: number;
26
+ }
27
+
28
+ export interface RestartResult {
29
+ /** Whether the restart was initiated. */
30
+ initiated: boolean;
31
+ /** The saved context. */
32
+ context?: RestartContext;
33
+ /** Error message if failed. */
34
+ error?: string;
35
+ }
36
+
37
+ export class SelfUpdateManager {
38
+ constructor(private readonly contextPath: string) {}
39
+
40
+ /**
41
+ * Save restart context and exit with code 75.
42
+ * The supervisor handles rebuild + restart.
43
+ * Returns the context (useful for testing — in production, process.exit fires).
44
+ */
45
+ requestRestart(
46
+ chatId: string,
47
+ reason: RestartContext['reason'] = 'manual',
48
+ commitSha?: string,
49
+ ): RestartResult {
50
+ const context: RestartContext = {
51
+ reason,
52
+ chatId,
53
+ commitSha,
54
+ requestedAt: Date.now(),
55
+ };
56
+
57
+ try {
58
+ this.saveContext(context);
59
+ return { initiated: true, context };
60
+ } catch (e) {
61
+ return {
62
+ initiated: false,
63
+ error: e instanceof Error ? e.message : String(e),
64
+ };
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Save restart context to disk.
70
+ */
71
+ saveContext(context: RestartContext): void {
72
+ mkdirSync(dirname(this.contextPath), { recursive: true });
73
+ writeFileSync(this.contextPath, JSON.stringify(context, null, 2), 'utf-8');
74
+ }
75
+
76
+ /**
77
+ * Load restart context from disk (if any).
78
+ * Returns null if no pending restart context exists.
79
+ */
80
+ loadContext(): RestartContext | null {
81
+ try {
82
+ const raw = readFileSync(this.contextPath, 'utf-8');
83
+ return JSON.parse(raw) as RestartContext;
84
+ } catch {
85
+ return null;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Clear restart context (call after successful startup confirmation).
91
+ */
92
+ clearContext(): void {
93
+ try {
94
+ unlinkSync(this.contextPath);
95
+ } catch {
96
+ // File doesn't exist — that's fine
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Check if there's a pending restart context.
102
+ */
103
+ hasPendingRestart(): boolean {
104
+ return this.loadContext() !== null;
105
+ }
106
+
107
+ /**
108
+ * Sanitize a commit message for safe shell usage.
109
+ * Allows alphanumeric, spaces, basic punctuation. Max 120 chars.
110
+ */
111
+ static sanitizeCommitMessage(msg: string): string {
112
+ return msg
113
+ .replace(/[^\w\s.,!?:;()\-/'"#@]/g, '')
114
+ .trim()
115
+ .slice(0, 120);
116
+ }
117
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Chat transport types — generic primitives for conversational agent transports.
3
+ *
4
+ * Works for Telegram, Discord, Slack, or any chat-based interface.
5
+ * Transport-specific wiring (Grammy, discord.js, etc.) belongs in forge templates.
6
+ */
7
+
8
+ // ─── Messages ────────────────────────────────────────────────────────
9
+
10
+ export type ChatRole = 'user' | 'assistant' | 'system' | 'tool';
11
+
12
+ export interface ChatMessage {
13
+ role: ChatRole;
14
+ content: string;
15
+ /** Optional structured content blocks (e.g. tool_use, tool_result, image). */
16
+ blocks?: unknown[];
17
+ /** Unix timestamp ms. */
18
+ timestamp: number;
19
+ /** Transport-specific metadata (message ID, chat ID, etc.). */
20
+ meta?: Record<string, unknown>;
21
+ }
22
+
23
+ // ─── Sessions ────────────────────────────────────────────────────────
24
+
25
+ export interface ChatSession {
26
+ /** Unique session ID (typically the chat/channel ID from the transport). */
27
+ id: string;
28
+ /** Conversation messages. */
29
+ messages: ChatMessage[];
30
+ /** Unix timestamp ms when the session was created. */
31
+ createdAt: number;
32
+ /** Unix timestamp ms of the last activity. */
33
+ lastActiveAt: number;
34
+ /** Custom metadata (personality state, counters, etc.). */
35
+ meta?: Record<string, unknown>;
36
+ }
37
+
38
+ export interface ChatSessionConfig {
39
+ /** Directory for session persistence. */
40
+ storageDir: string;
41
+ /** TTL in ms for inactivity expiry. Default: 7_200_000 (2 hours). */
42
+ ttlMs?: number;
43
+ /** Max messages before compaction triggers. Default: 100. */
44
+ compactionThreshold?: number;
45
+ /** Messages to keep after compaction. Default: 40. */
46
+ compactionKeep?: number;
47
+ }
48
+
49
+ // ─── Fragment Buffering ──────────────────────────────────────────────
50
+
51
+ export interface Fragment {
52
+ /** The message text. */
53
+ text: string;
54
+ /** Transport message ID (for ordering). */
55
+ messageId: number | string;
56
+ /** Unix timestamp ms when received. */
57
+ receivedAt: number;
58
+ }
59
+
60
+ export interface FragmentBufferConfig {
61
+ /** Character threshold to start buffering. Default: 4000. */
62
+ startThreshold?: number;
63
+ /** Max gap in ms between fragments before auto-flush. Default: 1500. */
64
+ maxGapMs?: number;
65
+ /** Maximum number of fragments to merge. Default: 12. */
66
+ maxParts?: number;
67
+ /** Maximum total bytes before force-flush. Default: 50_000. */
68
+ maxTotalBytes?: number;
69
+ }
70
+
71
+ // ─── Response Chunking ──────────────────────────────────────────────
72
+
73
+ export type MarkupFormat = 'html' | 'markdown' | 'plain';
74
+
75
+ export interface ChunkConfig {
76
+ /** Max characters per chunk. Default: 4000. */
77
+ maxChunkSize?: number;
78
+ /** Output markup format. Default: 'html'. */
79
+ format?: MarkupFormat;
80
+ }
81
+
82
+ // ─── Authentication ──────────────────────────────────────────────────
83
+
84
+ export interface ChatAuthConfig {
85
+ /** Path to auth persistence file. */
86
+ storagePath: string;
87
+ /** Passphrase required for authentication. If unset, auth is disabled. */
88
+ passphrase?: string;
89
+ /** Allowed user IDs. If empty or unset, any authenticated user is allowed. */
90
+ allowedUsers?: (string | number)[];
91
+ /** Rate limit: max failed attempts before temporary lockout. Default: 5. */
92
+ maxFailedAttempts?: number;
93
+ /** Lockout duration in ms. Default: 300_000 (5 minutes). */
94
+ lockoutMs?: number;
95
+ }
96
+
97
+ export interface AuthRecord {
98
+ userId: string | number;
99
+ authenticatedAt: number;
100
+ }
101
+
102
+ export interface AuthState {
103
+ authenticated: AuthRecord[];
104
+ failedAttempts: Map<string, { count: number; lastAttempt: number }>;
105
+ }
106
+
107
+ // ─── Chat Manager (combines everything) ─────────────────────────────
108
+
109
+ export interface ChatManagerConfig {
110
+ session: ChatSessionConfig;
111
+ fragment?: FragmentBufferConfig;
112
+ chunk?: ChunkConfig;
113
+ auth?: ChatAuthConfig;
114
+ }
115
+
116
+ export interface ChatManagerStatus {
117
+ activeSessions: number;
118
+ authenticatedUsers: number;
119
+ pendingFragments: number;
120
+ config: {
121
+ ttlMs: number;
122
+ compactionThreshold: number;
123
+ maxChunkSize: number;
124
+ authEnabled: boolean;
125
+ };
126
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Voice — transcription and text-to-speech via pure HTTP (no SDK deps).
3
+ *
4
+ * Supports OpenAI Whisper for transcription and OpenAI TTS for speech synthesis.
5
+ * Graceful degradation when API keys are missing.
6
+ */
7
+
8
+ // ─── Types ────────────────────────────────────────────────────────────
9
+
10
+ export interface VoiceConfig {
11
+ /** OpenAI API key for Whisper transcription and TTS. */
12
+ openaiApiKey?: string;
13
+ /** TTS voice ID. Default: 'onyx'. */
14
+ ttsVoice?: string;
15
+ /** TTS model. Default: 'tts-1'. */
16
+ ttsModel?: string;
17
+ /** Whisper model. Default: 'whisper-1'. */
18
+ whisperModel?: string;
19
+ }
20
+
21
+ export interface TranscriptionResult {
22
+ /** Transcribed text. */
23
+ text: string;
24
+ /** Whether transcription was successful. */
25
+ success: boolean;
26
+ }
27
+
28
+ export interface SpeechResult {
29
+ /** Audio data as Buffer (MP3). */
30
+ audio: Buffer;
31
+ /** Whether synthesis was successful. */
32
+ success: boolean;
33
+ }
34
+
35
+ // ─── Transcriber ──────────────────────────────────────────────────────
36
+
37
+ /**
38
+ * Transcribe audio using OpenAI Whisper API.
39
+ * Returns a fallback message if no API key is configured.
40
+ */
41
+ export async function transcribeAudio(
42
+ audioBuffer: Buffer,
43
+ config: VoiceConfig,
44
+ filename: string = 'audio.ogg',
45
+ ): Promise<TranscriptionResult> {
46
+ if (!config.openaiApiKey) {
47
+ return { text: '[Voice message — transcription unavailable]', success: false };
48
+ }
49
+
50
+ const model = config.whisperModel ?? 'whisper-1';
51
+
52
+ // Build multipart form data manually (no SDK)
53
+ const boundary = `----SoleriFormBoundary${Date.now()}`;
54
+ const parts: Buffer[] = [];
55
+
56
+ // File part
57
+ parts.push(
58
+ Buffer.from(
59
+ `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${filename}"\r\nContent-Type: audio/ogg\r\n\r\n`,
60
+ ),
61
+ );
62
+ parts.push(audioBuffer);
63
+ parts.push(Buffer.from('\r\n'));
64
+
65
+ // Model part
66
+ parts.push(
67
+ Buffer.from(
68
+ `--${boundary}\r\nContent-Disposition: form-data; name="model"\r\n\r\n${model}\r\n`,
69
+ ),
70
+ );
71
+
72
+ parts.push(Buffer.from(`--${boundary}--\r\n`));
73
+ const body = Buffer.concat(parts);
74
+
75
+ try {
76
+ const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {
77
+ method: 'POST',
78
+ headers: {
79
+ Authorization: `Bearer ${config.openaiApiKey}`,
80
+ 'Content-Type': `multipart/form-data; boundary=${boundary}`,
81
+ },
82
+ body,
83
+ signal: AbortSignal.timeout(30_000),
84
+ });
85
+
86
+ if (!response.ok) {
87
+ await response.text().catch(() => {});
88
+ return { text: `[Transcription failed: ${response.status}]`, success: false };
89
+ }
90
+
91
+ const data = (await response.json()) as { text?: string };
92
+ return { text: data.text ?? '', success: true };
93
+ } catch (e) {
94
+ const msg = e instanceof Error ? e.message : String(e);
95
+ return { text: `[Transcription error: ${msg}]`, success: false };
96
+ }
97
+ }
98
+
99
+ // ─── TTS ──────────────────────────────────────────────────────────────
100
+
101
+ /**
102
+ * Synthesize speech from text using OpenAI TTS API.
103
+ * Returns null if no API key is configured.
104
+ */
105
+ export async function synthesizeSpeech(
106
+ text: string,
107
+ config: VoiceConfig,
108
+ ): Promise<SpeechResult | null> {
109
+ if (!config.openaiApiKey) return null;
110
+
111
+ const model = config.ttsModel ?? 'tts-1';
112
+ const voice = config.ttsVoice ?? 'onyx';
113
+
114
+ try {
115
+ const response = await fetch('https://api.openai.com/v1/audio/speech', {
116
+ method: 'POST',
117
+ headers: {
118
+ Authorization: `Bearer ${config.openaiApiKey}`,
119
+ 'Content-Type': 'application/json',
120
+ },
121
+ body: JSON.stringify({ model, voice, input: text }),
122
+ signal: AbortSignal.timeout(30_000),
123
+ });
124
+
125
+ if (!response.ok) {
126
+ return { audio: Buffer.alloc(0), success: false };
127
+ }
128
+
129
+ const audio = Buffer.from(await response.arrayBuffer());
130
+ return { audio, success: true };
131
+ } catch {
132
+ return { audio: Buffer.alloc(0), success: false };
133
+ }
134
+ }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * CLAUDE.md composition — generates LLM instructions from agent config and facades.
3
+ *
4
+ * Produces markdown with:
5
+ * 1. Global instructions (priority-sorted)
6
+ * 2. Activation / deactivation
7
+ * 3. Session start protocol
8
+ * 4. Facade reference table (auto-generated from registered facades)
9
+ * 5. Facade behavioral rules (from FacadeInstructions)
10
+ *
11
+ * Wrapped in versioned markers: `<!-- agent:mode v1 -->` / `<!-- /agent:mode -->`
12
+ */
13
+
14
+ import type { FacadeConfig } from '../facades/types.js';
15
+ import type { AgentMeta, FacadeInstructions, GlobalInstruction } from './types.js';
16
+
17
+ export const FORMAT_VERSION = 1;
18
+ export const OPEN_MARKER = `<!-- agent:mode v${FORMAT_VERSION} -->`;
19
+ export const CLOSE_MARKER = '<!-- /agent:mode -->';
20
+ export const USER_ZONE_OPEN = '<!-- user:custom -->';
21
+ export const USER_ZONE_CLOSE = '<!-- /user:custom -->';
22
+
23
+ function sortByPriority<T extends { priority?: number }>(items: T[]): T[] {
24
+ return [...items].sort((a, b) => (a.priority ?? 50) - (b.priority ?? 50));
25
+ }
26
+
27
+ function renderActivation(agent: AgentMeta): string {
28
+ return [
29
+ `## ${agent.name} Mode`,
30
+ '',
31
+ '### Activation',
32
+ '',
33
+ `- "${agent.activationPhrase}" → \`${agent.activateCommand}\``,
34
+ `- "${agent.deactivationPhrase}" → \`${agent.deactivateCommand}\``,
35
+ '',
36
+ '> Persona details are returned dynamically by the activate response.',
37
+ ].join('\n');
38
+ }
39
+
40
+ function renderSessionStart(agent: AgentMeta): string {
41
+ return [
42
+ '### Session Start Protocol',
43
+ '',
44
+ 'On EVERY new session:',
45
+ `1. Register project: \`${agent.id}_core op:register params:{ projectPath: "." }\``,
46
+ '2. Check activation response for `persistence.status`, `vault.connected`',
47
+ `3. Check for plans in \`executing\` state — remind user to reconcile`,
48
+ ].join('\n');
49
+ }
50
+
51
+ function renderFacadeTable(
52
+ facades: FacadeConfig[],
53
+ instructions?: Map<string, FacadeInstructions>,
54
+ ): string {
55
+ const lines = ['### Essential Tools', '', '| Facade | Key Ops |', '|--------|---------|'];
56
+
57
+ for (const facade of facades) {
58
+ const instr = instructions?.get(facade.name);
59
+ const allOps = facade.ops.map((o) => o.name);
60
+ const keyOps = instr?.keyOps ?? allOps.slice(0, 5);
61
+ const display = keyOps.map((o) => `\`${o}\``).join(', ');
62
+ const suffix = allOps.length > keyOps.length ? ', ...' : '';
63
+ lines.push(`| \`${facade.name}\` | ${display}${suffix} |`);
64
+ }
65
+
66
+ return lines.join('\n');
67
+ }
68
+
69
+ function renderGlobalInstruction(gi: GlobalInstruction): string {
70
+ return `## ${gi.heading}\n\n${gi.content.trim()}`;
71
+ }
72
+
73
+ function renderFacadeRules(name: string, instr: FacadeInstructions): string {
74
+ const lines: string[] = [`## ${instr.heading}`, ''];
75
+
76
+ if (instr.rules?.length) {
77
+ for (const rule of instr.rules) {
78
+ lines.push(`- ${rule}`);
79
+ }
80
+ lines.push('');
81
+ }
82
+
83
+ if (instr.templates) {
84
+ for (const [label, template] of Object.entries(instr.templates)) {
85
+ lines.push(`### ${label}`, '', template.trim(), '');
86
+ }
87
+ }
88
+
89
+ return lines.join('\n').trimEnd();
90
+ }
91
+
92
+ export interface ComposeOptions {
93
+ /** Per-facade behavioral instructions */
94
+ facadeInstructions?: Map<string, FacadeInstructions>;
95
+ /** Include an empty user-safe zone */
96
+ includeUserZone?: boolean;
97
+ }
98
+
99
+ /**
100
+ * Compose the full CLAUDE.md agent block from metadata and facades.
101
+ * Returns the content wrapped in versioned markers.
102
+ */
103
+ export function composeCLAUDEmd(
104
+ agent: AgentMeta,
105
+ facades: FacadeConfig[],
106
+ options?: ComposeOptions,
107
+ ): string {
108
+ const sections: string[] = [];
109
+
110
+ // 1. Global instructions (sorted by priority)
111
+ if (agent.globalInstructions?.length) {
112
+ const sorted = sortByPriority(agent.globalInstructions);
113
+ for (const gi of sorted) {
114
+ sections.push(renderGlobalInstruction(gi));
115
+ }
116
+ }
117
+
118
+ // 2. Activation + session start
119
+ sections.push(renderActivation(agent));
120
+ sections.push(renderSessionStart(agent));
121
+
122
+ // 3. Facade reference table
123
+ sections.push(renderFacadeTable(facades, options?.facadeInstructions));
124
+
125
+ // 4. Facade behavioral rules
126
+ if (options?.facadeInstructions) {
127
+ const entries = [...options.facadeInstructions.entries()].sort(
128
+ ([, a], [, b]) => (a.priority ?? 50) - (b.priority ?? 50),
129
+ );
130
+ for (const [name, instr] of entries) {
131
+ sections.push(renderFacadeRules(name, instr));
132
+ }
133
+ }
134
+
135
+ // 5. User-safe zone
136
+ if (options?.includeUserZone) {
137
+ sections.push(`${USER_ZONE_OPEN}\n\n${USER_ZONE_CLOSE}`);
138
+ }
139
+
140
+ const body = sections.join('\n\n');
141
+ return `${OPEN_MARKER}\n\n${body}\n\n${CLOSE_MARKER}`;
142
+ }
@@ -0,0 +1,17 @@
1
+ export {
2
+ composeCLAUDEmd,
3
+ FORMAT_VERSION,
4
+ OPEN_MARKER,
5
+ CLOSE_MARKER,
6
+ USER_ZONE_OPEN,
7
+ USER_ZONE_CLOSE,
8
+ } from './compose.js';
9
+ export type { ComposeOptions } from './compose.js';
10
+ export { injectCLAUDEmd, removeCLAUDEmd, hasCLAUDEmdBlock, extractUserZone } from './inject.js';
11
+ export type {
12
+ AgentMeta,
13
+ GlobalInstruction,
14
+ FacadeInstructions,
15
+ InjectionResult,
16
+ RemovalResult,
17
+ } from './types.js';