@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,118 @@
1
+ /**
2
+ * **LLM-queue admit gate** — the Node-side gate for the supervisor's LLM-queue
3
+ * priority scheduler + per-provider rate governor (T11630 · AC1-AC4).
4
+ *
5
+ * The contended priority + rate state lives in the Rust arbiter
6
+ * (`crates/cleo-supervisor/src/llm_queue.rs`), exposed over `lease-ipc` v1.1 as
7
+ * the `queue_admit` → `queue_admit_result` verb. THIS module is the thin Node
8
+ * gate every outbound LLM call passes through immediately before it hits the
9
+ * wire: it asks the supervisor "may I admit this call?" and, on a `deferred`
10
+ * answer, backs off `retry_after_ms` and re-asks — a structured deferral, never
11
+ * a silent drop (AC4).
12
+ *
13
+ * ## Modes ({@link resolveLlmQueueMode})
14
+ *
15
+ * `CLEO_LLM_QUEUE_MODE` ∈ `{ supervisor | off }`, **default `off`** — mirrors
16
+ * {@link ../store/writer-lease.ts}'s `resolveLeaseMode()` shape:
17
+ *
18
+ * - `off` — pure pass-through: {@link llmQueueAdmit} returns `{ admitted: true }`
19
+ * without touching the supervisor. The daemon is OFF by default in production,
20
+ * so this is the shipping config: EVERY LLM call works with no supervisor.
21
+ * - `supervisor` — prefer the supervisor arbiter over the IPC socket; a
22
+ * `deferred` result is honoured with a back-off + re-request. When the socket
23
+ * is absent / refused / errors, the gate logs the demotion ONCE and degrades
24
+ * to direct execution (`{ admitted: true }`) — a dead/absent arbiter must
25
+ * NEVER block an LLM call.
26
+ *
27
+ * ## CRITICAL degrade-to-direct (headline correctness — AC4 inverse)
28
+ *
29
+ * Because the daemon stays OFF by default, the load-bearing path is the degrade:
30
+ * mode `off`, no socket, `E_LEASE_UNAVAILABLE`, or a connect-refused all resolve
31
+ * to `{ admitted: true }` and the caller executes the LLM call DIRECTLY. The
32
+ * supervisor is a pure OPTIMISATION; its absence is never an error.
33
+ *
34
+ * @module llm/llm-queue-admit
35
+ * @task T11630
36
+ * @epic T11625
37
+ * @see ../store/writer-lease.ts — the `resolveLeaseMode()` + log-once demotion this mirrors
38
+ * @see ../../../runtime/src/daemon/lease-ipc-client.ts — the v1.1 codec this mirrors (boundary: core cannot import runtime)
39
+ */
40
+ import { type QueuePriorityClass } from '@cleocode/contracts';
41
+ /** The LLM-queue admit gate mode. Resolved once per process; default `off`. */
42
+ export type LlmQueueMode = 'supervisor' | 'off';
43
+ /**
44
+ * The structured result of an admit gate decision. `admitted: true` means
45
+ * execute the LLM call now; the gate NEVER returns a "dropped" — an over-budget
46
+ * request is internally retried (with back-off) until admitted or the supervisor
47
+ * is found unavailable (then degrades to admitted-direct). AC4.
48
+ */
49
+ export interface LlmAdmitResult {
50
+ /** Whether the LLM call may proceed (always `true` once this resolves). */
51
+ readonly admitted: true;
52
+ /**
53
+ * How the admission was decided — `direct` when no supervisor arbitrated
54
+ * (off-mode / degrade), `supervisor` when the arbiter granted it. Diagnostic
55
+ * only; both mean "go".
56
+ */
57
+ readonly via: 'direct' | 'supervisor';
58
+ }
59
+ /** Options for {@link llmQueueAdmit}. */
60
+ export interface LlmQueueAdmitOptions {
61
+ /**
62
+ * Override the supervisor socket path. Defaults to
63
+ * `<cleoHome>/cleo-supervisor.sock` (or `$CLEO_SUPERVISOR_SOCKET`).
64
+ */
65
+ socketPath?: string;
66
+ /**
67
+ * Max wall-clock (ms) the gate will spend re-requesting a deferred admit
68
+ * before degrading to direct. Bounds the worst-case latency a starved call
69
+ * adds; on timeout the call proceeds (the supervisor budget is advisory, never
70
+ * a hard block on a real call). Default {@link DEFAULT_ADMIT_DEADLINE_MS}.
71
+ */
72
+ deadlineMs?: number;
73
+ }
74
+ /** Max wall-clock a deferred admit will be re-requested before degrading. */
75
+ export declare const DEFAULT_ADMIT_DEADLINE_MS = 30000;
76
+ /**
77
+ * Resolve the LLM-queue mode from `CLEO_LLM_QUEUE_MODE`, once per process.
78
+ *
79
+ * Unknown / unset values resolve to `'off'` — the production-safe default while
80
+ * the supervisor daemon is disabled. Mirrors `resolveLeaseMode()`.
81
+ *
82
+ * @returns The resolved {@link LlmQueueMode}.
83
+ * @task T11630
84
+ */
85
+ export declare function resolveLlmQueueMode(): LlmQueueMode;
86
+ /**
87
+ * Reset cached process-global state (mode + demotion flag). Tests only.
88
+ *
89
+ * @internal
90
+ */
91
+ export declare function _resetLlmQueueStateForTest(): void;
92
+ /**
93
+ * Gate an outbound LLM call through the supervisor's priority scheduler +
94
+ * per-provider rate governor (T11630). Call this immediately BEFORE executing
95
+ * the LLM request.
96
+ *
97
+ * - mode `off` (default) → returns `{ admitted: true, via: 'direct' }` with no
98
+ * IPC. The shipping config.
99
+ * - mode `supervisor`, arbiter reachable → sends `queue_admit`; on `admitted`
100
+ * returns immediately; on `deferred` awaits `retry_after_ms` and re-requests
101
+ * until admitted or the deadline elapses (then degrades to direct — the budget
102
+ * is advisory). AC4: a deferral is a structured wait, never a dropped call.
103
+ * - mode `supervisor`, arbiter UNreachable (no socket / connect-refused /
104
+ * `E_LEASE_UNAVAILABLE` / any transport error) → logs the demotion once and
105
+ * returns `{ admitted: true, via: 'direct' }`. A dead/absent supervisor MUST
106
+ * NEVER block an LLM call.
107
+ *
108
+ * @param provider - The provider id the call targets (rate budget is per-provider).
109
+ * @param priorityClass - The caller's priority class (lead > worker > background).
110
+ * @param estTokens - The caller's estimate of the request's token cost.
111
+ * @param childId - The child the call belongs to (in-flight tracking seam).
112
+ * @param opts - Socket path + deadline overrides.
113
+ * @returns Always resolves to an `{ admitted: true }` result — never throws, never drops.
114
+ *
115
+ * @task T11630
116
+ */
117
+ export declare function llmQueueAdmit(provider: string, priorityClass: QueuePriorityClass, estTokens: number, childId: string, opts?: LlmQueueAdmitOptions): Promise<LlmAdmitResult>;
118
+ //# sourceMappingURL=llm-queue-admit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-queue-admit.d.ts","sourceRoot":"","sources":["../../src/llm/llm-queue-admit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAO7B,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,CAAC;CACvC;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6EAA6E;AAC7E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAwBhD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,CAKlD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,kBAAkB,EACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * **LLM-queue admit gate** — the Node-side gate for the supervisor's LLM-queue
3
+ * priority scheduler + per-provider rate governor (T11630 · AC1-AC4).
4
+ *
5
+ * The contended priority + rate state lives in the Rust arbiter
6
+ * (`crates/cleo-supervisor/src/llm_queue.rs`), exposed over `lease-ipc` v1.1 as
7
+ * the `queue_admit` → `queue_admit_result` verb. THIS module is the thin Node
8
+ * gate every outbound LLM call passes through immediately before it hits the
9
+ * wire: it asks the supervisor "may I admit this call?" and, on a `deferred`
10
+ * answer, backs off `retry_after_ms` and re-asks — a structured deferral, never
11
+ * a silent drop (AC4).
12
+ *
13
+ * ## Modes ({@link resolveLlmQueueMode})
14
+ *
15
+ * `CLEO_LLM_QUEUE_MODE` ∈ `{ supervisor | off }`, **default `off`** — mirrors
16
+ * {@link ../store/writer-lease.ts}'s `resolveLeaseMode()` shape:
17
+ *
18
+ * - `off` — pure pass-through: {@link llmQueueAdmit} returns `{ admitted: true }`
19
+ * without touching the supervisor. The daemon is OFF by default in production,
20
+ * so this is the shipping config: EVERY LLM call works with no supervisor.
21
+ * - `supervisor` — prefer the supervisor arbiter over the IPC socket; a
22
+ * `deferred` result is honoured with a back-off + re-request. When the socket
23
+ * is absent / refused / errors, the gate logs the demotion ONCE and degrades
24
+ * to direct execution (`{ admitted: true }`) — a dead/absent arbiter must
25
+ * NEVER block an LLM call.
26
+ *
27
+ * ## CRITICAL degrade-to-direct (headline correctness — AC4 inverse)
28
+ *
29
+ * Because the daemon stays OFF by default, the load-bearing path is the degrade:
30
+ * mode `off`, no socket, `E_LEASE_UNAVAILABLE`, or a connect-refused all resolve
31
+ * to `{ admitted: true }` and the caller executes the LLM call DIRECTLY. The
32
+ * supervisor is a pure OPTIMISATION; its absence is never an error.
33
+ *
34
+ * @module llm/llm-queue-admit
35
+ * @task T11630
36
+ * @epic T11625
37
+ * @see ../store/writer-lease.ts — the `resolveLeaseMode()` + log-once demotion this mirrors
38
+ * @see ../../../runtime/src/daemon/lease-ipc-client.ts — the v1.1 codec this mirrors (boundary: core cannot import runtime)
39
+ */
40
+ import { connect } from 'node:net';
41
+ import { join } from 'node:path';
42
+ import { LEASE_IPC_PROTOCOL_VERSION, LeaseIpcRequestEnvelopeSchema, LeaseIpcResponseEnvelopeSchema, } from '@cleocode/contracts';
43
+ import { getCleoHome } from '@cleocode/paths';
44
+ import { getLogger } from '../logger.js';
45
+ /** The supervisor IPC socket filename — MUST equal `SOCKET_NAME` in the Rust `crates/cleo-supervisor/src/paths.rs`. */
46
+ const SUPERVISOR_SOCKET_NAME = 'cleo-supervisor.sock';
47
+ /** Max wall-clock a deferred admit will be re-requested before degrading. */
48
+ export const DEFAULT_ADMIT_DEADLINE_MS = 30_000;
49
+ /** Connect timeout for the supervisor socket (ms). A slow/absent socket degrades fast. */
50
+ const CONNECT_TIMEOUT_MS = 250;
51
+ /** Per-request read timeout for a `queue_admit_result` (ms). */
52
+ const REQUEST_TIMEOUT_MS = 2_000;
53
+ /** Cap on a single deferral back-off so a misconfigured window cannot wedge a call. */
54
+ const MAX_RETRY_BACKOFF_MS = 5_000;
55
+ /**
56
+ * Lazily-memoized module logger (import-time-side-effect-free — matches the
57
+ * `writer-lease.ts` deferral pattern so a mocked import graph never hits a TDZ).
58
+ */
59
+ let _log = null;
60
+ function log() {
61
+ if (_log === null)
62
+ _log = getLogger('llm-queue-admit');
63
+ return _log;
64
+ }
65
+ let _cachedMode = null;
66
+ let _supervisorDemotionLogged = false;
67
+ /**
68
+ * Resolve the LLM-queue mode from `CLEO_LLM_QUEUE_MODE`, once per process.
69
+ *
70
+ * Unknown / unset values resolve to `'off'` — the production-safe default while
71
+ * the supervisor daemon is disabled. Mirrors `resolveLeaseMode()`.
72
+ *
73
+ * @returns The resolved {@link LlmQueueMode}.
74
+ * @task T11630
75
+ */
76
+ export function resolveLlmQueueMode() {
77
+ if (_cachedMode !== null)
78
+ return _cachedMode;
79
+ const raw = process.env.CLEO_LLM_QUEUE_MODE;
80
+ _cachedMode = raw === 'supervisor' ? 'supervisor' : 'off';
81
+ return _cachedMode;
82
+ }
83
+ /**
84
+ * Reset cached process-global state (mode + demotion flag). Tests only.
85
+ *
86
+ * @internal
87
+ */
88
+ export function _resetLlmQueueStateForTest() {
89
+ _cachedMode = null;
90
+ _supervisorDemotionLogged = false;
91
+ }
92
+ /** Log the supervisor→direct demotion AT MOST once per process. */
93
+ function logDemotionOnce(reason) {
94
+ if (_supervisorDemotionLogged)
95
+ return;
96
+ _supervisorDemotionLogged = true;
97
+ log().info(`CLEO_LLM_QUEUE_MODE=supervisor but the LLM-queue arbiter is unavailable ` +
98
+ `(${reason}); degrading to direct LLM execution for the process lifetime.`);
99
+ }
100
+ /** The default supervisor socket path: `$CLEO_SUPERVISOR_SOCKET` or `<cleoHome>/cleo-supervisor.sock`. */
101
+ function defaultSocketPath() {
102
+ const override = process.env.CLEO_SUPERVISOR_SOCKET;
103
+ if (override !== undefined && override.length > 0)
104
+ return override;
105
+ return join(getCleoHome(), SUPERVISOR_SOCKET_NAME);
106
+ }
107
+ /** The "execute directly" result — the load-bearing degrade path. */
108
+ const ADMITTED_DIRECT = { admitted: true, via: 'direct' };
109
+ /** Async sleep that yields the event loop. */
110
+ function sleep(ms) {
111
+ return new Promise((resolve) => setTimeout(resolve, Math.max(0, Math.round(ms))));
112
+ }
113
+ /**
114
+ * Gate an outbound LLM call through the supervisor's priority scheduler +
115
+ * per-provider rate governor (T11630). Call this immediately BEFORE executing
116
+ * the LLM request.
117
+ *
118
+ * - mode `off` (default) → returns `{ admitted: true, via: 'direct' }` with no
119
+ * IPC. The shipping config.
120
+ * - mode `supervisor`, arbiter reachable → sends `queue_admit`; on `admitted`
121
+ * returns immediately; on `deferred` awaits `retry_after_ms` and re-requests
122
+ * until admitted or the deadline elapses (then degrades to direct — the budget
123
+ * is advisory). AC4: a deferral is a structured wait, never a dropped call.
124
+ * - mode `supervisor`, arbiter UNreachable (no socket / connect-refused /
125
+ * `E_LEASE_UNAVAILABLE` / any transport error) → logs the demotion once and
126
+ * returns `{ admitted: true, via: 'direct' }`. A dead/absent supervisor MUST
127
+ * NEVER block an LLM call.
128
+ *
129
+ * @param provider - The provider id the call targets (rate budget is per-provider).
130
+ * @param priorityClass - The caller's priority class (lead > worker > background).
131
+ * @param estTokens - The caller's estimate of the request's token cost.
132
+ * @param childId - The child the call belongs to (in-flight tracking seam).
133
+ * @param opts - Socket path + deadline overrides.
134
+ * @returns Always resolves to an `{ admitted: true }` result — never throws, never drops.
135
+ *
136
+ * @task T11630
137
+ */
138
+ export async function llmQueueAdmit(provider, priorityClass, estTokens, childId, opts = {}) {
139
+ if (resolveLlmQueueMode() === 'off') {
140
+ return ADMITTED_DIRECT;
141
+ }
142
+ const socketPath = opts.socketPath ?? defaultSocketPath();
143
+ const deadline = Date.now() + (opts.deadlineMs ?? DEFAULT_ADMIT_DEADLINE_MS);
144
+ for (;;) {
145
+ let result;
146
+ try {
147
+ result = await sendQueueAdmit(socketPath, {
148
+ kind: 'queue_admit',
149
+ provider,
150
+ priority_class: priorityClass,
151
+ est_tokens: Math.max(0, Math.trunc(estTokens)),
152
+ child_id: childId,
153
+ });
154
+ }
155
+ catch (err) {
156
+ // Any transport failure (ENOENT, ECONNREFUSED, timeout, malformed frame)
157
+ // → the arbiter is unavailable; degrade to direct (AC4 inverse).
158
+ logDemotionOnce(err instanceof Error ? err.message : String(err));
159
+ return ADMITTED_DIRECT;
160
+ }
161
+ if ('unavailable' in result) {
162
+ // The supervisor answered E_LEASE_UNAVAILABLE (arbiter not wired) →
163
+ // degrade to direct.
164
+ logDemotionOnce(result.reason);
165
+ return ADMITTED_DIRECT;
166
+ }
167
+ if (result.disposition === 'admitted') {
168
+ return { admitted: true, via: 'supervisor' };
169
+ }
170
+ // Deferred — structured back-off then re-request (AC4: never a silent drop).
171
+ if (Date.now() >= deadline) {
172
+ // The budget is advisory; a real call must not be blocked indefinitely.
173
+ // Past the deadline, proceed (degrade to direct) rather than starve.
174
+ log().debug({ provider, priorityClass, queuePosition: result.queue_position }, 'llm-queue admit deadline exceeded while deferred; proceeding directly');
175
+ return ADMITTED_DIRECT;
176
+ }
177
+ const backoff = Math.min(MAX_RETRY_BACKOFF_MS, Math.max(1, result.retry_after_ms));
178
+ await sleep(backoff);
179
+ }
180
+ }
181
+ /**
182
+ * Send ONE `queue_admit` over a fresh supervisor socket connection and resolve
183
+ * the typed `queue_admit_result` (or a sentinel when the arbiter answered
184
+ * `E_LEASE_UNAVAILABLE`). Connection-per-request keeps the gate stateless and
185
+ * transport failures isolated; the socket is closed before resolution.
186
+ *
187
+ * Encodes the request envelope + decodes the response line through the SAME
188
+ * `@cleocode/contracts` v1.1 Zod schemas the runtime `lease-ipc-client` uses —
189
+ * core cannot import `@cleocode/runtime` (cycle), so it mirrors the codec here.
190
+ *
191
+ * @throws On any transport error (connect refused, ENOENT, timeout, malformed frame).
192
+ */
193
+ function sendQueueAdmit(socketPath, request) {
194
+ return new Promise((resolve, reject) => {
195
+ const id = `qa-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
196
+ const envelope = LeaseIpcRequestEnvelopeSchema.parse({
197
+ protocol_version: LEASE_IPC_PROTOCOL_VERSION,
198
+ id,
199
+ direction: 'request',
200
+ request,
201
+ });
202
+ const line = `${JSON.stringify(envelope)}\n`;
203
+ let settled = false;
204
+ let buffer = '';
205
+ const socket = connect(socketPath);
206
+ const cleanup = () => {
207
+ socket.removeAllListeners();
208
+ socket.destroy();
209
+ };
210
+ const fail = (err) => {
211
+ if (settled)
212
+ return;
213
+ settled = true;
214
+ cleanup();
215
+ reject(err);
216
+ };
217
+ const succeed = (value) => {
218
+ if (settled)
219
+ return;
220
+ settled = true;
221
+ cleanup();
222
+ resolve(value);
223
+ };
224
+ socket.setTimeout(REQUEST_TIMEOUT_MS);
225
+ // A connect that does not complete within the bound is a degrade signal.
226
+ const connectTimer = setTimeout(() => fail(new Error('supervisor connect timeout')), CONNECT_TIMEOUT_MS);
227
+ socket.on('connect', () => {
228
+ clearTimeout(connectTimer);
229
+ socket.write(line);
230
+ });
231
+ socket.on('timeout', () => fail(new Error('supervisor request timeout')));
232
+ socket.on('error', (err) => {
233
+ clearTimeout(connectTimer);
234
+ fail(err);
235
+ });
236
+ socket.on('close', () => {
237
+ if (!settled)
238
+ fail(new Error('supervisor closed the connection before responding'));
239
+ });
240
+ socket.on('data', (chunk) => {
241
+ buffer += chunk.toString('utf8');
242
+ const nl = buffer.indexOf('\n');
243
+ if (nl < 0)
244
+ return; // wait for a full NDJSON line
245
+ const raw = buffer.slice(0, nl);
246
+ let json;
247
+ try {
248
+ json = JSON.parse(raw);
249
+ }
250
+ catch (cause) {
251
+ fail(new Error(`malformed lease-ipc frame: ${cause instanceof Error ? cause.message : cause}`));
252
+ return;
253
+ }
254
+ const parsed = LeaseIpcResponseEnvelopeSchema.safeParse(json);
255
+ if (!parsed.success) {
256
+ fail(new Error(`off-contract lease-ipc response: ${parsed.error.message}`));
257
+ return;
258
+ }
259
+ const { response } = parsed.data;
260
+ if (response.kind === 'queue_admit_result') {
261
+ succeed(response);
262
+ return;
263
+ }
264
+ if (response.kind === 'error') {
265
+ // E_LEASE_UNAVAILABLE (arbiter not wired) or any arbiter error →
266
+ // treat as "supervisor cannot arbitrate"; the caller degrades to direct.
267
+ succeed({ unavailable: true, reason: `${response.code}: ${response.message}` });
268
+ return;
269
+ }
270
+ // Any other kind on a queue_admit correlation is a protocol violation.
271
+ fail(new Error(`unexpected lease-ipc response kind for queue_admit: ${response.kind}`));
272
+ });
273
+ });
274
+ }
275
+ //# sourceMappingURL=llm-queue-admit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-queue-admit.js","sourceRoot":"","sources":["../../src/llm/llm-queue-admit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Local-model fit ranking for Ollama-backed open-weight models (T11982).
3
+ *
4
+ * ## Purpose
5
+ *
6
+ * Given the current machine's hardware (RAM, VRAM), rank 2–3 curated
7
+ * open-weight models that are actually likely to run well. This is the
8
+ * `cleo llm fit` wizard building block — it powers T11983's one-keypress
9
+ * pull+connect flow.
10
+ *
11
+ * ## Vendor-vs-inspire decision (llmfit)
12
+ *
13
+ * Evaluated `github.com/AlexsJones/llmfit` (MIT, Go, ~400 LOC). The library
14
+ * is a standalone Go binary — not a TS/ESM package. Its key contribution is
15
+ * the IDEA: use RAM thresholds to gate model selection, prefer VRAM when
16
+ * available, and produce a ranked list with human-readable reasons. We
17
+ * **vendor the IDEA** (TS-native re-implementation) rather than shelling out
18
+ * to a Go binary or adding a cross-language dependency. The model thresholds
19
+ * below are independently calibrated from Ollama's documentation and the
20
+ * Hugging Face model cards, not copy-pasted from llmfit.
21
+ *
22
+ * ## Gate-13 compliance
23
+ *
24
+ * This module:
25
+ * - MUST NOT construct any transport or SDK client.
26
+ * - MUST NOT read `process.env.*_API_KEY` directly.
27
+ * - MUST NOT define a new `resolveLLMFor*` function.
28
+ * - MUST NOT hardcode model-id literals in logic — all model IDs come from
29
+ * the {@link LOCAL_MODEL_CANDIDATES} data table.
30
+ *
31
+ * The hardware detection (`os.totalmem`, `os.freemem`, `/proc/meminfo`,
32
+ * `nvidia-smi`) is plain system inspection — not covered by Gate-13 (which
33
+ * governs LLM resolution / transport construction).
34
+ *
35
+ * Ollama liveness re-uses {@link probeOllamaAlive} from
36
+ * `cross-provider-selector.ts` (no duplication). The `/api/tags` fetch is
37
+ * a vanilla HTTP call to localhost, not a transport construction.
38
+ *
39
+ * @module llm/local-model-fit
40
+ * @task T11982
41
+ * @epic T11671
42
+ */
43
+ /**
44
+ * A single entry in the curated open-weight model catalog.
45
+ *
46
+ * These values are calibrated from Ollama model pages and Hugging Face cards.
47
+ * Quantisation notes describe the default GGUF quantisation level pulled by
48
+ * `ollama pull <model>`.
49
+ */
50
+ export interface LocalModelCandidate {
51
+ /** Ollama model tag (used verbatim in `ollama pull <modelTag>`). */
52
+ readonly modelTag: string;
53
+ /** Human-readable display name. */
54
+ readonly displayName: string;
55
+ /** Model family (for grouping in the wizard). */
56
+ readonly family: 'gemma4' | 'qwen3' | 'llama3.2' | 'qwen2.5-coder' | 'phi4';
57
+ /** Minimum RAM required to run (worst-case, CPU inference), in GiB. */
58
+ readonly minRamGb: number;
59
+ /** Recommended RAM for comfortable CPU inference, in GiB. */
60
+ readonly recommendedRamGb: number;
61
+ /** Minimum VRAM required for GPU acceleration, in GiB (0 = CPU-only model). */
62
+ readonly minVramGb: number;
63
+ /** Recommended VRAM for full GPU offload, in GiB (0 = CPU-only model). */
64
+ readonly recommendedVramGb: number;
65
+ /** Approximate model size on disk (for download size estimation), in GiB. */
66
+ readonly diskSizeGb: number;
67
+ /** Default quantisation pulled by `ollama pull` (informational). */
68
+ readonly quantNote: string;
69
+ /**
70
+ * Whether this model is intended for code tasks (true) or general use (false).
71
+ * Shown as a tag in the wizard.
72
+ */
73
+ readonly codeSpecialist: boolean;
74
+ /**
75
+ * Context window in tokens.
76
+ * Used to surface context-length as a selection criterion.
77
+ */
78
+ readonly contextLengthK: number;
79
+ }
80
+ /**
81
+ * Curated candidate table. These are the ONLY models `rankLocalModelFit`
82
+ * can recommend — expand this table to add new models.
83
+ *
84
+ * Exclusions:
85
+ * - `qwen2:0.5b` — proof-of-life only; deliberately absent from this list.
86
+ *
87
+ * @task T11982
88
+ */
89
+ export declare const LOCAL_MODEL_CANDIDATES: ReadonlyArray<LocalModelCandidate>;
90
+ /**
91
+ * VRAM detection result.
92
+ *
93
+ * VRAM detection is best-effort and graceful — the field is `null` when no
94
+ * GPU is detected (nvidia-smi absent, no Apple Silicon heuristic, etc.).
95
+ */
96
+ export interface VramInfo {
97
+ /** Total VRAM in bytes, or null if detection failed. */
98
+ totalBytes: number | null;
99
+ /** Free VRAM in bytes, or null if detection failed. */
100
+ freeBytes: number | null;
101
+ /** Detection method used. */
102
+ method: 'nvidia-smi' | 'rocm-smi' | 'apple-unified' | 'none';
103
+ }
104
+ /**
105
+ * Full hardware snapshot used by the ranking algorithm.
106
+ */
107
+ export interface HardwareSnapshot {
108
+ /** Total system RAM in bytes (from `os.totalmem()`). */
109
+ totalRamBytes: number;
110
+ /**
111
+ * Available RAM in bytes.
112
+ * Linux: from `/proc/meminfo` `MemAvailable` (more accurate than `os.freemem`).
113
+ * Other platforms: `os.freemem()`.
114
+ */
115
+ availableRamBytes: number;
116
+ /** VRAM information (best-effort, never throws). */
117
+ vram: VramInfo;
118
+ /** Detected platform. */
119
+ platform: string;
120
+ }
121
+ /**
122
+ * Capture a full hardware snapshot.
123
+ *
124
+ * Never throws — VRAM detection failures degrade gracefully to `null`.
125
+ *
126
+ * @param overrides - Override fields for testing (avoids OS calls in unit tests).
127
+ * @returns A hardware snapshot describing this machine's capabilities.
128
+ *
129
+ * @task T11982
130
+ */
131
+ export declare function captureHardwareSnapshot(overrides?: {
132
+ totalRamBytes?: number;
133
+ availableRamBytes?: number;
134
+ vram?: VramInfo;
135
+ platform?: string;
136
+ }): Promise<HardwareSnapshot>;
137
+ /**
138
+ * A model already pulled and available locally in Ollama.
139
+ */
140
+ export interface OllamaPulledModel {
141
+ /** Tag as returned by `/api/tags`. */
142
+ name: string;
143
+ /** Parameter size string (e.g. `"3.1B"`). */
144
+ parameterSize: string;
145
+ /** Quantisation level (e.g. `"Q4_K_M"`). */
146
+ quantizationLevel: string;
147
+ /** Model family (e.g. `"qwen2"`). */
148
+ family: string;
149
+ }
150
+ /**
151
+ * Fetch the list of locally-pulled models from Ollama's `/api/tags` endpoint.
152
+ *
153
+ * Uses the HTTP API (not shelling out) — Gate-13 does not govern plain `fetch`
154
+ * calls to localhost.
155
+ *
156
+ * @param baseUrl - Ollama base URL (default `http://localhost:11434`).
157
+ * @param fetchFn - Injectable `fetch` for testing (defaults to global `fetch`).
158
+ * @returns Array of pulled models, or empty array if Ollama is not reachable.
159
+ *
160
+ * @task T11982
161
+ */
162
+ export declare function listOllamaPulledModels(baseUrl?: string, fetchFn?: typeof fetch): Promise<OllamaPulledModel[]>;
163
+ /**
164
+ * Hard RAM floor below which no local model recommendation is made.
165
+ * Machines under this threshold are steered toward cloud providers instead.
166
+ */
167
+ export declare const LOCAL_FIT_FLOOR_GB = 4;
168
+ /**
169
+ * A ranked local model fit result.
170
+ */
171
+ export interface LocalModelFitResult {
172
+ /** The candidate model. */
173
+ candidate: LocalModelCandidate;
174
+ /**
175
+ * Overall fit score (higher is better).
176
+ * Used to rank candidates — not surfaced directly in the wizard UI.
177
+ */
178
+ score: number;
179
+ /**
180
+ * Whether this model is already pulled in the local Ollama installation.
181
+ * Models that are already pulled get a score boost (prefer not re-downloading).
182
+ */
183
+ alreadyPulled: boolean;
184
+ /**
185
+ * Human-readable fit reasons (bullet list for wizard display).
186
+ * Examples: "fits in 10GB VRAM", "already pulled", "recommended for 8GB RAM".
187
+ */
188
+ reasons: string[];
189
+ /**
190
+ * Fit tier:
191
+ * - `'excellent'` — hardware is well above requirements; full GPU offload expected.
192
+ * - `'good'` — hardware meets recommended threshold; runs well.
193
+ * - `'marginal'` — hardware meets minimum; expect slower inference.
194
+ */
195
+ fitTier: 'excellent' | 'good' | 'marginal';
196
+ /**
197
+ * The `ollama pull <pullCommand>` string for this model.
198
+ */
199
+ pullCommand: string;
200
+ }
201
+ /**
202
+ * Output envelope returned by {@link rankLocalModelFit}.
203
+ */
204
+ export interface LocalModelFitEnvelope {
205
+ /** Hardware snapshot used for ranking. */
206
+ hardware: {
207
+ totalRamGb: number;
208
+ availableRamGb: number;
209
+ vramTotalGb: number | null;
210
+ vramFreeGb: number | null;
211
+ vramMethod: VramInfo['method'];
212
+ };
213
+ /** Whether Ollama was detected as running. */
214
+ ollamaRunning: boolean;
215
+ /** Models already available in the local Ollama installation. */
216
+ pulledModels: OllamaPulledModel[];
217
+ /**
218
+ * Ranked 2–3 best-fit candidates.
219
+ * Empty when hardware is below the 4 GB floor.
220
+ */
221
+ recommendations: LocalModelFitResult[];
222
+ /**
223
+ * Human-readable explanation when no recommendations are available.
224
+ * null when recommendations is non-empty.
225
+ */
226
+ noRecommendationReason: string | null;
227
+ }
228
+ /**
229
+ * Rank the 2–3 best-fit local open-weight models for this machine.
230
+ *
231
+ * ## Floor
232
+ *
233
+ * Machines with total RAM below {@link LOCAL_FIT_FLOOR_GB} (4 GB) receive no
234
+ * recommendations. This deliberately excludes `qwen2:0.5b` (proof-of-life
235
+ * only) — it is absent from {@link LOCAL_MODEL_CANDIDATES}.
236
+ *
237
+ * ## Algorithm
238
+ *
239
+ * 1. Capture hardware snapshot.
240
+ * 2. Probe Ollama liveness and fetch the pulled-models list.
241
+ * 3. Filter candidates to those whose `minRamGb` ≤ total RAM.
242
+ * 4. Score remaining candidates (VRAM fit + RAM comfort + already-pulled bonus).
243
+ * 5. Return the top 3 (or fewer), ordered by score descending.
244
+ *
245
+ * @param opts - Override hardware snapshot for testing.
246
+ * @returns Fit envelope with ranked candidates.
247
+ *
248
+ * @task T11982
249
+ */
250
+ export declare function rankLocalModelFit(opts?: {
251
+ /** Override the hardware snapshot (for testing). */
252
+ hardwareOverride?: Parameters<typeof captureHardwareSnapshot>[0];
253
+ /** Override Ollama base URL. */
254
+ ollamaBaseUrl?: string;
255
+ /** Injectable fetch for testing. */
256
+ fetchFn?: typeof fetch;
257
+ /** Override pulled models list (for testing). */
258
+ pulledModelsOverride?: OllamaPulledModel[];
259
+ }): Promise<LocalModelFitEnvelope>;
260
+ //# sourceMappingURL=local-model-fit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-model-fit.d.ts","sourceRoot":"","sources":["../../src/llm/local-model-fit.ts"],"names":[],"mappings":"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"}