@open-mercato/cezar 0.9.1 → 0.9.2-pr772.1071

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 (355) hide show
  1. package/README.md +36 -17
  2. package/dist/agent-config/account-identity.d.ts +44 -0
  3. package/dist/agent-config/account-identity.js +128 -0
  4. package/dist/agent-config/account-identity.js.map +1 -0
  5. package/dist/agent-config/catalog.d.ts +9 -1
  6. package/dist/agent-config/catalog.js +18 -0
  7. package/dist/agent-config/catalog.js.map +1 -1
  8. package/dist/agent-config/files.d.ts +1 -1
  9. package/dist/agent-config/model-settings/claude.d.ts +2 -0
  10. package/dist/agent-config/model-settings/claude.js +11 -0
  11. package/dist/agent-config/model-settings/claude.js.map +1 -0
  12. package/dist/agent-config/model-settings/codex.d.ts +2 -0
  13. package/dist/agent-config/model-settings/codex.js +16 -0
  14. package/dist/agent-config/model-settings/codex.js.map +1 -0
  15. package/dist/agent-config/model-settings/opencode.d.ts +2 -0
  16. package/dist/agent-config/model-settings/opencode.js +8 -0
  17. package/dist/agent-config/model-settings/opencode.js.map +1 -0
  18. package/dist/agent-config/model-settings/shared.d.ts +9 -0
  19. package/dist/agent-config/model-settings/shared.js +93 -0
  20. package/dist/agent-config/model-settings/shared.js.map +1 -0
  21. package/dist/agent-config/model-settings/types.d.ts +9 -0
  22. package/dist/agent-config/model-settings/types.js +2 -0
  23. package/dist/agent-config/model-settings/types.js.map +1 -0
  24. package/dist/agent-config/models.d.ts +9 -0
  25. package/dist/agent-config/models.js +30 -0
  26. package/dist/agent-config/models.js.map +1 -0
  27. package/dist/agent-config/service.d.ts +1 -1
  28. package/dist/agent-config/service.js +4 -4
  29. package/dist/agent-config/service.js.map +1 -1
  30. package/dist/agent-config/validate.d.ts +1 -1
  31. package/dist/automations/coordinator.d.ts +26 -0
  32. package/dist/automations/coordinator.js +66 -0
  33. package/dist/automations/coordinator.js.map +1 -0
  34. package/dist/automations/github-poller.d.ts +74 -0
  35. package/dist/automations/github-poller.js +234 -0
  36. package/dist/automations/github-poller.js.map +1 -0
  37. package/dist/automations/scheduler.d.ts +42 -0
  38. package/dist/automations/scheduler.js +192 -0
  39. package/dist/automations/scheduler.js.map +1 -0
  40. package/dist/automations/store.d.ts +65 -0
  41. package/dist/automations/store.js +298 -0
  42. package/dist/automations/store.js.map +1 -0
  43. package/dist/automations/task-template.d.ts +18 -0
  44. package/dist/automations/task-template.js +95 -0
  45. package/dist/automations/task-template.js.map +1 -0
  46. package/dist/automations/types.d.ts +251 -0
  47. package/dist/automations/types.js +158 -0
  48. package/dist/automations/types.js.map +1 -0
  49. package/dist/config.d.ts +17 -112
  50. package/dist/config.js +45 -4
  51. package/dist/config.js.map +1 -1
  52. package/dist/contract/agent-config.d.ts +151 -0
  53. package/dist/contract/agent-profiles.d.ts +332 -0
  54. package/dist/contract/automations.d.ts +919 -0
  55. package/dist/contract/events.d.ts +45 -0
  56. package/dist/contract/github.d.ts +467 -0
  57. package/dist/contract/health.d.ts +96 -0
  58. package/dist/contract/index.d.ts +16 -0
  59. package/dist/contract/index.js +1614 -0
  60. package/dist/contract/projects.d.ts +185 -0
  61. package/dist/contract/repo.d.ts +234 -0
  62. package/dist/contract/runs.d.ts +1261 -0
  63. package/dist/contract/skills.d.ts +229 -0
  64. package/dist/contract/workflows.d.ts +212 -0
  65. package/dist/contract/workspace.d.ts +490 -0
  66. package/dist/core/agent-env.d.ts +1 -1
  67. package/dist/core/agent-model-policy.d.ts +10 -0
  68. package/dist/core/agent-model-policy.js +36 -0
  69. package/dist/core/agent-model-policy.js.map +1 -0
  70. package/dist/core/agent-profiles.d.ts +59 -0
  71. package/dist/core/agent-profiles.js +83 -0
  72. package/dist/core/agent-profiles.js.map +1 -0
  73. package/dist/core/agent-runner.d.ts +12 -1
  74. package/dist/core/agent-runner.js +13 -0
  75. package/dist/core/agent-runner.js.map +1 -1
  76. package/dist/core/ask.d.ts +45 -124
  77. package/dist/core/ask.js +103 -13
  78. package/dist/core/ask.js.map +1 -1
  79. package/dist/core/backend-detect.js +7 -2
  80. package/dist/core/backend-detect.js.map +1 -1
  81. package/dist/core/claude-cli-runner.d.ts +2 -2
  82. package/dist/core/claude-cli-runner.js +52 -9
  83. package/dist/core/claude-cli-runner.js.map +1 -1
  84. package/dist/core/claude-ui-mapper.d.ts +1 -1
  85. package/dist/core/codex-app-server-runner.d.ts +1 -1
  86. package/dist/core/codex-app-server-runner.js +60 -3
  87. package/dist/core/codex-app-server-runner.js.map +1 -1
  88. package/dist/core/codex-app-server-transport.d.ts +6 -1
  89. package/dist/core/codex-app-server-transport.js +12 -3
  90. package/dist/core/codex-app-server-transport.js.map +1 -1
  91. package/dist/core/codex-model-catalog.d.ts +1 -1
  92. package/dist/core/codex-ui-mapper.d.ts +5 -1
  93. package/dist/core/codex-ui-mapper.js +74 -17
  94. package/dist/core/codex-ui-mapper.js.map +1 -1
  95. package/dist/core/model-identity.d.ts +13 -6
  96. package/dist/core/model-identity.js +32 -17
  97. package/dist/core/model-identity.js.map +1 -1
  98. package/dist/core/model-presets.d.ts +2 -2
  99. package/dist/core/model-presets.js +1 -1
  100. package/dist/core/opencode-server-runner.d.ts +2 -2
  101. package/dist/core/opencode-ui-mapper.d.ts +4 -1
  102. package/dist/core/opencode-ui-mapper.js +45 -7
  103. package/dist/core/opencode-ui-mapper.js.map +1 -1
  104. package/dist/core/provider-auth.d.ts +154 -0
  105. package/dist/core/provider-auth.js +488 -0
  106. package/dist/core/provider-auth.js.map +1 -0
  107. package/dist/core/provider-availability.d.ts +3 -0
  108. package/dist/core/provider-availability.js +14 -0
  109. package/dist/core/provider-availability.js.map +1 -0
  110. package/dist/core/runner-factory.d.ts +1 -1
  111. package/dist/core/runner-model-catalog.d.ts +1 -1
  112. package/dist/core/shell-env.d.ts +28 -0
  113. package/dist/core/shell-env.js +56 -0
  114. package/dist/core/shell-env.js.map +1 -0
  115. package/dist/core/tool-display.d.ts +1 -1
  116. package/dist/core/ui-events.d.ts +1 -1
  117. package/dist/core/ui-events.js +1 -1
  118. package/dist/core/usage-limit.d.ts +42 -0
  119. package/dist/core/usage-limit.js +209 -0
  120. package/dist/core/usage-limit.js.map +1 -0
  121. package/dist/git-diff-base.d.ts +60 -0
  122. package/dist/git-diff-base.js +54 -0
  123. package/dist/git-diff-base.js.map +1 -0
  124. package/dist/git-worktree.d.ts +37 -6
  125. package/dist/git-worktree.js +39 -9
  126. package/dist/git-worktree.js.map +1 -1
  127. package/dist/handoff.d.ts +2 -2
  128. package/dist/handoff.js +1 -1
  129. package/dist/index.js +65 -8
  130. package/dist/index.js.map +1 -1
  131. package/dist/paths.d.ts +69 -6
  132. package/dist/paths.js +86 -9
  133. package/dist/paths.js.map +1 -1
  134. package/dist/planner.d.ts +2 -2
  135. package/dist/planner.js +7 -1
  136. package/dist/planner.js.map +1 -1
  137. package/dist/release/manifests.d.ts +81 -0
  138. package/dist/release/manifests.js +74 -0
  139. package/dist/release/manifests.js.map +1 -0
  140. package/dist/release/snapshot.d.ts +9 -23
  141. package/dist/release/snapshot.js +9 -22
  142. package/dist/release/snapshot.js.map +1 -1
  143. package/dist/release/stable.d.ts +15 -29
  144. package/dist/release/stable.js +14 -27
  145. package/dist/release/stable.js.map +1 -1
  146. package/dist/runs/auto-name.d.ts +1 -1
  147. package/dist/runs/auto-name.js +6 -1
  148. package/dist/runs/auto-name.js.map +1 -1
  149. package/dist/runs/retention.d.ts +1 -1
  150. package/dist/runs/store.d.ts +149 -336
  151. package/dist/runs/store.js +187 -9
  152. package/dist/runs/store.js.map +1 -1
  153. package/dist/runs/ui-event-sink.d.ts +1 -1
  154. package/dist/server/app-type.d.ts +21 -0
  155. package/dist/server/app-type.js +2 -0
  156. package/dist/server/app-type.js.map +1 -0
  157. package/dist/server/capabilities.d.ts +6 -5
  158. package/dist/server/capabilities.js +11 -0
  159. package/dist/server/capabilities.js.map +1 -1
  160. package/dist/server/forge/github.d.ts +58 -151
  161. package/dist/server/forge/github.js +530 -6
  162. package/dist/server/forge/github.js.map +1 -1
  163. package/dist/server/forge/index.d.ts +10 -3
  164. package/dist/server/forge/index.js +14 -1
  165. package/dist/server/forge/index.js.map +1 -1
  166. package/dist/server/forge/types.d.ts +86 -1
  167. package/dist/server/git-changes.d.ts +8 -8
  168. package/dist/server/git-changes.js +14 -17
  169. package/dist/server/git-changes.js.map +1 -1
  170. package/dist/server/git.d.ts +2 -0
  171. package/dist/server/git.js +9 -0
  172. package/dist/server/git.js.map +1 -1
  173. package/dist/server/github.d.ts +3 -3
  174. package/dist/server/github.js +1 -1
  175. package/dist/server/github.js.map +1 -1
  176. package/dist/server/open-in-terminal.d.ts +8 -1
  177. package/dist/server/open-in-terminal.js +16 -8
  178. package/dist/server/open-in-terminal.js.map +1 -1
  179. package/dist/server/pr.d.ts +2 -2
  180. package/dist/server/project-context.d.ts +20 -3
  181. package/dist/server/project-context.js +30 -1
  182. package/dist/server/project-context.js.map +1 -1
  183. package/dist/server/provider-action-gate.d.ts +8 -0
  184. package/dist/server/provider-action-gate.js +54 -0
  185. package/dist/server/provider-action-gate.js.map +1 -0
  186. package/dist/server/provider-auth-runtime.d.ts +21 -0
  187. package/dist/server/provider-auth-runtime.js +66 -0
  188. package/dist/server/provider-auth-runtime.js.map +1 -0
  189. package/dist/server/server.d.ts +12128 -47
  190. package/dist/server/server.js +2652 -917
  191. package/dist/server/server.js.map +1 -1
  192. package/dist/server/validators.d.ts +97 -0
  193. package/dist/server/validators.js +86 -0
  194. package/dist/server/validators.js.map +1 -0
  195. package/dist/server/ws.d.ts +2 -2
  196. package/dist/server/ws.js +2 -2
  197. package/dist/server/ws.js.map +1 -1
  198. package/dist/server-install/engine.d.ts +1 -1
  199. package/dist/server-install/platforms/macosx-ngrok.d.ts +1 -1
  200. package/dist/server-install/platforms/ubuntu-vps.d.ts +16 -1
  201. package/dist/server-install/platforms/ubuntu-vps.js +83 -1
  202. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
  203. package/dist/server-install/state.d.ts +1 -1
  204. package/dist/server-install/steps.d.ts +2 -2
  205. package/dist/server-install/strategies.d.ts +1 -1
  206. package/dist/server-install/types.d.ts +38 -424
  207. package/dist/server-install/ui.d.ts +1 -1
  208. package/dist/skills-banner.d.ts +7 -6
  209. package/dist/skills-banner.js +7 -6
  210. package/dist/skills-banner.js.map +1 -1
  211. package/dist/skills-remote.d.ts +2 -2
  212. package/dist/skills-update.d.ts +88 -0
  213. package/dist/skills-update.js +392 -0
  214. package/dist/skills-update.js.map +1 -0
  215. package/dist/skills.d.ts +2 -0
  216. package/dist/skills.js +7 -2
  217. package/dist/skills.js.map +1 -1
  218. package/dist/todos.d.ts +2 -28
  219. package/dist/todos.js +1 -1
  220. package/dist/ui-state.d.ts +16 -2
  221. package/dist/ui-state.js +14 -1
  222. package/dist/ui-state.js.map +1 -1
  223. package/dist/workflows/load.d.ts +1 -1
  224. package/dist/workflows/run.d.ts +238 -12
  225. package/dist/workflows/run.js +1103 -115
  226. package/dist/workflows/run.js.map +1 -1
  227. package/dist/workflows/types.d.ts +59 -224
  228. package/dist/workflows/types.js +14 -0
  229. package/dist/workflows/types.js.map +1 -1
  230. package/dist/workspace/agent-accounts.d.ts +149 -0
  231. package/dist/workspace/agent-accounts.js +303 -0
  232. package/dist/workspace/agent-accounts.js.map +1 -0
  233. package/dist/workspace/agent-profiles.d.ts +78 -0
  234. package/dist/workspace/agent-profiles.js +115 -0
  235. package/dist/workspace/agent-profiles.js.map +1 -0
  236. package/dist/workspace/config.d.ts +82 -206
  237. package/dist/workspace/config.js +183 -14
  238. package/dist/workspace/config.js.map +1 -1
  239. package/dist/workspace/migrations.d.ts +1 -1
  240. package/dist/workspace/migrations.js +19 -4
  241. package/dist/workspace/migrations.js.map +1 -1
  242. package/dist/workspace/projects.d.ts +8 -2
  243. package/dist/workspace/projects.js +9 -3
  244. package/dist/workspace/projects.js.map +1 -1
  245. package/dist/workspace/semaphore.d.ts +45 -0
  246. package/dist/workspace/semaphore.js +45 -1
  247. package/dist/workspace/semaphore.js.map +1 -1
  248. package/dist/workspace/ui-state.d.ts +13 -3
  249. package/dist/workspace/ui-state.js +15 -5
  250. package/dist/workspace/ui-state.js.map +1 -1
  251. package/package.json +17 -39
  252. package/scripts/inline-contract.mjs +112 -0
  253. package/scripts/mock-claude.mjs +59 -1
  254. package/scripts/sync-readme.mjs +20 -0
  255. package/web/dist/assets/alert-dialog-LMDsWZ8t.js +1 -0
  256. package/web/dist/assets/arrow-down-CDJD8f8N.js +1 -0
  257. package/web/dist/assets/arrow-left-DUirK4gC.js +1 -0
  258. package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
  259. package/web/dist/assets/centered-state-CX0EhxaQ.js +43 -0
  260. package/web/dist/assets/chevron-right-B70aoBYh.js +1 -0
  261. package/web/dist/assets/{chunk-BO2N2NFS-DtrdTCWa.js → chunk-BO2N2NFS-DE6qKn3r.js} +8 -8
  262. package/web/dist/assets/circle-check-C6IhUojk.js +1 -0
  263. package/web/dist/assets/circle-x-hV9f6Ypp.js +1 -0
  264. package/web/dist/assets/collapsible-D2igywSh.js +1 -0
  265. package/web/dist/assets/commit-list-ocsM8XZs.js +1 -0
  266. package/web/dist/assets/compare-variants-CYdYsQBv.js +1 -0
  267. package/web/dist/assets/{core-DePtBHcl.js → core-BCsw8oQw.js} +1 -1
  268. package/web/dist/assets/diff-3y-HnHEH.js +3 -0
  269. package/web/dist/assets/diff-stat-OeTa1MCD.js +1 -0
  270. package/web/dist/assets/{diff-view-DCeSegKk.js → diff-view-D8VBKGxl.js} +4 -4
  271. package/web/dist/assets/dropdown-menu-B9UHiJFv.js +1 -0
  272. package/web/dist/assets/editable-title-C9aK-GCt.js +1 -0
  273. package/web/dist/assets/{ellipsis-vertical-CNnSLn5a.js → ellipsis-vertical-BVp0AyW4.js} +1 -1
  274. package/web/dist/assets/{file-D4GBh1ao.js → file-D1v6Cb9Q.js} +1 -1
  275. package/web/dist/assets/folder-HNaOtP70.js +1 -0
  276. package/web/dist/assets/{git-pull-request-DnR8Xh4_.js → git-pull-request-C6KuSF45.js} +1 -1
  277. package/web/dist/assets/git-toolbar-DpRPWLaM.js +1 -0
  278. package/web/dist/assets/github-UumAmuAM.js +1 -0
  279. package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
  280. package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
  281. package/web/dist/assets/image-preview-M1y8lBCU.js +1 -0
  282. package/web/dist/assets/index-BNgqhk51.js +6 -0
  283. package/web/dist/assets/index-De7KdVHL.css +2 -0
  284. package/web/dist/assets/lib-BQXq3kEf.js +1 -0
  285. package/web/dist/assets/lib-BxQXEXDF.js +1 -0
  286. package/web/dist/assets/markdown-DfljSy6W.js +2 -0
  287. package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
  288. package/web/dist/assets/new-task-form-CkgsW8GC.js +1 -0
  289. package/web/dist/assets/pill-DWy7Dbv3.js +1 -0
  290. package/web/dist/assets/project-router-BJR_8pfk.js +1 -0
  291. package/web/dist/assets/prompt-templates-CKbMbly-.js +15 -0
  292. package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
  293. package/web/dist/assets/{refresh-cw-BT8E96Tm.js → refresh-cw-Bs4wU0JM.js} +1 -1
  294. package/web/dist/assets/repo-git-CBbpvexr.js +1 -0
  295. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  296. package/web/dist/assets/run-diff-CzrO-R7P.js +3 -0
  297. package/web/dist/assets/run-header-BQDPFKUM.js +1 -0
  298. package/web/dist/assets/{search-x-BDjaMrzG.js → search-x-sxnYXz0H.js} +1 -1
  299. package/web/dist/assets/skill-empty-hint-CMfCEn9L.js +1 -0
  300. package/web/dist/assets/skills-BiWfHmCR.js +1 -0
  301. package/web/dist/assets/skills-DrG0KcAJ.js +1 -0
  302. package/web/dist/assets/sparkles-CL1cbhb_.js +1 -0
  303. package/web/dist/assets/{square-terminal-Ckjjn0vb.js → square-terminal-5JEPtGG-.js} +1 -1
  304. package/web/dist/assets/tab-link-DVT33Q2m.js +1 -0
  305. package/web/dist/assets/task-changes-BuuNjQ_C.js +1 -0
  306. package/web/dist/assets/task-commits-CVjZWXuP.js +1 -0
  307. package/web/dist/assets/task-files-f7USaQD1.js +2 -0
  308. package/web/dist/assets/task-thread-Cc7rMyer.js +9 -0
  309. package/web/dist/assets/textarea-BieGhkR-.js +1 -0
  310. package/web/dist/assets/thread-loading-CwfY_3r7.js +1 -0
  311. package/web/dist/assets/{trash-2-DAyZ0VSi.js → trash-2-Cmbuh3Q9.js} +1 -1
  312. package/web/dist/assets/{triangle-alert-Uy8rokUh.js → triangle-alert-dswtPk4F.js} +1 -1
  313. package/web/dist/assets/{upload-CDdyPPo_.js → upload-BY1qMAxW.js} +1 -1
  314. package/web/dist/assets/use-desktop-DrxT9b31.js +1 -0
  315. package/web/dist/assets/use-submit-shortcut-CULpfw9y.js +1 -0
  316. package/web/dist/assets/utils-C5bzdO9U.js +64 -0
  317. package/web/dist/assets/workflows-D6GsX0A9.js +11 -0
  318. package/web/dist/assets/zoomable-image-CEjRqsuW.js +1 -0
  319. package/web/dist/index.html +33 -13
  320. package/scripts/dev.mjs +0 -74
  321. package/scripts/release-snapshot.mjs +0 -130
  322. package/scripts/release.mjs +0 -119
  323. package/web/dist/assets/arrow-left-CnSdp92h.js +0 -1
  324. package/web/dist/assets/bundle-mjs-BegPhL5c.js +0 -1
  325. package/web/dist/assets/centered-state-DOsTcJZF.js +0 -43
  326. package/web/dist/assets/commit-list-BrxBEzRK.js +0 -1
  327. package/web/dist/assets/compare-variants-Bv2c9ORF.js +0 -1
  328. package/web/dist/assets/dist-B6XQOhgM.js +0 -1
  329. package/web/dist/assets/git-toolbar-pIC1ubPM.js +0 -1
  330. package/web/dist/assets/github-DTTSG0ht.js +0 -1
  331. package/web/dist/assets/highlighted-body-OFNGDK62-BuFJwunK.js +0 -1
  332. package/web/dist/assets/image-preview-DEhW0TFz.js +0 -1
  333. package/web/dist/assets/index-Cijmlz7q.js +0 -30
  334. package/web/dist/assets/index-DzroxqBG.css +0 -2
  335. package/web/dist/assets/lib-DPEZDBUN.js +0 -1
  336. package/web/dist/assets/lib-uHpeUPzK.js +0 -1
  337. package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +0 -1
  338. package/web/dist/assets/open-mercato-toBr6SOa.svg +0 -11
  339. package/web/dist/assets/project-router-BMx4e8m-.js +0 -1
  340. package/web/dist/assets/repo-git-BusYfa3t.js +0 -1
  341. package/web/dist/assets/run-diff-wOJ3odA-.js +0 -3
  342. package/web/dist/assets/run-header-Cg5incil.js +0 -1
  343. package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +0 -1
  344. package/web/dist/assets/skills-PpP2owbM.js +0 -1
  345. package/web/dist/assets/tab-link-F3uQrdm2.js +0 -1
  346. package/web/dist/assets/task-changes-iD9kS79I.js +0 -1
  347. package/web/dist/assets/task-commits-COkLaUri.js +0 -1
  348. package/web/dist/assets/task-files-Ckttz7XH.js +0 -2
  349. package/web/dist/assets/task-thread-CQD91VPt.js +0 -9
  350. package/web/dist/assets/textarea-Bj_LCreg.js +0 -1
  351. package/web/dist/assets/use-desktop-DUh0STzq.js +0 -3
  352. package/web/dist/assets/utils-B8s5qIcK.js +0 -1
  353. package/web/dist/assets/workflows-BFk8C0co.js +0 -11
  354. package/web/dist/assets/zoomable-image-PEDOqyLQ.js +0 -1
  355. /package/web/{open-mercato.svg → dist/open-mercato.svg} +0 -0
