@cleocode/core 2026.6.13 → 2026.6.15

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 (485) hide show
  1. package/dist/admin/ops.d.ts +4 -0
  2. package/dist/admin/ops.d.ts.map +1 -1
  3. package/dist/check/index.d.ts +12 -0
  4. package/dist/check/index.d.ts.map +1 -0
  5. package/dist/check/index.js +12 -0
  6. package/dist/check/index.js.map +1 -0
  7. package/dist/check/pr-gate.d.ts +183 -0
  8. package/dist/check/pr-gate.d.ts.map +1 -0
  9. package/dist/check/pr-gate.js +348 -0
  10. package/dist/check/pr-gate.js.map +1 -0
  11. package/dist/conduit/delivery-router.d.ts +134 -0
  12. package/dist/conduit/delivery-router.d.ts.map +1 -0
  13. package/dist/conduit/delivery-router.js +0 -0
  14. package/dist/conduit/delivery-router.js.map +1 -0
  15. package/dist/conduit/index.d.ts +5 -2
  16. package/dist/conduit/index.d.ts.map +1 -1
  17. package/dist/conduit/index.js +5 -2
  18. package/dist/conduit/index.js.map +1 -1
  19. package/dist/conduit/local-tui-adapter.d.ts +89 -0
  20. package/dist/conduit/local-tui-adapter.d.ts.map +1 -0
  21. package/dist/conduit/local-tui-adapter.js +225 -0
  22. package/dist/conduit/local-tui-adapter.js.map +1 -0
  23. package/dist/config/config-repair.d.ts +70 -0
  24. package/dist/config/config-repair.d.ts.map +1 -0
  25. package/dist/config/config-repair.js +248 -0
  26. package/dist/config/config-repair.js.map +1 -0
  27. package/dist/config/registry.d.ts +54 -0
  28. package/dist/config/registry.d.ts.map +1 -1
  29. package/dist/config/registry.js +92 -0
  30. package/dist/config/registry.js.map +1 -1
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +11 -10
  33. package/dist/config.js.map +1 -1
  34. package/dist/deriver/queue-manager.d.ts +30 -2
  35. package/dist/deriver/queue-manager.d.ts.map +1 -1
  36. package/dist/deriver/queue-manager.js +54 -9
  37. package/dist/deriver/queue-manager.js.map +1 -1
  38. package/dist/dispatch/config-domain-handler.d.ts +125 -0
  39. package/dist/dispatch/config-domain-handler.d.ts.map +1 -0
  40. package/dist/dispatch/config-domain-handler.js +160 -0
  41. package/dist/dispatch/config-domain-handler.js.map +1 -0
  42. package/dist/dispatch/contracts/input-contracts.d.ts.map +1 -1
  43. package/dist/dispatch/contracts/input-contracts.js +19 -1
  44. package/dist/dispatch/contracts/input-contracts.js.map +1 -1
  45. package/dist/docs/export-document.js +3721 -696
  46. package/dist/docs/export-document.js.map +3 -3
  47. package/dist/gateway-client/client.d.ts +123 -0
  48. package/dist/gateway-client/client.d.ts.map +1 -0
  49. package/dist/gateway-client/client.js +93 -0
  50. package/dist/gateway-client/client.js.map +1 -0
  51. package/dist/gateway-client/generated/client/client.gen.d.ts +3 -0
  52. package/dist/gateway-client/generated/client/client.gen.d.ts.map +1 -0
  53. package/dist/gateway-client/generated/client/client.gen.js +217 -0
  54. package/dist/gateway-client/generated/client/client.gen.js.map +1 -0
  55. package/dist/gateway-client/generated/client/index.d.ts +11 -0
  56. package/dist/gateway-client/generated/client/index.d.ts.map +1 -0
  57. package/dist/gateway-client/generated/client/index.js +7 -0
  58. package/dist/gateway-client/generated/client/index.js.map +1 -0
  59. package/dist/gateway-client/generated/client/types.gen.d.ts +121 -0
  60. package/dist/gateway-client/generated/client/types.gen.d.ts.map +1 -0
  61. package/dist/gateway-client/generated/client/types.gen.js +3 -0
  62. package/dist/gateway-client/generated/client/types.gen.js.map +1 -0
  63. package/dist/gateway-client/generated/client/utils.gen.d.ts +38 -0
  64. package/dist/gateway-client/generated/client/utils.gen.d.ts.map +1 -0
  65. package/dist/gateway-client/generated/client/utils.gen.js +229 -0
  66. package/dist/gateway-client/generated/client/utils.gen.js.map +1 -0
  67. package/dist/gateway-client/generated/client.gen.d.ts +13 -0
  68. package/dist/gateway-client/generated/client.gen.d.ts.map +1 -0
  69. package/dist/gateway-client/generated/client.gen.js +4 -0
  70. package/dist/gateway-client/generated/client.gen.js.map +1 -0
  71. package/dist/gateway-client/generated/core/auth.gen.d.ts +26 -0
  72. package/dist/gateway-client/generated/core/auth.gen.d.ts.map +1 -0
  73. package/dist/gateway-client/generated/core/auth.gen.js +15 -0
  74. package/dist/gateway-client/generated/core/auth.gen.js.map +1 -0
  75. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts +26 -0
  76. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts.map +1 -0
  77. package/dist/gateway-client/generated/core/bodySerializer.gen.js +58 -0
  78. package/dist/gateway-client/generated/core/bodySerializer.gen.js.map +1 -0
  79. package/dist/gateway-client/generated/core/params.gen.d.ts +44 -0
  80. package/dist/gateway-client/generated/core/params.gen.d.ts.map +1 -0
  81. package/dist/gateway-client/generated/core/params.gen.js +101 -0
  82. package/dist/gateway-client/generated/core/params.gen.js.map +1 -0
  83. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts +34 -0
  84. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts.map +1 -0
  85. package/dist/gateway-client/generated/core/pathSerializer.gen.js +107 -0
  86. package/dist/gateway-client/generated/core/pathSerializer.gen.js.map +1 -0
  87. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts +19 -0
  88. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  89. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js +93 -0
  90. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js.map +1 -0
  91. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts +72 -0
  92. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  93. package/dist/gateway-client/generated/core/serverSentEvents.gen.js +133 -0
  94. package/dist/gateway-client/generated/core/serverSentEvents.gen.js.map +1 -0
  95. package/dist/gateway-client/generated/core/types.gen.d.ts +84 -0
  96. package/dist/gateway-client/generated/core/types.gen.d.ts.map +1 -0
  97. package/dist/gateway-client/generated/core/types.gen.js +3 -0
  98. package/dist/gateway-client/generated/core/types.gen.js.map +1 -0
  99. package/dist/gateway-client/generated/core/utils.gen.d.ts +20 -0
  100. package/dist/gateway-client/generated/core/utils.gen.d.ts.map +1 -0
  101. package/dist/gateway-client/generated/core/utils.gen.js +88 -0
  102. package/dist/gateway-client/generated/core/utils.gen.js.map +1 -0
  103. package/dist/gateway-client/generated/index.d.ts +3 -0
  104. package/dist/gateway-client/generated/index.d.ts.map +1 -0
  105. package/dist/gateway-client/generated/index.js +3 -0
  106. package/dist/gateway-client/generated/index.js.map +1 -0
  107. package/dist/gateway-client/generated/namespaces.gen.d.ts +512 -0
  108. package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -0
  109. package/dist/gateway-client/generated/namespaces.gen.js +521 -0
  110. package/dist/gateway-client/generated/namespaces.gen.js.map +1 -0
  111. package/dist/gateway-client/generated/sdk.gen.d.ts +1780 -0
  112. package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -0
  113. package/dist/gateway-client/generated/sdk.gen.js +3811 -0
  114. package/dist/gateway-client/generated/sdk.gen.js.map +1 -0
  115. package/dist/gateway-client/generated/types.gen.d.ts +14681 -0
  116. package/dist/gateway-client/generated/types.gen.d.ts.map +1 -0
  117. package/dist/gateway-client/generated/types.gen.js +3 -0
  118. package/dist/gateway-client/generated/types.gen.js.map +1 -0
  119. package/dist/gateway-client/index.d.ts +27 -0
  120. package/dist/gateway-client/index.d.ts.map +1 -0
  121. package/dist/gateway-client/index.js +25 -0
  122. package/dist/gateway-client/index.js.map +1 -0
  123. package/dist/gc/cleanup.d.ts +23 -8
  124. package/dist/gc/cleanup.d.ts.map +1 -1
  125. package/dist/gc/cleanup.js +287 -22
  126. package/dist/gc/cleanup.js.map +1 -1
  127. package/dist/index.d.ts +10 -0
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +20 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/init.d.ts.map +1 -1
  132. package/dist/init.js +28 -0
  133. package/dist/init.js.map +1 -1
  134. package/dist/internal.d.ts +10 -1
  135. package/dist/internal.d.ts.map +1 -1
  136. package/dist/internal.js +18 -1
  137. package/dist/internal.js.map +1 -1
  138. package/dist/llm/catalog-model-resolver.d.ts +19 -0
  139. package/dist/llm/catalog-model-resolver.d.ts.map +1 -1
  140. package/dist/llm/catalog-model-resolver.js +36 -0
  141. package/dist/llm/catalog-model-resolver.js.map +1 -1
  142. package/dist/llm/catalog-resolver.d.ts +112 -0
  143. package/dist/llm/catalog-resolver.d.ts.map +1 -0
  144. package/dist/llm/catalog-resolver.js +207 -0
  145. package/dist/llm/catalog-resolver.js.map +1 -0
  146. package/dist/llm/catalog-seeder.d.ts +96 -0
  147. package/dist/llm/catalog-seeder.d.ts.map +1 -0
  148. package/dist/llm/catalog-seeder.js +189 -0
  149. package/dist/llm/catalog-seeder.js.map +1 -0
  150. package/dist/llm/cli-ops.d.ts +16 -0
  151. package/dist/llm/cli-ops.d.ts.map +1 -1
  152. package/dist/llm/cli-ops.js +37 -10
  153. package/dist/llm/cli-ops.js.map +1 -1
  154. package/dist/llm/complexity-classifier.d.ts +208 -0
  155. package/dist/llm/complexity-classifier.d.ts.map +1 -0
  156. package/dist/llm/complexity-classifier.js +359 -0
  157. package/dist/llm/complexity-classifier.js.map +1 -0
  158. package/dist/llm/credential-pool.d.ts +2 -0
  159. package/dist/llm/credential-pool.d.ts.map +1 -1
  160. package/dist/llm/credential-pool.js +5 -2
  161. package/dist/llm/credential-pool.js.map +1 -1
  162. package/dist/llm/credentials-store.d.ts +10 -14
  163. package/dist/llm/credentials-store.d.ts.map +1 -1
  164. package/dist/llm/credentials-store.js.map +1 -1
  165. package/dist/llm/cross-provider-selector.d.ts +249 -0
  166. package/dist/llm/cross-provider-selector.d.ts.map +1 -0
  167. package/dist/llm/cross-provider-selector.js +572 -0
  168. package/dist/llm/cross-provider-selector.js.map +1 -0
  169. package/dist/llm/entity-ops.d.ts +299 -0
  170. package/dist/llm/entity-ops.d.ts.map +1 -0
  171. package/dist/llm/entity-ops.js +441 -0
  172. package/dist/llm/entity-ops.js.map +1 -0
  173. package/dist/llm/index.d.ts +17 -0
  174. package/dist/llm/index.d.ts.map +1 -1
  175. package/dist/llm/index.js +9 -0
  176. package/dist/llm/index.js.map +1 -1
  177. package/dist/llm/llm-queue-admit.d.ts +118 -0
  178. package/dist/llm/llm-queue-admit.d.ts.map +1 -0
  179. package/dist/llm/llm-queue-admit.js +275 -0
  180. package/dist/llm/llm-queue-admit.js.map +1 -0
  181. package/dist/llm/local-model-fit.d.ts +260 -0
  182. package/dist/llm/local-model-fit.d.ts.map +1 -0
  183. package/dist/llm/local-model-fit.js +563 -0
  184. package/dist/llm/local-model-fit.js.map +1 -0
  185. package/dist/llm/oauth/device-code.d.ts.map +1 -1
  186. package/dist/llm/oauth/device-code.js +2 -8
  187. package/dist/llm/oauth/device-code.js.map +1 -1
  188. package/dist/llm/oauth/google-pkce.d.ts.map +1 -1
  189. package/dist/llm/oauth/google-pkce.js +2 -18
  190. package/dist/llm/oauth/google-pkce.js.map +1 -1
  191. package/dist/llm/oauth/pkce.d.ts +70 -0
  192. package/dist/llm/oauth/pkce.d.ts.map +1 -1
  193. package/dist/llm/oauth/pkce.js +106 -29
  194. package/dist/llm/oauth/pkce.js.map +1 -1
  195. package/dist/llm/onboarding/front-door.d.ts +146 -0
  196. package/dist/llm/onboarding/front-door.d.ts.map +1 -0
  197. package/dist/llm/onboarding/front-door.js +153 -0
  198. package/dist/llm/onboarding/front-door.js.map +1 -0
  199. package/dist/llm/onboarding/login-engine.d.ts +175 -0
  200. package/dist/llm/onboarding/login-engine.d.ts.map +1 -0
  201. package/dist/llm/onboarding/login-engine.js +286 -0
  202. package/dist/llm/onboarding/login-engine.js.map +1 -0
  203. package/dist/llm/pi/pi-gondolin-env.d.ts +23 -0
  204. package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -1
  205. package/dist/llm/pi/pi-gondolin-env.js +2 -2
  206. package/dist/llm/pi/pi-gondolin-env.js.map +1 -1
  207. package/dist/llm/plugin-facade.js +4612 -1042
  208. package/dist/llm/plugin-facade.js.map +3 -3
  209. package/dist/llm/provider-registry/builtin/anthropic.d.ts.map +1 -1
  210. package/dist/llm/provider-registry/builtin/anthropic.js +23 -10
  211. package/dist/llm/provider-registry/builtin/anthropic.js.map +1 -1
  212. package/dist/llm/provider-registry/builtin/ollama.d.ts +18 -0
  213. package/dist/llm/provider-registry/builtin/ollama.d.ts.map +1 -1
  214. package/dist/llm/provider-registry/builtin/ollama.js +20 -2
  215. package/dist/llm/provider-registry/builtin/ollama.js.map +1 -1
  216. package/dist/llm/provider-registry/provider-alias.d.ts +62 -0
  217. package/dist/llm/provider-registry/provider-alias.d.ts.map +1 -0
  218. package/dist/llm/provider-registry/provider-alias.js +85 -0
  219. package/dist/llm/provider-registry/provider-alias.js.map +1 -0
  220. package/dist/llm/provider-registry/provider-defs.d.ts +45 -0
  221. package/dist/llm/provider-registry/provider-defs.d.ts.map +1 -0
  222. package/dist/llm/provider-registry/provider-defs.js +145 -0
  223. package/dist/llm/provider-registry/provider-defs.js.map +1 -0
  224. package/dist/llm/provider-registry/provider-seed.d.ts +78 -0
  225. package/dist/llm/provider-registry/provider-seed.d.ts.map +1 -0
  226. package/dist/llm/provider-registry/provider-seed.js +113 -0
  227. package/dist/llm/provider-registry/provider-seed.js.map +1 -0
  228. package/dist/llm/role-executor.d.ts.map +1 -1
  229. package/dist/llm/role-executor.js +36 -0
  230. package/dist/llm/role-executor.js.map +1 -1
  231. package/dist/llm/role-resolver.d.ts.map +1 -1
  232. package/dist/llm/role-resolver.js +52 -10
  233. package/dist/llm/role-resolver.js.map +1 -1
  234. package/dist/llm/system-resolver.d.ts.map +1 -1
  235. package/dist/llm/system-resolver.js +73 -22
  236. package/dist/llm/system-resolver.js.map +1 -1
  237. package/dist/llm/transports/codex-responses.d.ts +111 -88
  238. package/dist/llm/transports/codex-responses.d.ts.map +1 -1
  239. package/dist/llm/transports/codex-responses.js +456 -258
  240. package/dist/llm/transports/codex-responses.js.map +1 -1
  241. package/dist/memory/learnings.d.ts +4 -0
  242. package/dist/memory/learnings.d.ts.map +1 -1
  243. package/dist/memory/patterns.d.ts +4 -0
  244. package/dist/memory/patterns.d.ts.map +1 -1
  245. package/dist/metrics/index.d.ts +2 -0
  246. package/dist/metrics/index.d.ts.map +1 -1
  247. package/dist/metrics/index.js +1 -0
  248. package/dist/metrics/index.js.map +1 -1
  249. package/dist/orchestration/spawn.d.ts +89 -0
  250. package/dist/orchestration/spawn.d.ts.map +1 -1
  251. package/dist/orchestration/spawn.js +68 -0
  252. package/dist/orchestration/spawn.js.map +1 -1
  253. package/dist/playbooks/cantbook-profile.d.ts +96 -0
  254. package/dist/playbooks/cantbook-profile.d.ts.map +1 -0
  255. package/dist/playbooks/cantbook-profile.js +97 -0
  256. package/dist/playbooks/cantbook-profile.js.map +1 -0
  257. package/dist/playbooks/guarded-deterministic-runner.d.ts +153 -0
  258. package/dist/playbooks/guarded-deterministic-runner.d.ts.map +1 -0
  259. package/dist/playbooks/guarded-deterministic-runner.js +155 -0
  260. package/dist/playbooks/guarded-deterministic-runner.js.map +1 -0
  261. package/dist/playbooks/index.d.ts +2 -0
  262. package/dist/playbooks/index.d.ts.map +1 -1
  263. package/dist/playbooks/index.js +10 -0
  264. package/dist/playbooks/index.js.map +1 -1
  265. package/dist/playbooks/pi-runner-wiring.d.ts +75 -0
  266. package/dist/playbooks/pi-runner-wiring.d.ts.map +1 -0
  267. package/dist/playbooks/pi-runner-wiring.js +82 -0
  268. package/dist/playbooks/pi-runner-wiring.js.map +1 -0
  269. package/dist/release/index.d.ts +2 -2
  270. package/dist/release/index.d.ts.map +1 -1
  271. package/dist/release/index.js +1 -1
  272. package/dist/release/index.js.map +1 -1
  273. package/dist/release/reconcile.d.ts +97 -0
  274. package/dist/release/reconcile.d.ts.map +1 -1
  275. package/dist/release/reconcile.js +412 -5
  276. package/dist/release/reconcile.js.map +1 -1
  277. package/dist/resources/backend.d.ts +155 -0
  278. package/dist/resources/backend.d.ts.map +1 -0
  279. package/dist/resources/backend.js +23 -0
  280. package/dist/resources/backend.js.map +1 -0
  281. package/dist/resources/linux-backend.d.ts +167 -0
  282. package/dist/resources/linux-backend.d.ts.map +1 -0
  283. package/dist/resources/linux-backend.js +259 -0
  284. package/dist/resources/linux-backend.js.map +1 -0
  285. package/dist/resources/monitor.d.ts +230 -0
  286. package/dist/resources/monitor.d.ts.map +1 -0
  287. package/dist/resources/monitor.js +255 -0
  288. package/dist/resources/monitor.js.map +1 -0
  289. package/dist/resources/spawn-wrapper.d.ts +265 -0
  290. package/dist/resources/spawn-wrapper.d.ts.map +1 -0
  291. package/dist/resources/spawn-wrapper.js +304 -0
  292. package/dist/resources/spawn-wrapper.js.map +1 -0
  293. package/dist/runtime/openapi/generate-openapi.d.ts +211 -0
  294. package/dist/runtime/openapi/generate-openapi.d.ts.map +1 -0
  295. package/dist/runtime/openapi/generate-openapi.js +300 -0
  296. package/dist/runtime/openapi/generate-openapi.js.map +1 -0
  297. package/dist/runtime/openapi/index.d.ts +16 -0
  298. package/dist/runtime/openapi/index.d.ts.map +1 -0
  299. package/dist/runtime/openapi/index.js +16 -0
  300. package/dist/runtime/openapi/index.js.map +1 -0
  301. package/dist/selfimprove/budget.d.ts +11 -2
  302. package/dist/selfimprove/budget.d.ts.map +1 -1
  303. package/dist/selfimprove/budget.js +11 -2
  304. package/dist/selfimprove/budget.js.map +1 -1
  305. package/dist/selfimprove/fix-gen.d.ts +229 -0
  306. package/dist/selfimprove/fix-gen.d.ts.map +1 -0
  307. package/dist/selfimprove/fix-gen.js +266 -0
  308. package/dist/selfimprove/fix-gen.js.map +1 -0
  309. package/dist/selfimprove/run-loop.d.ts +44 -4
  310. package/dist/selfimprove/run-loop.d.ts.map +1 -1
  311. package/dist/selfimprove/run-loop.js +73 -6
  312. package/dist/selfimprove/run-loop.js.map +1 -1
  313. package/dist/selfimprove/scenarios/dhq-replay-find/golden.json +32 -0
  314. package/dist/selfimprove/scenarios/dhq-replay-find/scenario.json +18 -0
  315. package/dist/sentient/cross-project-hygiene.d.ts +11 -2
  316. package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
  317. package/dist/sentient/cross-project-hygiene.js +73 -10
  318. package/dist/sentient/cross-project-hygiene.js.map +1 -1
  319. package/dist/sentient/daemon.d.ts.map +1 -1
  320. package/dist/sentient/daemon.js +7 -2
  321. package/dist/sentient/daemon.js.map +1 -1
  322. package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
  323. package/dist/sentient/worktree-dispatch.js +8 -1
  324. package/dist/sentient/worktree-dispatch.js.map +1 -1
  325. package/dist/setup/config-json-merge.d.ts.map +1 -1
  326. package/dist/setup/config-json-merge.js +14 -0
  327. package/dist/setup/config-json-merge.js.map +1 -1
  328. package/dist/setup/index.d.ts +23 -11
  329. package/dist/setup/index.d.ts.map +1 -1
  330. package/dist/setup/index.js +25 -12
  331. package/dist/setup/index.js.map +1 -1
  332. package/dist/setup/sections/llm.d.ts +28 -1
  333. package/dist/setup/sections/llm.d.ts.map +1 -1
  334. package/dist/setup/sections/llm.js +27 -6
  335. package/dist/setup/sections/llm.js.map +1 -1
  336. package/dist/setup/sections/models-roles.d.ts +40 -0
  337. package/dist/setup/sections/models-roles.d.ts.map +1 -0
  338. package/dist/setup/sections/models-roles.js +219 -0
  339. package/dist/setup/sections/models-roles.js.map +1 -0
  340. package/dist/setup/wizard.d.ts +19 -1
  341. package/dist/setup/wizard.d.ts.map +1 -1
  342. package/dist/setup/wizard.js.map +1 -1
  343. package/dist/spawn/branch-lock.d.ts.map +1 -1
  344. package/dist/spawn/branch-lock.js +7 -1
  345. package/dist/spawn/branch-lock.js.map +1 -1
  346. package/dist/store/attachment-repair.d.ts +110 -0
  347. package/dist/store/attachment-repair.d.ts.map +1 -0
  348. package/dist/store/attachment-repair.js +326 -0
  349. package/dist/store/attachment-repair.js.map +1 -0
  350. package/dist/store/attachment-store.d.ts.map +1 -1
  351. package/dist/store/attachment-store.js +24 -7
  352. package/dist/store/attachment-store.js.map +1 -1
  353. package/dist/store/schedule-schema.d.ts +195 -0
  354. package/dist/store/schedule-schema.d.ts.map +1 -0
  355. package/dist/store/schedule-schema.js +84 -0
  356. package/dist/store/schedule-schema.js.map +1 -0
  357. package/dist/store/schedule-store.d.ts +144 -0
  358. package/dist/store/schedule-store.d.ts.map +1 -0
  359. package/dist/store/schedule-store.js +162 -0
  360. package/dist/store/schedule-store.js.map +1 -0
  361. package/dist/store/schema/attachments.d.ts +1 -1
  362. package/dist/store/schema/cleo-global/index.d.ts +3 -0
  363. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  364. package/dist/store/schema/cleo-global/index.js +5 -0
  365. package/dist/store/schema/cleo-global/index.js.map +1 -1
  366. package/dist/store/schema/cleo-global/models-catalog.d.ts +359 -0
  367. package/dist/store/schema/cleo-global/models-catalog.d.ts.map +1 -0
  368. package/dist/store/schema/cleo-global/models-catalog.js +114 -0
  369. package/dist/store/schema/cleo-global/models-catalog.js.map +1 -0
  370. package/dist/store/schema/cleo-global/providers.d.ts +279 -0
  371. package/dist/store/schema/cleo-global/providers.d.ts.map +1 -0
  372. package/dist/store/schema/cleo-global/providers.js +94 -0
  373. package/dist/store/schema/cleo-global/providers.js.map +1 -0
  374. package/dist/store/schema/cleo-global/services.d.ts +493 -0
  375. package/dist/store/schema/cleo-global/services.d.ts.map +1 -0
  376. package/dist/store/schema/cleo-global/services.js +200 -0
  377. package/dist/store/schema/cleo-global/services.js.map +1 -0
  378. package/dist/store/schema/cleo-project/docs.d.ts +1 -1
  379. package/dist/store/schema/cleo-project/provenance-rest.d.ts +1 -1
  380. package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
  381. package/dist/store/schema/memory-schema.d.ts +182 -2
  382. package/dist/store/schema/memory-schema.d.ts.map +1 -1
  383. package/dist/store/schema/memory-schema.js +111 -2
  384. package/dist/store/schema/memory-schema.js.map +1 -1
  385. package/dist/store/schema/provenance/releases.d.ts +1 -1
  386. package/dist/store/service-connections-accessor.d.ts +313 -0
  387. package/dist/store/service-connections-accessor.d.ts.map +1 -0
  388. package/dist/store/service-connections-accessor.js +464 -0
  389. package/dist/store/service-connections-accessor.js.map +1 -0
  390. package/dist/store/service-host-matcher.d.ts +70 -0
  391. package/dist/store/service-host-matcher.d.ts.map +1 -0
  392. package/dist/store/service-host-matcher.js +127 -0
  393. package/dist/store/service-host-matcher.js.map +1 -0
  394. package/dist/store/service-injection.d.ts +152 -0
  395. package/dist/store/service-injection.d.ts.map +1 -0
  396. package/dist/store/service-injection.js +225 -0
  397. package/dist/store/service-injection.js.map +1 -0
  398. package/dist/store/service-oauth.d.ts +287 -0
  399. package/dist/store/service-oauth.d.ts.map +1 -0
  400. package/dist/store/service-oauth.js +524 -0
  401. package/dist/store/service-oauth.js.map +1 -0
  402. package/dist/store/service-trust-gate.d.ts +164 -0
  403. package/dist/store/service-trust-gate.d.ts.map +1 -0
  404. package/dist/store/service-trust-gate.js +122 -0
  405. package/dist/store/service-trust-gate.js.map +1 -0
  406. package/dist/store/validation-schemas.d.ts +4 -4
  407. package/dist/tasks/agent-lifecycle-lane.d.ts +175 -0
  408. package/dist/tasks/agent-lifecycle-lane.d.ts.map +1 -0
  409. package/dist/tasks/agent-lifecycle-lane.js +176 -0
  410. package/dist/tasks/agent-lifecycle-lane.js.map +1 -0
  411. package/dist/tasks/complete.d.ts +17 -0
  412. package/dist/tasks/complete.d.ts.map +1 -1
  413. package/dist/tasks/complete.js +53 -10
  414. package/dist/tasks/complete.js.map +1 -1
  415. package/dist/tasks/depends-waiver-audit.d.ts +52 -0
  416. package/dist/tasks/depends-waiver-audit.d.ts.map +1 -0
  417. package/dist/tasks/depends-waiver-audit.js +36 -0
  418. package/dist/tasks/depends-waiver-audit.js.map +1 -0
  419. package/dist/tasks/engine-wrap.d.ts +36 -2
  420. package/dist/tasks/engine-wrap.d.ts.map +1 -1
  421. package/dist/tasks/engine-wrap.js +44 -2
  422. package/dist/tasks/engine-wrap.js.map +1 -1
  423. package/dist/tasks/evidence.d.ts +34 -2
  424. package/dist/tasks/evidence.d.ts.map +1 -1
  425. package/dist/tasks/evidence.js +293 -35
  426. package/dist/tasks/evidence.js.map +1 -1
  427. package/dist/tasks/index.d.ts +1 -0
  428. package/dist/tasks/index.d.ts.map +1 -1
  429. package/dist/tasks/index.js +1 -0
  430. package/dist/tasks/index.js.map +1 -1
  431. package/dist/tasks/ops.d.ts +3 -0
  432. package/dist/tasks/ops.d.ts.map +1 -1
  433. package/dist/tasks/task-ops.d.ts +1 -1
  434. package/dist/tasks/task-ops.d.ts.map +1 -1
  435. package/dist/tasks/task-ops.js +3 -1
  436. package/dist/tasks/task-ops.js.map +1 -1
  437. package/dist/tasks/task-reparent.d.ts +90 -0
  438. package/dist/tasks/task-reparent.d.ts.map +1 -1
  439. package/dist/tasks/task-reparent.js +171 -0
  440. package/dist/tasks/task-reparent.js.map +1 -1
  441. package/dist/tools/builtin-agent-tools.d.ts.map +1 -1
  442. package/dist/tools/builtin-agent-tools.js +41 -0
  443. package/dist/tools/builtin-agent-tools.js.map +1 -1
  444. package/dist/tools/exec-code-agent-tool.d.ts +179 -0
  445. package/dist/tools/exec-code-agent-tool.d.ts.map +1 -0
  446. package/dist/tools/exec-code-agent-tool.js +239 -0
  447. package/dist/tools/exec-code-agent-tool.js.map +1 -0
  448. package/dist/tools/index.d.ts +6 -0
  449. package/dist/tools/index.d.ts.map +1 -1
  450. package/dist/tools/index.js +15 -0
  451. package/dist/tools/index.js.map +1 -1
  452. package/dist/tools/mcp-agent-tool.d.ts +189 -0
  453. package/dist/tools/mcp-agent-tool.d.ts.map +1 -0
  454. package/dist/tools/mcp-agent-tool.js +243 -0
  455. package/dist/tools/mcp-agent-tool.js.map +1 -0
  456. package/dist/tools/media-agent-tools.d.ts +105 -0
  457. package/dist/tools/media-agent-tools.d.ts.map +1 -0
  458. package/dist/tools/media-agent-tools.js +255 -0
  459. package/dist/tools/media-agent-tools.js.map +1 -0
  460. package/dist/tools/memory-agent-tools.d.ts +99 -0
  461. package/dist/tools/memory-agent-tools.d.ts.map +1 -0
  462. package/dist/tools/memory-agent-tools.js +190 -0
  463. package/dist/tools/memory-agent-tools.js.map +1 -0
  464. package/dist/tools/schedule-agent-tools.d.ts +151 -0
  465. package/dist/tools/schedule-agent-tools.d.ts.map +1 -0
  466. package/dist/tools/schedule-agent-tools.js +238 -0
  467. package/dist/tools/schedule-agent-tools.js.map +1 -0
  468. package/dist/tools/skill-agent-tool.d.ts +108 -0
  469. package/dist/tools/skill-agent-tool.d.ts.map +1 -0
  470. package/dist/tools/skill-agent-tool.js +135 -0
  471. package/dist/tools/skill-agent-tool.js.map +1 -0
  472. package/dist/validation/engine-ops.d.ts.map +1 -1
  473. package/dist/validation/engine-ops.js +17 -1
  474. package/dist/validation/engine-ops.js.map +1 -1
  475. package/dist/verification/verify-tools.d.ts.map +1 -1
  476. package/dist/verification/verify-tools.js +5 -6
  477. package/dist/verification/verify-tools.js.map +1 -1
  478. package/migrations/drizzle-brain/20260610000001_t10405-bitemporal-network-columns/migration.sql +71 -0
  479. package/migrations/drizzle-cleo-global/20260609000000_t11937-service-vault/migration.sql +93 -0
  480. package/migrations/drizzle-cleo-global/20260609010000_t11733-models-catalog/migration.sql +65 -0
  481. package/migrations/drizzle-cleo-global/20260609020000_t11703-providers/migration.sql +52 -0
  482. package/migrations/drizzle-cleo-global/20260610000000_t11962-schedules/migration.sql +48 -0
  483. package/migrations/drizzle-cleo-project/20260610000000_t11962-schedules/migration.sql +48 -0
  484. package/package.json +33 -13
  485. package/templates/workflows/release-prepare.yml.tmpl +48 -2
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Delivery Router + Session Store — route inbound channel messages to the agent
3
+ * and route the agent's reply back to the originating channel.
4
+ *
5
+ * This is the minimal Session Store + Delivery Router stub from T1797 (epic
6
+ * T11854 · saga T10419). It tracks per-channel session affinity in memory and
7
+ * resolves an {@link OutboundReply} back to the {@link ChannelAdapter} that
8
+ * originated the inbound exchange. Channels register with the router; inbound
9
+ * messages flow `adapter.receive() → router.ingest() → handler`, and the
10
+ * handler's reply flows `router.dispatch() → adapter.send()` over the SAME
11
+ * channel by session affinity.
12
+ *
13
+ * The store is in-memory by design for the contained increment: the underlying
14
+ * conduit `LocalTransport` already persists the message rows in conduit.db
15
+ * (via the consolidated `conduit_*` domain through the store chokepoint), so the
16
+ * router does NOT open its own database handle and introduces no new schema.
17
+ * A durable session table is a follow-up if cross-process routing is needed.
18
+ *
19
+ * @see T1797 — Session Store + Delivery Router.
20
+ * @epic T11854
21
+ * @saga T10419
22
+ * @module conduit/delivery-router
23
+ */
24
+ import type { ChannelAdapter, ChannelSession, InboundMsg, OutboundReply } from '@cleocode/contracts';
25
+ /** Handler invoked for each routed inbound message; returns an optional reply. */
26
+ export type InboundHandler = (msg: InboundMsg) => Promise<OutboundReply | undefined>;
27
+ /**
28
+ * In-memory per-channel session-affinity store.
29
+ *
30
+ * Keyed on `(channelId, sessionKey)`, it remembers the last inbound exchange so
31
+ * the {@link DeliveryRouter} can route a reply back to the originating channel
32
+ * without the caller threading routing state.
33
+ *
34
+ * @see T1797
35
+ */
36
+ export declare class SessionStore {
37
+ private readonly sessions;
38
+ /**
39
+ * Record (or refresh) the session for an inbound message.
40
+ *
41
+ * @param msg - The inbound message establishing the session.
42
+ * @returns The stored {@link ChannelSession}.
43
+ */
44
+ touch(msg: InboundMsg): ChannelSession;
45
+ /**
46
+ * Look up a stored session by channel + session key.
47
+ *
48
+ * @param channelId - The channel id.
49
+ * @param sessionKey - The channel-native session key.
50
+ * @returns The session if present, else `undefined`.
51
+ */
52
+ get(channelId: string, sessionKey: string): ChannelSession | undefined;
53
+ /**
54
+ * List every tracked session (newest-touched first).
55
+ *
56
+ * @returns A snapshot array of sessions.
57
+ */
58
+ list(): ChannelSession[];
59
+ /** Remove all tracked sessions. */
60
+ clear(): void;
61
+ }
62
+ /**
63
+ * Routes inbound channel messages to a handler and delivers replies back to the
64
+ * originating channel by session affinity.
65
+ *
66
+ * Channels register via {@link DeliveryRouter.register}. Calling
67
+ * {@link DeliveryRouter.run} drains each registered adapter's `receive()`
68
+ * stream, invokes the handler, and — when the handler returns a reply — routes
69
+ * it back over the same channel.
70
+ *
71
+ * @see T1797
72
+ */
73
+ export declare class DeliveryRouter {
74
+ private readonly adapters;
75
+ private readonly store;
76
+ /**
77
+ * Create a router.
78
+ *
79
+ * @param store - Optional injected {@link SessionStore} (a fresh in-memory
80
+ * store is created when omitted).
81
+ */
82
+ constructor(store?: SessionStore);
83
+ /** The session store backing this router. */
84
+ get sessions(): SessionStore;
85
+ /**
86
+ * Register a channel adapter with the router.
87
+ *
88
+ * @param adapter - The adapter to route for.
89
+ * @throws When an adapter with the same id is already registered.
90
+ */
91
+ register(adapter: ChannelAdapter): void;
92
+ /**
93
+ * Resolve the adapter registered for a channel id.
94
+ *
95
+ * @param channelId - The channel id.
96
+ * @returns The adapter if registered, else `undefined`.
97
+ */
98
+ adapter(channelId: string): ChannelAdapter | undefined;
99
+ /**
100
+ * Ingest a single inbound message: record session affinity and invoke the
101
+ * handler. When the handler returns a reply, it is dispatched back to the
102
+ * originating channel.
103
+ *
104
+ * Exposed independently of {@link DeliveryRouter.run} so a caller (or test)
105
+ * can drive one message at a time over an in-memory transport.
106
+ *
107
+ * @param msg - The inbound message.
108
+ * @param handler - The agent handler producing an optional reply.
109
+ */
110
+ ingest(msg: InboundMsg, handler: InboundHandler): Promise<void>;
111
+ /**
112
+ * Dispatch an outbound reply back to a channel.
113
+ *
114
+ * Resolution order for the destination channel + session:
115
+ * 1. Explicit `reply.channelId` / `reply.sessionKey`.
116
+ * 2. The originating inbound message's channel + session (affinity).
117
+ * 3. The adapter's `config.homeChannel` session fallback.
118
+ *
119
+ * @param reply - The reply to deliver.
120
+ * @param origin - The inbound message being replied to (for affinity).
121
+ * @throws When no destination channel can be resolved or is unregistered.
122
+ */
123
+ dispatch(reply: OutboundReply, origin?: InboundMsg): Promise<void>;
124
+ /**
125
+ * Drain a registered adapter's inbound stream, routing each message through
126
+ * the handler until the adapter stops (its `receive()` iterator ends).
127
+ *
128
+ * @param channelId - The channel to run.
129
+ * @param handler - The agent handler producing optional replies.
130
+ * @throws When the channel is not registered.
131
+ */
132
+ run(channelId: string, handler: InboundHandler): Promise<void>;
133
+ }
134
+ //# sourceMappingURL=delivery-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-router.d.ts","sourceRoot":"","sources":["../../src/conduit/delivery-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,UAAU,EACV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;AAOrF;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc;IAYtC;;;;;;OAMG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAItE;;;;OAIG;IACH,IAAI,IAAI,cAAc,EAAE;IAIxB,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC;;;;;OAKG;gBACS,KAAK,CAAC,EAAE,YAAY;IAIhC,6CAA6C;IAC7C,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAOvC;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAItD;;;;;;;;;;OAUG;IACG,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxE;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CASrE"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-router.js","sourceRoot":"","sources":["../../src/conduit/delivery-router.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,18 @@
2
2
  * Conduit — High-level agent messaging for the CLEO ecosystem.
