@wjarka/cezarion 0.10.0-pr30.54

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 (478) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +838 -0
  3. package/dist/agent-config/account-identity.d.ts +44 -0
  4. package/dist/agent-config/account-identity.js +128 -0
  5. package/dist/agent-config/account-identity.js.map +1 -0
  6. package/dist/agent-config/catalog.d.ts +72 -0
  7. package/dist/agent-config/catalog.js +223 -0
  8. package/dist/agent-config/catalog.js.map +1 -0
  9. package/dist/agent-config/files.d.ts +46 -0
  10. package/dist/agent-config/files.js +119 -0
  11. package/dist/agent-config/files.js.map +1 -0
  12. package/dist/agent-config/model-settings/claude.d.ts +2 -0
  13. package/dist/agent-config/model-settings/claude.js +11 -0
  14. package/dist/agent-config/model-settings/claude.js.map +1 -0
  15. package/dist/agent-config/model-settings/codex.d.ts +2 -0
  16. package/dist/agent-config/model-settings/codex.js +16 -0
  17. package/dist/agent-config/model-settings/codex.js.map +1 -0
  18. package/dist/agent-config/model-settings/opencode.d.ts +2 -0
  19. package/dist/agent-config/model-settings/opencode.js +8 -0
  20. package/dist/agent-config/model-settings/opencode.js.map +1 -0
  21. package/dist/agent-config/model-settings/pi.d.ts +12 -0
  22. package/dist/agent-config/model-settings/pi.js +18 -0
  23. package/dist/agent-config/model-settings/pi.js.map +1 -0
  24. package/dist/agent-config/model-settings/shared.d.ts +9 -0
  25. package/dist/agent-config/model-settings/shared.js +93 -0
  26. package/dist/agent-config/model-settings/shared.js.map +1 -0
  27. package/dist/agent-config/model-settings/types.d.ts +9 -0
  28. package/dist/agent-config/model-settings/types.js +2 -0
  29. package/dist/agent-config/model-settings/types.js.map +1 -0
  30. package/dist/agent-config/models.d.ts +9 -0
  31. package/dist/agent-config/models.js +32 -0
  32. package/dist/agent-config/models.js.map +1 -0
  33. package/dist/agent-config/seed.d.ts +7 -0
  34. package/dist/agent-config/seed.js +90 -0
  35. package/dist/agent-config/seed.js.map +1 -0
  36. package/dist/agent-config/service.d.ts +44 -0
  37. package/dist/agent-config/service.js +71 -0
  38. package/dist/agent-config/service.js.map +1 -0
  39. package/dist/agent-config/validate.d.ts +21 -0
  40. package/dist/agent-config/validate.js +76 -0
  41. package/dist/agent-config/validate.js.map +1 -0
  42. package/dist/automations/coordinator.d.ts +26 -0
  43. package/dist/automations/coordinator.js +66 -0
  44. package/dist/automations/coordinator.js.map +1 -0
  45. package/dist/automations/github-poller.d.ts +74 -0
  46. package/dist/automations/github-poller.js +234 -0
  47. package/dist/automations/github-poller.js.map +1 -0
  48. package/dist/automations/scheduler.d.ts +42 -0
  49. package/dist/automations/scheduler.js +192 -0
  50. package/dist/automations/scheduler.js.map +1 -0
  51. package/dist/automations/store.d.ts +65 -0
  52. package/dist/automations/store.js +298 -0
  53. package/dist/automations/store.js.map +1 -0
  54. package/dist/automations/task-template.d.ts +18 -0
  55. package/dist/automations/task-template.js +95 -0
  56. package/dist/automations/task-template.js.map +1 -0
  57. package/dist/automations/types.d.ts +255 -0
  58. package/dist/automations/types.js +159 -0
  59. package/dist/automations/types.js.map +1 -0
  60. package/dist/config.d.ts +77 -0
  61. package/dist/config.js +242 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/contract/agent-config.d.ts +153 -0
  64. package/dist/contract/agent-profiles.d.ts +347 -0
  65. package/dist/contract/automations.d.ts +935 -0
  66. package/dist/contract/events.d.ts +104 -0
  67. package/dist/contract/github.d.ts +556 -0
  68. package/dist/contract/health.d.ts +102 -0
  69. package/dist/contract/index.d.ts +16 -0
  70. package/dist/contract/index.js +1895 -0
  71. package/dist/contract/projects.d.ts +210 -0
  72. package/dist/contract/repo.d.ts +234 -0
  73. package/dist/contract/runs.d.ts +1473 -0
  74. package/dist/contract/skills.d.ts +232 -0
  75. package/dist/contract/workflows.d.ts +218 -0
  76. package/dist/contract/workspace.d.ts +579 -0
  77. package/dist/core/agent-env.d.ts +31 -0
  78. package/dist/core/agent-env.js +371 -0
  79. package/dist/core/agent-env.js.map +1 -0
  80. package/dist/core/agent-model-policy.d.ts +10 -0
  81. package/dist/core/agent-model-policy.js +36 -0
  82. package/dist/core/agent-model-policy.js.map +1 -0
  83. package/dist/core/agent-profiles.d.ts +62 -0
  84. package/dist/core/agent-profiles.js +90 -0
  85. package/dist/core/agent-profiles.js.map +1 -0
  86. package/dist/core/agent-runner.d.ts +211 -0
  87. package/dist/core/agent-runner.js +68 -0
  88. package/dist/core/agent-runner.js.map +1 -0
  89. package/dist/core/ask.d.ts +105 -0
  90. package/dist/core/ask.js +187 -0
  91. package/dist/core/ask.js.map +1 -0
  92. package/dist/core/backend-detect.d.ts +16 -0
  93. package/dist/core/backend-detect.js +155 -0
  94. package/dist/core/backend-detect.js.map +1 -0
  95. package/dist/core/claude-cli-runner.d.ts +59 -0
  96. package/dist/core/claude-cli-runner.js +483 -0
  97. package/dist/core/claude-cli-runner.js.map +1 -0
  98. package/dist/core/claude-ui-mapper.d.ts +80 -0
  99. package/dist/core/claude-ui-mapper.js +598 -0
  100. package/dist/core/claude-ui-mapper.js.map +1 -0
  101. package/dist/core/codex-app-server-runner.d.ts +41 -0
  102. package/dist/core/codex-app-server-runner.js +584 -0
  103. package/dist/core/codex-app-server-runner.js.map +1 -0
  104. package/dist/core/codex-app-server-transport.d.ts +35 -0
  105. package/dist/core/codex-app-server-transport.js +150 -0
  106. package/dist/core/codex-app-server-transport.js.map +1 -0
  107. package/dist/core/codex-model-catalog.d.ts +10 -0
  108. package/dist/core/codex-model-catalog.js +110 -0
  109. package/dist/core/codex-model-catalog.js.map +1 -0
  110. package/dist/core/codex-ui-mapper.d.ts +112 -0
  111. package/dist/core/codex-ui-mapper.js +766 -0
  112. package/dist/core/codex-ui-mapper.js.map +1 -0
  113. package/dist/core/model-identity.d.ts +125 -0
  114. package/dist/core/model-identity.js +132 -0
  115. package/dist/core/model-identity.js.map +1 -0
  116. package/dist/core/model-presets.d.ts +21 -0
  117. package/dist/core/model-presets.js +81 -0
  118. package/dist/core/model-presets.js.map +1 -0
  119. package/dist/core/ndjson.d.ts +6 -0
  120. package/dist/core/ndjson.js +23 -0
  121. package/dist/core/ndjson.js.map +1 -0
  122. package/dist/core/opencode-model-catalog.d.ts +32 -0
  123. package/dist/core/opencode-model-catalog.js +153 -0
  124. package/dist/core/opencode-model-catalog.js.map +1 -0
  125. package/dist/core/opencode-server-runner.d.ts +32 -0
  126. package/dist/core/opencode-server-runner.js +882 -0
  127. package/dist/core/opencode-server-runner.js.map +1 -0
  128. package/dist/core/opencode-ui-mapper.d.ts +137 -0
  129. package/dist/core/opencode-ui-mapper.js +800 -0
  130. package/dist/core/opencode-ui-mapper.js.map +1 -0
  131. package/dist/core/pi-model-catalog.d.ts +31 -0
  132. package/dist/core/pi-model-catalog.js +152 -0
  133. package/dist/core/pi-model-catalog.js.map +1 -0
  134. package/dist/core/pi-runner.d.ts +24 -0
  135. package/dist/core/pi-runner.js +403 -0
  136. package/dist/core/pi-runner.js.map +1 -0
  137. package/dist/core/pi-ui-mapper.d.ts +36 -0
  138. package/dist/core/pi-ui-mapper.js +304 -0
  139. package/dist/core/pi-ui-mapper.js.map +1 -0
  140. package/dist/core/process-usage.d.ts +66 -0
  141. package/dist/core/process-usage.js +193 -0
  142. package/dist/core/process-usage.js.map +1 -0
  143. package/dist/core/provider-auth.d.ts +154 -0
  144. package/dist/core/provider-auth.js +509 -0
  145. package/dist/core/provider-auth.js.map +1 -0
  146. package/dist/core/provider-availability.d.ts +3 -0
  147. package/dist/core/provider-availability.js +14 -0
  148. package/dist/core/provider-availability.js.map +1 -0
  149. package/dist/core/runner-factory.d.ts +8 -0
  150. package/dist/core/runner-factory.js +25 -0
  151. package/dist/core/runner-factory.js.map +1 -0
  152. package/dist/core/runner-model-catalog.d.ts +29 -0
  153. package/dist/core/runner-model-catalog.js +78 -0
  154. package/dist/core/runner-model-catalog.js.map +1 -0
  155. package/dist/core/secret-redaction.d.ts +37 -0
  156. package/dist/core/secret-redaction.js +115 -0
  157. package/dist/core/secret-redaction.js.map +1 -0
  158. package/dist/core/shell-env.d.ts +28 -0
  159. package/dist/core/shell-env.js +56 -0
  160. package/dist/core/shell-env.js.map +1 -0
  161. package/dist/core/tool-display.d.ts +31 -0
  162. package/dist/core/tool-display.js +179 -0
  163. package/dist/core/tool-display.js.map +1 -0
  164. package/dist/core/ui-events.d.ts +335 -0
  165. package/dist/core/ui-events.js +25 -0
  166. package/dist/core/ui-events.js.map +1 -0
  167. package/dist/core/usage-limit.d.ts +42 -0
  168. package/dist/core/usage-limit.js +209 -0
  169. package/dist/core/usage-limit.js.map +1 -0
  170. package/dist/core/usage.d.ts +11 -0
  171. package/dist/core/usage.js +15 -0
  172. package/dist/core/usage.js.map +1 -0
  173. package/dist/core/v1-text-coalescer.d.ts +36 -0
  174. package/dist/core/v1-text-coalescer.js +72 -0
  175. package/dist/core/v1-text-coalescer.js.map +1 -0
  176. package/dist/git-diff-base.d.ts +85 -0
  177. package/dist/git-diff-base.js +180 -0
  178. package/dist/git-diff-base.js.map +1 -0
  179. package/dist/git-refs.d.ts +11 -0
  180. package/dist/git-refs.js +14 -0
  181. package/dist/git-refs.js.map +1 -0
  182. package/dist/git-worktree.d.ts +161 -0
  183. package/dist/git-worktree.js +508 -0
  184. package/dist/git-worktree.js.map +1 -0
  185. package/dist/handoff.d.ts +62 -0
  186. package/dist/handoff.js +154 -0
  187. package/dist/handoff.js.map +1 -0
  188. package/dist/index.d.ts +2 -0
  189. package/dist/index.js +680 -0
  190. package/dist/index.js.map +1 -0
  191. package/dist/install-as-command.d.ts +40 -0
  192. package/dist/install-as-command.js +52 -0
  193. package/dist/install-as-command.js.map +1 -0
  194. package/dist/pack-check.d.ts +17 -0
  195. package/dist/pack-check.js +27 -0
  196. package/dist/pack-check.js.map +1 -0
  197. package/dist/paths.d.ts +140 -0
  198. package/dist/paths.js +192 -0
  199. package/dist/paths.js.map +1 -0
  200. package/dist/planner.d.ts +27 -0
  201. package/dist/planner.js +268 -0
  202. package/dist/planner.js.map +1 -0
  203. package/dist/release/manifests.d.ts +81 -0
  204. package/dist/release/manifests.js +74 -0
  205. package/dist/release/manifests.js.map +1 -0
  206. package/dist/release/snapshot.d.ts +67 -0
  207. package/dist/release/snapshot.js +97 -0
  208. package/dist/release/snapshot.js.map +1 -0
  209. package/dist/release/stable.d.ts +38 -0
  210. package/dist/release/stable.js +55 -0
  211. package/dist/release/stable.js.map +1 -0
  212. package/dist/runs/agent-tmpdir.d.ts +41 -0
  213. package/dist/runs/agent-tmpdir.js +183 -0
  214. package/dist/runs/agent-tmpdir.js.map +1 -0
  215. package/dist/runs/auto-name.d.ts +75 -0
  216. package/dist/runs/auto-name.js +179 -0
  217. package/dist/runs/auto-name.js.map +1 -0
  218. package/dist/runs/event-history.d.ts +50 -0
  219. package/dist/runs/event-history.js +613 -0
  220. package/dist/runs/event-history.js.map +1 -0
  221. package/dist/runs/retention.d.ts +60 -0
  222. package/dist/runs/retention.js +86 -0
  223. package/dist/runs/retention.js.map +1 -0
  224. package/dist/runs/review-gate.d.ts +18 -0
  225. package/dist/runs/review-gate.js +21 -0
  226. package/dist/runs/review-gate.js.map +1 -0
  227. package/dist/runs/run-index.d.ts +19 -0
  228. package/dist/runs/run-index.js +43 -0
  229. package/dist/runs/run-index.js.map +1 -0
  230. package/dist/runs/store.d.ts +446 -0
  231. package/dist/runs/store.js +1118 -0
  232. package/dist/runs/store.js.map +1 -0
  233. package/dist/runs/task-markers.d.ts +28 -0
  234. package/dist/runs/task-markers.js +74 -0
  235. package/dist/runs/task-markers.js.map +1 -0
  236. package/dist/runs/task-refs.d.ts +25 -0
  237. package/dist/runs/task-refs.js +74 -0
  238. package/dist/runs/task-refs.js.map +1 -0
  239. package/dist/runs/ui-event-sink.d.ts +81 -0
  240. package/dist/runs/ui-event-sink.js +210 -0
  241. package/dist/runs/ui-event-sink.js.map +1 -0
  242. package/dist/server/app-type.d.ts +21 -0
  243. package/dist/server/app-type.js +2 -0
  244. package/dist/server/app-type.js.map +1 -0
  245. package/dist/server/capabilities.d.ts +70 -0
  246. package/dist/server/capabilities.js +152 -0
  247. package/dist/server/capabilities.js.map +1 -0
  248. package/dist/server/checkout.d.ts +128 -0
  249. package/dist/server/checkout.js +296 -0
  250. package/dist/server/checkout.js.map +1 -0
  251. package/dist/server/forge/github.d.ts +513 -0
  252. package/dist/server/forge/github.js +2364 -0
  253. package/dist/server/forge/github.js.map +1 -0
  254. package/dist/server/forge/index.d.ts +40 -0
  255. package/dist/server/forge/index.js +72 -0
  256. package/dist/server/forge/index.js.map +1 -0
  257. package/dist/server/forge/types.d.ts +242 -0
  258. package/dist/server/forge/types.js +2 -0
  259. package/dist/server/forge/types.js.map +1 -0
  260. package/dist/server/fs-browse.d.ts +105 -0
  261. package/dist/server/fs-browse.js +182 -0
  262. package/dist/server/fs-browse.js.map +1 -0
  263. package/dist/server/git-changes.d.ts +213 -0
  264. package/dist/server/git-changes.js +555 -0
  265. package/dist/server/git-changes.js.map +1 -0
  266. package/dist/server/git.d.ts +28 -0
  267. package/dist/server/git.js +112 -0
  268. package/dist/server/git.js.map +1 -0
  269. package/dist/server/github.d.ts +9 -0
  270. package/dist/server/github.js +8 -0
  271. package/dist/server/github.js.map +1 -0
  272. package/dist/server/launch-key.d.ts +7 -0
  273. package/dist/server/launch-key.js +33 -0
  274. package/dist/server/launch-key.js.map +1 -0
  275. package/dist/server/open-in-app.d.ts +66 -0
  276. package/dist/server/open-in-app.js +211 -0
  277. package/dist/server/open-in-app.js.map +1 -0
  278. package/dist/server/open-in-terminal.d.ts +70 -0
  279. package/dist/server/open-in-terminal.js +179 -0
  280. package/dist/server/open-in-terminal.js.map +1 -0
  281. package/dist/server/pr.d.ts +7 -0
  282. package/dist/server/pr.js +7 -0
  283. package/dist/server/pr.js.map +1 -0
  284. package/dist/server/project-context.d.ts +120 -0
  285. package/dist/server/project-context.js +182 -0
  286. package/dist/server/project-context.js.map +1 -0
  287. package/dist/server/provider-action-gate.d.ts +8 -0
  288. package/dist/server/provider-action-gate.js +56 -0
  289. package/dist/server/provider-action-gate.js.map +1 -0
  290. package/dist/server/provider-auth-runtime.d.ts +21 -0
  291. package/dist/server/provider-auth-runtime.js +66 -0
  292. package/dist/server/provider-auth-runtime.js.map +1 -0
  293. package/dist/server/server.d.ts +13138 -0
  294. package/dist/server/server.js +5263 -0
  295. package/dist/server/server.js.map +1 -0
  296. package/dist/server/static-ui.d.ts +49 -0
  297. package/dist/server/static-ui.js +92 -0
  298. package/dist/server/static-ui.js.map +1 -0
  299. package/dist/server/validators.d.ts +97 -0
  300. package/dist/server/validators.js +86 -0
  301. package/dist/server/validators.js.map +1 -0
  302. package/dist/server/ws.d.ts +85 -0
  303. package/dist/server/ws.js +218 -0
  304. package/dist/server/ws.js.map +1 -0
  305. package/dist/server/wsl.d.ts +25 -0
  306. package/dist/server/wsl.js +92 -0
  307. package/dist/server/wsl.js.map +1 -0
  308. package/dist/server-install/engine.d.ts +50 -0
  309. package/dist/server-install/engine.js +324 -0
  310. package/dist/server-install/engine.js.map +1 -0
  311. package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
  312. package/dist/server-install/platforms/macosx-ngrok.js +345 -0
  313. package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
  314. package/dist/server-install/platforms/ubuntu-vps.d.ts +78 -0
  315. package/dist/server-install/platforms/ubuntu-vps.js +1016 -0
  316. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
  317. package/dist/server-install/state.d.ts +52 -0
  318. package/dist/server-install/state.js +182 -0
  319. package/dist/server-install/state.js.map +1 -0
  320. package/dist/server-install/steps.d.ts +109 -0
  321. package/dist/server-install/steps.js +334 -0
  322. package/dist/server-install/steps.js.map +1 -0
  323. package/dist/server-install/strategies.d.ts +4 -0
  324. package/dist/server-install/strategies.js +20 -0
  325. package/dist/server-install/strategies.js.map +1 -0
  326. package/dist/server-install/types.d.ts +287 -0
  327. package/dist/server-install/types.js +121 -0
  328. package/dist/server-install/types.js.map +1 -0
  329. package/dist/server-install/ui.d.ts +42 -0
  330. package/dist/server-install/ui.js +130 -0
  331. package/dist/server-install/ui.js.map +1 -0
  332. package/dist/skills-banner.d.ts +22 -0
  333. package/dist/skills-banner.js +41 -0
  334. package/dist/skills-banner.js.map +1 -0
  335. package/dist/skills-remote.d.ts +84 -0
  336. package/dist/skills-remote.js +468 -0
  337. package/dist/skills-remote.js.map +1 -0
  338. package/dist/skills-update.d.ts +88 -0
  339. package/dist/skills-update.js +392 -0
  340. package/dist/skills-update.js.map +1 -0
  341. package/dist/skills.d.ts +82 -0
  342. package/dist/skills.js +251 -0
  343. package/dist/skills.js.map +1 -0
  344. package/dist/todos.d.ts +48 -0
  345. package/dist/todos.js +201 -0
  346. package/dist/todos.js.map +1 -0
  347. package/dist/ui-state.d.ts +26 -0
  348. package/dist/ui-state.js +38 -0
  349. package/dist/ui-state.js.map +1 -0
  350. package/dist/update-check.d.ts +12 -0
  351. package/dist/update-check.js +41 -0
  352. package/dist/update-check.js.map +1 -0
  353. package/dist/workflows/load.d.ts +15 -0
  354. package/dist/workflows/load.js +56 -0
  355. package/dist/workflows/load.js.map +1 -0
  356. package/dist/workflows/run.d.ts +758 -0
  357. package/dist/workflows/run.js +3389 -0
  358. package/dist/workflows/run.js.map +1 -0
  359. package/dist/workflows/types.d.ts +153 -0
  360. package/dist/workflows/types.js +212 -0
  361. package/dist/workflows/types.js.map +1 -0
  362. package/dist/workspace/agent-accounts.d.ts +153 -0
  363. package/dist/workspace/agent-accounts.js +304 -0
  364. package/dist/workspace/agent-accounts.js.map +1 -0
  365. package/dist/workspace/agent-profiles.d.ts +78 -0
  366. package/dist/workspace/agent-profiles.js +115 -0
  367. package/dist/workspace/agent-profiles.js.map +1 -0
  368. package/dist/workspace/config.d.ts +169 -0
  369. package/dist/workspace/config.js +379 -0
  370. package/dist/workspace/config.js.map +1 -0
  371. package/dist/workspace/migrations.d.ts +45 -0
  372. package/dist/workspace/migrations.js +147 -0
  373. package/dist/workspace/migrations.js.map +1 -0
  374. package/dist/workspace/projects-cli.d.ts +25 -0
  375. package/dist/workspace/projects-cli.js +172 -0
  376. package/dist/workspace/projects-cli.js.map +1 -0
  377. package/dist/workspace/projects.d.ts +109 -0
  378. package/dist/workspace/projects.js +250 -0
  379. package/dist/workspace/projects.js.map +1 -0
  380. package/dist/workspace/semaphore.d.ts +179 -0
  381. package/dist/workspace/semaphore.js +195 -0
  382. package/dist/workspace/semaphore.js.map +1 -0
  383. package/dist/workspace/ui-state.d.ts +34 -0
  384. package/dist/workspace/ui-state.js +53 -0
  385. package/dist/workspace/ui-state.js.map +1 -0
  386. package/package.json +70 -0
  387. package/scripts/check-pack.mjs +46 -0
  388. package/scripts/inline-contract.mjs +112 -0
  389. package/scripts/install-as-command.mjs +120 -0
  390. package/scripts/mock-claude.mjs +520 -0
  391. package/scripts/mock-pi-rpc.mjs +83 -0
  392. package/scripts/sync-readme.mjs +20 -0
  393. package/scripts/test-process-usage.mjs +47 -0
  394. package/web/dist/assets/alert-dialog-B4Ofsgv7.js +1 -0
  395. package/web/dist/assets/arrow-down-Dy8dup7j.js +1 -0
  396. package/web/dist/assets/arrow-left-BJaucbhn.js +1 -0
  397. package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
  398. package/web/dist/assets/centered-state-duPW0phQ.js +43 -0
  399. package/web/dist/assets/chevron-right-Be4A5TCS.js +1 -0
  400. package/web/dist/assets/chunk-BO2N2NFS-DE6qKn3r.js +131 -0
  401. package/web/dist/assets/collapsible-DdcNBdSk.js +1 -0
  402. package/web/dist/assets/commit-list-CgvN9vec.js +1 -0
  403. package/web/dist/assets/compare-variants-CQA2nd65.js +1 -0
  404. package/web/dist/assets/core-BCsw8oQw.js +12 -0
  405. package/web/dist/assets/css-BsVw1vtW.js +1 -0
  406. package/web/dist/assets/diff-B6Agp5Hl.js +3 -0
  407. package/web/dist/assets/diff-stat-BoXuGkgq.js +1 -0
  408. package/web/dist/assets/diff-view-CD8XI-fj.js +6 -0
  409. package/web/dist/assets/diff-woXpYk--.js +1 -0
  410. package/web/dist/assets/dropdown-menu-B3SYw-k5.js +1 -0
  411. package/web/dist/assets/editable-title-B-hjp5wl.js +1 -0
  412. package/web/dist/assets/ellipsis-vertical-BYwzw0xl.js +1 -0
  413. package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
  414. package/web/dist/assets/file-BRj5eISx.js +1 -0
  415. package/web/dist/assets/folder-z4oT5981.js +1 -0
  416. package/web/dist/assets/git-toolbar-owSEkYld.js +1 -0
  417. package/web/dist/assets/github-Bz2VgRX3.js +1 -0
  418. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  419. package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
  420. package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
  421. package/web/dist/assets/html-BY76lXLH.js +1 -0
  422. package/web/dist/assets/image-preview-h3WFluuy.js +1 -0
  423. package/web/dist/assets/index-BbcQNT92.css +2 -0
  424. package/web/dist/assets/index-EtQQQ6Kj.js +7 -0
  425. package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  426. package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  427. package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
  428. package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  429. package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  430. package/web/dist/assets/json-qhed-kSA.js +1 -0
  431. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  432. package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
  433. package/web/dist/assets/lib-BQXq3kEf.js +1 -0
  434. package/web/dist/assets/lib-BxQXEXDF.js +1 -0
  435. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  436. package/web/dist/assets/markdown-DqBKYPiB.js +2 -0
  437. package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
  438. package/web/dist/assets/new-task-form-BdJKRBJX.js +1 -0
  439. package/web/dist/assets/pill-BQfmfpYp.js +1 -0
  440. package/web/dist/assets/project-router-DxgFZY1l.js +1 -0
  441. package/web/dist/assets/prompt-templates-B6m16gq-.js +15 -0
  442. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  443. package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
  444. package/web/dist/assets/refresh-cw-mhSpxf2a.js +1 -0
  445. package/web/dist/assets/repo-git-CUNRxR3_.js +1 -0
  446. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  447. package/web/dist/assets/run-diff-DsmmDVfx.js +3 -0
  448. package/web/dist/assets/run-header-BkhrseLJ.js +1 -0
  449. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  450. package/web/dist/assets/search-x-BqDMB2g8.js +1 -0
  451. package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
  452. package/web/dist/assets/skill-empty-hint-BWEvTggc.js +1 -0
  453. package/web/dist/assets/skills-9oR_oHse.js +1 -0
  454. package/web/dist/assets/skills-DwIxnnWO.js +1 -0
  455. package/web/dist/assets/sparkles-DIoTQpyx.js +1 -0
  456. package/web/dist/assets/sql-BsFa4tDR.js +1 -0
  457. package/web/dist/assets/square-terminal-Cc7CuQxc.js +1 -0
  458. package/web/dist/assets/tab-link-D1fQgpmO.js +1 -0
  459. package/web/dist/assets/task-changes-BKeLlDpK.js +1 -0
  460. package/web/dist/assets/task-commits-gcEFZIa5.js +1 -0
  461. package/web/dist/assets/task-files-BGAqoXTW.js +2 -0
  462. package/web/dist/assets/task-thread-DT8aUYTS.js +9 -0
  463. package/web/dist/assets/textarea-BOVbfy5C.js +1 -0
  464. package/web/dist/assets/thread-loading-CypW73KD.js +1 -0
  465. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  466. package/web/dist/assets/trash-2-CJq6LHWn.js +1 -0
  467. package/web/dist/assets/triangle-alert-CjDFvU27.js +1 -0
  468. package/web/dist/assets/tsx-udAQXfEw.js +1 -0
  469. package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
  470. package/web/dist/assets/upload-CPDZlJeK.js +1 -0
  471. package/web/dist/assets/use-desktop-5JsLmi0a.js +1 -0
  472. package/web/dist/assets/use-submit-shortcut-CHVFevty.js +1 -0
  473. package/web/dist/assets/utils-DiO6zyJd.js +64 -0
  474. package/web/dist/assets/workflows-rQDFzWRt.js +11 -0
  475. package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
  476. package/web/dist/assets/zoomable-image-COWqb11v.js +1 -0
  477. package/web/dist/index.html +80 -0
  478. package/web/dist/open-mercato.svg +11 -0
