@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,524 @@
1
+ /**
2
+ * Service-vault OAuth flow — build / exchange / refresh / self-heal (T11939).
3
+ *
4
+ * EP-UNIVERSAL-SERVICE-VAULT (epic T11765 · saga SG-VAULT-CORE T10409 · M2 W2 ·
5
+ * task T11939). The OAuth dance the foundation (T11937) left a clean seam for.
6
+ * Every function is DRIVEN BY the declarative {@link ServiceProviderDef} from the
7
+ * `SERVICE_PROVIDERS` registry (contracts, T11937 + T11938 breadth) — there is no
8
+ * per-provider code, only data-shaped branches on the provider's `oauth` config
9
+ * and `refresh.kind` discriminant.
10
+ *
11
+ * ## What this module owns (the four entry points)
12
+ *
13
+ * 1. {@link buildAuthUrl} — compose the authorization URL (PKCE S256 + state +
14
+ * provider `extraAuthParams`) for an `oauth2`/`oauth2-pkce` provider, or the
15
+ * device-authorization start for a `device-code` provider.
16
+ * 2. {@link exchangeCode} — POST `grant_type=authorization_code` (+ PKCE
17
+ * verifier) to the token endpoint and PERSIST the resulting
18
+ * `{accessToken, refreshToken}` blob `encryptGlobal`-encrypted via
19
+ * {@link connectService} (the foundation accessor — reused, not reinvented).
20
+ * 3. {@link refreshAccessToken} — refresh an access token honoring the
21
+ * provider's `refresh` config: the `refresh-token` grant (Form/Json body ×
22
+ * Body/BasicAuth client auth) plus the three special variants (`github-app`
23
+ * JWT, `service-account-jwt` bearer, `client-credentials`).
24
+ * 4. {@link selfHealConnection} — the resolve-path self-heal: when a connection's
25
+ * `expires_at` is past, transparently refresh → re-`encryptGlobal` → persist
26
+ * back via the accessor, returning a FRESH {@link SealedCredential} so agents
27
+ * NEVER see a stale token. Cannibalizes onecli `connect.rs::resolve_access_token`.
28
+ *
29
+ * ## Crypto + persistence reuse (DRY — no new crypto, no new store)
30
+ *
31
+ * Encryption is ALWAYS `encryptGlobal` keyed `id = service:${provider}:${label}`
32
+ * (via {@link connectService} / {@link updateConnectionTokens}). The egress handle
33
+ * is the shared {@link makeSealedCredential} — the plaintext materializes ONLY at
34
+ * the wire inside the handle's `fetch()`, never inline on a resolve. HTTP uses the
35
+ * platform `globalThis.fetch` (no new dep) so tests inject a stub.
36
+ *
37
+ * @module store/service-oauth
38
+ * @task T11939
39
+ * @epic T11765
40
+ * @saga T10409
41
+ * @see ../../../contracts/src/vault/service-provider.ts — the DATA that drives this flow
42
+ * @see ./service-connections-accessor.ts — connect/resolve/persist (reused)
43
+ * @see ../llm/oauth/pkce.ts — generatePkcePair / buildAuthorizationUrl (reused)
44
+ * @see ../crypto/credentials.ts — encryptGlobal / decryptGlobal (reused)
45
+ * @see ../../../onecli — apps/gateway/src/{apps.rs,connect.rs} (the ported design)
46
+ */
47
+ import { SERVICE_PROVIDERS } from '@cleocode/contracts';
48
+ import { buildAuthorizationUrl, generatePkcePair } from '../llm/oauth/pkce.js';
49
+ import { makeSealedCredential, tokenPreview } from '../llm/sealed-credential.js';
50
+ import { connectService, loadDecryptedTokenBlob, updateConnectionTokens, } from './service-connections-accessor.js';
51
+ /** Bind the platform fetch lazily so the module imports side-effect-free. */
52
+ const globalFetch = (input, init) => globalThis.fetch(input, init);
53
+ // ---------------------------------------------------------------------------
54
+ // Provider resolution
55
+ // ---------------------------------------------------------------------------
56
+ /**
57
+ * Resolve the {@link ServiceProviderDef} for a provider key, throwing a typed
58
+ * error when unknown.
59
+ *
60
+ * @param provider - The stable provider key (e.g. `'github'`).
61
+ * @returns The declarative provider definition.
62
+ * @throws {Error} `E_SERVICE_PROVIDER_UNKNOWN` when the key is not in the registry.
63
+ * @task T11939
64
+ */
65
+ export function resolveProviderDef(provider) {
66
+ const def = SERVICE_PROVIDERS[provider];
67
+ if (def === undefined) {
68
+ throw new Error(`E_SERVICE_PROVIDER_UNKNOWN: no service provider '${provider}' in registry`);
69
+ }
70
+ return def;
71
+ }
72
+ /** Resolve the provider's OAuth config, throwing when the provider is api-key-only. */
73
+ function requireOAuth(def) {
74
+ if (def.oauth === undefined) {
75
+ throw new Error(`E_SERVICE_OAUTH_UNSUPPORTED: provider '${def.provider}' (authKind=${def.authKind}) has no OAuth config`);
76
+ }
77
+ return def.oauth;
78
+ }
79
+ /**
80
+ * AC1 — build the authorization URL (+ PKCE pair) for an OAuth provider.
81
+ *
82
+ * Generates a fresh PKCE verifier/challenge (RFC 7636 S256) and composes the
83
+ * authorization URL via the reused {@link buildAuthorizationUrl}, appending the
84
+ * provider's declared `extraAuthParams` (e.g. google `access_type=offline`).
85
+ * Returns the verifier + state the caller round-trips through the redirect into
86
+ * {@link exchangeCode}.
87
+ *
88
+ * @param provider - The provider key (must have an `oauth` config).
89
+ * @param opts - Optional state / scope / client-id / redirect overrides (BYOC).
90
+ * @returns The auth URL plus the PKCE verifier and state to round-trip.
91
+ * @throws {Error} When the provider is unknown or api-key-only.
92
+ * @task T11939
93
+ */
94
+ export async function buildAuthUrl(provider, opts = {}) {
95
+ const def = resolveProviderDef(provider);
96
+ const oauth = requireOAuth(def);
97
+ if (oauth.authorizationEndpoint === undefined) {
98
+ throw new Error(`E_SERVICE_OAUTH_NO_AUTH_ENDPOINT: provider '${provider}' has no authorizationEndpoint (device-code flow uses startDeviceAuthorization)`);
99
+ }
100
+ const { codeVerifier, codeChallenge } = await generatePkcePair();
101
+ const state = opts.state ?? generateState();
102
+ const redirectUri = opts.redirectUri ?? oauth.redirectUri ?? 'http://127.0.0.1:7878/callback';
103
+ const scope = opts.scope ?? oauth.scope ?? def.defaultScopes ?? '';
104
+ const authUrl = buildAuthorizationUrl({
105
+ authorizationEndpoint: oauth.authorizationEndpoint,
106
+ clientId: opts.clientId ?? oauth.clientId,
107
+ redirectUri,
108
+ scope,
109
+ codeChallenge,
110
+ state,
111
+ ...(oauth.extraAuthParams !== undefined ? { extraParams: oauth.extraAuthParams } : {}),
112
+ });
113
+ return { authUrl, codeVerifier, state, redirectUri };
114
+ }
115
+ /** Generate an opaque, URL-safe CSRF `state` value. */
116
+ function generateState() {
117
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
118
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
119
+ }
120
+ /**
121
+ * AC1 — exchange an authorization code for tokens and PERSIST them encrypted.
122
+ *
123
+ * POSTs `grant_type=authorization_code` (+ PKCE verifier) to the provider's token
124
+ * endpoint via the reused {@link exchangePkceCode}, then writes the resulting
125
+ * `{accessToken, refreshToken}` blob `encryptGlobal`-encrypted through
126
+ * {@link connectService}. The plaintext token is NEVER returned — only the
127
+ * non-secret connection identity. The expiry is computed from `expires_in`.
128
+ *
129
+ * @param provider - The provider key.
130
+ * @param opts - The code, PKCE verifier, redirect, and connection label.
131
+ * @param deps - Injectable HTTP / clock / vault (test seam).
132
+ * @returns The persisted connection's non-secret identity.
133
+ * @throws {Error} On HTTP failure or a token response missing `access_token`.
134
+ * @task T11939
135
+ */
136
+ export async function exchangeCode(provider, opts, deps = {}) {
137
+ const def = resolveProviderDef(provider);
138
+ const oauth = requireOAuth(def);
139
+ const label = opts.label ?? 'default';
140
+ const fetchImpl = deps.fetch ?? globalFetch;
141
+ // POST grant_type=authorization_code + PKCE verifier through the injectable
142
+ // FetchLike (consistent with the refresh path; lets a test stub the endpoint).
143
+ const form = new URLSearchParams({
144
+ grant_type: 'authorization_code',
145
+ client_id: opts.clientId ?? oauth.clientId,
146
+ code: opts.code,
147
+ code_verifier: opts.codeVerifier,
148
+ redirect_uri: opts.redirectUri,
149
+ });
150
+ const resp = await fetchImpl(oauth.tokenEndpoint, {
151
+ method: 'POST',
152
+ headers: {
153
+ 'Content-Type': 'application/x-www-form-urlencoded',
154
+ Accept: 'application/json',
155
+ },
156
+ body: form.toString(),
157
+ });
158
+ if (!resp.ok) {
159
+ throw new Error(`E_SERVICE_EXCHANGE_HTTP: provider '${provider}' code exchange failed: HTTP ${resp.status}: ${await safeText(resp)}`);
160
+ }
161
+ const data = (await resp.json());
162
+ const accessToken = data['access_token'];
163
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
164
+ const err = typeof data['error'] === 'string' ? data['error'] : 'no access_token';
165
+ throw new Error(`E_SERVICE_EXCHANGE_NO_ACCESS_TOKEN: provider '${provider}': ${err}`);
166
+ }
167
+ const tokens = {
168
+ accessToken,
169
+ refreshToken: typeof data['refresh_token'] === 'string' ? data['refresh_token'] : undefined,
170
+ expiresIn: typeof data['expires_in'] === 'number' ? data['expires_in'] : undefined,
171
+ tokenType: typeof data['token_type'] === 'string' ? data['token_type'] : 'bearer',
172
+ };
173
+ const expiresAt = computeExpiresAt(tokens.expiresIn, deps.now);
174
+ const blob = {
175
+ accessToken: tokens.accessToken,
176
+ ...(tokens.refreshToken !== undefined ? { refreshToken: tokens.refreshToken } : {}),
177
+ };
178
+ const connectionId = await connectService({
179
+ provider,
180
+ label,
181
+ tokens: blob,
182
+ scopes: (oauth.scope ?? def.defaultScopes ?? '').split(' ').filter((s) => s.length > 0),
183
+ ...(expiresAt !== null ? { expiresAt } : {}),
184
+ ...(opts.metadata !== undefined ? { metadata: opts.metadata } : {}),
185
+ }, deps.vault);
186
+ return {
187
+ connectionId,
188
+ provider,
189
+ label,
190
+ expiresAt,
191
+ hasRefreshToken: tokens.refreshToken !== undefined,
192
+ };
193
+ }
194
+ /**
195
+ * AC2 — refresh an access token honoring the provider's declared refresh config.
196
+ *
197
+ * Branches on {@link RefreshConfig.kind}:
198
+ *
199
+ * - `refresh-token` — `grant_type=refresh_token` shaped by `bodyFormat`
200
+ * (Form/Json) × `clientAuth` (Body/BasicAuth). The common OAuth case.
201
+ * - `github-app` — sign an RS256 JWT with the app key, POST
202
+ * `/app/installations/{id}/access_tokens`.
203
+ * - `service-account-jwt` — sign an RS256 JWT, exchange via
204
+ * `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer`.
205
+ * - `client-credentials` — `grant_type=client_credentials`, Basic-auth client.
206
+ *
207
+ * Returns normalized {@link OAuthTokens} (a fresh access token + optional rotated
208
+ * refresh token). PERSISTENCE is the caller's job ({@link selfHealConnection}
209
+ * does it); this function is pure HTTP + crypto so it is independently testable.
210
+ *
211
+ * @param provider - The provider key.
212
+ * @param opts - The refresh token / client credentials / variant secrets.
213
+ * @param deps - Injectable HTTP / clock (test seam).
214
+ * @returns The refreshed tokens.
215
+ * @throws {Error} When the provider declares no refresh, or the exchange fails.
216
+ * @task T11939
217
+ */
218
+ export async function refreshAccessToken(provider, opts, deps = {}) {
219
+ const def = resolveProviderDef(provider);
220
+ const refresh = def.refresh;
221
+ if (refresh === undefined) {
222
+ throw new Error(`E_SERVICE_REFRESH_UNSUPPORTED: provider '${provider}' declares no refresh config`);
223
+ }
224
+ const fetchImpl = deps.fetch ?? globalFetch;
225
+ switch (refresh.kind) {
226
+ case 'refresh-token':
227
+ return refreshViaRefreshToken(provider, refresh, opts, fetchImpl);
228
+ case 'github-app':
229
+ return refreshViaGithubApp(refresh, opts, fetchImpl, deps.now);
230
+ case 'service-account-jwt':
231
+ return refreshViaServiceAccount(refresh, opts, fetchImpl, deps.now);
232
+ case 'client-credentials':
233
+ return refreshViaClientCredentials(refresh, opts, fetchImpl);
234
+ default: {
235
+ // Exhaustiveness guard — a new RefreshKind must extend this switch.
236
+ const never = refresh.kind;
237
+ throw new Error(`E_SERVICE_REFRESH_KIND_UNKNOWN: ${String(never)}`);
238
+ }
239
+ }
240
+ }
241
+ /** `grant_type=refresh_token` — Form/Json body × Body/BasicAuth client auth. */
242
+ async function refreshViaRefreshToken(provider, refresh, opts, fetchImpl) {
243
+ const refreshToken = opts.refreshToken;
244
+ if (refreshToken === undefined || refreshToken.length === 0) {
245
+ throw new Error(`E_SERVICE_REFRESH_NO_TOKEN: provider '${provider}' refresh requires a token`);
246
+ }
247
+ const bodyFormat = refresh.bodyFormat ?? 'form';
248
+ const clientAuth = refresh.clientAuth ?? 'body';
249
+ const clientId = opts.client?.clientId;
250
+ const clientSecret = opts.client?.clientSecret;
251
+ const headers = { Accept: 'application/json' };
252
+ // BasicAuth presents the client credentials as an Authorization header.
253
+ if (clientAuth === 'basic-auth' && clientId !== undefined && clientSecret !== undefined) {
254
+ headers['authorization'] = `Basic ${base64(`${clientId}:${clientSecret}`)}`;
255
+ }
256
+ let body;
257
+ if (bodyFormat === 'json') {
258
+ headers['Content-Type'] = 'application/json';
259
+ const json = {
260
+ refresh_token: refreshToken,
261
+ grant_type: 'refresh_token',
262
+ };
263
+ if (clientAuth === 'body' && clientId !== undefined && clientSecret !== undefined) {
264
+ json['client_id'] = clientId;
265
+ json['client_secret'] = clientSecret;
266
+ }
267
+ body = JSON.stringify(json);
268
+ }
269
+ else {
270
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
271
+ const form = new URLSearchParams({
272
+ refresh_token: refreshToken,
273
+ grant_type: 'refresh_token',
274
+ });
275
+ if (clientAuth === 'body' && clientId !== undefined && clientSecret !== undefined) {
276
+ form.set('client_id', clientId);
277
+ form.set('client_secret', clientSecret);
278
+ }
279
+ body = form.toString();
280
+ }
281
+ const resp = await fetchImpl(refresh.tokenUrl, { method: 'POST', headers, body });
282
+ return parseRefreshResponse(provider, resp);
283
+ }
284
+ /** `grant_type=client_credentials` — Basic-auth client (e.g. MongoDB Atlas SAs). */
285
+ async function refreshViaClientCredentials(refresh, opts, fetchImpl) {
286
+ const clientId = opts.client?.clientId;
287
+ const clientSecret = opts.client?.clientSecret;
288
+ if (clientId === undefined || clientSecret === undefined) {
289
+ throw new Error('E_SERVICE_REFRESH_NO_CLIENT: client_credentials refresh requires clientId + clientSecret');
290
+ }
291
+ const resp = await fetchImpl(refresh.tokenUrl, {
292
+ method: 'POST',
293
+ headers: {
294
+ Authorization: `Basic ${base64(`${clientId}:${clientSecret}`)}`,
295
+ 'Content-Type': 'application/x-www-form-urlencoded',
296
+ Accept: 'application/json',
297
+ },
298
+ body: 'grant_type=client_credentials',
299
+ });
300
+ return parseRefreshResponse('client-credentials', resp);
301
+ }
302
+ /**
303
+ * GitHub App installation token — sign an RS256 JWT with the app key, exchange at
304
+ * `/app/installations/{id}/access_tokens`. The response shape differs (`token` +
305
+ * `expires_at`), normalized here to {@link OAuthTokens}.
306
+ */
307
+ async function refreshViaGithubApp(refresh, opts, fetchImpl, now) {
308
+ const { privateKeyPem, appId, installationId } = opts.variant ?? {};
309
+ if (privateKeyPem === undefined || appId === undefined || installationId === undefined) {
310
+ throw new Error('E_SERVICE_REFRESH_GITHUB_APP: github-app refresh requires privateKeyPem + appId + installationId');
311
+ }
312
+ const nowSec = Math.floor((now?.() ?? Date.now()) / 1000);
313
+ const jwt = await signRs256Jwt({ alg: 'RS256', typ: 'JWT' }, { iss: appId, iat: nowSec - 60, exp: nowSec + 600 }, privateKeyPem);
314
+ const url = `${refresh.tokenUrl}/${installationId}/access_tokens`;
315
+ const resp = await fetchImpl(url, {
316
+ method: 'POST',
317
+ headers: {
318
+ Authorization: `Bearer ${jwt}`,
319
+ Accept: 'application/vnd.github+json',
320
+ 'X-GitHub-Api-Version': '2022-11-28',
321
+ 'User-Agent': 'cleo-service-vault',
322
+ },
323
+ });
324
+ if (!resp.ok) {
325
+ throw new Error(`E_SERVICE_REFRESH_GITHUB_APP_HTTP: HTTP ${resp.status}: ${await safeText(resp)}`);
326
+ }
327
+ const data = (await resp.json());
328
+ const token = data['token'];
329
+ if (typeof token !== 'string' || token.length === 0) {
330
+ throw new Error('E_SERVICE_REFRESH_GITHUB_APP_NO_TOKEN: installation token response missing token');
331
+ }
332
+ // GitHub returns an ISO `expires_at`; derive seconds-until for the common shape.
333
+ const expiresAtIso = typeof data['expires_at'] === 'string' ? data['expires_at'] : undefined;
334
+ const expiresIn = expiresAtIso !== undefined
335
+ ? Math.max(0, Math.floor((Date.parse(expiresAtIso) - (now?.() ?? Date.now())) / 1000))
336
+ : 3600;
337
+ return { accessToken: token, expiresIn, tokenType: 'bearer' };
338
+ }
339
+ /**
340
+ * Google service-account — sign an RS256 JWT and exchange via the jwt-bearer
341
+ * grant at the provider's token endpoint.
342
+ */
343
+ async function refreshViaServiceAccount(refresh, opts, fetchImpl, now) {
344
+ const { privateKeyPem, clientEmail } = opts.variant ?? {};
345
+ if (privateKeyPem === undefined || clientEmail === undefined) {
346
+ throw new Error('E_SERVICE_REFRESH_SERVICE_ACCOUNT: service-account-jwt refresh requires privateKeyPem + clientEmail');
347
+ }
348
+ const nowSec = Math.floor((now?.() ?? Date.now()) / 1000);
349
+ const assertion = await signRs256Jwt({ alg: 'RS256', typ: 'JWT' }, {
350
+ iss: clientEmail,
351
+ sub: clientEmail,
352
+ aud: refresh.tokenUrl,
353
+ scope: 'https://www.googleapis.com/auth/cloud-platform',
354
+ iat: nowSec,
355
+ exp: nowSec + 3600,
356
+ }, privateKeyPem);
357
+ const resp = await fetchImpl(refresh.tokenUrl, {
358
+ method: 'POST',
359
+ headers: {
360
+ 'Content-Type': 'application/x-www-form-urlencoded',
361
+ Accept: 'application/json',
362
+ },
363
+ body: new URLSearchParams({
364
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
365
+ assertion,
366
+ }).toString(),
367
+ });
368
+ return parseRefreshResponse('service-account', resp);
369
+ }
370
+ /**
371
+ * AC3 — resolve a connection, transparently refreshing a PAST-EXPIRY token.
372
+ *
373
+ * The self-heal resolve path (cannibalized from onecli
374
+ * `connect.rs::resolve_access_token`):
375
+ *
376
+ * 1. Read the connection's non-secret view (`expiresAt`).
377
+ * 2. If `expiresAt` is past (within `skewSeconds`) AND a refresh token exists:
378
+ * refresh via {@link refreshAccessToken}, re-`encryptGlobal` the new blob, and
379
+ * persist it back via {@link updateConnectionTokens} — so the NEXT resolve and
380
+ * every other agent see the fresh token.
381
+ * 3. Return a FRESH {@link SealedCredential} resolving against the (now-current)
382
+ * stored blob. A stale token is NEVER handed out: the heal runs BEFORE the
383
+ * sealed handle is built, and the handle decrypts the persisted (fresh) blob.
384
+ *
385
+ * The trust gate runs inside the accessor's resolve — a denied agent gets `null`
386
+ * with NO refresh and NO decrypt.
387
+ *
388
+ * @param connectionRef - The agent + provider + label, plus refresh credentials.
389
+ * @param deps - Injectable HTTP / clock / vault (test seam — the fake clock proves
390
+ * the past-expiry branch fires).
391
+ * @returns The fresh sealed credential + whether a refresh fired.
392
+ * @task T11939
393
+ */
394
+ export async function selfHealConnection(connectionRef, deps = {}) {
395
+ const { agentId, provider, label } = connectionRef;
396
+ const nowMs = deps.now?.() ?? Date.now();
397
+ const skewMs = (connectionRef.skewSeconds ?? 0) * 1000;
398
+ // 1. Load the decrypted blob + expiry (gated: the accessor enforces the trust
399
+ // gate and only decrypts on allow). A denied/missing connection → null.
400
+ const loaded = await loadDecryptedTokenBlob({
401
+ agentId,
402
+ provider,
403
+ label,
404
+ ...(connectionRef.approved !== undefined ? { approved: connectionRef.approved } : {}),
405
+ }, deps.vault);
406
+ if (loaded === null) {
407
+ return { sealed: null, refreshed: false, expiresAt: null };
408
+ }
409
+ let { blob, expiresAt } = loaded;
410
+ let refreshed = false;
411
+ // 2. Past expiry (within skew) AND refreshable → transparent refresh + persist.
412
+ const expiryMs = expiresAt !== null ? Date.parse(expiresAt) : Number.NaN;
413
+ const isPast = !Number.isNaN(expiryMs) && expiryMs - skewMs <= nowMs;
414
+ if (isPast && blob.refreshToken !== undefined && def_isRefreshable(provider)) {
415
+ const fresh = await refreshAccessToken(provider, {
416
+ refreshToken: blob.refreshToken,
417
+ ...(connectionRef.client !== undefined ? { client: connectionRef.client } : {}),
418
+ ...(connectionRef.variant !== undefined ? { variant: connectionRef.variant } : {}),
419
+ }, deps);
420
+ const newExpiresAt = computeExpiresAt(fresh.expiresIn, deps.now);
421
+ const newBlob = {
422
+ accessToken: fresh.accessToken,
423
+ // Honor refresh-token rotation; else keep the existing one.
424
+ refreshToken: fresh.refreshToken ?? blob.refreshToken,
425
+ };
426
+ await updateConnectionTokens({ provider, label, tokens: newBlob, expiresAt: newExpiresAt }, deps.vault);
427
+ blob = newBlob;
428
+ expiresAt = newExpiresAt;
429
+ refreshed = true;
430
+ }
431
+ // 3. Build a sealed handle over the (now-fresh) access token. The plaintext
432
+ // only materializes at the wire inside fetch().
433
+ const freshAccessToken = blob.accessToken;
434
+ const sealed = makeSealedCredential({
435
+ provider,
436
+ account: label,
437
+ tokenPreview: tokenPreview('', 'oauth'),
438
+ resolveToken: () => freshAccessToken,
439
+ });
440
+ return { sealed, refreshed, expiresAt };
441
+ }
442
+ /** Whether the provider declares a refresh config (drives the self-heal branch). */
443
+ function def_isRefreshable(provider) {
444
+ return SERVICE_PROVIDERS[provider]?.refresh !== undefined;
445
+ }
446
+ // ---------------------------------------------------------------------------
447
+ // Shared helpers (HTTP parse, expiry, base64, RS256 JWT)
448
+ // ---------------------------------------------------------------------------
449
+ /** Parse a token-endpoint response into normalized {@link OAuthTokens}. */
450
+ async function parseRefreshResponse(provider, resp) {
451
+ if (!resp.ok) {
452
+ throw new Error(`E_SERVICE_REFRESH_HTTP: provider '${provider}' refresh failed: HTTP ${resp.status}: ${await safeText(resp)}`);
453
+ }
454
+ const data = (await resp.json());
455
+ const accessToken = data['access_token'];
456
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
457
+ const err = typeof data['error'] === 'string' ? data['error'] : 'no access_token';
458
+ throw new Error(`E_SERVICE_REFRESH_NO_ACCESS_TOKEN: provider '${provider}': ${err}`);
459
+ }
460
+ return {
461
+ accessToken,
462
+ refreshToken: typeof data['refresh_token'] === 'string' ? data['refresh_token'] : undefined,
463
+ expiresIn: typeof data['expires_in'] === 'number' ? data['expires_in'] : undefined,
464
+ tokenType: typeof data['token_type'] === 'string' ? data['token_type'] : 'bearer',
465
+ };
466
+ }
467
+ /** Read a response body as text without throwing (for error detail). */
468
+ async function safeText(resp) {
469
+ try {
470
+ return (await resp.text()).slice(0, 512);
471
+ }
472
+ catch {
473
+ return '';
474
+ }
475
+ }
476
+ /** Compute an ISO-8601 expiry from `expires_in` seconds, or `null` when absent. */
477
+ function computeExpiresAt(expiresIn, now) {
478
+ if (expiresIn === undefined)
479
+ return null;
480
+ return new Date((now?.() ?? Date.now()) + expiresIn * 1000).toISOString();
481
+ }
482
+ /** Base64-encode a UTF-8 string (Node Buffer; platform-available). */
483
+ function base64(input) {
484
+ return Buffer.from(input, 'utf-8').toString('base64');
485
+ }
486
+ /** Base64url-encode bytes (no padding) for JWT segments. */
487
+ function base64url(bytes) {
488
+ return Buffer.from(bytes)
489
+ .toString('base64')
490
+ .replace(/\+/g, '-')
491
+ .replace(/\//g, '_')
492
+ .replace(/=+$/, '');
493
+ }
494
+ /**
495
+ * Sign a compact RS256 JWT using Web Crypto (no new dep — replaces the Rust
496
+ * `jsonwebtoken` crate). Used by the github-app + service-account-jwt variants.
497
+ *
498
+ * @param header - The JOSE header (`{ alg: 'RS256', typ: 'JWT' }`).
499
+ * @param claims - The claim set.
500
+ * @param privateKeyPem - The RSA private key in PKCS#8 PEM.
501
+ * @returns The signed compact JWT.
502
+ */
503
+ async function signRs256Jwt(header, claims, privateKeyPem) {
504
+ const enc = new TextEncoder();
505
+ const headerB64 = base64url(enc.encode(JSON.stringify(header)));
506
+ const claimsB64 = base64url(enc.encode(JSON.stringify(claims)));
507
+ const signingInput = `${headerB64}.${claimsB64}`;
508
+ const key = await crypto.subtle.importKey('pkcs8', pemToPkcs8(privateKeyPem), { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, ['sign']);
509
+ const signature = await crypto.subtle.sign('RSASSA-PKCS1-v1_5', key, enc.encode(signingInput));
510
+ return `${signingInput}.${base64url(new Uint8Array(signature))}`;
511
+ }
512
+ /** Decode a PKCS#8 PEM private key to its DER bytes. */
513
+ function pemToPkcs8(pem) {
514
+ const body = pem
515
+ .replace(/-----BEGIN [^-]+-----/, '')
516
+ .replace(/-----END [^-]+-----/, '')
517
+ .replace(/\s+/g, '');
518
+ const der = Buffer.from(body, 'base64');
519
+ // Return a copy as a standalone ArrayBuffer (avoids SharedArrayBuffer typing).
520
+ const out = new ArrayBuffer(der.byteLength);
521
+ new Uint8Array(out).set(der);
522
+ return out;
523
+ }
524
+ //# sourceMappingURL=service-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-oauth.js","sourceRoot":"","sources":["../../src/store/service-oauth.ts"],"names":[],"mappings":"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"}