3
3
  *
4
4
  * Exports the ConduitClient (high-level messaging), HttpTransport
5
- * (HTTP polling to cloud), LocalTransport (offline SQLite), and
6
- * createConduit factory.
5
+ * (HTTP polling to cloud), LocalTransport (offline SQLite), the
6
+ * channel layer (LocalTuiChannelAdapter + DeliveryRouter/SessionStore),
7
+ * and the createConduit factory.
7
8
  *
8
9
  * @module conduit
9
10
  */
10
11
  export { ConduitClient } from './conduit-client.js';
12
+ export { DeliveryRouter, type InboundHandler, SessionStore, } from './delivery-router.js';
11
13
  export { createConduit, resolveTransport } from './factory.js';
12
14
  export { HttpTransport } from './http-transport.js';
13
15
  export { LocalTransport } from './local-transport.js';
16
+ export { LOCAL_TUI_CHANNEL_ID, LocalTuiChannelAdapter, type LocalTuiChannelAdapterOptions, } from './local-tui-adapter.js';
14
17
  export type { conduitCoreOps } from './ops.js';
15
18
  export { SseTransport } from './sse-transport.js';
16
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conduit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conduit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,6BAA6B,GACnC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -2,14 +2,17 @@
2
2
  * Conduit — High-level agent messaging for the CLEO ecosystem.
