@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,255 @@
1
+ /**
2
+ * ResourceMonitor — PSI + MemAvailable sensing, daemon-off capable.
3
+ *
4
+ * Two operational modes:
5
+ *
6
+ * 1. **Point-in-time sample** (`ResourceMonitor.sample()`): used inside the
7
+ * governor acquire path when the daemon is off. Single call, bounded reads.
8
+ *
9
+ * 2. **Continuous loop** (`ResourceMonitor.startContinuous()`): used by the
10
+ * daemon/supervisor. Polls at `pollIntervalMs` and emits `ok` → `hold` →
11
+ * `backoff` state transitions with hysteresis.
12
+ *
13
+ * ## State machine
14
+ *
15
+ * ok ──── pressure > holdThreshold ──────→ hold
16
+ * hold ─── pressure < holdThreshold - hyst ─→ ok
17
+ * hold ─── pressure > backoffThreshold ─────→ backoff
18
+ * backoff ─ pressure < holdThreshold - hyst ─→ ok
19
+ *
20
+ * Default thresholds (far below systemd-oomd's Fedora 80%/20s kill line):
21
+ * - hold: some avg10 > 10% OR full avg10 > 5%
22
+ * - backoff: some avg10 > 20% OR full avg10 > 10%
23
+ * - hysteresis: 3 percentage points (prevents thrash on threshold edge)
24
+ *
25
+ * ## Degraded mode
26
+ *
27
+ * When the PSI interface is absent (non-Linux, locked-down container,
28
+ * unprivileged environment), the monitor falls back to availability-only
29
+ * sampling: `pressureAvailable = false`, `state = 'ok'` unless
30
+ * `memAvailableBytes` is below `headroomMb`.
31
+ *
32
+ * ## oomd facts (Amendment 4)
33
+ *
34
+ * systemd-oomd on Fedora defaults to 80%/20s on user@1000.service (NOT
35
+ * the 50%/20s figure cited in older research). Our hold/backoff thresholds
36
+ * sit far below that line — cleo always throttles before oomd kills.
37
+ *
38
+ * ## WAL growth signal (Amendment 3)
39
+ *
40
+ * The monitor accepts an optional watch on SQLite `-wal` sidecar file sizes.
41
+ * A size above `walWarnThresholdBytes` is surfaced in the sample and can
42
+ * drive governor decisions independently of memory pressure.
43
+ *
44
+ * @module resources/monitor
45
+ * @task T11994
46
+ * @epic T11992
47
+ */
48
+ import { EventEmitter } from 'node:events';
49
+ import { LinuxResourceBackend } from './linux-backend.js';
50
+ const DEFAULTS = {
51
+ holdSomeAvg10: 10,
52
+ backoffSomeAvg10: 20,
53
+ holdFullAvg10: 5,
54
+ backoffFullAvg10: 10,
55
+ hysteresisPoints: 3,
56
+ headroomBytes: 256 * 1024 * 1024,
57
+ walWarnThresholdBytes: 256 * 1024 * 1024,
58
+ pollIntervalMs: 1500,
59
+ };
60
+ function resolveThresholds(cfg) {
61
+ return {
62
+ holdSomeAvg10: cfg.psi?.holdSomeAvg10 ?? DEFAULTS.holdSomeAvg10,
63
+ backoffSomeAvg10: cfg.psi?.backoffSomeAvg10 ?? DEFAULTS.backoffSomeAvg10,
64
+ holdFullAvg10: cfg.psi?.holdFullAvg10 ?? DEFAULTS.holdFullAvg10,
65
+ backoffFullAvg10: cfg.psi?.backoffFullAvg10 ?? DEFAULTS.backoffFullAvg10,
66
+ hysteresisPoints: cfg.hysteresisPoints ?? DEFAULTS.hysteresisPoints,
67
+ headroomBytes: cfg.headroomBytes ?? DEFAULTS.headroomBytes,
68
+ walWarnThresholdBytes: cfg.walWarnThresholdBytes ?? DEFAULTS.walWarnThresholdBytes,
69
+ pollIntervalMs: cfg.pollIntervalMs ?? DEFAULTS.pollIntervalMs,
70
+ };
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // State evaluation
74
+ // ---------------------------------------------------------------------------
75
+ /**
76
+ * Evaluate the pressure state given a sample and resolved thresholds.
77
+ *
78
+ * In degraded mode (PSI absent), the state is `hold` only when free memory
79
+ * falls below `headroomBytes`.
80
+ *
81
+ * @internal
82
+ */
83
+ export function evaluateState(sample, thresholds, currentState) {
84
+ if (!sample.pressureAvailable) {
85
+ // Degraded mode — availability-only
86
+ if (sample.memAvailableBytes !== null && sample.memAvailableBytes < thresholds.headroomBytes) {
87
+ return { state: 'hold', reason: 'degraded: memAvailable below headroom' };
88
+ }
89
+ return { state: 'ok', reason: 'degraded: PSI unavailable, memAvailable sufficient' };
90
+ }
91
+ const somePressure = sample.globalPressure?.some ?? sample.slicePressure?.some;
92
+ const fullPressure = sample.globalPressure?.full ?? sample.slicePressure?.full;
93
+ const someAvg10 = somePressure?.avg10 ?? 0;
94
+ const fullAvg10 = fullPressure?.avg10 ?? 0;
95
+ // Backoff threshold (highest severity)
96
+ if (someAvg10 > thresholds.backoffSomeAvg10 || fullAvg10 > thresholds.backoffFullAvg10) {
97
+ return {
98
+ state: 'backoff',
99
+ reason: `some avg10=${someAvg10.toFixed(2)} full avg10=${fullAvg10.toFixed(2)} — above backoff threshold`,
100
+ };
101
+ }
102
+ // Hold threshold
103
+ if (someAvg10 > thresholds.holdSomeAvg10 || fullAvg10 > thresholds.holdFullAvg10) {
104
+ return {
105
+ state: 'hold',
106
+ reason: `some avg10=${someAvg10.toFixed(2)} full avg10=${fullAvg10.toFixed(2)} — above hold threshold`,
107
+ };
108
+ }
109
+ // Hysteresis: only drop to 'ok' if we were already at 'ok', or
110
+ // pressure has fallen below (holdThreshold - hysteresis)
111
+ if (currentState !== 'ok') {
112
+ const hysteresisFloor = thresholds.holdSomeAvg10 - thresholds.hysteresisPoints;
113
+ const fullHysteresisFloor = thresholds.holdFullAvg10 - thresholds.hysteresisPoints;
114
+ if (someAvg10 > hysteresisFloor || fullAvg10 > fullHysteresisFloor) {
115
+ // Still in hysteresis band — stay in current state (clamp to max 'hold')
116
+ const clamped = currentState === 'backoff' ? 'hold' : currentState;
117
+ return {
118
+ state: clamped,
119
+ reason: `some avg10=${someAvg10.toFixed(2)} full avg10=${fullAvg10.toFixed(2)} — hysteresis hold (floor: some ${hysteresisFloor}, full ${fullHysteresisFloor})`,
120
+ };
121
+ }
122
+ }
123
+ return {
124
+ state: 'ok',
125
+ reason: `some avg10=${someAvg10.toFixed(2)} full avg10=${fullAvg10.toFixed(2)} — below thresholds`,
126
+ };
127
+ }
128
+ /**
129
+ * ResourceMonitor — PSI + MemAvailable sensing, daemon-off capable.
130
+ *
131
+ * @example Point-in-time (daemon-off governor acquire):
132
+ * ```ts
133
+ * const monitor = new ResourceMonitor();
134
+ * const sample = await monitor.sample();
135
+ * if (sample.memAvailableBytes !== null && sample.memAvailableBytes < 256 * 1024 * 1024) {
136
+ * throw new Error('insufficient memory');
137
+ * }
138
+ * ```
139
+ *
140
+ * @example Continuous mode (daemon supervisor):
141
+ * ```ts
142
+ * const monitor = new ResourceMonitor({ pollIntervalMs: 1500 });
143
+ * monitor.on('transition', ({ from, to, reason }) => {
144
+ * logger.warn(`pressure: ${from} → ${to} (${reason})`);
145
+ * });
146
+ * const stop = monitor.startContinuous();
147
+ * // later:
148
+ * stop();
149
+ * ```
150
+ */
151
+ export class ResourceMonitor extends EventEmitter {
152
+ thresholds;
153
+ backend;
154
+ _state = 'ok';
155
+ _timer = null;
156
+ _running = false;
157
+ constructor(cfg = {}) {
158
+ super();
159
+ this.thresholds = resolveThresholds(cfg);
160
+ this.backend = cfg.backend ?? new LinuxResourceBackend();
161
+ }
162
+ // -------------------------------------------------------------------------
163
+ // Public API
164
+ // -------------------------------------------------------------------------
165
+ /**
166
+ * Current pressure state (only meaningful after at least one sample).
167
+ */
168
+ get state() {
169
+ return this._state;
170
+ }
171
+ /**
172
+ * `true` while the continuous loop is running.
173
+ */
174
+ get running() {
175
+ return this._running;
176
+ }
177
+ /**
178
+ * Take a single point-in-time resource sample.
179
+ *
180
+ * Safe to call with the daemon off (no child processes, bounded reads).
181
+ * Does NOT update `this.state` — use {@link startContinuous} for that.
182
+ */
183
+ async sample() {
184
+ return this.backend.sample();
185
+ }
186
+ /**
187
+ * Start the continuous polling loop.
188
+ *
189
+ * Returns a `stop()` function. Calling `stop()` is idempotent.
190
+ *
191
+ * Emits:
192
+ * - `'sample'` on every poll (even if state did not change)
193
+ * - `'transition'` when `PressureState` changes
194
+ * - `'error'` if the backend throws (loop continues regardless)
195
+ */
196
+ startContinuous() {
197
+ if (this._running) {
198
+ return () => this._stopLoop();
199
+ }
200
+ this._running = true;
201
+ this._scheduleNext();
202
+ return () => this._stopLoop();
203
+ }
204
+ /**
205
+ * Stop the continuous polling loop. Idempotent.
206
+ */
207
+ stop() {
208
+ this._stopLoop();
209
+ }
210
+ // -------------------------------------------------------------------------
211
+ // Private loop machinery
212
+ // -------------------------------------------------------------------------
213
+ _scheduleNext() {
214
+ this._timer = setTimeout(() => {
215
+ void this._tick();
216
+ }, this.thresholds.pollIntervalMs);
217
+ // Allow the process to exit if this is the only pending callback
218
+ if (typeof this._timer.unref === 'function') {
219
+ this._timer.unref();
220
+ }
221
+ }
222
+ async _tick() {
223
+ if (!this._running)
224
+ return;
225
+ try {
226
+ const sample = await this.backend.sample();
227
+ this.emit('sample', sample);
228
+ const { state: newState, reason } = evaluateState(sample, this.thresholds, this._state);
229
+ if (newState !== this._state) {
230
+ const transition = {
231
+ from: this._state,
232
+ to: newState,
233
+ sample,
234
+ reason,
235
+ };
236
+ this._state = newState;
237
+ this.emit('transition', transition);
238
+ }
239
+ }
240
+ catch (err) {
241
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
242
+ }
243
+ if (this._running) {
244
+ this._scheduleNext();
245
+ }
246
+ }
247
+ _stopLoop() {
248
+ this._running = false;
249
+ if (this._timer !== null) {
250
+ clearTimeout(this._timer);
251
+ this._timer = null;
252
+ }
253
+ }
254
+ }
255
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/resources/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Slice-aware launch-wrapper SSoT (T11993 · Epic T11992).
3
+ *
4
+ * This module is the ONLY constructor of `systemd-run` argv for cleo children.
5
+ * Every consumer that needs to launch a cleo child in a memory-capped cgroup
6
+ * MUST call {@link buildSpawnArgs} or {@link spawnWrapped} here instead of
7
+ * constructing `systemd-run` arguments ad-hoc.
8
+ *
9
+ * ## Design
10
+ *
11
+ * Children are placed inside `cleo.slice` when systemd is available:
12
+ *
13
+ * ```
14
+ * cleo.slice
15
+ * ├── cleo-daemon.service (managed by the daemon service unit)
16
+ * └── cleo-<scopeClass>-<n>.scope (transient scopes for child spawns)
17
+ * ```
18
+ *
19
+ * The slice applies MemoryHigh (primary soft throttle) and MemoryMax (hard
20
+ * safety net) at the slice level, shared across all members. Child scopes
21
+ * inherit these limits and may override them downward.
22
+ *
23
+ * ## Staged P1 budget (IMPORTANT — read before tuning)
24
+ *
25
+ * P1 ships MemoryHigh within 5 % of MemoryMax (80 % / 85 % of a reference
26
+ * host total) so that reclaim stalls under the soft limit NEVER block the
27
+ * SQLite WAL write-transaction held by a slice member. A stalled scope
28
+ * holding a WAL write-txn for > 30 s (busy_timeout) cascades SQLITE_BUSY to
29
+ * every other slice member.
30
+ *
31
+ * **P1 installed values (safe defaults):**
32
+ * - `MemoryHigh = undefined` (disabled — no throttle in P1)
33
+ * - `MemoryMax = 32G` (hard cap, benign cgroup kill)
34
+ *
35
+ * The 60 % / 85 % target shape is documented here and in `DEFAULT_SLICE_CONFIG`
36
+ * as the P2 goal once the stall-escalator (T11994) is in place.
37
+ *
38
+ * **With `MemorySwapMax=0`:** reclaim has only page-cache to chew against
39
+ * `MemoryHigh` on anonymous heaps — admission (P2) becomes the primary
40
+ * control, throttling is not load-bearing in P1.
41
+ *
42
+ * ## oomd-avoid (selective)
43
+ *
44
+ * `ManagedOOMPreference=avoid` is applied ONLY to daemon/db-heavy scope
45
+ * classes (`'daemon'`, `'db'`). Bulk agent/test scopes do NOT get `avoid`
46
+ * because Fedora oomd monitors `user@1000.service` at 80 %/20 s and ranks
47
+ * avoid-marked candidates last — blanket avoid redirects oomd kills onto
48
+ * innocent user apps.
49
+ *
50
+ * ## Fallback
51
+ *
52
+ * On hosts without systemd-run (macOS, CI containers, minimal installs)
53
+ * the wrapper degrades log-once to plain `spawn` in a new process-group
54
+ * with NODE_OPTIONS heap cap inherited from the caller. This is mirrored
55
+ * from the writer-lease `pgid-demotion` pattern.
56
+ *
57
+ * ## Return value — ownership handle (T11998 / T11995)
58
+ *
59
+ * {@link SpawnWrappedResult} carries `{ unitName?, pid, mode }` so the
60
+ * suite-containment epic (T11998) and the janitor (T11995) can look up or
61
+ * clean up the transient scope by unit name.
62
+ *
63
+ * @module @cleocode/core/resources/spawn-wrapper
64
+ * @epic T11992
65
+ * @task T11993
66
+ */
67
+ import { type ChildProcess, spawn } from 'node:child_process';
68
+ /**
69
+ * Scope classes understood by the wrapper.
70
+ *
71
+ * `'daemon'` and `'db'` receive `ManagedOOMPreference=avoid` (write-txn
72
+ * holders must not be oom-killed mid-transaction). All other classes run
73
+ * without the avoid flag.
74
+ */
75
+ export type ScopeClass = 'daemon' | 'db' | 'agent' | 'test' | 'tool';
76
+ /**
77
+ * Memory resource configuration for the slice / scope.
78
+ *
79
+ * Percentages are resolved against the host's MemTotal at build time by
80
+ * {@link buildSpawnArgs}. Pass absolute strings (e.g. `'32G'`, `'768M'`)
81
+ * to bypass percentage resolution.
82
+ */
83
+ export interface SliceResourceConfig {
84
+ /**
85
+ * MemoryHigh for the transient scope.
86
+ *
87
+ * `undefined` (default P1) = disabled (no soft throttle).
88
+ * Set to a fraction in (0, 1) to express as percent of MemTotal, or pass
89
+ * an absolute systemd memory value (`'32G'`, `'2G'`, …`).
90
+ *
91
+ * **P1 default: `undefined`** (disabled). P2 target: `0.60` (60 %).
92
+ */
93
+ memoryHigh?: number | string;
94
+ /**
95
+ * MemoryMax for the transient scope (hard kill ceiling).
96
+ *
97
+ * Default: `'32G'`. P2 target: 85 % of MemTotal (`0.85`).
98
+ */
99
+ memoryMax?: number | string;
100
+ }
101
+ /**
102
+ * Options for {@link buildSpawnArgs}.
103
+ */
104
+ export interface BuildSpawnArgsOptions {
105
+ /**
106
+ * Scope class — controls `ManagedOOMPreference` and the transient unit name
107
+ * prefix.
108
+ *
109
+ * Default: `'agent'`.
110
+ */
111
+ scopeClass?: ScopeClass;
112
+ /**
113
+ * Optional caller-supplied discriminator appended to the unit name so that
114
+ * concurrent same-class scopes are addressable. E.g. a task ID.
115
+ */
116
+ scopeId?: string;
117
+ /**
118
+ * Memory resource overrides. Merged over {@link DEFAULT_SCOPE_RESOURCES}.
119
+ */
120
+ resources?: SliceResourceConfig;
121
+ /**
122
+ * When `true` (default), suppress coredumps by wrapping the inner command
123
+ * as `sh -c 'ulimit -c 0; exec "$@"' sh <cmd> <args...>`.
124
+ *
125
+ * This achieves process-level core suppression without relying on
126
+ * `LimitCORE=0`, which is a service-unit EXEC property and is rejected by
127
+ * `systemd-run --scope` ("Unknown assignment: LimitCORE"). The `ulimit -c 0`
128
+ * approach works identically in the systemd path and the pgid-fallback path,
129
+ * preventing V8-heap-abort and cgroup-kill coredumps from producing
130
+ * abrt-applet toasts on Fedora and Ubuntu.
131
+ *
132
+ * Default: `true`.
133
+ */
134
+ noCoreFile?: boolean;
135
+ }
136
+ /**
137
+ * Result returned by {@link buildSpawnArgs}.
138
+ *
139
+ * `mode = 'systemd'` means the argv leads with `systemd-run`.
140
+ * `mode = 'pgid'` means the fallback path (no systemd-run available).
141
+ */
142
+ export interface SpawnArgsBuildResult {
143
+ /** The command to execute (e.g. `'systemd-run'` or the original command). */
144
+ command: string;
145
+ /** Full argument list, including the original command if wrapped. */
146
+ args: string[];
147
+ /**
148
+ * Whether the child will run inside a systemd transient scope.
149
+ * `false` = plain pgid spawn (no systemd available).
150
+ */
151
+ mode: 'systemd' | 'pgid';
152
+ /**
153
+ * The transient scope unit name (e.g. `cleo-agent-T1234.scope`).
154
+ * `undefined` when `mode = 'pgid'`.
155
+ */
156
+ unitName?: string;
157
+ }
158
+ /**
159
+ * Result returned by {@link spawnWrapped}.
160
+ *
161
+ * Carries the ownership/cleanup handle (T11998 / T11995).
162
+ */
163
+ export interface SpawnWrappedResult {
164
+ /** The spawned child process handle. */
165
+ child: ChildProcess;
166
+ /** PID of the spawned child (may be undefined for detached+unreffed). */
167
+ pid: number | undefined;
168
+ /**
169
+ * Whether the child runs inside a systemd transient scope (`'systemd'`) or
170
+ * in a plain process-group (`'pgid'`).
171
+ */
172
+ mode: 'systemd' | 'pgid';
173
+ /**
174
+ * The transient scope unit name (e.g. `cleo-agent-T1234.scope`).
175
+ * `undefined` when `mode = 'pgid'`.
176
+ *
177
+ * Use this as the cleanup handle in T11998 / T11995:
178
+ * `systemctl --user stop <unitName>`
179
+ */
180
+ unitName?: string;
181
+ }
182
+ /**
183
+ * The systemd user slice that all cleo child scopes are placed under.
184
+ *
185
+ * The slice unit (`~/.config/systemd/user/cleo.slice`) must be installed
186
+ * by the doctor/install flow before this is effective. Placing an orphan
187
+ * scope under a non-existent slice degrades silently to the default slice —
188
+ * so the slice install is best-effort and the wrapper is always safe to call.
189
+ */
190
+ export declare const CLEO_SLICE: "cleo.slice";
191
+ /**
192
+ * Default per-scope memory resource config (P1 staged values).
193
+ *
194
+ * P1: MemoryHigh disabled, MemoryMax=32G.
195
+ * P2 target (after T11994 stall-escalator lands): memoryHigh=0.60, memoryMax=0.85.
196
+ */
197
+ export declare const DEFAULT_SCOPE_RESOURCES: Required<SliceResourceConfig>;
198
+ /**
199
+ * Check whether `systemd-run --user` is usable on this host.
200
+ *
201
+ * Returns `false` on non-Linux, when systemd-run is not on PATH, or when
202
+ * DBUS_SESSION_BUS_ADDRESS / XDG_RUNTIME_DIR are absent (CI containers,
203
+ * ssh sessions without a user bus).
204
+ */
205
+ export declare function hasSystemdRun(): boolean;
206
+ /**
207
+ * Force-override the cached systemd-run availability.
208
+ *
209
+ * Exposed for unit tests that need to exercise the pgid-fallback or
210
+ * systemd paths without the real binary.
211
+ *
212
+ * @param available - `true` = force systemd path, `false` = force pgid path.
213
+ */
214
+ export declare function _forceSystemdRunAvailable(available: boolean): void;
215
+ /**
216
+ * Build the argv for a cleo child spawn.
217
+ *
218
+ * When `systemd-run` is available, the result is:
219
+ *
220
+ * ```
221
+ * ['systemd-run', '--user', '--scope', '--slice=cleo.slice',
222
+ * '--unit=cleo-<class>-<id>.scope',
223
+ * '-p', 'MemoryHigh=<high>', '-p', 'MemoryMax=<max>',
224
+ * '-p', 'MemorySwapMax=0',
225
+ * ['-p', 'ManagedOOMPreference=avoid'], // daemon/db only
226
+ * '--',
227
+ * // when noCoreFile=true (default):
228
+ * 'sh', '-c', 'ulimit -c 0; exec "$@"', 'sh', command, ...args
229
+ * // when noCoreFile=false:
230
+ * command, ...args]
231
+ * ```
232
+ *
233
+ * `LimitCORE` is intentionally NOT used — it is a service-unit EXEC property
234
+ * and is rejected by `systemd-run --scope` with "Unknown assignment: LimitCORE".
235
+ * Core-dump suppression is applied at the process level instead via
236
+ * `ulimit -c 0` (POSIX sh, works in both systemd and pgid-fallback paths).
237
+ *
238
+ * When `systemd-run` is NOT available, the result is `[command, ...args]`
239
+ * (or the sh/ulimit-wrapped form when noCoreFile=true) and `mode` is `'pgid'`.
240
+ *
241
+ * @param command - The executable to run (e.g. `'node'`).
242
+ * @param args - Arguments to pass to the executable.
243
+ * @param opts - Wrapper options (scope class, resources, etc.).
244
+ * @returns Build result with final command, args, mode, and unit name.
245
+ */
246
+ export declare function buildSpawnArgs(command: string, args: readonly string[], opts?: BuildSpawnArgsOptions): SpawnArgsBuildResult;
247
+ /**
248
+ * Spawn a command wrapped in a cleo.slice transient cgroup scope.
249
+ *
250
+ * This is a thin convenience wrapper over {@link buildSpawnArgs} +
251
+ * Node.js `child_process.spawn`. All cleo child spawns SHOULD route through
252
+ * this function instead of constructing `systemd-run` arguments inline.
253
+ *
254
+ * The returned {@link SpawnWrappedResult} carries `unitName` — the systemd
255
+ * transient scope unit name — as the ownership/cleanup handle for
256
+ * T11998 (suite containment) and T11995 (janitor).
257
+ *
258
+ * @param command - The executable to run.
259
+ * @param args - Arguments to pass to the executable.
260
+ * @param spawnOpts - Options forwarded to `child_process.spawn`.
261
+ * @param wrapOpts - Wrapper options (scope class, resources, etc.).
262
+ * @returns Wrapped spawn result.
263
+ */
264
+ export declare function spawnWrapped(command: string, args: readonly string[], spawnOpts?: Parameters<typeof spawn>[2], wrapOpts?: BuildSpawnArgsOptions): SpawnWrappedResult;
265
+ //# sourceMappingURL=spawn-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-wrapper.d.ts","sourceRoot":"","sources":["../../src/resources/spawn-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,EAAa,MAAM,oBAAoB,CAAC;AAQzE;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAEhC;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;OAGG;IACH,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,EAAE,YAAY,CAAC;IACpB,yEAAyE;IACzE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAG,YAAqB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,mBAAmB,CAGjE,CAAC;AAoBF;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAUvC;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAElE;AA4CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,GAAE,qBAA0B,GAC/B,oBAAoB,CA6EtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,SAAS,GAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAM,EAC3C,QAAQ,GAAE,qBAA0B,GACnC,kBAAkB,CASpB"}