@@ -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":"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"}
@@ -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
+ }
@@ -0,0 +1,192 @@
1
+ /** One request chain process-wide. The promise tail also prevents a failed request from
2
+ * poisoning later projects. */
3
+ class GithubRequestArbiter {
4
+ tail = Promise.resolve();
5
+ run(operation) {
6
+ const current = this.tail.then(operation, operation);
7
+ this.tail = current.catch(() => undefined);
8
+ return current;
9
+ }
10
+ }
11
+ const githubRequests = new GithubRequestArbiter();
12
+ export class ProjectAutomationScheduler {
13
+ handle;
14
+ constructor(handle) {
15
+ this.handle = handle;
16
+ }
17
+ async check(definition, mode = 'execute') {
18
+ const detectionOnly = mode === 'execute' && !this.handle.launch;
19
+ if (detectionOnly)
20
+ mode = 'preview';
21
+ const { store } = this.handle;
22
+ const lease = store.acquireLease();
23
+ if (!lease)
24
+ throw new Error('automation polling lease is held by another process');
25
+ const started = Date.now();
26
+ let completion;
27
+ try {
28
+ const state = store.state(definition.id) ?? {};
29
+ if (state.backoffUntil && Date.parse(state.backoffUntil) > Date.now()) {
30
+ throw new Error(`automation is backed off until ${state.backoffUntil}`);
31
+ }
32
+ const since = state.cursor?.timestamp ?? state.baselineAt;
33
+ const overlapSince = since
34
+ ? new Date(Date.parse(since) - 120_000).toISOString()
35
+ : undefined;
36
+ const result = await githubRequests.run(() => this.handle.poller.poll(this.handle.owner, this.handle.repo, definition, { since: overlapSince }));
37
+ const eligible = result.candidates.filter((candidate) => {
38
+ if (state.baselineAt && candidate.timestamp <= state.baselineAt)
39
+ return false;
40
+ if (!state.cursor)
41
+ return true;
42
+ const overlap = Date.parse(state.cursor.timestamp) - 120_000;
43
+ return Date.parse(candidate.timestamp) >= overlap;
44
+ });
45
+ if (mode === 'execute' && this.handle.launch) {
46
+ for (const candidate of eligible)
47
+ await this.launch(definition, candidate);
48
+ }
49
+ if (mode === 'execute') {
50
+ const now = new Date().toISOString();
51
+ const cursor = laterCursor(state.cursor, result.cursor);
52
+ store.setState(definition.id, {
53
+ ...state,
54
+ revision: definition.revision,
55
+ cursor,
56
+ frozenHighWatermark: result.truncated && cursor?.tieBreaker
57
+ ? { timestamp: cursor.timestamp, tieBreaker: cursor.tieBreaker }
58
+ : undefined,
59
+ lastSuccessAt: now,
60
+ nextCheckAt: new Date(Date.now() + definition.intervalSeconds * 1_000).toISOString(),
61
+ consecutiveFailures: 0,
62
+ backoffUntil: undefined,
63
+ });
64
+ }
65
+ else if (detectionOnly) {
66
+ store.setState(definition.id, {
67
+ ...state,
68
+ revision: definition.revision,
69
+ nextCheckAt: new Date(Date.now() + definition.intervalSeconds * 1_000).toISOString(),
70
+ });
71
+ }
72
+ this.handle.onChange?.(definition.id, definition.revision);
73
+ completion = mode === 'preview'
74
+ ? { result: 'preview', reason: `Bounded preview found ${eligible.length} match${eligible.length === 1 ? '' : 'es'}; no tasks were launched.` }
75
+ : { result: 'no-match', reason: 'Scheduled check completed.' };
76
+ return { ...result, candidates: eligible };
77
+ }
78
+ catch (error) {
79
+ if (mode === 'execute')
80
+ this.recordFailure(definition, error);
81
+ else
82
+ store.appendLog({ automationId: definition.id, revision: definition.revision, result: 'error', reason: error instanceof Error ? error.message : String(error) });
83
+ throw error;
84
+ }
85
+ finally {
86
+ if (completion)
87
+ store.appendLog({ automationId: definition.id, revision: definition.revision, ...completion, durationMs: Date.now() - started });
88
+ try {
89
+ store.maybeCompact();
90
+ }
91
+ catch { /* append-only state remains readable; next check retries */ }
92
+ lease.release();
93
+ }
94
+ }
95
+ async launch(definition, candidate) {
96
+ const receipt = this.handle.store.reserveReceipt({ automationId: definition.id, revision: definition.revision, eventId: candidate.eventId, candidate });
97
+ if (!receipt) {
98
+ this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, event: candidate.event, result: 'duplicate', reason: 'A durable receipt already exists for this automation and event.', githubNumber: candidate.number, githubTitle: candidate.title, githubUrl: candidate.url });
99
+ return;
100
+ }
101
+ try {
102
+ const launched = await this.handle.launch(definition, candidate, receipt.receiptId);
103
+ this.handle.store.appendReceipt({ ...receipt, status: 'launched', runId: launched.runId, updatedAt: new Date().toISOString() });
104
+ this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, event: candidate.event, result: 'launched', receiptId: receipt.receiptId, runId: launched.runId, githubNumber: candidate.number, githubTitle: candidate.title, githubUrl: candidate.url });
105
+ }
106
+ catch (error) {
107
+ this.handle.store.appendReceipt({ ...receipt, status: 'launch-error', error: error instanceof Error ? error.message : String(error), updatedAt: new Date().toISOString() });
108
+ throw error;
109
+ }
110
+ }
111
+ recordFailure(definition, error) {
112
+ const state = this.handle.store.state(definition.id) ?? {};
113
+ const failures = (state.consecutiveFailures ?? 0) + 1;
114
+ const delay = Math.min(6 * 60 * 60_000, 60_000 * 2 ** (failures - 1));
115
+ this.handle.store.setState(definition.id, {
116
+ ...state,
117
+ consecutiveFailures: failures,
118
+ backoffUntil: new Date(Date.now() + delay).toISOString(),
119
+ nextCheckAt: new Date(Date.now() + delay).toISOString(),
120
+ });
121
+ this.handle.store.appendLog({ automationId: definition.id, revision: definition.revision, result: 'error', reason: error instanceof Error ? error.message : String(error) });
122
+ this.handle.onChange?.(definition.id, definition.revision);
123
+ }
124
+ }
125
+ function laterCursor(current, observed) {
126
+ if (!observed)
127
+ return current;
128
+ if (!current)
129
+ return observed;
130
+ const order = observed.timestamp.localeCompare(current.timestamp)
131
+ || observed.tieBreaker.localeCompare(current.tieBreaker ?? '');
132
+ return order > 0 ? observed : current;
133
+ }
134
+ /** One workspace timer, created only while at least one enabled definition exists. */
135
+ export class WorkspaceAutomationScheduler {
136
+ options;
137
+ timer;
138
+ stopped = true;
139
+ scheduleGeneration = 0;
140
+ constructor(options) {
141
+ this.options = options;
142
+ }
143
+ async start() {
144
+ this.stopped = false;
145
+ await this.reschedule();
146
+ }
147
+ async reschedule() {
148
+ if (this.stopped)
149
+ return;
150
+ const generation = ++this.scheduleGeneration;
151
+ if (this.timer)
152
+ clearTimeout(this.timer);
153
+ this.timer = undefined;
154
+ await this.options.coordinator.refresh();
155
+ if (this.stopped || generation !== this.scheduleGeneration)
156
+ return;
157
+ this.schedule();
158
+ }
159
+ stop() {
160
+ this.stopped = true;
161
+ this.scheduleGeneration += 1;
162
+ if (this.timer)
163
+ clearTimeout(this.timer);
164
+ this.timer = undefined;
165
+ }
166
+ hasTimer() { return this.timer !== undefined; }
167
+ schedule() {
168
+ if (this.stopped)
169
+ return;
170
+ const due = [];
171
+ for (const projectId of this.options.coordinator.enabledProjectIds()) {
172
+ const store = this.options.coordinator.store(projectId);
173
+ if (!store)
174
+ continue;
175
+ const handle = this.options.handle(projectId, store);
176
+ if (!handle)
177
+ continue;
178
+ for (const definition of store.list().filter((item) => item.enabled)) {
179
+ due.push({ at: Date.parse(store.state(definition.id)?.nextCheckAt ?? new Date().toISOString()), definition, scheduler: new ProjectAutomationScheduler(handle) });
180
+ }
181
+ }
182
+ if (!due.length)
183
+ return;
184
+ due.sort((a, b) => a.at - b.at);
185
+ const next = due[0];
186
+ this.timer = setTimeout(() => {
187
+ this.timer = undefined;
188
+ void next.scheduler.check(next.definition).catch(() => undefined).finally(() => this.schedule());
189
+ }, Math.max(0, next.at - (this.options.now?.() ?? Date.now())));
190
+ }
191
+ }
192
+ //# sourceMappingURL=scheduler.js.map