@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,572 @@
1
+ /**
2
+ * Cross-provider provisioning-aware LLM selection (DHQ-081 · T11978).
3
+ *
4
+ * ## Problem
5
+ *
6
+ * `selectProviderModel` in `role-resolver.ts` (tier 8) falls back to
7
+ * `IMPLICIT_FALLBACK_PROVIDER = 'anthropic'` unconditionally when all 7
8
+ * config tiers miss. This means a machine with only `OPENAI_API_KEY` set
9
+ * still resolves to `anthropic` and returns `credential: null`, causing a
10
+ * silent 401 / graceful-degradation miss.
11
+ *
12
+ * ## Fix
13
+ *
14
+ * When all config tiers miss, instead of immediately returning the hardcoded
15
+ * `anthropic` fallback, `selectBestProvisioned` is called. It:
16
+ *
17
+ * 1. Enumerates all {@link BUILTIN_PROVIDER_IDS} (11 providers).
18
+ * 2. Probes which are provisioned (have a non-exhausted, non-expired
19
+ * credential in the cred store OR a non-empty env var).
20
+ * 3. Ranks provisioned providers by `scoreProvider(provider, taskTier)`.
21
+ * 4. Returns the winner's `SelectedProviderModel`, or `null` if nothing
22
+ * is provisioned (caller falls through to the anthropic implicit fallback,
23
+ * preserving backward compat).
24
+ *
25
+ * ## Gate-13 compliance
26
+ *
27
+ * This module:
28
+ * - MUST NOT construct any transport or SDK client.
29
+ * - MUST NOT read `process.env.*_API_KEY` directly — delegates to the
30
+ * credential layer (`resolveCredentials`, `pickCredentialForProviderSync`).
31
+ * - MUST NOT define a new exported `resolveLLMFor*` function.
32
+ * - MUST NOT hardcode model-id literals outside the provider-registry SSoT.
33
+ *
34
+ * @module llm/cross-provider-selector
35
+ * @task T11978
36
+ * @epic T11679
37
+ */
38
+ import { totalmem } from 'node:os';
39
+ import { getLogger } from '../logger.js';
40
+ import { resolveCredentials } from './credentials.js';
41
+ import { pickCredentialForProviderSync } from './credentials-store.js';
42
+ const logger = getLogger('llm-cross-provider-selector');
43
+ // ---------------------------------------------------------------------------
44
+ // Constants
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * The canonical set of builtin provider IDs that the cross-provider selector
48
+ * enumerates. Mirrors `BuiltinProviderId` (contracts/src/llm/provider-id.ts).
49
+ * Defined here as a runtime array so we can iterate without importing the
50
+ * union type.
51
+ *
52
+ * @task T11978
53
+ */
54
+ export const BUILTIN_PROVIDER_IDS = [
55
+ 'anthropic',
56
+ 'openai',
57
+ 'gemini',
58
+ 'moonshot',
59
+ 'openrouter',
60
+ 'bedrock',
61
+ 'deepseek',
62
+ 'xai',
63
+ 'groq',
64
+ 'kimi-code',
65
+ 'ollama',
66
+ ];
67
+ /**
68
+ * Tier base scores for the scoring function.
69
+ * Local gets a relatively high base so a running ollama beats a missing cloud
70
+ * provider, but PROVISIONED_CLOUD_BIAS pushes provisioned cloud above running local.
71
+ *
72
+ * @task T11978
73
+ */
74
+ const TIER_BASE = {
75
+ frontier: 100,
76
+ standard: 70,
77
+ fast: 50,
78
+ local: 120,
79
+ };
80
+ /**
81
+ * Bias added for frontier/standard cloud providers that hold a valid credential.
82
+ * This ensures a provisioned frontier cloud provider (anthropic, openai) outranks
83
+ * a merely-running local ollama for frontier-tier tasks.
84
+ *
85
+ * Rationale (Q1 ratification): +60 on top of frontier's TIER_BASE=100 → score
86
+ * 160 ≥ local's TIER_BASE=120 + LOCALITY_BONUS=30 = 150.
87
+ *
88
+ * @task T11978
89
+ */
90
+ export const PROVISIONED_CLOUD_BIAS = 60;
91
+ /**
92
+ * Bonus applied when the ollama daemon is confirmed listening (TTL-cached probe).
93
+ *
94
+ * @task T11978
95
+ */
96
+ const LOCALITY_BONUS = 30;
97
+ /**
98
+ * Task-match bonus when the provider tier aligns with the requested task tier.
99
+ *
100
+ * @task T11978
101
+ */
102
+ const TASK_MATCH_BONUS_FRONTIER = 20;
103
+ const TASK_MATCH_BONUS_FAST = 15;
104
+ /**
105
+ * Maximum cost penalty (prevents dominated ranking on expensive providers).
106
+ *
107
+ * @task T11978
108
+ */
109
+ const MAX_COST_PENALTY = 10;
110
+ /**
111
+ * Ollama liveness probe timeout in milliseconds.
112
+ *
113
+ * @task T11978
114
+ */
115
+ const OLLAMA_PROBE_TIMEOUT_MS = 200;
116
+ /**
117
+ * Ollama liveness cache TTL in milliseconds (30 seconds).
118
+ *
119
+ * @task T11978
120
+ */
121
+ const OLLAMA_PROBE_TTL_MS = 30_000;
122
+ const _ollamaProbeCache = new Map();
123
+ /**
124
+ * Reset ollama probe cache for testing.
125
+ * @internal
126
+ */
127
+ export function _resetOllamaProbeCache() {
128
+ _ollamaProbeCache.clear();
129
+ }
130
+ /**
131
+ * Check whether the ollama daemon is listening at `baseUrl`.
132
+ *
133
+ * Uses a lightweight HTTP GET with a 200ms timeout. Result is cached in-process
134
+ * for {@link OLLAMA_PROBE_TTL_MS} (30 seconds) to avoid hammering localhost on
135
+ * every resolve call.
136
+ *
137
+ * Gate-13 note: this is a vanilla `fetch` call to probe localhost, NOT a
138
+ * transport/SDK client construction — Gate-13 does not cover network utility calls.
139
+ *
140
+ * @param baseUrl - Ollama base URL (default: `http://localhost:11434`).
141
+ * @returns `true` if the daemon responded with HTTP 200, `false` otherwise.
142
+ *
143
+ * @task T11978
144
+ */
145
+ export async function probeOllamaAlive(baseUrl) {
146
+ const cached = _ollamaProbeCache.get(baseUrl);
147
+ if (cached && Date.now() - cached.checkedAt < OLLAMA_PROBE_TTL_MS) {
148
+ return cached.alive;
149
+ }
150
+ let alive = false;
151
+ try {
152
+ const controller = new AbortController();
153
+ const timeoutId = setTimeout(() => controller.abort(), OLLAMA_PROBE_TIMEOUT_MS);
154
+ try {
155
+ const res = await fetch(baseUrl, { signal: controller.signal });
156
+ alive = res.ok || res.status < 500;
157
+ }
158
+ finally {
159
+ clearTimeout(timeoutId);
160
+ }
161
+ }
162
+ catch {
163
+ alive = false;
164
+ }
165
+ _ollamaProbeCache.set(baseUrl, { alive, checkedAt: Date.now() });
166
+ return alive;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Ollama RAM-gated model selection
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * Select the appropriate ollama default model based on available RAM (DHQ-081 Q2).
173
+ *
174
+ * RAM gating uses `os.totalmem()` (Node.js built-in, no native addon required).
175
+ * VRAM detection is out-of-scope (deferred to T11982 wizard task).
176
+ *
177
+ * Resolution:
178
+ * - RAM ≥ 8 GB → `gemma4:e4b` for frontier/standard; `gemma4:e2b` for fast/local.
179
+ * - 4 GB ≤ RAM < 8 GB → `gemma4:e2b` for all tiers.
180
+ * - RAM < 4 GB → `qwen2:0.5b` (proof-of-life only; logged as WARNING).
181
+ *
182
+ * Note: `qwen2:0.5b` MUST NOT be selected as a resolver default. It is a
183
+ * last-resort proof-of-life floor for under-resourced machines.
184
+ *
185
+ * These string literals live here (the one allowed location outside
186
+ * `ollama.ts`) because they are DEFAULTS within the selector logic. The
187
+ * profile's `defaultModel`/`defaultAuxModel` fields are the primary SSoT;
188
+ * the selector reads them via `getProviderProfile('ollama')` when available
189
+ * and only falls back to these when the profile is unavailable (defensive).
190
+ *
191
+ * Tags live-verified 2026-06-11 on ollama.com/library/gemma4:
192
+ * - gemma4:e2b = 7.2 GB (Q4_K_M), edge 2B effective params, ≥ 4 GB RAM
193
+ * - gemma4:e4b = 9.6 GB (Q4_K_M), edge 4B effective params, ≥ 8 GB RAM
194
+ * If the catalog does not yet have a `gemma4` family entry, the resolver
195
+ * logs a hint to run `cleo llm refresh-catalog`.
196
+ *
197
+ * @param tier - The task tier for which a model is being selected.
198
+ * @param ramBytesOverride - Override `os.totalmem()` for testing.
199
+ * @returns The model ID string to use for ollama.
200
+ *
201
+ * @task T11978
202
+ */
203
+ export function ollamaDefaultModelForTier(tier, ramBytesOverride) {
204
+ const ramBytes = ramBytesOverride ?? totalmem();
205
+ const gb = ramBytes / 1024 ** 3;
206
+ if (gb >= 8) {
207
+ // High-RAM: use gemma4:e4b for standard/frontier, gemma4:e2b for fast/local
208
+ return tier === 'fast' || tier === 'local' ? 'gemma4:e2b' : 'gemma4:e4b';
209
+ }
210
+ if (gb >= 4) {
211
+ // Mid-RAM: gemma4:e2b for all tiers
212
+ return 'gemma4:e2b';
213
+ }
214
+ // Low-RAM proof-of-life floor — NEVER a default for any task tier
215
+ logger.warn({ ramGb: gb.toFixed(1), tier }, 'cross-provider-selector: RAM < 4 GB; selecting qwen2:0.5b (proof-of-life only — not suitable for production)');
216
+ return 'qwen2:0.5b';
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // Provisioning probe
220
+ // ---------------------------------------------------------------------------
221
+ /**
222
+ * Check whether a provider is provisioned (has at least one usable credential).
223
+ *
224
+ * A provider is provisioned if:
225
+ * - It has a non-expired, non-disabled credential entry in the credentials store, OR
226
+ * - Its canonical env var is set and non-empty in the process environment.
227
+ *
228
+ * Gate-13 compliance: this delegates to `resolveCredentials()` (inside the
229
+ * credential layer) rather than reading `process.env.*_API_KEY` directly.
230
+ *
231
+ * Special case — ollama: ollama does not require a key. It is considered
232
+ * provisioned when `OLLAMA_HOST` is set OR the default localhost URL is
233
+ * reachable (checked by `probeOllamaAlive`). However, `probeOllamaAlive` is
234
+ * async, so the sync provisioning check treats ollama as provisioned if
235
+ * `OLLAMA_HOST` is set OR the store has an entry. Liveness is checked
236
+ * separately during scoring.
237
+ *
238
+ * @param provider - The provider transport ID to check.
239
+ * @returns `true` if the provider has at least one usable credential.
240
+ *
241
+ * @task T11978
242
+ */
243
+ function isProvisioned(provider) {
244
+ // For ollama: check if OLLAMA_HOST is set OR store has an entry.
245
+ // Ollama can run without a key; the env var OLLAMA_HOST signals intent.
246
+ if (provider === 'ollama') {
247
+ if (process.env['OLLAMA_HOST']?.trim())
248
+ return true;
249
+ // Check the credential store (may have a stored base URL / token).
250
+ const stored = pickCredentialForProviderSync(provider, { strategy: 'priorityOnly' });
251
+ return stored !== null;
252
+ }
253
+ // For all other providers: use the sync credential resolver (tier 2+3 only —
254
+ // no project-config look-up needed for provisioning check).
255
+ const cred = resolveCredentials(provider); // llm-resolve-allowed: provisioning probe only — checks if cred exists; never constructs a transport or client
256
+ return (cred.apiKey?.trim().length ?? 0) > 0;
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Scoring
260
+ // ---------------------------------------------------------------------------
261
+ /**
262
+ * Score a provisioned provider for a given task tier.
263
+ *
264
+ * Higher score = preferred. Tie-break by credential priority (lower priority
265
+ * value = higher user-assigned trust) is handled in {@link selectBestProvisioned}.
266
+ *
267
+ * Scoring formula:
268
+ * ```
269
+ * score = TIER_BASE[tier]
270
+ * + TASK_MATCH_BONUS (if tier aligns with taskTier)
271
+ * + LOCALITY_BONUS (local + daemon alive)
272
+ * + PROVISIONED_CLOUD_BIAS (frontier/standard cloud providers with valid cred)
273
+ * - COST_PENALTY (capped at MAX_COST_PENALTY)
274
+ * ```
275
+ *
276
+ * @param provider - The provider transport ID.
277
+ * @param providerTier - The capability tier of the provider.
278
+ * @param taskTier - The capability tier required by the current task.
279
+ * @param ollamaAlive - Whether the ollama daemon is currently reachable.
280
+ * @param costInputPerMillion - Cost per 1M input tokens (from catalog), or 0.
281
+ * @returns The numeric score (higher = preferred).
282
+ *
283
+ * @task T11978
284
+ */
285
+ export function scoreProvider(provider, providerTier, taskTier, ollamaAlive, costInputPerMillion) {
286
+ let score = TIER_BASE[providerTier];
287
+ // Task-match bonus: reward providers whose tier aligns with what the task needs.
288
+ if (taskTier === 'frontier' && providerTier === 'frontier') {
289
+ score += TASK_MATCH_BONUS_FRONTIER;
290
+ }
291
+ else if ((taskTier === 'fast' || taskTier === 'local') &&
292
+ (providerTier === 'fast' || providerTier === 'local')) {
293
+ score += TASK_MATCH_BONUS_FAST;
294
+ }
295
+ // Locality bonus: local provider + daemon confirmed up.
296
+ if (providerTier === 'local' && ollamaAlive) {
297
+ score += LOCALITY_BONUS;
298
+ }
299
+ // Provisioned cloud bias: frontier/standard cloud providers with a valid
300
+ // credential beat a merely-running local ollama for frontier-tier tasks.
301
+ // This implements Q1 ratification: provisioned cloud > running-only local.
302
+ if ((providerTier === 'frontier' || providerTier === 'standard') && provider !== 'ollama') {
303
+ score += PROVISIONED_CLOUD_BIAS;
304
+ }
305
+ // Cost penalty: slight preference for cheaper providers (capped).
306
+ const penalty = Math.min(Math.floor(costInputPerMillion / 10), MAX_COST_PENALTY);
307
+ score -= penalty;
308
+ return score;
309
+ }
310
+ /**
311
+ * Map a role name to a task tier for scoring purposes.
312
+ *
313
+ * @param role - The LLM role name.
314
+ * @returns The task tier for the role.
315
+ *
316
+ * @task T11978
317
+ */
318
+ export function roleTierFor(role) {
319
+ switch (role) {
320
+ case 'consolidation':
321
+ case 'judgement':
322
+ case 'hygiene':
323
+ return 'frontier';
324
+ case 'extraction':
325
+ case 'derivation':
326
+ return 'standard';
327
+ default:
328
+ return 'fast';
329
+ }
330
+ }
331
+ // ---------------------------------------------------------------------------
332
+ // Public API
333
+ // ---------------------------------------------------------------------------
334
+ /**
335
+ * Enumerate all builtin providers with their provisioning state and scores.
336
+ *
337
+ * Used by `cleo llm providers` and `cleo llm health` subcommands to display
338
+ * the full provisioning landscape to the user.
339
+ *
340
+ * @param taskTier - The task tier to score against (defaults to `'frontier'`).
341
+ * @returns Array of provider enumeration records.
342
+ *
343
+ * @task T11978
344
+ */
345
+ export async function enumerateProvisionedProviders(taskTier = 'frontier') {
346
+ // Lazy import to avoid circular deps at module init time.
347
+ const { getProviderProfile } = await import('./provider-registry/index.js');
348
+ const { resolveProviderDefaultModel } = await import('./catalog-model-resolver.js');
349
+ const { listCredentials } = await import('./credentials-store.js');
350
+ const ollamaDefaultBase = 'http://localhost:11434';
351
+ let ollamaAlive = false;
352
+ try {
353
+ ollamaAlive = await probeOllamaAlive(ollamaDefaultBase);
354
+ }
355
+ catch {
356
+ ollamaAlive = false;
357
+ }
358
+ const results = [];
359
+ for (const id of BUILTIN_PROVIDER_IDS) {
360
+ const profile = await getProviderProfile(id);
361
+ const displayName = profile?.displayName ?? id;
362
+ const tier = profile?.tier ?? 'standard';
363
+ // Credential count
364
+ const allCreds = await listCredentials(id);
365
+ const credentialCount = allCreds.length;
366
+ // Provisioning state
367
+ const provisioned = isProvisioned(id);
368
+ const provisioningState = provisioned
369
+ ? 'provisioned'
370
+ : 'not-provisioned';
371
+ // Reachability state
372
+ let reachabilityState = 'no-credential';
373
+ if (provisioned) {
374
+ const cred = resolveCredentials(id); // llm-resolve-allowed: enumeration surface only — never constructs transport or client
375
+ if (cred.apiKey) {
376
+ reachabilityState = 'auth-reachable';
377
+ }
378
+ }
379
+ else if (credentialCount > 0) {
380
+ // Has credentials in store but none are currently eligible
381
+ // (all expired or invalid — we can't distinguish precisely from the public API,
382
+ // so check expiry vs invalid status via store).
383
+ reachabilityState = 'credential-expired';
384
+ }
385
+ // Machine-runnable (ollama only)
386
+ const machineRunnable = tier === 'local' ? ollamaAlive : null;
387
+ // Score
388
+ const resolverScore = provisioned ? scoreProvider(id, tier, taskTier, ollamaAlive, 0) : null;
389
+ // Would-pick model
390
+ let wouldPickModel = null;
391
+ try {
392
+ const { catalogKeyForProvider } = await import('./catalog-model-resolver.js');
393
+ wouldPickModel = resolveProviderDefaultModel(catalogKeyForProvider(id));
394
+ }
395
+ catch {
396
+ wouldPickModel = profile?.defaultModel ?? null;
397
+ }
398
+ if (!wouldPickModel) {
399
+ wouldPickModel = profile?.defaultModel ?? null;
400
+ }
401
+ results.push({
402
+ id,
403
+ displayName,
404
+ tier,
405
+ provisioningState,
406
+ reachabilityState,
407
+ machineRunnable,
408
+ credentialCount,
409
+ resolverScore,
410
+ wouldPickModel,
411
+ wouldPickReason: provisioned ? 'cross-provider-best' : 'not-selected',
412
+ });
413
+ }
414
+ // Mark the actual winner
415
+ const provisioned = results.filter((r) => r.resolverScore !== null);
416
+ if (provisioned.length > 0) {
417
+ const winner = provisioned.reduce((best, r) => (r.resolverScore ?? -Infinity) > (best.resolverScore ?? -Infinity) ? r : best);
418
+ for (const r of results) {
419
+ if (r.id === winner.id) {
420
+ r.wouldPickReason = 'cross-provider-best';
421
+ }
422
+ else if (r.provisioningState === 'not-provisioned') {
423
+ r.wouldPickReason = 'not-selected';
424
+ }
425
+ else {
426
+ r.wouldPickReason = 'not-selected';
427
+ }
428
+ }
429
+ }
430
+ return results;
431
+ }
432
+ /**
433
+ * Select the best provisioned provider for the given role.
434
+ *
435
+ * Called at tier 8 of `selectProviderModel` in `role-resolver.ts`, replacing
436
+ * the unconditional `IMPLICIT_FALLBACK_PROVIDER = 'anthropic'` hardcode.
437
+ *
438
+ * ## Algorithm
439
+ *
440
+ * 1. Enumerate all {@link BUILTIN_PROVIDER_IDS}.
441
+ * 2. Filter to those that are provisioned (cred store or env var).
442
+ * 3. Score each provisioned provider.
443
+ * 4. Pick the highest scorer. Tie-break: lowest credential priority value.
444
+ * 5. Resolve the model via catalog (`resolveProviderDefaultModel`) or
445
+ * provider profile `defaultModel`.
446
+ * 6. For ollama: gate model selection on `os.totalmem()`.
447
+ *
448
+ * ## When nothing is provisioned
449
+ *
450
+ * Returns `null`. The caller falls through to the hardcoded anthropic fallback,
451
+ * preserving backward compatibility.
452
+ *
453
+ * ## Gate-13 compliance
454
+ *
455
+ * Does NOT construct any transport or SDK client. Does NOT read
456
+ * `process.env.*_API_KEY` directly (delegates to credential layer).
457
+ * Does NOT define a new `resolveLLMFor*` function.
458
+ *
459
+ * @param role - The LLM role name (used to derive `taskTier`).
460
+ * @param opts - Options including `projectRoot`.
461
+ * @returns The best {@link SelectedProviderModel}, or `null` if nothing is provisioned.
462
+ *
463
+ * @task T11978
464
+ */
465
+ export async function selectBestProvisioned(role, opts) {
466
+ const taskTier = roleTierFor(role);
467
+ // Collect provisioned providers synchronously first to avoid async overhead
468
+ // when nothing is provisioned (the common case on anthropic-only machines).
469
+ const provisionedIds = [];
470
+ for (const id of BUILTIN_PROVIDER_IDS) {
471
+ if (isProvisioned(id)) {
472
+ provisionedIds.push(id);
473
+ }
474
+ }
475
+ if (provisionedIds.length === 0) {
476
+ logger.warn({
477
+ providers_checked: BUILTIN_PROVIDER_IDS.slice(),
478
+ reason: 'no-provisioned-provider',
479
+ role,
480
+ projectRoot: opts.projectRoot,
481
+ }, 'resolveLLMForSystem: no provider has a usable credential; returning null-credential envelope');
482
+ return null;
483
+ }
484
+ // Lazy imports (avoid circular deps at module init time).
485
+ const { getProviderProfile } = await import('./provider-registry/index.js');
486
+ const { resolveProviderDefaultModel, catalogKeyForProvider } = await import('./catalog-model-resolver.js');
487
+ const { pickCredentialForProvider } = await import('./credentials-store.js');
488
+ // Probe ollama liveness only when ollama is in the provisioned set.
489
+ const ollamaProvisioned = provisionedIds.includes('ollama');
490
+ let ollamaAlive = false;
491
+ if (ollamaProvisioned) {
492
+ const profile = await getProviderProfile('ollama');
493
+ const ollamaBase = profile?.baseUrl ?? 'http://localhost:11434';
494
+ ollamaAlive = await probeOllamaAlive(ollamaBase);
495
+ }
496
+ const scored = [];
497
+ for (const id of provisionedIds) {
498
+ const profile = await getProviderProfile(id);
499
+ const tier = profile?.tier ?? 'standard';
500
+ // Cost info (from catalog, best-effort; 0 if unavailable).
501
+ const costInput = 0;
502
+ // Cost penalty is not implemented here yet; catalog cost lookup is
503
+ // non-trivial and deferred to T11982. Keeping the formula extension point.
504
+ const score = scoreProvider(id, tier, taskTier, ollamaAlive, costInput);
505
+ // Tie-break: get credential priority from the store.
506
+ const storedCred = await pickCredentialForProvider(id, { strategy: 'priorityOnly' });
507
+ const credentialPriority = storedCred?.priority ?? Number.MAX_SAFE_INTEGER;
508
+ scored.push({ id, tier, score, credentialPriority });
509
+ }
510
+ // Sort by score DESC, then credentialPriority ASC (lower = higher trust).
511
+ scored.sort((a, b) => {
512
+ if (b.score !== a.score)
513
+ return b.score - a.score;
514
+ return a.credentialPriority - b.credentialPriority;
515
+ });
516
+ const winner = scored[0];
517
+ if (!winner)
518
+ return null;
519
+ // Resolve model for the winning provider.
520
+ let model;
521
+ if (winner.id === 'ollama') {
522
+ // For ollama: gate on RAM, falling back to profile.defaultModel (gemma3:4b/1b).
523
+ const ollamaProfile = await getProviderProfile('ollama');
524
+ const ramBytes = totalmem();
525
+ const gb = ramBytes / 1024 ** 3;
526
+ if (gb >= 8) {
527
+ model =
528
+ (winner.tier === 'fast' || taskTier === 'fast'
529
+ ? ollamaProfile?.defaultAuxModel
530
+ : ollamaProfile?.defaultModel) ?? ollamaDefaultModelForTier(winner.tier);
531
+ }
532
+ else if (gb >= 4) {
533
+ model = ollamaProfile?.defaultAuxModel ?? 'gemma4:e2b';
534
+ }
535
+ else {
536
+ // Proof-of-life floor — logged as warning by ollamaDefaultModelForTier.
537
+ model = ollamaDefaultModelForTier(winner.tier, ramBytes);
538
+ }
539
+ // Log hint if gemma4 family is not in catalog
540
+ const catalogKey = catalogKeyForProvider(winner.id);
541
+ const catalogModel = resolveProviderDefaultModel(catalogKey);
542
+ if (!catalogModel?.startsWith('gemma4')) {
543
+ logger.info({ provider: 'ollama', selectedModel: model }, 'cross-provider-selector: gemma4 family not in catalog snapshot — run `cleo llm refresh-catalog` to pull latest');
544
+ }
545
+ }
546
+ else {
547
+ // Non-ollama: use catalog default model (latest release_date), fallback to profile.
548
+ try {
549
+ const catalogKey = catalogKeyForProvider(winner.id);
550
+ const catalogModel = resolveProviderDefaultModel(catalogKey);
551
+ const profileModel = (await getProviderProfile(winner.id))?.defaultModel;
552
+ model = catalogModel ?? profileModel ?? 'unknown';
553
+ }
554
+ catch {
555
+ model = (await getProviderProfile(winner.id))?.defaultModel ?? 'unknown';
556
+ }
557
+ }
558
+ logger.debug({
559
+ winner: winner.id,
560
+ score: winner.score,
561
+ taskTier,
562
+ model,
563
+ provisionedCount: provisionedIds.length,
564
+ }, 'cross-provider-selector: selected best provisioned provider');
565
+ return {
566
+ provider: winner.id,
567
+ model,
568
+ credentialLabel: undefined,
569
+ source: 'cross-provider',
570
+ };
571
+ }
572
+ //# sourceMappingURL=cross-provider-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-provider-selector.js","sourceRoot":"","sources":["../../src/llm/cross-provider-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAGvE,MAAM,MAAM,GAAG,SAAS,CAAC,6BAA6B,CAAC,CAAC;AAExD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkC;IACjE,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,SAAS;IACT,UAAU;IACV,KAAK;IACL,MAAM;IACN,WAAW;IACX,QAAQ;CACA,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,SAAS,GAAiC;IAC9C,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,GAAG;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;GAIG;AACH,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,EAAE,CAAC;AACrC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAyEnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,mBAAmB,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,KAAK,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAED,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAkB,EAAE,gBAAyB;IACrF,MAAM,QAAQ,GAAG,gBAAgB,IAAI,QAAQ,EAAE,CAAC;IAChD,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;IAEhC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,4EAA4E;QAC5E,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC3E,CAAC;IACD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,oCAAoC;QACpC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,kEAAkE;IAClE,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAC9B,8GAA8G,CAC/G,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,aAAa,CAAC,QAAwB;IAC7C,iEAAiE;IACjE,wEAAwE;IACxE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACpD,mEAAmE;QACnE,MAAM,MAAM,GAAG,6BAA6B,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QACrF,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IAED,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,+GAA+G;IAC1J,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAwB,EACxB,YAA0B,EAC1B,QAAsB,EACtB,WAAoB,EACpB,mBAA2B;IAE3B,IAAI,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAEpC,iFAAiF;IACjF,IAAI,QAAQ,KAAK,UAAU,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAC3D,KAAK,IAAI,yBAAyB,CAAC;IACrC,CAAC;SAAM,IACL,CAAC,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,CAAC;QAC7C,CAAC,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,OAAO,CAAC,EACrD,CAAC;QACD,KAAK,IAAI,qBAAqB,CAAC;IACjC,CAAC;IAED,wDAAwD;IACxD,IAAI,YAAY,KAAK,OAAO,IAAI,WAAW,EAAE,CAAC;QAC5C,KAAK,IAAI,cAAc,CAAC;IAC1B,CAAC;IAED,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,CAAC,YAAY,KAAK,UAAU,IAAI,YAAY,KAAK,UAAU,CAAC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1F,KAAK,IAAI,sBAAsB,CAAC;IAClC,CAAC;IAED,kEAAkE;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACjF,KAAK,IAAI,OAAO,CAAC;IAEjB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe,CAAC;QACrB,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,WAAyB,UAAU;IAEnC,0DAA0D;IAC1D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC5E,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACpF,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAEnE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;IACnD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAA0B,EAAE,CAAC;IAE1C,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAkB,OAAO,EAAE,IAAiC,IAAI,UAAU,CAAC;QAErF,mBAAmB;QACnB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC;QAExC,qBAAqB;QACrB,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,iBAAiB,GAAsC,WAAW;YACtE,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,iBAAiB,CAAC;QAEtB,qBAAqB;QACrB,IAAI,iBAAiB,GAA6C,eAAe,CAAC;QAClF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,uFAAuF;YAC5H,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,iBAAiB,GAAG,gBAAgB,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAC/B,2DAA2D;YAC3D,gFAAgF;YAChF,gDAAgD;YAChD,iBAAiB,GAAG,oBAAoB,CAAC;QAC3C,CAAC;QAED,iCAAiC;QACjC,MAAM,eAAe,GAAmB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9E,QAAQ;QACR,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7F,mBAAmB;QACnB,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;YAC9E,cAAc,GAAG,2BAA2B,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,EAAE;YACF,WAAW;YACX,IAAI;YACJ,iBAAiB;YACjB,iBAAiB;YACjB,eAAe;YACf,eAAe;YACf,aAAa;YACb,cAAc;YACd,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,cAAc;SACtE,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;IACpE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9E,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;gBACvB,CAAC,CAAC,eAAe,GAAG,qBAAqB,CAAC;YAC5C,CAAC;iBAAM,IAAI,CAAC,CAAC,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;gBACrD,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,IAA6B;IAE7B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAEnC,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,cAAc,GAAqB,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CACT;YACE,iBAAiB,EAAE,oBAAoB,CAAC,KAAK,EAAE;YAC/C,MAAM,EAAE,yBAAyB;YACjC,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,8FAA8F,CAC/F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC5E,MAAM,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CACzE,6BAA6B,CAC9B,CAAC;IACF,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAE7E,oEAAoE;IACpE,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,IAAI,wBAAwB,CAAC;QAChE,WAAW,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAUD,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAkB,OAAO,EAAE,IAAiC,IAAI,UAAU,CAAC;QAErF,2DAA2D;QAC3D,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,mEAAmE;QACnE,2EAA2E;QAE3E,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAExE,qDAAqD;QACrD,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;QACrF,MAAM,kBAAkB,GAAG,UAAU,EAAE,QAAQ,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAE3E,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,0EAA0E;IAC1E,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAClD,OAAO,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,0CAA0C;IAC1C,IAAI,KAAa,CAAC;IAClB,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,gFAAgF;QAChF,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;QAEhC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,KAAK;gBACH,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;oBAC5C,CAAC,CAAC,aAAa,EAAE,eAAe;oBAChC,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACnB,KAAK,GAAG,aAAa,EAAE,eAAe,IAAI,YAAY,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,wEAAwE;YACxE,KAAK,GAAG,yBAAyB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;QAED,8CAA8C;QAC9C,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CACT,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,EAC5C,gHAAgH,CACjH,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,oFAAoF;QACpF,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,YAAY,GAAG,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC;YACzE,KAAK,GAAG,YAAY,IAAI,YAAY,IAAI,SAAS,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,IAAI,SAAS,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CACV;QACE,MAAM,EAAE,MAAM,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ;QACR,KAAK;QACL,gBAAgB,EAAE,cAAc,CAAC,MAAM;KACxC,EACD,6DAA6D,CAC9D,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,KAAK;QACL,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE,gBAAgB;KACzB,CAAC;AACJ,CAAC"}