3
3
  *
4
4
  * Exports the ConduitClient (high-level messaging), HttpTransport
5
- * (HTTP polling to cloud), LocalTransport (offline SQLite), and
6
- * createConduit factory.
5
+ * (HTTP polling to cloud), LocalTransport (offline SQLite), the
6
+ * channel layer (LocalTuiChannelAdapter + DeliveryRouter/SessionStore),
7
+ * and the createConduit factory.
7
8
  *
8
9
  * @module conduit
9
10
  */
10
11
  export { ConduitClient } from './conduit-client.js';
12
+ export { DeliveryRouter, SessionStore, } from './delivery-router.js';
11
13
  export { createConduit, resolveTransport } from './factory.js';
12
14
  export { HttpTransport } from './http-transport.js';
13
15
  export { LocalTransport } from './local-transport.js';
16
+ export { LOCAL_TUI_CHANNEL_ID, LocalTuiChannelAdapter, } from './local-tui-adapter.js';
14
17
  export { SseTransport } from './sse-transport.js';
15
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conduit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conduit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,cAAc,EAEd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * LocalTuiChannelAdapter — the first reference {@link ChannelAdapter} (T11952).
3
+ *
4
+ * A fully-offline, daemon-OFF terminal channel that rides the EXISTING conduit
5
+ * {@link Transport} (the project-local `LocalTransport` over conduit.db). It
6
+ * needs no network and no platform credential: the single local operator on the
7
+ * other end of stdin/stdout is treated as a verified sender.
8
+ *
9
+ * The adapter translates between the channel-native surface and the normalized
10
+ * {@link InboundMsg} / {@link OutboundReply} shapes the {@link DeliveryRouter}
11
+ * consumes. It does NOT reinvent the transport — every wire operation delegates
12
+ * to the injected {@link Transport} (push/poll/subscribe), so the SAME adapter
13
+ * works over `LocalTransport` in production and an in-memory transport in tests.
14
+ *
15
+ * Platform adapters (Telegram/Discord/Slack/WhatsApp — T11855) implement the
16
+ * same {@link ChannelAdapter} contract but are credential+network gated and are
17
+ * out of scope for this contained increment.
18
+ *
19
+ * @epic T11854
20
+ * @saga T10419
21
+ * @module conduit/local-tui-adapter
22
+ */
23
+ import type { ChannelAdapter, ChannelConfig, ChannelHealth, InboundMsg, OutboundReply, Transport, TransportConnectConfig } from '@cleocode/contracts';
24
+ /** Default channel id for the Local-TUI adapter. */
25
+ export declare const LOCAL_TUI_CHANNEL_ID = "local-tui";
26
+ /** Options for constructing a {@link LocalTuiChannelAdapter}. */
27
+ export interface LocalTuiChannelAdapterOptions {
28
+ /** The transport this channel rides (e.g. conduit `LocalTransport`). */
29
+ transport: Transport;
30
+ /** Transport connect config (agentId / apiKey / apiBaseUrl). */
31
+ connectConfig: TransportConnectConfig;
32
+ /** Per-channel configuration. */
33
+ config?: ChannelConfig;
34
+ /** Channel id override (defaults to {@link LOCAL_TUI_CHANNEL_ID}). */
35
+ id?: string;
36
+ }
37
+ /**
38
+ * Local terminal channel adapter over a conduit {@link Transport}.
39
+ *
40
+ * @see T11952
41
+ */
42
+ export declare class LocalTuiChannelAdapter implements ChannelAdapter {
43
+ readonly id: string;
44
+ readonly config: ChannelConfig;
45
+ private readonly transport;
46
+ private readonly connectConfig;
47
+ private status;
48
+ private detail;
49
+ private unsubscribe;
50
+ private queue;
51
+ /** Create a Local-TUI channel adapter. */
52
+ constructor(options: LocalTuiChannelAdapterOptions);
53
+ /**
54
+ * Connect the transport and begin buffering inbound messages.
55
+ *
56
+ * Idempotent: a second `start()` while already connected is a no-op.
57
+ */
58
+ start(): Promise<void>;
59
+ /** Detach the subscription, end the inbound stream, and disconnect. */
60
+ stop(): Promise<void>;
61
+ /**
62
+ * Stream inbound messages as they arrive on the transport.
63
+ *
64
+ * Yields each {@link InboundMsg} until {@link LocalTuiChannelAdapter.stop}
65
+ * ends the iterator. When the transport lacks `subscribe()`, falls back to a
66
+ * single drain of `poll()` so the channel is still usable.
67
+ */
68
+ receive(): AsyncIterable<InboundMsg>;
69
+ /**
70
+ * Send a reply back to the channel over the transport.
71
+ *
72
+ * @param reply - The reply. The destination session resolves from
73
+ * `reply.sessionKey` then `config.homeChannel` then the default TTY session.
74
+ */
75
+ send(reply: OutboundReply): Promise<void>;
76
+ /** Sample the adapter's current health. */
77
+ health(): ChannelHealth;
78
+ /** Push a transport message onto the inbound queue (after policy filtering). */
79
+ private onTransportMessage;
80
+ /**
81
+ * Normalize a {@link ConduitMessage} into an {@link InboundMsg}, applying the
82
+ * channel's allowlist + require-mention policy. Returns `undefined` when the
83
+ * message is filtered out.
84
+ */
85
+ private toInbound;
86
+ /** Whether the message content mentions the connected agent id. */
87
+ private mentionsAgent;
88
+ }
89
+ //# sourceMappingURL=local-tui-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-tui-adapter.d.ts","sourceRoot":"","sources":["../../src/conduit/local-tui-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,aAAa,EAGb,UAAU,EACV,aAAa,EACb,SAAS,EACT,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAKhD,iEAAiE;AACjE,MAAM,WAAW,6BAA6B;IAC5C,wEAAwE;IACxE,SAAS,EAAE,SAAS,CAAC;IACrB,gEAAgE;IAChE,aAAa,EAAE,sBAAsB,CAAC;IACtC,iCAAiC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,sEAAsE;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAkDD;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,KAAK,CAAuC;IAEpD,0CAA0C;gBAC9B,OAAO,EAAE,6BAA6B;IAOlD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B,uEAAuE;IACjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;;;OAMG;IACI,OAAO,IAAI,aAAa,CAAC,UAAU,CAAC;IAuB3C;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,2CAA2C;IAC3C,MAAM,IAAI,aAAa;IAUvB,gFAAgF;IAChF,OAAO,CAAC,kBAAkB;IAO1B;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmBjB,mEAAmE;IACnE,OAAO,CAAC,aAAa;CAGtB"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * LocalTuiChannelAdapter — the first reference {@link ChannelAdapter} (T11952).
3
+ *
4
+ * A fully-offline, daemon-OFF terminal channel that rides the EXISTING conduit
5
+ * {@link Transport} (the project-local `LocalTransport` over conduit.db). It
6
+ * needs no network and no platform credential: the single local operator on the
7
+ * other end of stdin/stdout is treated as a verified sender.
8
+ *
9
+ * The adapter translates between the channel-native surface and the normalized
10
+ * {@link InboundMsg} / {@link OutboundReply} shapes the {@link DeliveryRouter}
11
+ * consumes. It does NOT reinvent the transport — every wire operation delegates
12
+ * to the injected {@link Transport} (push/poll/subscribe), so the SAME adapter
13
+ * works over `LocalTransport` in production and an in-memory transport in tests.
14
+ *
15
+ * Platform adapters (Telegram/Discord/Slack/WhatsApp — T11855) implement the
16
+ * same {@link ChannelAdapter} contract but are credential+network gated and are
17
+ * out of scope for this contained increment.
18
+ *
19
+ * @epic T11854
20
+ * @saga T10419
21
+ * @module conduit/local-tui-adapter
22
+ */
23
+ /** Default channel id for the Local-TUI adapter. */
24
+ export const LOCAL_TUI_CHANNEL_ID = 'local-tui';
25
+ /** Default session key used when no explicit thread is supplied (single TTY session). */
26
+ const DEFAULT_SESSION_KEY = 'tui';
27
+ /**
28
+ * A bounded async queue that lets a push-style transport subscription be
29
+ * consumed as a pull-style {@link AsyncIterable}.
30
+ *
31
+ * @internal
32
+ */
33
+ class MessageQueue {
34
+ buffer = [];
35
+ waiters = [];
36
+ closed = false;
37
+ /** Enqueue a value (or hand it directly to a waiting consumer). */
38
+ push(value) {
39
+ if (this.closed)
40
+ return;
41
+ const waiter = this.waiters.shift();
42
+ if (waiter) {
43
+ waiter({ value, done: false });
44
+ }
45
+ else {
46
+ this.buffer.push(value);
47
+ }
48
+ }
49
+ /** Close the queue: pending and future consumers receive `done`. */
50
+ close() {
51
+ if (this.closed)
52
+ return;
53
+ this.closed = true;
54
+ let waiter = this.waiters.shift();
55
+ while (waiter) {
56
+ waiter({ value: undefined, done: true });
57
+ waiter = this.waiters.shift();
58
+ }
59
+ }
60
+ /** Pull the next value, awaiting one if the buffer is empty. */
61
+ next() {
62
+ const buffered = this.buffer.shift();
63
+ if (buffered !== undefined) {
64
+ return Promise.resolve({ value: buffered, done: false });
65
+ }
66
+ if (this.closed) {
67
+ return Promise.resolve({ value: undefined, done: true });
68
+ }
69
+ return new Promise((resolve) => {
70
+ this.waiters.push(resolve);
71
+ });
72
+ }
73
+ }
74
+ /**
75
+ * Local terminal channel adapter over a conduit {@link Transport}.
76
+ *
77
+ * @see T11952
78
+ */
79
+ export class LocalTuiChannelAdapter {
80
+ id;
81
+ config;
82
+ transport;
83
+ connectConfig;
84
+ status = 'disconnected';
85
+ detail;
86
+ unsubscribe;
87
+ queue;
88
+ /** Create a Local-TUI channel adapter. */
89
+ constructor(options) {
90
+ this.transport = options.transport;
91
+ this.connectConfig = options.connectConfig;
92
+ this.id = options.id ?? LOCAL_TUI_CHANNEL_ID;
93
+ this.config = options.config ?? {};
94
+ }
95
+ /**
96
+ * Connect the transport and begin buffering inbound messages.
97
+ *
98
+ * Idempotent: a second `start()` while already connected is a no-op.
99
+ */
100
+ async start() {
101
+ if (this.status === 'connected')
102
+ return;
103
+ try {
104
+ await this.transport.connect(this.connectConfig);
105
+ if (this.transport.subscribe) {
106
+ this.queue = new MessageQueue();
107
+ this.unsubscribe = this.transport.subscribe((m) => this.onTransportMessage(m));
108
+ this.status = 'connected';
109
+ }
110
+ else {
111
+ // No real-time subscription — the channel still functions via poll(),
112
+ // but inbound streaming is degraded (no queue: receive() drains poll()).
113
+ this.queue = undefined;
114
+ this.status = 'degraded';
115
+ this.detail = 'transport has no subscribe(); receive() falls back to poll()';
116
+ }
117
+ }
118
+ catch (err) {
119
+ this.status = 'error';
120
+ this.detail = err instanceof Error ? err.message : String(err);
121
+ throw err;
122
+ }
123
+ }
124
+ /** Detach the subscription, end the inbound stream, and disconnect. */
125
+ async stop() {
126
+ this.unsubscribe?.();
127
+ this.unsubscribe = undefined;
128
+ this.queue?.close();
129
+ this.queue = undefined;
130
+ await this.transport.disconnect();
131
+ this.status = 'disconnected';
132
+ this.detail = undefined;
133
+ }
134
+ /**
135
+ * Stream inbound messages as they arrive on the transport.
136
+ *
137
+ * Yields each {@link InboundMsg} until {@link LocalTuiChannelAdapter.stop}
138
+ * ends the iterator. When the transport lacks `subscribe()`, falls back to a
139
+ * single drain of `poll()` so the channel is still usable.
140
+ */
141
+ async *receive() {
142
+ if (this.status !== 'connected' && this.status !== 'degraded') {
143
+ throw new Error(`LocalTuiChannelAdapter.receive: channel "${this.id}" not started`);
144
+ }
145
+ // Degraded path: no real-time subscription — drain what poll() returns now.
146
+ if (!this.queue) {
147
+ const polled = await this.transport.poll();
148
+ for (const m of polled) {
149
+ const inbound = this.toInbound(m);
150
+ if (inbound)
151
+ yield inbound;
152
+ }
153
+ return;
154
+ }
155
+ const queue = this.queue;
156
+ for (;;) {
157
+ const result = await queue.next();
158
+ if (result.done)
159
+ return;
160
+ yield result.value;
161
+ }
162
+ }
163
+ /**
164
+ * Send a reply back to the channel over the transport.
165
+ *
166
+ * @param reply - The reply. The destination session resolves from
167
+ * `reply.sessionKey` then `config.homeChannel` then the default TTY session.
168
+ */
169
+ async send(reply) {
170
+ if (this.status !== 'connected' && this.status !== 'degraded') {
171
+ throw new Error(`LocalTuiChannelAdapter.send: channel "${this.id}" not started`);
172
+ }
173
+ const sessionKey = reply.sessionKey ?? this.config.homeChannel ?? DEFAULT_SESSION_KEY;
174
+ // Reply is addressed back to the connected operator id; the conversation is
175
+ // keyed by sessionKey so the originating thread is preserved.
176
+ await this.transport.push(this.connectConfig.agentId, reply.content, {
177
+ conversationId: sessionKey,
178
+ });
179
+ }
180
+ /** Sample the adapter's current health. */
181
+ health() {
182
+ return {
183
+ channelId: this.id,
184
+ status: this.status,
185
+ transport: this.transport.name,
186
+ detail: this.detail,
187
+ checkedAt: new Date().toISOString(),
188
+ };
189
+ }
190
+ /** Push a transport message onto the inbound queue (after policy filtering). */
191
+ onTransportMessage(message) {
192
+ const inbound = this.toInbound(message);
193
+ if (inbound) {
194
+ this.queue?.push(inbound);
195
+ }
196
+ }
197
+ /**
198
+ * Normalize a {@link ConduitMessage} into an {@link InboundMsg}, applying the
199
+ * channel's allowlist + require-mention policy. Returns `undefined` when the
200
+ * message is filtered out.
201
+ */
202
+ toInbound(message) {
203
+ const allowed = this.config.allowedUsers;
204
+ if (allowed && allowed.length > 0 && !allowed.includes(message.from)) {
205
+ return undefined;
206
+ }
207
+ if (this.config.requireMention && !this.mentionsAgent(message.content)) {
208
+ return undefined;
209
+ }
210
+ return {
211
+ id: message.id,
212
+ channelId: this.id,
213
+ from: message.from,
214
+ content: message.content,
215
+ sessionKey: message.threadId ?? this.config.homeChannel ?? DEFAULT_SESSION_KEY,
216
+ timestamp: message.timestamp,
217
+ payload: message.payload,
218
+ };
219
+ }
220
+ /** Whether the message content mentions the connected agent id. */
221
+ mentionsAgent(content) {
222
+ return content.includes(`@${this.connectConfig.agentId}`);
223
+ }
224
+ }
225
+ //# sourceMappingURL=local-tui-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-tui-adapter.js","sourceRoot":"","sources":["../../src/conduit/local-tui-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Config file repair — crash-safe restore from backup (Amendment 1, T11997).
3
+ *
4
+ * Checks a JSON config file for parse failures. When the live file is
5
+ * corrupt, the routine:
6
+ *
7
+ * 1. Quarantines the corrupt file beside the target (`.corrupt-<iso>`).
8
+ * 2. Scans available backup snapshots for the NEWEST valid (parseable) candidate.
9
+ * 3. Restores the best candidate atomically (tmp-rename) only when JSON parse
10
+ * fails AND no active write window is detected.
11
+ * 4. Appends a structured audit record to `.cleo/audit/config-repair.jsonl`
12
+ * that the `cleo health` surface can consume.
13
+ *
14
+ * Key invariants (Amendment 1):
15
+ * - Never silently restore a stale backup — always quarantine first, then
16
+ * restore the newest valid candidate.
17
+ * - Restore only when `JSON.parse` fails on the live file (not merely on
18
+ * schema drift).
19
+ * - A `.tmp` survivor from a previously interrupted write (write-file-atomic
20
+ * pattern) takes priority over numbered backups when it is both newer and
21
+ * valid JSON.
22
+ *
23
+ * @task T11997
24
+ * @epic T11992
25
+ */
26
+ /** Outcome of a {@link repairConfigFile} call. */
27
+ export type ConfigRepairOutcome = 'healthy' | 'restored-from-backup' | 'restored-from-tmp' | 'quarantined-no-candidate' | 'skipped-active-write';
28
+ /** Structured result of {@link repairConfigFile}. */
29
+ export interface ConfigRepairResult {
30
+ /** What happened. */
31
+ readonly outcome: ConfigRepairOutcome;
32
+ /** Absolute path to the config file that was checked/restored. */
33
+ readonly configPath: string;
34
+ /** Absolute path to the backup used for restore (when applicable). */
35
+ readonly restoredFrom?: string;
36
+ /** Absolute path to the quarantine file (when a corrupt file was renamed). */
37
+ readonly quarantinedTo?: string;
38
+ /** Human-readable detail. */
39
+ readonly detail: string;
40
+ }
41
+ /**
42
+ * Check and optionally repair a JSON config file.
43
+ *
44
+ * Safe to call on config paths that do not yet exist — returns `'healthy'`
45
+ * immediately when the file is absent (a missing file is not a corrupt file).
46
+ *
47
+ * @param configPath - Absolute path to the config JSON file to check.
48
+ * @param backupDir - Directory containing numbered `.1`, `.2`, … backups.
49
+ * Pass `null` to skip backup-based restore.
50
+ * @param cwd - Project root for audit-log path resolution.
51
+ * @returns Structured {@link ConfigRepairResult}.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { repairConfigFile } from '@cleocode/core/config/config-repair';
56
+ *
57
+ * const result = await repairConfigFile(
58
+ * '/home/user/.local/share/cleo/config.json',
59
+ * '/home/user/.local/share/cleo/backups',
60
+ * '/home/user/projects/myapp',
61
+ * );
62
+ * if (result.outcome === 'restored-from-backup') {
63
+ * console.log(`Restored from ${result.restoredFrom}`);
64
+ * }
65
+ * ```
66
+ *
67
+ * @task T11997
68
+ */
69
+ export declare function repairConfigFile(configPath: string, backupDir: string | null, cwd: string): Promise<ConfigRepairResult>;
70
+ //# sourceMappingURL=config-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-repair.d.ts","sourceRoot":"","sources":["../../src/config/config-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,kDAAkD;AAClD,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,sBAAsB,GACtB,mBAAmB,GACnB,0BAA0B,GAC1B,sBAAsB,CAAC;AAE3B,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA0DD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CAqJ7B"}