@@ -0,0 +1,9 @@
1
+ import { type RunnerId } from '../core/agent-runner.ts';
2
+ import type { AgentModelSettings } from './model-settings/types.ts';
3
+ /** The model defaults exposed by the coding agents' own settings files. */
4
+ export type AgentModelDefaults = Partial<Record<RunnerId, string>>;
5
+ export declare function readAgentModelSettings(runner: RunnerId, repoRoot: string, env?: NodeJS.ProcessEnv): Promise<AgentModelSettings>;
6
+ /** Read the current default model for each installed/configured coding agent. */
7
+ export declare function readAgentModelDefaults(repoRoot: string, env?: NodeJS.ProcessEnv): Promise<AgentModelDefaults>;
8
+ /** Read the provider that the agent itself will use for a bare model id. */
9
+ export declare function readAgentModelProvider(runner: RunnerId, repoRoot: string, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
@@ -0,0 +1,30 @@
1
+ import { RUNNER_IDS } from '../core/agent-runner.js';
2
+ import { claudeModelSettingsStrategy } from './model-settings/claude.js';
3
+ import { codexModelSettingsStrategy } from './model-settings/codex.js';
4
+ import { opencodeModelSettingsStrategy } from './model-settings/opencode.js';
5
+ /**
6
+ * Each runner owns its native-settings policy. Adding another backend means
7
+ * registering its strategy here; vendor precedence, environment variables,
8
+ * and provider composition stay inside that runner's module.
9
+ */
10
+ const MODEL_SETTINGS_STRATEGIES = {
11
+ claude: claudeModelSettingsStrategy,
12
+ codex: codexModelSettingsStrategy,
13
+ opencode: opencodeModelSettingsStrategy,
14
+ };
15
+ export function readAgentModelSettings(runner, repoRoot, env = process.env) {
16
+ return MODEL_SETTINGS_STRATEGIES[runner].read(repoRoot, env);
17
+ }
18
+ /** Read the current default model for each installed/configured coding agent. */
19
+ export async function readAgentModelDefaults(repoRoot, env = process.env) {
20
+ const entries = await Promise.all(RUNNER_IDS.map(async (runner) => [
21
+ runner,
22
+ (await readAgentModelSettings(runner, repoRoot, env)).model,
23
+ ]));
24
+ return Object.fromEntries(entries.filter((entry) => entry[1] !== undefined));
25
+ }
26
+ /** Read the provider that the agent itself will use for a bare model id. */
27
+ export async function readAgentModelProvider(runner, repoRoot, env = process.env) {
28
+ return (await readAgentModelSettings(runner, repoRoot, env)).provider;
29
+ }
30
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/agent-config/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAM7E;;;;GAIG;AACH,MAAM,yBAAyB,GAAiD;IAC9E,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,0BAA0B;IACjC,QAAQ,EAAE,6BAA6B;CACxC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,MAAgB,EAChB,QAAgB,EAChB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAC/B,MAAM;QACN,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK;KACnD,CAAC,CACZ,CAAC;IACF,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAwC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAgB,EAChB,QAAgB,EAChB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,OAAO,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type ConfigFileDef } from './catalog.js';
1
+ import { type ConfigFileDef } from './catalog.ts';
2
2
  /**
3
3
  * Assembles the `GET /api/agent-config` payload: every catalog file's current
4
4
  * on-disk state plus, locally, a read-only listing of the MCP servers Claude
@@ -1,6 +1,5 @@
1
1
  import { readFile } from 'node:fs/promises';
2
- import { dirname, join } from 'node:path';
3
- import { agentHomePaths } from '../paths.js';
2
+ import { agentHomePaths, claudeStateFilePath } from '../paths.js';
4
3
  import { CONFIG_FILES } from './catalog.js';
5
4
  import { hashBytes, statConfigPath } from './files.js';
6
5
  const HOSTED_REASON = 'agent config is edited from the machine that owns the checkout (this cockpit runs in hosted mode)';
@@ -18,8 +17,9 @@ async function versionOf(path, exists) {
18
17
  }
19
18
  /** Read the user-scope MCP server *names* from ~/.claude.json — never its contents, never for writing. */
