@soleri/core 2.10.0 → 2.12.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 (511) 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 +24 -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/loader.d.ts.map +1 -1
  168. package/dist/intelligence/loader.js +51 -5
  169. package/dist/intelligence/loader.js.map +1 -1
  170. package/dist/intelligence/types.d.ts +1 -0
  171. package/dist/intelligence/types.d.ts.map +1 -1
  172. package/dist/migrations/index.d.ts +6 -0
  173. package/dist/migrations/index.d.ts.map +1 -0
  174. package/dist/migrations/index.js +5 -0
  175. package/dist/migrations/index.js.map +1 -0
  176. package/dist/migrations/migration-runner.d.ts +51 -0
  177. package/dist/migrations/migration-runner.d.ts.map +1 -0
  178. package/dist/migrations/migration-runner.js +141 -0
  179. package/dist/migrations/migration-runner.js.map +1 -0
  180. package/dist/packs/index.d.ts +10 -0
  181. package/dist/packs/index.d.ts.map +1 -0
  182. package/dist/packs/index.js +8 -0
  183. package/dist/packs/index.js.map +1 -0
  184. package/dist/packs/lockfile.d.ts +97 -0
  185. package/dist/packs/lockfile.d.ts.map +1 -0
  186. package/dist/packs/lockfile.js +129 -0
  187. package/dist/packs/lockfile.js.map +1 -0
  188. package/dist/packs/pack-installer.d.ts +41 -0
  189. package/dist/packs/pack-installer.d.ts.map +1 -0
  190. package/dist/packs/pack-installer.js +253 -0
  191. package/dist/packs/pack-installer.js.map +1 -0
  192. package/dist/packs/resolver.d.ts +51 -0
  193. package/dist/packs/resolver.d.ts.map +1 -0
  194. package/dist/packs/resolver.js +195 -0
  195. package/dist/packs/resolver.js.map +1 -0
  196. package/dist/packs/types.d.ts +186 -0
  197. package/dist/packs/types.d.ts.map +1 -0
  198. package/dist/packs/types.js +69 -0
  199. package/dist/packs/types.js.map +1 -0
  200. package/dist/persistence/postgres-provider.d.ts +42 -7
  201. package/dist/persistence/postgres-provider.d.ts.map +1 -1
  202. package/dist/persistence/postgres-provider.js +187 -46
  203. package/dist/persistence/postgres-provider.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/domain-ops.d.ts.map +1 -1
  239. package/dist/runtime/domain-ops.js +21 -2
  240. package/dist/runtime/domain-ops.js.map +1 -1
  241. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  242. package/dist/runtime/facades/admin-facade.js +12 -1
  243. package/dist/runtime/facades/admin-facade.js.map +1 -1
  244. package/dist/runtime/facades/agency-facade.d.ts +7 -0
  245. package/dist/runtime/facades/agency-facade.d.ts.map +1 -0
  246. package/dist/runtime/facades/agency-facade.js +103 -0
  247. package/dist/runtime/facades/agency-facade.js.map +1 -0
  248. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/brain-facade.js +58 -0
  250. package/dist/runtime/facades/brain-facade.js.map +1 -1
  251. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  252. package/dist/runtime/facades/chat-facade.d.ts.map +1 -0
  253. package/dist/runtime/facades/chat-facade.js +808 -0
  254. package/dist/runtime/facades/chat-facade.js.map +1 -0
  255. package/dist/runtime/facades/context-facade.d.ts +7 -0
  256. package/dist/runtime/facades/context-facade.d.ts.map +1 -0
  257. package/dist/runtime/facades/context-facade.js +45 -0
  258. package/dist/runtime/facades/context-facade.js.map +1 -0
  259. package/dist/runtime/facades/index.d.ts.map +1 -1
  260. package/dist/runtime/facades/index.js +18 -0
  261. package/dist/runtime/facades/index.js.map +1 -1
  262. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  263. package/dist/runtime/facades/vault-facade.js +247 -1
  264. package/dist/runtime/facades/vault-facade.js.map +1 -1
  265. package/dist/runtime/feature-flags.d.ts +18 -0
  266. package/dist/runtime/feature-flags.d.ts.map +1 -0
  267. package/dist/runtime/feature-flags.js +90 -0
  268. package/dist/runtime/feature-flags.js.map +1 -0
  269. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  270. package/dist/runtime/orchestrate-ops.js +13 -0
  271. package/dist/runtime/orchestrate-ops.js.map +1 -1
  272. package/dist/runtime/pack-ops.d.ts +9 -0
  273. package/dist/runtime/pack-ops.d.ts.map +1 -0
  274. package/dist/runtime/pack-ops.js +76 -0
  275. package/dist/runtime/pack-ops.js.map +1 -0
  276. package/dist/runtime/playbook-ops.d.ts +3 -7
  277. package/dist/runtime/playbook-ops.d.ts.map +1 -1
  278. package/dist/runtime/playbook-ops.js +101 -10
  279. package/dist/runtime/playbook-ops.js.map +1 -1
  280. package/dist/runtime/plugin-ops.d.ts +9 -0
  281. package/dist/runtime/plugin-ops.d.ts.map +1 -0
  282. package/dist/runtime/plugin-ops.js +235 -0
  283. package/dist/runtime/plugin-ops.js.map +1 -0
  284. package/dist/runtime/runtime.d.ts.map +1 -1
  285. package/dist/runtime/runtime.js +72 -5
  286. package/dist/runtime/runtime.js.map +1 -1
  287. package/dist/runtime/telemetry-ops.d.ts +10 -0
  288. package/dist/runtime/telemetry-ops.d.ts.map +1 -0
  289. package/dist/runtime/telemetry-ops.js +53 -0
  290. package/dist/runtime/telemetry-ops.js.map +1 -0
  291. package/dist/runtime/types.d.ts +35 -0
  292. package/dist/runtime/types.d.ts.map +1 -1
  293. package/dist/runtime/vault-sharing-ops.d.ts +13 -0
  294. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -0
  295. package/dist/runtime/vault-sharing-ops.js +345 -0
  296. package/dist/runtime/vault-sharing-ops.js.map +1 -0
  297. package/dist/streams/index.d.ts +1 -1
  298. package/dist/streams/index.d.ts.map +1 -1
  299. package/dist/streams/index.js +1 -1
  300. package/dist/streams/index.js.map +1 -1
  301. package/dist/streams/replayable-stream.d.ts +13 -1
  302. package/dist/streams/replayable-stream.d.ts.map +1 -1
  303. package/dist/streams/replayable-stream.js +27 -3
  304. package/dist/streams/replayable-stream.js.map +1 -1
  305. package/dist/text/similarity.d.ts +0 -1
  306. package/dist/text/similarity.d.ts.map +1 -1
  307. package/dist/text/similarity.js +1 -1
  308. package/dist/text/similarity.js.map +1 -1
  309. package/dist/transport/http-server.d.ts +56 -0
  310. package/dist/transport/http-server.d.ts.map +1 -0
  311. package/dist/transport/http-server.js +210 -0
  312. package/dist/transport/http-server.js.map +1 -0
  313. package/dist/transport/index.d.ts +11 -0
  314. package/dist/transport/index.d.ts.map +1 -0
  315. package/dist/transport/index.js +10 -0
  316. package/dist/transport/index.js.map +1 -0
  317. package/dist/transport/lsp-server.d.ts +140 -0
  318. package/dist/transport/lsp-server.d.ts.map +1 -0
  319. package/dist/transport/lsp-server.js +239 -0
  320. package/dist/transport/lsp-server.js.map +1 -0
  321. package/dist/transport/rate-limiter.d.ts +35 -0
  322. package/dist/transport/rate-limiter.d.ts.map +1 -0
  323. package/dist/transport/rate-limiter.js +72 -0
  324. package/dist/transport/rate-limiter.js.map +1 -0
  325. package/dist/transport/session-manager.d.ts +49 -0
  326. package/dist/transport/session-manager.d.ts.map +1 -0
  327. package/dist/transport/session-manager.js +83 -0
  328. package/dist/transport/session-manager.js.map +1 -0
  329. package/dist/transport/token-auth.d.ts +29 -0
  330. package/dist/transport/token-auth.d.ts.map +1 -0
  331. package/dist/transport/token-auth.js +84 -0
  332. package/dist/transport/token-auth.js.map +1 -0
  333. package/dist/transport/types.d.ts +61 -0
  334. package/dist/transport/types.d.ts.map +1 -0
  335. package/dist/transport/types.js +5 -0
  336. package/dist/transport/types.js.map +1 -0
  337. package/dist/transport/ws-server.d.ts +78 -0
  338. package/dist/transport/ws-server.d.ts.map +1 -0
  339. package/dist/transport/ws-server.js +342 -0
  340. package/dist/transport/ws-server.js.map +1 -0
  341. package/dist/vault/git-vault-sync.d.ts +107 -0
  342. package/dist/vault/git-vault-sync.d.ts.map +1 -0
  343. package/dist/vault/git-vault-sync.js +251 -0
  344. package/dist/vault/git-vault-sync.js.map +1 -0
  345. package/dist/vault/knowledge-review.d.ts +67 -0
  346. package/dist/vault/knowledge-review.d.ts.map +1 -0
  347. package/dist/vault/knowledge-review.js +133 -0
  348. package/dist/vault/knowledge-review.js.map +1 -0
  349. package/dist/vault/obsidian-sync.d.ts +94 -0
  350. package/dist/vault/obsidian-sync.d.ts.map +1 -0
  351. package/dist/vault/obsidian-sync.js +247 -0
  352. package/dist/vault/obsidian-sync.js.map +1 -0
  353. package/dist/vault/scope-detector.d.ts +31 -0
  354. package/dist/vault/scope-detector.d.ts.map +1 -0
  355. package/dist/vault/scope-detector.js +182 -0
  356. package/dist/vault/scope-detector.js.map +1 -0
  357. package/dist/vault/vault-branching.d.ts +71 -0
  358. package/dist/vault/vault-branching.d.ts.map +1 -0
  359. package/dist/vault/vault-branching.js +180 -0
  360. package/dist/vault/vault-branching.js.map +1 -0
  361. package/dist/vault/vault-manager.d.ts +89 -0
  362. package/dist/vault/vault-manager.d.ts.map +1 -0
  363. package/dist/vault/vault-manager.js +199 -0
  364. package/dist/vault/vault-manager.js.map +1 -0
  365. package/dist/vault/vault-types.d.ts +30 -0
  366. package/dist/vault/vault-types.d.ts.map +1 -0
  367. package/dist/vault/vault-types.js +10 -0
  368. package/dist/vault/vault-types.js.map +1 -0
  369. package/dist/vault/vault.d.ts +10 -0
  370. package/dist/vault/vault.d.ts.map +1 -1
  371. package/dist/vault/vault.js +36 -3
  372. package/dist/vault/vault.js.map +1 -1
  373. package/package.json +1 -1
  374. package/src/__tests__/admin-extra-ops.test.ts +31 -11
  375. package/src/__tests__/agency-manager.test.ts +374 -0
  376. package/src/__tests__/agent-loop.test.ts +256 -0
  377. package/src/__tests__/capture-ops.test.ts +275 -0
  378. package/src/__tests__/chat-differentiators.test.ts +251 -0
  379. package/src/__tests__/chat-enhanced.test.ts +390 -0
  380. package/src/__tests__/chat-transport.test.ts +665 -0
  381. package/src/__tests__/claudemd.test.ts +282 -0
  382. package/src/__tests__/context-engine.test.ts +256 -0
  383. package/src/__tests__/core-ops.test.ts +97 -5
  384. package/src/__tests__/deprecation.test.ts +78 -0
  385. package/src/__tests__/enforcement.test.ts +153 -0
  386. package/src/__tests__/facade-factory.test.ts +271 -0
  387. package/src/__tests__/feature-flags.test.ts +138 -0
  388. package/src/__tests__/git-vault-sync.test.ts +230 -0
  389. package/src/__tests__/health-registry.test.ts +173 -0
  390. package/src/__tests__/knowledge-review.test.ts +104 -0
  391. package/src/__tests__/lsp-transport.test.ts +442 -0
  392. package/src/__tests__/migration-runner.test.ts +170 -0
  393. package/src/__tests__/normalize.test.ts +10 -0
  394. package/src/__tests__/obsidian-sync.test.ts +354 -0
  395. package/src/__tests__/pack-lockfile.test.ts +261 -0
  396. package/src/__tests__/pack-ops.test.ts +146 -0
  397. package/src/__tests__/pack-system.test.ts +423 -0
  398. package/src/__tests__/playbook-executor.test.ts +249 -0
  399. package/src/__tests__/playbook-ops-execution.test.ts +189 -0
  400. package/src/__tests__/plugin-ops.test.ts +411 -0
  401. package/src/__tests__/plugin-system.test.ts +509 -0
  402. package/src/__tests__/postgres-provider.test.ts +64 -6
  403. package/src/__tests__/replayable-stream.test.ts +112 -1
  404. package/src/__tests__/scope-detector.test.ts +121 -0
  405. package/src/__tests__/session-lifecycle.test.ts +259 -0
  406. package/src/__tests__/transport.test.ts +758 -0
  407. package/src/__tests__/vault-branching.test.ts +274 -0
  408. package/src/__tests__/vault-connect.test.ts +179 -0
  409. package/src/__tests__/vault-integrity.test.ts +71 -0
  410. package/src/__tests__/vault-manager.test.ts +238 -0
  411. package/src/__tests__/vault-scaling.test.ts +281 -0
  412. package/src/__tests__/vault-sharing.test.ts +270 -0
  413. package/src/__tests__/ws-transport.test.ts +479 -0
  414. package/src/agency/agency-manager.ts +326 -0
  415. package/src/agency/index.ts +13 -0
  416. package/src/agency/types.ts +88 -0
  417. package/src/brain/brain.ts +27 -11
  418. package/src/brain/intelligence.ts +103 -0
  419. package/src/brain/types.ts +26 -0
  420. package/src/chat/agent-loop-types.ts +99 -0
  421. package/src/chat/agent-loop.ts +357 -0
  422. package/src/chat/auth-manager.ts +171 -0
  423. package/src/chat/browser-session.ts +188 -0
  424. package/src/chat/cancellation.ts +99 -0
  425. package/src/chat/chat-session.ts +283 -0
  426. package/src/chat/file-handler.ts +230 -0
  427. package/src/chat/fragment-buffer.ts +160 -0
  428. package/src/chat/index.ts +72 -0
  429. package/src/chat/mcp-bridge.ts +135 -0
  430. package/src/chat/notifications.ts +164 -0
  431. package/src/chat/output-compressor.ts +116 -0
  432. package/src/chat/queue.ts +208 -0
  433. package/src/chat/response-chunker.ts +200 -0
  434. package/src/chat/self-update.ts +117 -0
  435. package/src/chat/types.ts +126 -0
  436. package/src/chat/voice.ts +134 -0
  437. package/src/claudemd/compose.ts +142 -0
  438. package/src/claudemd/index.ts +17 -0
  439. package/src/claudemd/inject.ts +170 -0
  440. package/src/claudemd/types.ts +45 -0
  441. package/src/context/context-engine.ts +302 -0
  442. package/src/context/index.ts +11 -0
  443. package/src/context/types.ts +69 -0
  444. package/src/enforcement/adapters/claude-code.ts +135 -0
  445. package/src/enforcement/adapters/index.ts +1 -0
  446. package/src/enforcement/index.ts +10 -0
  447. package/src/enforcement/registry.ts +82 -0
  448. package/src/enforcement/types.ts +56 -0
  449. package/src/facades/facade-factory.ts +138 -5
  450. package/src/facades/types.ts +21 -0
  451. package/src/health/health-registry.ts +165 -0
  452. package/src/health/index.ts +11 -0
  453. package/src/health/vault-integrity.ts +66 -0
  454. package/src/index.ts +294 -2
  455. package/src/intake/intake-pipeline.ts +1 -1
  456. package/src/intelligence/loader.ts +58 -5
  457. package/src/intelligence/types.ts +1 -0
  458. package/src/migrations/index.ts +6 -0
  459. package/src/migrations/migration-runner.ts +185 -0
  460. package/src/packs/index.ts +20 -0
  461. package/src/packs/lockfile.ts +180 -0
  462. package/src/packs/pack-installer.ts +289 -0
  463. package/src/packs/resolver.ts +237 -0
  464. package/src/packs/types.ts +125 -0
  465. package/src/persistence/postgres-provider.ts +211 -58
  466. package/src/playbooks/index.ts +11 -0
  467. package/src/playbooks/playbook-executor.ts +301 -0
  468. package/src/plugins/index.ts +19 -0
  469. package/src/plugins/plugin-loader.ts +183 -0
  470. package/src/plugins/plugin-registry.ts +187 -0
  471. package/src/plugins/types.ts +119 -0
  472. package/src/runtime/admin-extra-ops.ts +193 -8
  473. package/src/runtime/capture-ops.ts +113 -8
  474. package/src/runtime/deprecation.ts +58 -0
  475. package/src/runtime/domain-ops.ts +21 -2
  476. package/src/runtime/facades/admin-facade.ts +16 -1
  477. package/src/runtime/facades/agency-facade.ts +111 -0
  478. package/src/runtime/facades/brain-facade.ts +60 -0
  479. package/src/runtime/facades/chat-facade.ts +918 -0
  480. package/src/runtime/facades/context-facade.ts +55 -0
  481. package/src/runtime/facades/index.ts +22 -1
  482. package/src/runtime/facades/vault-facade.ts +261 -1
  483. package/src/runtime/feature-flags.ts +101 -0
  484. package/src/runtime/orchestrate-ops.ts +13 -0
  485. package/src/runtime/pack-ops.ts +85 -0
  486. package/src/runtime/playbook-ops.ts +113 -9
  487. package/src/runtime/plugin-ops.ts +258 -0
  488. package/src/runtime/runtime.ts +84 -5
  489. package/src/runtime/telemetry-ops.ts +57 -0
  490. package/src/runtime/types.ts +35 -0
  491. package/src/runtime/vault-sharing-ops.ts +372 -0
  492. package/src/streams/index.ts +1 -1
  493. package/src/streams/replayable-stream.ts +34 -3
  494. package/src/text/similarity.ts +1 -1
  495. package/src/transport/http-server.ts +269 -0
  496. package/src/transport/index.ts +48 -0
  497. package/src/transport/lsp-server.ts +401 -0
  498. package/src/transport/rate-limiter.ts +97 -0
  499. package/src/transport/session-manager.ts +120 -0
  500. package/src/transport/token-auth.ts +96 -0
  501. package/src/transport/types.ts +66 -0
  502. package/src/transport/ws-server.ts +415 -0
  503. package/src/vault/git-vault-sync.ts +318 -0
  504. package/src/vault/knowledge-review.ts +221 -0
  505. package/src/vault/obsidian-sync.ts +346 -0
  506. package/src/vault/scope-detector.ts +219 -0
  507. package/src/vault/vault-branching.ts +264 -0
  508. package/src/vault/vault-manager.ts +237 -0
  509. package/src/vault/vault-types.ts +50 -0
  510. package/src/vault/vault.ts +41 -3
  511. package/src/governance/index.ts +0 -18
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Message Queue — disk-based message passing for zero-cost chat relay.
3
+ *
4
+ * The queue bot writes incoming messages to inbox/. Claude Code (or any
5
+ * processor) reads them, generates responses, and writes to outbox/.
6
+ * The outbox poller sends replies back through the chat transport.
7
+ *
8
+ * Directory structure:
9
+ * ~/.{agentId}/queue/
10
+ * inbox/ ← bot writes, processor reads
11
+ * outbox/ ← processor writes, bot reads and sends
12
+ */
13
+ import { mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, existsSync, } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ // ─── Queue Manager ───────────────────────────────────────────────────
16
+ export class MessageQueue {
17
+ inboxDir;
18
+ outboxDir;
19
+ constructor(config) {
20
+ this.inboxDir = join(config.queueDir, 'inbox');
21
+ this.outboxDir = join(config.queueDir, 'outbox');
22
+ mkdirSync(this.inboxDir, { recursive: true });
23
+ mkdirSync(this.outboxDir, { recursive: true });
24
+ }
25
+ /**
26
+ * Enqueue an incoming message to inbox.
27
+ */
28
+ enqueue(msg) {
29
+ const timestamp = new Date().toISOString();
30
+ const id = `${msg.chatId}-${Date.now()}`;
31
+ const queued = { ...msg, id, timestamp };
32
+ const filename = `${id}.json`;
33
+ writeFileSync(join(this.inboxDir, filename), JSON.stringify(queued, null, 2), 'utf-8');
34
+ return queued;
35
+ }
36
+ /**
37
+ * Read all pending inbox messages, sorted by timestamp.
38
+ */
39
+ readInbox() {
40
+ const files = this.listJsonFiles(this.inboxDir);
41
+ const messages = [];
42
+ for (const file of files) {
43
+ try {
44
+ const raw = readFileSync(join(this.inboxDir, file), 'utf-8');
45
+ messages.push(JSON.parse(raw));
46
+ }
47
+ catch {
48
+ // Skip corrupt files
49
+ }
50
+ }
51
+ return messages.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
52
+ }
53
+ /**
54
+ * Get the number of pending inbox messages.
55
+ */
56
+ inboxCount() {
57
+ return this.listJsonFiles(this.inboxDir).length;
58
+ }
59
+ /**
60
+ * Remove a message from inbox (after processing).
61
+ */
62
+ removeFromInbox(messageId) {
63
+ const filename = `${messageId}.json`;
64
+ const filepath = join(this.inboxDir, filename);
65
+ if (!existsSync(filepath))
66
+ return false;
67
+ try {
68
+ unlinkSync(filepath);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Write a response to outbox.
77
+ */
78
+ sendResponse(messageId, chatId, text) {
79
+ const response = {
80
+ messageId,
81
+ chatId,
82
+ text,
83
+ timestamp: new Date().toISOString(),
84
+ };
85
+ const filename = `${chatId}-${Date.now()}.json`;
86
+ writeFileSync(join(this.outboxDir, filename), JSON.stringify(response, null, 2), 'utf-8');
87
+ // Remove from inbox
88
+ this.removeFromInbox(messageId);
89
+ return response;
90
+ }
91
+ /**
92
+ * Read and remove all pending outbox responses.
93
+ */
94
+ drainOutbox() {
95
+ const files = this.listJsonFiles(this.outboxDir);
96
+ const responses = [];
97
+ for (const file of files) {
98
+ const filepath = join(this.outboxDir, file);
99
+ try {
100
+ const raw = readFileSync(filepath, 'utf-8');
101
+ responses.push(JSON.parse(raw));
102
+ unlinkSync(filepath);
103
+ }
104
+ catch {
105
+ // Skip corrupt files
106
+ }
107
+ }
108
+ return responses.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
109
+ }
110
+ /**
111
+ * Get outbox count.
112
+ */
113
+ outboxCount() {
114
+ return this.listJsonFiles(this.outboxDir).length;
115
+ }
116
+ /**
117
+ * Format inbox as readable text (for MCP tool output).
118
+ */
119
+ formatInbox() {
120
+ const messages = this.readInbox();
121
+ if (messages.length === 0)
122
+ return 'No pending messages.';
123
+ return messages
124
+ .map((m) => {
125
+ const age = Math.round((Date.now() - new Date(m.timestamp).getTime()) / 1000);
126
+ const content = m.type === 'text'
127
+ ? m.text
128
+ : m.type === 'voice'
129
+ ? `[Voice: ${m.voice?.duration}s]`
130
+ : `[Photo: ${m.photo?.caption ?? 'no caption'}]`;
131
+ return `[${m.id}] ${m.username ?? m.userId} (${age}s ago): ${content}`;
132
+ })
133
+ .join('\n');
134
+ }
135
+ listJsonFiles(dir) {
136
+ try {
137
+ return readdirSync(dir)
138
+ .filter((f) => f.endsWith('.json'))
139
+ .sort();
140
+ }
141
+ catch {
142
+ return [];
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/chat/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Response Chunker — splits long agent responses for chat platforms.
3
+ *
4
+ * Two capabilities:
5
+ * 1. Markdown → HTML conversion (for Telegram-style HTML parse mode)
6
+ * 2. Smart chunking at natural boundaries (paragraphs, sentences, words)
7
+ *
8
+ * Ported from Salvador's response-chunker.ts with improvements:
9
+ * - Cleaner code block protection (no sentinel characters)
10
+ * - Supports multiple output formats (HTML, Markdown passthrough, plain)
11
+ * - Better heading handling
12
+ */
13
+ import type { ChunkConfig, MarkupFormat } from './types.js';
14
+ /**
15
+ * Convert Markdown to the target format and split into chunks.
16
+ */
17
+ export declare function chunkResponse(text: string, config?: ChunkConfig): string[];
18
+ /**
19
+ * Convert Markdown to the target markup format.
20
+ */
21
+ export declare function convertMarkup(text: string, format: MarkupFormat): string;
22
+ /**
23
+ * Convert Markdown to Telegram-compatible HTML.
24
+ *
25
+ * Handles: headings, bold, italic, strikethrough, code, links,
26
+ * blockquotes, lists, and fenced code blocks.
27
+ */
28
+ export declare function markdownToHtml(text: string): string;
29
+ //# sourceMappingURL=response-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-chunker.d.ts","sourceRoot":"","sources":["../../src/chat/response-chunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM5D;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,CAS1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAUxE;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6CnD"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Response Chunker — splits long agent responses for chat platforms.
3
+ *
4
+ * Two capabilities:
5
+ * 1. Markdown → HTML conversion (for Telegram-style HTML parse mode)
6
+ * 2. Smart chunking at natural boundaries (paragraphs, sentences, words)
7
+ *
8
+ * Ported from Salvador's response-chunker.ts with improvements:
9
+ * - Cleaner code block protection (no sentinel characters)
10
+ * - Supports multiple output formats (HTML, Markdown passthrough, plain)
11
+ * - Better heading handling
12
+ */
13
+ const DEFAULT_MAX_CHUNK_SIZE = 4000;
14
+ // ─── Public API ──────────────────────────────────────────────────────
15
+ /**
16
+ * Convert Markdown to the target format and split into chunks.
17
+ */
18
+ export function chunkResponse(text, config) {
19
+ const maxSize = config?.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;
20
+ const format = config?.format ?? 'html';
21
+ const converted = convertMarkup(text, format);
22
+ if (converted.length <= maxSize)
23
+ return [converted];
24
+ return splitAtBoundaries(converted, maxSize);
25
+ }
26
+ /**
27
+ * Convert Markdown to the target markup format.
28
+ */
29
+ export function convertMarkup(text, format) {
30
+ switch (format) {
31
+ case 'html':
32
+ return markdownToHtml(text);
33
+ case 'plain':
34
+ return markdownToPlain(text);
35
+ case 'markdown':
36
+ default:
37
+ return text;
38
+ }
39
+ }
40
+ // ─── Markdown → HTML ────────────────────────────────────────────────
41
+ /**
42
+ * Convert Markdown to Telegram-compatible HTML.
43
+ *
44
+ * Handles: headings, bold, italic, strikethrough, code, links,
45
+ * blockquotes, lists, and fenced code blocks.
46
+ */
47
+ export function markdownToHtml(text) {
48
+ // Protect fenced code blocks first
49
+ const codeBlocks = [];
50
+ let processed = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => {
51
+ const escaped = escapeHtml(code.trimEnd());
52
+ const langAttr = lang ? ` class="language-${escapeHtml(lang)}"` : '';
53
+ codeBlocks.push(`<pre><code${langAttr}>${escaped}</code></pre>`);
54
+ return `<<CODEBLOCK_${codeBlocks.length - 1}>>`;
55
+ });
56
+ // Inline code
57
+ processed = processed.replace(/`([^`]+)`/g, (_m, code) => `<code>${escapeHtml(code)}</code>`);
58
+ // Headings → bold
59
+ processed = processed.replace(/^#{1,6}\s+(.+)$/gm, '<b>$1</b>');
60
+ // Bold + italic
61
+ processed = processed.replace(/\*\*\*(.+?)\*\*\*/g, '<b><i>$1</i></b>');
62
+ // Bold
63
+ processed = processed.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>');
64
+ // Italic
65
+ processed = processed.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g, '<i>$1</i>');
66
+ // Strikethrough
67
+ processed = processed.replace(/~~(.+?)~~/g, '<s>$1</s>');
68
+ // Links
69
+ processed = processed.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
70
+ // Blockquotes
71
+ processed = processed.replace(/^>\s?(.*)$/gm, '<blockquote>$1</blockquote>');
72
+ // Merge consecutive blockquotes
73
+ processed = processed.replace(/<\/blockquote>\n<blockquote>/g, '\n');
74
+ // Unordered lists
75
+ processed = processed.replace(/^[-*]\s+(.+)$/gm, '• $1');
76
+ // Ordered lists
77
+ processed = processed.replace(/^\d+\.\s+(.+)$/gm, '• $1');
78
+ // Horizontal rules
79
+ processed = processed.replace(/^---+$/gm, '─'.repeat(20));
80
+ // Restore code blocks
81
+ processed = processed.replace(/<<CODEBLOCK_(\d+)>>/g, (_m, i) => codeBlocks[Number(i)]);
82
+ return processed.trim();
83
+ }
84
+ // ─── Markdown → Plain ───────────────────────────────────────────────
85
+ function markdownToPlain(text) {
86
+ let plain = text;
87
+ // Remove fenced code block markers (keep content)
88
+ plain = plain.replace(/```\w*\n?/g, '');
89
+ // Remove inline formatting
90
+ plain = plain.replace(/\*\*\*(.+?)\*\*\*/g, '$1');
91
+ plain = plain.replace(/\*\*(.+?)\*\*/g, '$1');
92
+ plain = plain.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g, '$1');
93
+ plain = plain.replace(/~~(.+?)~~/g, '$1');
94
+ plain = plain.replace(/`([^`]+)`/g, '$1');
95
+ // Headings → plain text
96
+ plain = plain.replace(/^#{1,6}\s+/gm, '');
97
+ // Links → text (URL)
98
+ plain = plain.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)');
99
+ // Blockquotes
100
+ plain = plain.replace(/^>\s?/gm, '');
101
+ // Lists
102
+ plain = plain.replace(/^[-*]\s+/gm, '• ');
103
+ return plain.trim();
104
+ }
105
+ // ─── Chunking ───────────────────────────────────────────────────────
106
+ function splitAtBoundaries(text, maxSize) {
107
+ const chunks = [];
108
+ let remaining = text;
109
+ while (remaining.length > maxSize) {
110
+ const cutPoint = findCutPoint(remaining, maxSize);
111
+ chunks.push(remaining.slice(0, cutPoint).trimEnd());
112
+ remaining = remaining.slice(cutPoint).trimStart();
113
+ }
114
+ if (remaining.length > 0) {
115
+ chunks.push(remaining.trimEnd());
116
+ }
117
+ return chunks;
118
+ }
119
+ /**
120
+ * Find the best cut point, prioritizing natural boundaries:
121
+ * 1. Paragraph break (double newline)
122
+ * 2. Line break
123
+ * 3. Sentence boundary (. ! ?)
124
+ * 4. Word boundary (space)
125
+ * 5. Hard cut at maxSize
126
+ */
127
+ function findCutPoint(text, maxSize) {
128
+ const window = text.slice(0, maxSize);
129
+ // Try paragraph break (must be at least 30% into the chunk to be useful)
130
+ const minUseful = Math.floor(maxSize * 0.3);
131
+ const paragraphBreak = window.lastIndexOf('\n\n');
132
+ if (paragraphBreak >= minUseful)
133
+ return paragraphBreak + 2;
134
+ // Try line break
135
+ const lineBreak = window.lastIndexOf('\n');
136
+ if (lineBreak >= minUseful)
137
+ return lineBreak + 1;
138
+ // Try sentence boundary
139
+ const sentenceEnd = findLastSentenceEnd(window, minUseful);
140
+ if (sentenceEnd > 0)
141
+ return sentenceEnd;
142
+ // Try word boundary
143
+ const spaceBreak = window.lastIndexOf(' ');
144
+ if (spaceBreak >= minUseful)
145
+ return spaceBreak + 1;
146
+ // Hard cut
147
+ return maxSize;
148
+ }
149
+ function findLastSentenceEnd(text, minPos) {
150
+ // Look for ". " or "! " or "? " from the end
151
+ for (let i = text.length - 1; i >= minPos; i--) {
152
+ const ch = text[i];
153
+ if ((ch === '.' || ch === '!' || ch === '?') && i + 1 < text.length && text[i + 1] === ' ') {
154
+ return i + 2;
155
+ }
156
+ }
157
+ return -1;
158
+ }
159
+ // ─── Helpers ────────────────────────────────────────────────────────
160
+ function escapeHtml(text) {
161
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
162
+ }
163
+ //# sourceMappingURL=response-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-chunker.js","sourceRoot":"","sources":["../../src/chat/response-chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
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
+ /** Exit code that tells the supervisor to rebuild before restart. */
11
+ export declare const RESTART_EXIT_CODE = 75;
12
+ export interface RestartContext {
13
+ /** Why the restart was requested. */
14
+ reason: 'self-update' | 'rebuild' | 'manual';
15
+ /** Chat ID to send confirmation to after restart. */
16
+ chatId: string;
17
+ /** Git commit SHA that triggered the update (if applicable). */
18
+ commitSha?: string;
19
+ /** Unix timestamp ms when restart was requested. */
20
+ requestedAt: number;
21
+ }
22
+ export interface RestartResult {
23
+ /** Whether the restart was initiated. */
24
+ initiated: boolean;
25
+ /** The saved context. */
26
+ context?: RestartContext;
27
+ /** Error message if failed. */
28
+ error?: string;
29
+ }
30
+ export declare class SelfUpdateManager {
31
+ private readonly contextPath;
32
+ constructor(contextPath: string);
33
+ /**
34
+ * Save restart context and exit with code 75.
35
+ * The supervisor handles rebuild + restart.
36
+ * Returns the context (useful for testing — in production, process.exit fires).
37
+ */
38
+ requestRestart(chatId: string, reason?: RestartContext['reason'], commitSha?: string): RestartResult;
39
+ /**
40
+ * Save restart context to disk.
41
+ */
42
+ saveContext(context: RestartContext): void;
43
+ /**
44
+ * Load restart context from disk (if any).
45
+ * Returns null if no pending restart context exists.
46
+ */
47
+ loadContext(): RestartContext | null;
48
+ /**
49
+ * Clear restart context (call after successful startup confirmation).
50
+ */
51
+ clearContext(): void;
52
+ /**
53
+ * Check if there's a pending restart context.
54
+ */
55
+ hasPendingRestart(): boolean;
56
+ /**
57
+ * Sanitize a commit message for safe shell usage.
58
+ * Allows alphanumeric, spaces, basic punctuation. Max 120 chars.
59
+ */
60
+ static sanitizeCommitMessage(msg: string): string;
61
+ }
62
+ //# sourceMappingURL=self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/chat/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7C,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEhD;;;;OAIG;IACH,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,cAAc,CAAC,QAAQ,CAAY,EAC3C,SAAS,CAAC,EAAE,MAAM,GACjB,aAAa;IAmBhB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAK1C;;;OAGG;IACH,WAAW,IAAI,cAAc,GAAG,IAAI;IASpC;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAMlD"}
@@ -0,0 +1,90 @@
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
+ import { readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
11
+ import { dirname } from 'node:path';
12
+ /** Exit code that tells the supervisor to rebuild before restart. */
13
+ export const RESTART_EXIT_CODE = 75;
14
+ export class SelfUpdateManager {
15
+ contextPath;
16
+ constructor(contextPath) {
17
+ this.contextPath = contextPath;
18
+ }
19
+ /**
20
+ * Save restart context and exit with code 75.
21
+ * The supervisor handles rebuild + restart.
22
+ * Returns the context (useful for testing — in production, process.exit fires).
23
+ */
24
+ requestRestart(chatId, reason = 'manual', commitSha) {
25
+ const context = {
26
+ reason,
27
+ chatId,
28
+ commitSha,
29
+ requestedAt: Date.now(),
30
+ };
31
+ try {
32
+ this.saveContext(context);
33
+ return { initiated: true, context };
34
+ }
35
+ catch (e) {
36
+ return {
37
+ initiated: false,
38
+ error: e instanceof Error ? e.message : String(e),
39
+ };
40
+ }
41
+ }
42
+ /**
43
+ * Save restart context to disk.
44
+ */
45
+ saveContext(context) {
46
+ mkdirSync(dirname(this.contextPath), { recursive: true });
47
+ writeFileSync(this.contextPath, JSON.stringify(context, null, 2), 'utf-8');
48
+ }
49
+ /**
50
+ * Load restart context from disk (if any).
51
+ * Returns null if no pending restart context exists.
52
+ */
53
+ loadContext() {
54
+ try {
55
+ const raw = readFileSync(this.contextPath, 'utf-8');
56
+ return JSON.parse(raw);
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Clear restart context (call after successful startup confirmation).
64
+ */
65
+ clearContext() {
66
+ try {
67
+ unlinkSync(this.contextPath);
68
+ }
69
+ catch {
70
+ // File doesn't exist — that's fine
71
+ }
72
+ }
73
+ /**
74
+ * Check if there's a pending restart context.
75
+ */
76
+ hasPendingRestart() {
77
+ return this.loadContext() !== null;
78
+ }
79
+ /**
80
+ * Sanitize a commit message for safe shell usage.
81
+ * Allows alphanumeric, spaces, basic punctuation. Max 120 chars.
82
+ */
83
+ static sanitizeCommitMessage(msg) {
84
+ return msg
85
+ .replace(/[^\w\s.,!?:;()\-/'"#@]/g, '')
86
+ .trim()
87
+ .slice(0, 120);
88
+ }
89
+ }
90
+ //# sourceMappingURL=self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/chat/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAsBpC,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD;;;;OAIG;IACH,cAAc,CACZ,MAAc,EACd,SAAmC,QAAQ,EAC3C,SAAkB;QAElB,MAAM,OAAO,GAAmB;YAC9B,MAAM;YACN,MAAM;YACN,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAuB;QACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAW;QACtC,OAAO,GAAG;aACP,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;aACtC,IAAI,EAAE;aACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,105 @@
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
+ export type ChatRole = 'user' | 'assistant' | 'system' | 'tool';
8
+ export interface ChatMessage {
9
+ role: ChatRole;
10
+ content: string;
11
+ /** Optional structured content blocks (e.g. tool_use, tool_result, image). */
12
+ blocks?: unknown[];
13
+ /** Unix timestamp ms. */
14
+ timestamp: number;
15
+ /** Transport-specific metadata (message ID, chat ID, etc.). */
16
+ meta?: Record<string, unknown>;
17
+ }
18
+ export interface ChatSession {
19
+ /** Unique session ID (typically the chat/channel ID from the transport). */
20
+ id: string;
21
+ /** Conversation messages. */
22
+ messages: ChatMessage[];
23
+ /** Unix timestamp ms when the session was created. */
24
+ createdAt: number;
25
+ /** Unix timestamp ms of the last activity. */
26
+ lastActiveAt: number;
27
+ /** Custom metadata (personality state, counters, etc.). */
28
+ meta?: Record<string, unknown>;
29
+ }
30
+ export interface ChatSessionConfig {
31
+ /** Directory for session persistence. */
32
+ storageDir: string;
33
+ /** TTL in ms for inactivity expiry. Default: 7_200_000 (2 hours). */
34
+ ttlMs?: number;
35
+ /** Max messages before compaction triggers. Default: 100. */
36
+ compactionThreshold?: number;
37
+ /** Messages to keep after compaction. Default: 40. */
38
+ compactionKeep?: number;
39
+ }
40
+ export interface Fragment {
41
+ /** The message text. */
42
+ text: string;
43
+ /** Transport message ID (for ordering). */
44
+ messageId: number | string;
45
+ /** Unix timestamp ms when received. */
46
+ receivedAt: number;
47
+ }
48
+ export interface FragmentBufferConfig {
49
+ /** Character threshold to start buffering. Default: 4000. */
50
+ startThreshold?: number;
51
+ /** Max gap in ms between fragments before auto-flush. Default: 1500. */
52
+ maxGapMs?: number;
53
+ /** Maximum number of fragments to merge. Default: 12. */
54
+ maxParts?: number;
55
+ /** Maximum total bytes before force-flush. Default: 50_000. */
56
+ maxTotalBytes?: number;
57
+ }
58
+ export type MarkupFormat = 'html' | 'markdown' | 'plain';
59
+ export interface ChunkConfig {
60
+ /** Max characters per chunk. Default: 4000. */
61
+ maxChunkSize?: number;
62
+ /** Output markup format. Default: 'html'. */
63
+ format?: MarkupFormat;
64
+ }
65
+ export interface ChatAuthConfig {
66
+ /** Path to auth persistence file. */
67
+ storagePath: string;
68
+ /** Passphrase required for authentication. If unset, auth is disabled. */
69
+ passphrase?: string;
70
+ /** Allowed user IDs. If empty or unset, any authenticated user is allowed. */
71
+ allowedUsers?: (string | number)[];
72
+ /** Rate limit: max failed attempts before temporary lockout. Default: 5. */
73
+ maxFailedAttempts?: number;
74
+ /** Lockout duration in ms. Default: 300_000 (5 minutes). */
75
+ lockoutMs?: number;
76
+ }
77
+ export interface AuthRecord {
78
+ userId: string | number;
79
+ authenticatedAt: number;
80
+ }
81
+ export interface AuthState {
82
+ authenticated: AuthRecord[];
83
+ failedAttempts: Map<string, {
84
+ count: number;
85
+ lastAttempt: number;
86
+ }>;
87
+ }
88
+ export interface ChatManagerConfig {
89
+ session: ChatSessionConfig;
90
+ fragment?: FragmentBufferConfig;
91
+ chunk?: ChunkConfig;
92
+ auth?: ChatAuthConfig;
93
+ }
94
+ export interface ChatManagerStatus {
95
+ activeSessions: number;
96
+ authenticatedUsers: number;
97
+ pendingFragments: number;
98
+ config: {
99
+ ttlMs: number;
100
+ compactionThreshold: number;
101
+ maxChunkSize: number;
102
+ authEnabled: boolean;
103
+ };
104
+ }
105
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAID,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,MAAM,WAAW,QAAQ;IACvB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAID,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACnC,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;CACH"}
@@ -0,0 +1,8 @@
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
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}