20
19
  export async function readUserMcpServers(env) {
21
- // ~/.claude.json is a sibling of ~/.claude/ — Claude's own MCP state file.
22
- const path = join(dirname(agentHomePaths(env).claude), '.claude.json');
20
+ // Claude's own MCP state file. Sibling of `~/.claude/` by default, INSIDE the
21
+ // dir once CLAUDE_CONFIG_DIR relocates it — `claudeStateFilePath` owns that rule.
22
+ const path = claudeStateFilePath(agentHomePaths(env).claude, env);
23
23
  try {
24
24
  const { size } = await statConfigPath(path);
25
25
  if (size > CLAUDE_JSON_CAP)
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/agent-config/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/agent-config/service.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ConfigFormat } from './catalog.js';
1
+ import type { ConfigFormat } from './catalog.ts';
2
2
  /**
3
3
  * On save, cezar proves a config file PARSES in its own format — refusing to
4
4
  * write bytes that would break the user's agent — but it never checks the
@@ -0,0 +1,26 @@
1
+ import { AutomationStore } from './store.ts';
2
+ export interface AutomationProjectSource {
3
+ id: string;
4
+ root: string;
5
+ status: 'ok' | 'missing' | 'not-git';
6
+ }
7
+ export interface AutomationCoordinatorOptions {
8
+ listProjects: () => Promise<readonly AutomationProjectSource[]>;
9
+ warn?: (message: string) => void;
10
+ }
11
+ /**
12
+ * Lightweight workspace index for project automation state. Discovery checks
13
+ * only the optional definitions file and never materializes a RunManager or a
14
+ * full ProjectContext. Schedulers attach to these handles in Phase 4.
15
+ */
16
+ export declare class AutomationCoordinator {
17
+ private readonly options;
18
+ private readonly stores;
19
+ private readonly roots;
20
+ constructor(options: AutomationCoordinatorOptions);
21
+ refresh(): Promise<void>;
22
+ store(projectId: string, root?: string): AutomationStore | undefined;
23
+ enabledProjectIds(): string[];
24
+ remove(projectId: string): void;
25
+ ids(): string[];
26
+ }
@@ -0,0 +1,66 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { AutomationStore } from './store.js';
4
+ /**
5
+ * Lightweight workspace index for project automation state. Discovery checks
6
+ * only the optional definitions file and never materializes a RunManager or a
7
+ * full ProjectContext. Schedulers attach to these handles in Phase 4.
8
+ */
9
+ export class AutomationCoordinator {
10
+ options;
11
+ stores = new Map();
12
+ roots = new Map();
13
+ constructor(options) {
14
+ this.options = options;
15
+ }
16
+ async refresh() {
17
+ let projects;
18
+ try {
19
+ projects = await this.options.listProjects();
20
+ }
21
+ catch (error) {
22
+ this.options.warn?.(`Unable to refresh GitHub automations: ${error instanceof Error ? error.message : String(error)}`);
23
+ return;
24
+ }
25
+ const present = new Set(projects.map((project) => project.id));
26
+ for (const id of this.stores.keys()) {
27
+ if (!present.has(id))
28
+ this.remove(id);
29
+ }
30
+ for (const project of projects) {
31
+ if (project.status === 'missing') {
32
+ this.remove(project.id);
33
+ continue;
34
+ }
35
+ this.roots.set(project.id, project.root);
36
+ const definitions = join(project.root, '.ai/cezar/automations.json');
37
+ if (existsSync(definitions))
38
+ this.store(project.id, project.root);
39
+ }
40
+ }
41
+ store(projectId, root) {
42
+ const existing = this.stores.get(projectId);
43
+ if (existing)
44
+ return existing;
45
+ const projectRoot = root ?? this.roots.get(projectId);
46
+ if (!projectRoot)
47
+ return undefined;
48
+ const store = AutomationStore.open(join(projectRoot, '.ai/cezar'), { warn: this.options.warn });
49
+ this.stores.set(projectId, store);
50
+ this.roots.set(projectId, projectRoot);
51
+ return store;
52
+ }
53
+ enabledProjectIds() {
54
+ return [...this.stores.entries()]
55
+ .filter(([, store]) => store.list().some((definition) => definition.enabled))
56
+ .map(([id]) => id);
57
+ }
58
+ remove(projectId) {
59
+ this.stores.delete(projectId);
60
+ this.roots.delete(projectId);
61
+ }
62
+ ids() {
63
+ return [...this.stores.keys()];
64
+ }
65
+ }
66
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/automations/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAIH,OAAO;IAHnB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC5C,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,YAA6B,OAAqC;uBAArC,OAAO;IAAiC,CAAC;IAEtE,KAAK,CAAC,OAAO;QACX,IAAI,QAA4C,CAAC;QACjD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvH,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;YACrE,IAAI,UAAU,CAAC,WAAW,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,IAAa;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACnC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import type { AutomationDefinition, AutomationEvent } from './types.ts';
3
+ declare const githubItemSchema: z.ZodObject<{
4
+ id: z.ZodOptional<z.ZodNumber>;
5
+ node_id: z.ZodString;
6
+ number: z.ZodNumber;
7
+ title: z.ZodString;
8
+ html_url: z.ZodString;
9
+ created_at: z.ZodString;
10
+ updated_at: z.ZodOptional<z.ZodString>;
11
+ user: z.ZodObject<{
12
+ login: z.ZodString;
13
+ }, z.core.$strip>;
14
+ assignees: z.ZodDefault<z.ZodArray<z.ZodObject<{
15
+ login: z.ZodString;
16
+ }, z.core.$strip>>>;
17
+ labels: z.ZodDefault<z.ZodArray<z.ZodObject<{
18
+ name: z.ZodString;
19
+ }, z.core.$strip>>>;
20
+ repository_url: z.ZodString;
21
+ pull_request: z.ZodOptional<z.ZodUnknown>;
22
+ }, z.core.$strip>;
23
+ declare const timelineEventSchema: z.ZodObject<{
24
+ id: z.ZodOptional<z.ZodNumber>;
25
+ node_id: z.ZodOptional<z.ZodString>;
26
+ event: z.ZodEnum<{
27
+ labeled: "labeled";
28
+ unlabeled: "unlabeled";
29
+ }>;
30
+ created_at: z.ZodString;
31
+ label: z.ZodObject<{
32
+ name: z.ZodString;
33
+ }, z.core.$strip>;
34
+ }, z.core.$strip>;
35
+ export interface GithubCandidate {
36
+ eventId: string;
37
+ event: AutomationEvent;
38
+ timestamp: string;
39
+ tieBreaker: string;
40
+ repo: string;
41
+ nodeId: string;
42
+ number: number;
43
+ title: string;
44
+ url: string;
45
+ author: string;
46
+ assignees: string[];
47
+ labels: string[];
48
+ changedLabel?: string;
49
+ }
50
+ export interface GithubPollResult {
51
+ candidates: GithubCandidate[];
52
+ truncated: boolean;
53
+ pages: number;
54
+ cursor?: {
55
+ timestamp: string;
56
+ tieBreaker: string;
57
+ };
58
+ }
59
+ export interface GithubPollerOptions {
60
+ run?: (executable: string, args: readonly string[]) => Promise<string>;
61
+ }
62
+ export interface GithubPollOptions {
63
+ since?: string;
64
+ }
65
+ export declare class GithubPoller {
66
+ private readonly run;
67
+ constructor(options?: GithubPollerOptions);
68
+ poll(owner: string, repo: string, definition: AutomationDefinition, options?: GithubPollOptions): Promise<GithubPollResult>;
69
+ private timeline;
70
+ }
71
+ export declare function buildSearchQuery(owner: string, repo: string, definition: AutomationDefinition, family?: 'issues' | 'prs' | 'mixed', activity?: 'created' | 'updated', since?: string): string;
72
+ export declare function reconstructLabelEvents(owner: string, repo: string, item: z.infer<typeof githubItemSchema>, timeline: z.infer<typeof timelineEventSchema>[]): GithubCandidate[];
73
+ export declare function matchesFilters(candidate: GithubCandidate, definition: AutomationDefinition): boolean;
74
+ export {};
@@ -0,0 +1,234 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { z } from 'zod';
4
+ const execFileAsync = promisify(execFile);
5
+ const HARD_CANDIDATE_CAP = 100;
6
+ const GITHUB_COMMAND_TIMEOUT_MS = 30_000;
7
+ const githubItemSchema = z.object({
8
+ id: z.number().int().positive().optional(),
9
+ node_id: z.string().min(1),
10
+ number: z.number().int().positive(),
11
+ title: z.string(),
12
+ html_url: z.string().url(),
13
+ created_at: z.string().datetime(),
14
+ updated_at: z.string().datetime().optional(),
15
+ user: z.object({ login: z.string() }),
16
+ assignees: z.array(z.object({ login: z.string() })).default([]),
17
+ labels: z.array(z.object({ name: z.string() })).default([]),
18
+ repository_url: z.string().url(),
19
+ pull_request: z.unknown().optional(),
20
+ });
21
+ const searchResponseSchema = z.object({ items: z.array(githubItemSchema) });
22
+ const timelineEventSchema = z.object({
23
+ id: z.number().int().positive().optional(),
24
+ node_id: z.string().optional(),
25
+ event: z.enum(['labeled', 'unlabeled']),
26
+ created_at: z.string().datetime(),
27
+ label: z.object({ name: z.string() }),
28
+ });
29
+ export class GithubPoller {
30
+ run;
31
+ constructor(options = {}) {
32
+ this.run = options.run ?? (async (executable, args) => (await execFileAsync(executable, [...args], {
33
+ maxBuffer: 4 * 1024 * 1024,
34
+ timeout: GITHUB_COMMAND_TIMEOUT_MS,
35
+ })).stdout);
36
+ }
37
+ async poll(owner, repo, definition, options = {}) {
38
+ const openedEvents = definition.events.filter((event) => event === 'pull_request.opened' || event === 'issue.opened');
39
+ const labelEvents = definition.events.filter((event) => event === 'issue.labeled' || event === 'issue.unlabeled');
40
+ const sources = [];
41
+ if (openedEvents.length) {
42
+ sources.push({
43
+ family: openedEvents.every((event) => event === 'pull_request.opened')
44
+ ? 'prs'
45
+ : openedEvents.every((event) => event === 'issue.opened') ? 'issues' : 'mixed',
46
+ activity: 'created',
47
+ opened: true,
48
+ labels: false,
49
+ });
50
+ }
51
+ if (labelEvents.length) {
52
+ sources.push({ family: 'issues', activity: 'updated', opened: false, labels: true });
53
+ }
54
+ const perPage = Math.min(definition.filters.maxRecords, HARD_CANDIDATE_CAP);
55
+ const expectedRepoUrl = `https://api.github.com/repos/${owner}/${repo}`.toLowerCase();
56
+ const observations = [];
57
+ let truncated = false;
58
+ for (const source of sources) {
59
+ const query = buildSearchQuery(owner, repo, definition, source.family, source.activity, options.since);
60
+ const args = [
61
+ 'api', '--method', 'GET', '/search/issues',
62
+ '-f', `q=${query}`,
63
+ '-f', `per_page=${perPage}`,
64
+ '-f', `sort=${source.activity}`,
65
+ '-f', 'order=asc',
66
+ ];
67
+ const raw = await this.run('gh', args);
68
+ const response = searchResponseSchema.parse(JSON.parse(raw));
69
+ const sourceObservations = [];
70
+ truncated ||= response.items.length >= perPage;
71
+ for (const item of response.items.slice(0, HARD_CANDIDATE_CAP)) {
72
+ if (item.repository_url.toLowerCase() !== expectedRepoUrl)
73
+ continue;
74
+ if (source.opened && item.pull_request && definition.events.includes('pull_request.opened')) {
75
+ const candidate = normalizeOpened(owner, repo, item, 'pull_request.opened');
76
+ if (atOrAfter(candidate.timestamp, options.since)) {
77
+ sourceObservations.push({
78
+ timestamp: candidate.timestamp,
79
+ tieBreaker: candidate.tieBreaker,
80
+ candidate: matchesFilters(candidate, definition) ? candidate : undefined,
81
+ });
82
+ }
83
+ }
84
+ else if (source.opened && !item.pull_request && definition.events.includes('issue.opened')) {
85
+ const candidate = normalizeOpened(owner, repo, item, 'issue.opened');
86
+ if (atOrAfter(candidate.timestamp, options.since)) {
87
+ sourceObservations.push({
88
+ timestamp: candidate.timestamp,
89
+ tieBreaker: candidate.tieBreaker,
90
+ candidate: matchesFilters(candidate, definition) ? candidate : undefined,
91
+ });
92
+ }
93
+ }
94
+ if (source.labels && !item.pull_request) {
95
+ const timeline = await this.timeline(owner, repo, item.number);
96
+ const events = reconstructLabelEvents(owner, repo, item, timeline);
97
+ for (const event of events) {
98
+ if (!atOrAfter(event.timestamp, options.since))
99
+ continue;
100
+ sourceObservations.push({
101
+ timestamp: event.timestamp,
102
+ tieBreaker: event.tieBreaker,
103
+ candidate: definition.events.includes(event.event) && matchesFilters(event, definition)
104
+ ? event
105
+ : undefined,
106
+ });
107
+ if (sourceObservations.length >= perPage)
108
+ break;
109
+ }
110
+ const lastEventAt = events.at(-1)?.timestamp;
111
+ if (sourceObservations.length < perPage
112
+ && item.updated_at
113
+ && atOrAfter(item.updated_at, options.since)
114
+ && (!lastEventAt || item.updated_at > lastEventAt)) {
115
+ sourceObservations.push({
116
+ timestamp: item.updated_at,
117
+ tieBreaker: `activity:${item.node_id}`,
118
+ });
119
+ }
120
+ }
121
+ if (sourceObservations.length >= perPage)
122
+ break;
123
+ }
124
+ sourceObservations.sort(compareObservation);
125
+ truncated ||= sourceObservations.length >= perPage;
126
+ observations.push(...sourceObservations.slice(0, perPage));
127
+ }
128
+ observations.sort(compareObservation);
129
+ const evaluated = observations.slice(0, definition.filters.maxRecords);
130
+ const cursor = evaluated.at(-1);
131
+ return {
132
+ candidates: evaluated.flatMap((observation) => observation.candidate ? [observation.candidate] : []),
133
+ truncated: truncated || observations.length > definition.filters.maxRecords,
134
+ pages: sources.length,
135
+ cursor: cursor ? { timestamp: cursor.timestamp, tieBreaker: cursor.tieBreaker } : undefined,
136
+ };
137
+ }
138
+ async timeline(owner, repo, number) {
139
+ const raw = await this.run('gh', [
140
+ 'api', '--method', 'GET', `repos/${owner}/${repo}/issues/${number}/timeline`,
141
+ '-H', 'Accept: application/vnd.github+json', '-f', 'per_page=100',
142
+ ]);
143
+ return z.array(timelineEventSchema).parse(JSON.parse(raw));
144
+ }
145
+ }
146
+ export function buildSearchQuery(owner, repo, definition, family = 'mixed', activity = 'created', since) {
147
+ const start = since
148
+ ?? new Date(Date.now() - definition.filters.lookbackDays * 86_400_000).toISOString().slice(0, 10);
149
+ const terms = [
150
+ `repo:${owner}/${repo}`,
151
+ family === 'prs' ? 'is:pr' : family === 'issues' ? 'is:issue' : '',
152
+ `${activity}:>=${start}`,
153
+ ];
154
+ for (const author of definition.filters.authors ?? [])
155
+ terms.push(`author:${safeQualifier(author)}`);
156
+ for (const assignee of definition.filters.assignees ?? [])
157
+ terms.push(`assignee:${safeQualifier(assignee)}`);
158
+ for (const label of definition.filters.allLabels ?? [])
159
+ terms.push(`label:${JSON.stringify(label)}`);
160
+ return terms.filter(Boolean).join(' ');
161
+ }
162
+ function safeQualifier(value) {
163
+ return value.replace(/[^A-Za-z0-9_.-]/g, '');
164
+ }
165
+ function normalizeOpened(owner, repo, item, event) {
166
+ const eventId = `${owner}/${repo}:${item.node_id}:${event}:${item.created_at}`;
167
+ return {
168
+ eventId,
169
+ event,
170
+ timestamp: item.created_at,
171
+ tieBreaker: item.node_id,
172
+ repo: `${owner}/${repo}`,
173
+ nodeId: item.node_id,
174
+ number: item.number,
175
+ title: sanitize(item.title, 500),
176
+ url: item.html_url,
177
+ author: item.user.login,
178
+ assignees: item.assignees.map((assignee) => assignee.login),
179
+ labels: item.labels.map((label) => label.name),
180
+ };
181
+ }
182
+ export function reconstructLabelEvents(owner, repo, item, timeline) {
183
+ const current = new Set(item.labels.map((label) => label.name));
184
+ const ordered = [...timeline].sort((a, b) => b.created_at.localeCompare(a.created_at));
185
+ const rows = [];
186
+ for (const entry of ordered) {
187
+ const postLabels = [...current];
188
+ if (entry.event === 'labeled')
189
+ current.delete(entry.label.name);
190
+ else
191
+ current.add(entry.label.name);
192
+ const labels = entry.event === 'labeled' ? postLabels : [...current];
193
+ const kind = entry.event === 'labeled' ? 'issue.labeled' : 'issue.unlabeled';
194
+ const stable = entry.node_id ?? String(entry.id ?? `${entry.created_at}:${entry.label.name.toLowerCase()}`);
195
+ rows.push({
196
+ ...normalizeOpened(owner, repo, item, 'issue.opened'),
197
+ event: kind,
198
+ eventId: `${owner}/${repo}:${item.node_id}:${kind}:${stable}`,
199
+ timestamp: entry.created_at,
200
+ tieBreaker: stable,
201
+ labels,
202
+ changedLabel: entry.label.name,
203
+ });
204
+ }
205
+ return rows.sort((a, b) => a.timestamp.localeCompare(b.timestamp) || a.tieBreaker.localeCompare(b.tieBreaker));
206
+ }
207
+ export function matchesFilters(candidate, definition) {
208
+ const lower = (values) => new Set(values.map((value) => value.toLowerCase()));
209
+ const labels = lower(candidate.labels);
210
+ const filters = definition.filters;
211
+ if (filters.authors?.length && !lower(filters.authors).has(candidate.author.toLowerCase()))
212
+ return false;
213
+ if (filters.assignees?.length && !candidate.assignees.some((value) => lower(filters.assignees).has(value.toLowerCase())))
214
+ return false;
215
+ if (filters.allLabels?.some((value) => !labels.has(value.toLowerCase())))
216
+ return false;
217
+ if (filters.anyLabels?.length && !filters.anyLabels.some((value) => labels.has(value.toLowerCase())))
218
+ return false;
219
+ if (filters.excludeLabels?.some((value) => labels.has(value.toLowerCase())))
220
+ return false;
221
+ if (candidate.changedLabel && filters.changedLabels?.length && !lower(filters.changedLabels).has(candidate.changedLabel.toLowerCase()))
222
+ return false;
223
+ return true;
224
+ }
225
+ function sanitize(value, max) {
226
+ return value.replace(/[\u0000-\u001f\u007f]/g, ' ').slice(0, max);
227
+ }
228
+ function compareObservation(a, b) {
229
+ return a.timestamp.localeCompare(b.timestamp) || a.tieBreaker.localeCompare(b.tieBreaker);
230
+ }
231
+ function atOrAfter(timestamp, since) {
232
+ return !since || timestamp >= since;
233
+ }
234
+ //# sourceMappingURL=github-poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-poller.js","sourceRoot":"","sources":["../../src/automations/github-poller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAChC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAC5E,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;CACtC,CAAC,CAAC;AAiCH,MAAM,OAAO,YAAY;IACN,GAAG,CAA0C;IAE9D,YAAY,OAAO,GAAwB,EAAE;QAC3C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;YACjG,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;YAC1B,OAAO,EAAE,yBAAyB;SACnC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAa,EACb,IAAY,EACZ,UAAgC,EAChC,OAAO,GAAsB,EAAE;QAE/B,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,qBAAqB,IAAI,KAAK,KAAK,cAAc,CACvE,CAAC;QACF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,iBAAiB,CACpE,CAAC;QACF,MAAM,OAAO,GAKR,EAAE,CAAC;QACR,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,qBAAqB,CAAC;oBACpE,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;gBAChF,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;QACL,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC5E,MAAM,eAAe,GAAG,gCAAgC,KAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtF,MAAM,YAAY,GAIb,EAAE,CAAC;QACR,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,gBAAgB,CAC5B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,EACf,OAAO,CAAC,KAAK,CACd,CAAC;YACF,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB;gBAC1C,IAAI,EAAE,KAAK,KAAK,EAAE;gBAClB,IAAI,EAAE,YAAY,OAAO,EAAE;gBAC3B,IAAI,EAAE,QAAQ,MAAM,CAAC,QAAQ,EAAE;gBAC/B,IAAI,EAAE,WAAW;aAClB,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,MAAM,kBAAkB,GAAwB,EAAE,CAAC;YACnD,SAAS,KAAK,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBAC/D,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,eAAe;oBAAE,SAAS;gBACpE,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBAC5F,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;oBAC5E,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClD,kBAAkB,CAAC,IAAI,CAAC;4BACtB,SAAS,EAAE,SAAS,CAAC,SAAS;4BAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;4BAChC,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;yBACzE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC7F,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;oBACrE,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClD,kBAAkB,CAAC,IAAI,CAAC;4BACtB,SAAS,EAAE,SAAS,CAAC,SAAS;4BAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;4BAChC,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;yBACzE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;4BAAE,SAAS;wBACzD,kBAAkB,CAAC,IAAI,CAAC;4BACtB,SAAS,EAAE,KAAK,CAAC,SAAS;4BAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC;gCACrF,CAAC,CAAC,KAAK;gCACP,CAAC,CAAC,SAAS;yBACd,CAAC,CAAC;wBACH,IAAI,kBAAkB,CAAC,MAAM,IAAI,OAAO;4BAAE,MAAM;oBAClD,CAAC;oBACD,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;oBAC7C,IACE,kBAAkB,CAAC,MAAM,GAAG,OAAO;2BAChC,IAAI,CAAC,UAAU;2BACf,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;2BACzC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,EAClD,CAAC;wBACD,kBAAkB,CAAC,IAAI,CAAC;4BACtB,SAAS,EAAE,IAAI,CAAC,UAAU;4BAC1B,UAAU,EAAE,YAAY,IAAI,CAAC,OAAO,EAAE;yBACvC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,IAAI,kBAAkB,CAAC,MAAM,IAAI,OAAO;oBAAE,MAAM;YAClD,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC5C,SAAS,KAAK,kBAAkB,CAAC,MAAM,IAAI,OAAO,CAAC;YACnD,YAAY,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO;YACL,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpG,SAAS,EAAE,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU;YAC3E,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;SAC5F,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,IAAY,EAAE,MAAc;QAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAC/B,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,IAAI,WAAW,MAAM,WAAW;YAC5E,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,cAAc;SAClE,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,IAAY,EACZ,UAAgC,EAChC,MAAM,GAA+B,OAAO,EAC5C,QAAQ,GAA0B,SAAS,EAC3C,KAAc;IAEd,MAAM,KAAK,GAAG,KAAK;WACd,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpG,MAAM,KAAK,GAAG;QACZ,QAAQ,KAAK,IAAI,IAAI,EAAE;QACvB,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;QAClE,GAAG,QAAQ,MAAM,KAAK,EAAE;KACzB,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrG,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7G,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,IAAY,EAAE,IAAsC,EAAE,KAA6C;IACzI,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/E,OAAO;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,UAAU,EAAE,IAAI,CAAC,OAAO;QACxB,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;QACxB,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;QAChC,GAAG,EAAE,IAAI,CAAC,QAAQ;QAClB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3D,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,IAAY,EACZ,IAAsC,EACtC,QAA+C;IAE/C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACvF,MAAM,IAAI,GAAsB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5G,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;YACrD,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,MAAM,EAAE;YAC7D,SAAS,EAAE,KAAK,CAAC,UAAU;YAC3B,UAAU,EAAE,MAAM;YAClB,MAAM;YACN,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAA0B,EAAE,UAAgC;IACzF,MAAM,KAAK,GAAG,CAAC,MAAyB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACzG,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACxI,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvF,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnH,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1F,IAAI,SAAS,CAAC,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACrJ,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,kBAAkB,CACzB,CAA4C,EAC5C,CAA4C;IAE5C,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB,EAAE,KAAyB;IAC7D,OAAO,CAAC,KAAK,IAAI,SAAS,IAAI,KAAK,CAAC;AACtC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { AutomationCoordinator } from './coordinator.ts';
2
+ import type { GithubCandidate, GithubPoller, GithubPollResult } from './github-poller.ts';
3
+ import type { AutomationStore } from './store.ts';
4
+ import type { AutomationDefinition } from './types.ts';
5
+ export interface AutomationLaunchResult {
6
+ runId: string;
7
+ }
8
+ export type AutomationLauncher = (definition: AutomationDefinition, candidate: GithubCandidate, receiptId: string) => Promise<AutomationLaunchResult>;
9
+ export interface ProjectAutomationHandle {
10
+ projectId: string;
11
+ owner: string;
12
+ repo: string;
13
+ store: AutomationStore;
14
+ poller: GithubPoller;
15
+ launch?: AutomationLauncher;
16
+ onChange?: (automationId: string, revision: number) => void;
17
+ }
18
+ export declare class ProjectAutomationScheduler {
19
+ private readonly handle;
20
+ constructor(handle: ProjectAutomationHandle);
21
+ check(definition: AutomationDefinition, mode?: 'preview' | 'execute'): Promise<GithubPollResult>;
22
+ private launch;
23
+ private recordFailure;
24
+ }
25
+ export interface WorkspaceAutomationSchedulerOptions {
26
+ coordinator: AutomationCoordinator;
27
+ handle: (projectId: string, store: AutomationStore) => ProjectAutomationHandle | undefined;
28
+ now?: () => number;
29
+ }
30
+ /** One workspace timer, created only while at least one enabled definition exists. */
31
+ export declare class WorkspaceAutomationScheduler {
32
+ private readonly options;
33
+ private timer?;
34
+ private stopped;
35
+ private scheduleGeneration;
36
+ constructor(options: WorkspaceAutomationSchedulerOptions);
37
+ start(): Promise<void>;
38
+ reschedule(): Promise<void>;
39
+ stop(): void;
40
+ hasTimer(): boolean;
41
+ private schedule;
42
+ }