neondeck 1.0.0-beta.10

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 (804) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/DEVELOPMENT.md +304 -0
  3. package/LICENSE +21 -0
  4. package/README.md +129 -0
  5. package/SOUL.md +8 -0
  6. package/bin/neondeck.mjs +27 -0
  7. package/config/dashboard.json +224 -0
  8. package/config/dashboard.schema.json +247 -0
  9. package/dist/SOUL.md +8 -0
  10. package/dist/assets/app-CnXGMuTl.js +3878 -0
  11. package/dist/assets/app-CnXGMuTl.js.map +1 -0
  12. package/dist/assets/autopilot-B8lfWyA1.js +68813 -0
  13. package/dist/assets/autopilot-B8lfWyA1.js.map +1 -0
  14. package/dist/assets/briefing-BT8h9XXT.js +52 -0
  15. package/dist/assets/briefing-BT8h9XXT.js.map +1 -0
  16. package/dist/assets/briefing-VMdQPEGc.js +2 -0
  17. package/dist/assets/briefings-DuApznpN.js +1596 -0
  18. package/dist/assets/briefings-DuApznpN.js.map +1 -0
  19. package/dist/assets/command-run-CnPOA8iY.js +20 -0
  20. package/dist/assets/command-run-CnPOA8iY.js.map +1 -0
  21. package/dist/assets/command-run-Smpq7waT.js +2 -0
  22. package/dist/assets/display-assistant-CKU4YJlc.js +392 -0
  23. package/dist/assets/display-assistant-CKU4YJlc.js.map +1 -0
  24. package/dist/assets/fix-pr-ci-Ce2SIcyf.js +46 -0
  25. package/dist/assets/fix-pr-ci-Ce2SIcyf.js.map +1 -0
  26. package/dist/assets/fix-pr-ci-P3dLxmbx.js +2 -0
  27. package/dist/assets/migrations/20260710061339_neondeck_pre_1_0_baseline/migration.sql +748 -0
  28. package/dist/assets/migrations/20260710061339_neondeck_pre_1_0_baseline/snapshot.json +7126 -0
  29. package/dist/assets/migrations/20260711171708_conversational_briefings/migration.sql +35 -0
  30. package/dist/assets/migrations/20260711171708_conversational_briefings/snapshot.json +7458 -0
  31. package/dist/assets/migrations/20260714191624_worktree_lock_revocation/migration.sql +1 -0
  32. package/dist/assets/migrations/20260714191624_worktree_lock_revocation/snapshot.json +7468 -0
  33. package/dist/assets/migrations/20260714213018_pr_reviews/migration.sql +34 -0
  34. package/dist/assets/migrations/20260714213018_pr_reviews/snapshot.json +7809 -0
  35. package/dist/assets/pr-reviews-BtJ5cm5P.js +521 -0
  36. package/dist/assets/pr-reviews-BtJ5cm5P.js.map +1 -0
  37. package/dist/assets/prepare-pr-worktree-B0qMZMRP.js +2 -0
  38. package/dist/assets/prepare-pr-worktree-C7SmiaTp.js +17 -0
  39. package/dist/assets/prepare-pr-worktree-C7SmiaTp.js.map +1 -0
  40. package/dist/assets/push-pr-autofix-CsMbrnXR.js +17 -0
  41. package/dist/assets/push-pr-autofix-CsMbrnXR.js.map +1 -0
  42. package/dist/assets/push-pr-autofix-njuM6ej2.js +2 -0
  43. package/dist/assets/review-pr-for-human-CEciM46A.js +2 -0
  44. package/dist/assets/review-pr-for-human-TPiQNRWV.js +790 -0
  45. package/dist/assets/review-pr-for-human-TPiQNRWV.js.map +1 -0
  46. package/dist/assets/safety-BQC7exnI.js +1931 -0
  47. package/dist/assets/safety-BQC7exnI.js.map +1 -0
  48. package/dist/assets/scheduled-agent-instruction-BbxwCKbU.js +2 -0
  49. package/dist/assets/scheduled-agent-instruction-C58itQyU.js +22 -0
  50. package/dist/assets/scheduled-agent-instruction-C58itQyU.js.map +1 -0
  51. package/dist/assets/scheduler-tick-B2S9jCYS.js +90 -0
  52. package/dist/assets/scheduler-tick-B2S9jCYS.js.map +1 -0
  53. package/dist/assets/scheduler-workflow-CnI0tWbg.js +21 -0
  54. package/dist/assets/scheduler-workflow-CnI0tWbg.js.map +1 -0
  55. package/dist/assets/skills/github-gh/SKILL.md +56 -0
  56. package/dist/assets/skills/neon-ci-fix/SKILL.md +15 -0
  57. package/dist/assets/skills/neon-docs-fix/SKILL.md +15 -0
  58. package/dist/assets/skills/neon-issue-triage/SKILL.md +13 -0
  59. package/dist/assets/skills/neon-pr-review/SKILL.md +19 -0
  60. package/dist/assets/skills/neondeck/SKILL.md +127 -0
  61. package/dist/assets/skills/neondeck-handoff/SKILL.md +31 -0
  62. package/dist/assets/triage-pr-event-CBje6df5.js +2 -0
  63. package/dist/assets/triage-pr-event-IgC-IrNs.js +17 -0
  64. package/dist/assets/triage-pr-event-IgC-IrNs.js.map +1 -0
  65. package/dist/assets/verify-then-push-pr-autofix-C5Dpomtd.js +75 -0
  66. package/dist/assets/verify-then-push-pr-autofix-C5Dpomtd.js.map +1 -0
  67. package/dist/assets/verify-then-push-pr-autofix-oZ0-wa7L.js +2 -0
  68. package/dist/config/dashboard.json +224 -0
  69. package/dist/config/dashboard.schema.json +247 -0
  70. package/dist/server.mjs +583 -0
  71. package/dist/server.mjs.map +1 -0
  72. package/dist/skills/github-gh/SKILL.md +56 -0
  73. package/dist/skills/neon-ci-fix/SKILL.md +15 -0
  74. package/dist/skills/neon-docs-fix/SKILL.md +15 -0
  75. package/dist/skills/neon-issue-triage/SKILL.md +13 -0
  76. package/dist/skills/neon-pr-review/SKILL.md +19 -0
  77. package/dist/skills/neondeck/SKILL.md +127 -0
  78. package/dist/skills/neondeck-handoff/SKILL.md +31 -0
  79. package/drizzle.config.ts +7 -0
  80. package/package.json +156 -0
  81. package/shared/patch-anchors.ts +78 -0
  82. package/shared/report-document.ts +91 -0
  83. package/src/agents/busywork-workflow.ts +24 -0
  84. package/src/agents/display-assistant.ts +137 -0
  85. package/src/agents/pr-review-assistant.ts +25 -0
  86. package/src/agents/scheduler-workflow.ts +20 -0
  87. package/src/agents/support/tools.ts +346 -0
  88. package/src/app.ts +1 -0
  89. package/src/cli/index.ts +560 -0
  90. package/src/cli/learning.ts +44 -0
  91. package/src/cli/mcp.ts +496 -0
  92. package/src/cli/modules.ts +107 -0
  93. package/src/cli/onboarding.ts +666 -0
  94. package/src/cli/options.ts +102 -0
  95. package/src/cli/output.ts +399 -0
  96. package/src/cli/preapprovals.ts +204 -0
  97. package/src/cli/prompts.ts +108 -0
  98. package/src/cli/types.ts +59 -0
  99. package/src/db.ts +41 -0
  100. package/src/desktop/open.ts +698 -0
  101. package/src/desktop/service.ts +863 -0
  102. package/src/domains/mcp/actions.ts +420 -0
  103. package/src/domains/mcp/config.ts +501 -0
  104. package/src/domains/mcp/format.ts +35 -0
  105. package/src/domains/mcp/gate.ts +188 -0
  106. package/src/domains/mcp/index.ts +9 -0
  107. package/src/domains/mcp/instructions.ts +18 -0
  108. package/src/domains/mcp/oauth.ts +1063 -0
  109. package/src/domains/mcp/policy.ts +15 -0
  110. package/src/domains/mcp/registry.ts +461 -0
  111. package/src/domains/mcp/schemas.ts +171 -0
  112. package/src/domains/mcp/stdio.ts +451 -0
  113. package/src/domains/mcp/store.ts +905 -0
  114. package/src/domains/mcp/tools.ts +119 -0
  115. package/src/lib/action-result.ts +51 -0
  116. package/src/lib/exec.ts +118 -0
  117. package/src/lib/git.ts +20 -0
  118. package/src/lib/report-html.ts +193 -0
  119. package/src/lib/sqlite.ts +51 -0
  120. package/src/lib/valibot.ts +33 -0
  121. package/src/modules/app-state/index.ts +4 -0
  122. package/src/modules/app-state/notification-events.ts +44 -0
  123. package/src/modules/app-state/notifications.ts +259 -0
  124. package/src/modules/app-state/types.ts +42 -0
  125. package/src/modules/app-state/workflow-summaries.ts +201 -0
  126. package/src/modules/autonomous-audit/index.ts +225 -0
  127. package/src/modules/autopilot/actions.ts +186 -0
  128. package/src/modules/autopilot/admissions.ts +865 -0
  129. package/src/modules/autopilot/approvals.ts +59 -0
  130. package/src/modules/autopilot/ci-fix-run.ts +1332 -0
  131. package/src/modules/autopilot/ci-fix.ts +718 -0
  132. package/src/modules/autopilot/comments.ts +426 -0
  133. package/src/modules/autopilot/fixtures.ts +344 -0
  134. package/src/modules/autopilot/github-facts.ts +306 -0
  135. package/src/modules/autopilot/index.ts +64 -0
  136. package/src/modules/autopilot/notifications.ts +271 -0
  137. package/src/modules/autopilot/push-support.ts +260 -0
  138. package/src/modules/autopilot/push.ts +670 -0
  139. package/src/modules/autopilot/recovery.ts +656 -0
  140. package/src/modules/autopilot/review-feedback.ts +649 -0
  141. package/src/modules/autopilot/review-support.ts +524 -0
  142. package/src/modules/autopilot/revision-run.ts +445 -0
  143. package/src/modules/autopilot/schemas.ts +485 -0
  144. package/src/modules/autopilot/state-mappers.ts +517 -0
  145. package/src/modules/autopilot/state-schemas.ts +450 -0
  146. package/src/modules/autopilot/state-store.ts +183 -0
  147. package/src/modules/autopilot/state.ts +255 -0
  148. package/src/modules/autopilot/triage-support.ts +234 -0
  149. package/src/modules/autopilot/triage.ts +156 -0
  150. package/src/modules/autopilot/utils.ts +145 -0
  151. package/src/modules/autopilot/worktree.ts +637 -0
  152. package/src/modules/autopilot-policy/config.ts +101 -0
  153. package/src/modules/autopilot-policy/index.ts +4 -0
  154. package/src/modules/autopilot-policy/risk.ts +359 -0
  155. package/src/modules/autopilot-policy/schemas.ts +229 -0
  156. package/src/modules/autopilot-policy/service.ts +272 -0
  157. package/src/modules/briefings/actions.ts +80 -0
  158. package/src/modules/briefings/index.ts +5 -0
  159. package/src/modules/briefings/schemas.ts +125 -0
  160. package/src/modules/briefings/service.ts +642 -0
  161. package/src/modules/briefings/snapshot.ts +291 -0
  162. package/src/modules/briefings/store.ts +644 -0
  163. package/src/modules/commands/actions.ts +112 -0
  164. package/src/modules/commands/handlers/index.ts +3 -0
  165. package/src/modules/commands/handlers/misc.ts +367 -0
  166. package/src/modules/commands/handlers/queue.ts +710 -0
  167. package/src/modules/commands/handlers/repo.ts +339 -0
  168. package/src/modules/commands/index.ts +5 -0
  169. package/src/modules/commands/registry.ts +157 -0
  170. package/src/modules/commands/runner.ts +152 -0
  171. package/src/modules/commands/schemas.ts +109 -0
  172. package/src/modules/commands/summaries.ts +108 -0
  173. package/src/modules/commands/utils.ts +113 -0
  174. package/src/modules/config/actions.ts +253 -0
  175. package/src/modules/config/events.ts +80 -0
  176. package/src/modules/config/files.ts +9 -0
  177. package/src/modules/config/history.ts +74 -0
  178. package/src/modules/config/index.ts +9 -0
  179. package/src/modules/config/mutations/dashboard.ts +333 -0
  180. package/src/modules/config/mutations/execution.ts +89 -0
  181. package/src/modules/config/mutations/models.ts +467 -0
  182. package/src/modules/config/mutations/providers.ts +163 -0
  183. package/src/modules/config/mutations/repos.ts +663 -0
  184. package/src/modules/config/read.ts +130 -0
  185. package/src/modules/config/result.ts +66 -0
  186. package/src/modules/config/schemas.ts +180 -0
  187. package/src/modules/docs-drift/index.ts +1 -0
  188. package/src/modules/docs-drift/service.ts +863 -0
  189. package/src/modules/execution/actions.ts +35 -0
  190. package/src/modules/execution/approvals.ts +322 -0
  191. package/src/modules/execution/exedev/checkouts.ts +356 -0
  192. package/src/modules/execution/exedev/context.ts +286 -0
  193. package/src/modules/execution/index.ts +7 -0
  194. package/src/modules/execution/policy.ts +102 -0
  195. package/src/modules/execution/run.ts +589 -0
  196. package/src/modules/execution/schemas.ts +116 -0
  197. package/src/modules/execution/scope.ts +137 -0
  198. package/src/modules/execution/store.ts +320 -0
  199. package/src/modules/execution/utils.ts +105 -0
  200. package/src/modules/execution-policy/index.ts +424 -0
  201. package/src/modules/flue/execution-context.ts +40 -0
  202. package/src/modules/flue/index.ts +2 -0
  203. package/src/modules/flue/origin.ts +7 -0
  204. package/src/modules/github/actions.ts +334 -0
  205. package/src/modules/github/checks.ts +484 -0
  206. package/src/modules/github/client.ts +110 -0
  207. package/src/modules/github/comments.ts +204 -0
  208. package/src/modules/github/errors.ts +50 -0
  209. package/src/modules/github/index.ts +93 -0
  210. package/src/modules/github/issues.ts +116 -0
  211. package/src/modules/github/pr-file-cache.ts +264 -0
  212. package/src/modules/github/pull-requests.ts +411 -0
  213. package/src/modules/github/queue.ts +350 -0
  214. package/src/modules/github/reviews.ts +1446 -0
  215. package/src/modules/github/schemas.ts +794 -0
  216. package/src/modules/github/state-truncation.ts +31 -0
  217. package/src/modules/handoff/index.ts +2 -0
  218. package/src/modules/handoff/schemas.ts +61 -0
  219. package/src/modules/handoff/service.ts +587 -0
  220. package/src/modules/hygiene/index.ts +1 -0
  221. package/src/modules/hygiene/service.ts +513 -0
  222. package/src/modules/kilo/actions.ts +229 -0
  223. package/src/modules/kilo/ci-fix-run-reconcile.ts +299 -0
  224. package/src/modules/kilo/docs-drift-boundary.ts +178 -0
  225. package/src/modules/kilo/index.ts +8 -0
  226. package/src/modules/kilo/notifications.ts +295 -0
  227. package/src/modules/kilo/process.ts +637 -0
  228. package/src/modules/kilo/results/actions.ts +66 -0
  229. package/src/modules/kilo/results/gates.ts +227 -0
  230. package/src/modules/kilo/results/index.ts +23 -0
  231. package/src/modules/kilo/results/schemas.ts +112 -0
  232. package/src/modules/kilo/results/service.ts +512 -0
  233. package/src/modules/kilo/results/state.ts +508 -0
  234. package/src/modules/kilo/results/verify.ts +328 -0
  235. package/src/modules/kilo/revision-reconcile.ts +187 -0
  236. package/src/modules/kilo/runtime-facts.ts +128 -0
  237. package/src/modules/kilo/schemas.ts +265 -0
  238. package/src/modules/kilo/service.ts +714 -0
  239. package/src/modules/kilo/sessions-adapters.ts +343 -0
  240. package/src/modules/kilo/sessions.ts +446 -0
  241. package/src/modules/kilo/store.ts +689 -0
  242. package/src/modules/kilo/utils.ts +166 -0
  243. package/src/modules/learning/automation-health.ts +441 -0
  244. package/src/modules/learning/automation-memory.ts +179 -0
  245. package/src/modules/learning/index.ts +6 -0
  246. package/src/modules/learning/observability.ts +616 -0
  247. package/src/modules/learning/operator.ts +404 -0
  248. package/src/modules/learning/reviews/agents.ts +33 -0
  249. package/src/modules/learning/reviews/complete.ts +321 -0
  250. package/src/modules/learning/reviews/context.ts +145 -0
  251. package/src/modules/learning/reviews/events.ts +306 -0
  252. package/src/modules/learning/reviews/index.ts +6 -0
  253. package/src/modules/learning/reviews/pr-cadence.ts +157 -0
  254. package/src/modules/learning/reviews/pr-context.ts +749 -0
  255. package/src/modules/learning/reviews/prepare.ts +387 -0
  256. package/src/modules/learning/reviews/schemas.ts +184 -0
  257. package/src/modules/learning/reviews/store.ts +405 -0
  258. package/src/modules/learning/skill-patches/actions.ts +86 -0
  259. package/src/modules/learning/skill-patches/index.ts +3 -0
  260. package/src/modules/learning/skill-patches/schemas.ts +60 -0
  261. package/src/modules/learning/skill-patches/service.ts +571 -0
  262. package/src/modules/learning/skill-patches/support.ts +417 -0
  263. package/src/modules/memory/actions.ts +183 -0
  264. package/src/modules/memory/candidates.ts +525 -0
  265. package/src/modules/memory/events.ts +2 -0
  266. package/src/modules/memory/index.ts +6 -0
  267. package/src/modules/memory/prompt.ts +214 -0
  268. package/src/modules/memory/schemas.ts +170 -0
  269. package/src/modules/memory/service.ts +578 -0
  270. package/src/modules/memory/store.ts +489 -0
  271. package/src/modules/pr-events/actions.ts +191 -0
  272. package/src/modules/pr-events/index.ts +46 -0
  273. package/src/modules/pr-events/schemas.ts +186 -0
  274. package/src/modules/pr-events/service.ts +1414 -0
  275. package/src/modules/pr-events/target.ts +222 -0
  276. package/src/modules/pr-events/utils.ts +85 -0
  277. package/src/modules/pr-events/watermarks.ts +308 -0
  278. package/src/modules/pr-local-diffs/index.ts +334 -0
  279. package/src/modules/pr-review-assist/actions.ts +239 -0
  280. package/src/modules/pr-review-assist/index.ts +3 -0
  281. package/src/modules/pr-review-assist/schemas.ts +86 -0
  282. package/src/modules/pr-review-assist/service.ts +706 -0
  283. package/src/modules/pr-reviews/events.ts +39 -0
  284. package/src/modules/pr-reviews/index.ts +4 -0
  285. package/src/modules/pr-reviews/service.ts +655 -0
  286. package/src/modules/pr-reviews/store.ts +186 -0
  287. package/src/modules/pr-reviews/types.ts +48 -0
  288. package/src/modules/prepared-diffs/actions.ts +132 -0
  289. package/src/modules/prepared-diffs/index.ts +53 -0
  290. package/src/modules/prepared-diffs/schemas.ts +255 -0
  291. package/src/modules/prepared-diffs/service.ts +791 -0
  292. package/src/modules/prepared-diffs/store.ts +678 -0
  293. package/src/modules/repo-guardrails/config.ts +61 -0
  294. package/src/modules/repo-guardrails/index.ts +162 -0
  295. package/src/modules/repo-guardrails/risk.ts +2 -0
  296. package/src/modules/reports/index.ts +1 -0
  297. package/src/modules/reports/service.ts +337 -0
  298. package/src/modules/repos/index.ts +3 -0
  299. package/src/modules/repos/model-discovery.ts +233 -0
  300. package/src/modules/repos/providers.ts +194 -0
  301. package/src/modules/repos/registry.ts +232 -0
  302. package/src/modules/runtime/agent-config.ts +167 -0
  303. package/src/modules/runtime/doctor.ts +528 -0
  304. package/src/modules/runtime/env.ts +123 -0
  305. package/src/modules/runtime/index.ts +12 -0
  306. package/src/modules/runtime/local-api-auth.ts +43 -0
  307. package/src/modules/runtime/metrics.ts +211 -0
  308. package/src/modules/runtime/skills-actions.ts +141 -0
  309. package/src/modules/runtime/skills.ts +689 -0
  310. package/src/modules/runtime/soul.ts +68 -0
  311. package/src/modules/runtime/status-database.ts +252 -0
  312. package/src/modules/runtime/status-schema.ts +149 -0
  313. package/src/modules/runtime/status.ts +481 -0
  314. package/src/modules/runtime/subagents.ts +37 -0
  315. package/src/modules/runtime/utility-model.ts +47 -0
  316. package/src/modules/safety/index.ts +3 -0
  317. package/src/modules/safety/policy-entries.ts +2528 -0
  318. package/src/modules/safety/schemas.ts +63 -0
  319. package/src/modules/safety/service.ts +58 -0
  320. package/src/modules/safety/tools.ts +15 -0
  321. package/src/modules/scheduled-tasks/actions.ts +113 -0
  322. package/src/modules/scheduled-tasks/dispatch.ts +107 -0
  323. package/src/modules/scheduled-tasks/index.ts +6 -0
  324. package/src/modules/scheduled-tasks/schemas.ts +91 -0
  325. package/src/modules/scheduled-tasks/service.ts +296 -0
  326. package/src/modules/scheduled-tasks/store.ts +814 -0
  327. package/src/modules/scheduled-tasks/triggers.ts +87 -0
  328. package/src/modules/scheduler/actions.ts +37 -0
  329. package/src/modules/scheduler/dispatch.ts +192 -0
  330. package/src/modules/scheduler/index.ts +4 -0
  331. package/src/modules/scheduler/lease.ts +247 -0
  332. package/src/modules/scheduler/pr-watch-event-deltas.ts +367 -0
  333. package/src/modules/scheduler/pr-watch-events.ts +834 -0
  334. package/src/modules/scheduler/schemas.ts +79 -0
  335. package/src/modules/scheduler/service.ts +228 -0
  336. package/src/modules/scheduler/utils.ts +106 -0
  337. package/src/modules/scheduler/workflow-invocation.ts +48 -0
  338. package/src/modules/sessions/actions.ts +213 -0
  339. package/src/modules/sessions/active-session.ts +46 -0
  340. package/src/modules/sessions/activity.ts +122 -0
  341. package/src/modules/sessions/agent-context.ts +152 -0
  342. package/src/modules/sessions/approval-nudges.ts +156 -0
  343. package/src/modules/sessions/events.ts +57 -0
  344. package/src/modules/sessions/index.ts +12 -0
  345. package/src/modules/sessions/queries.ts +252 -0
  346. package/src/modules/sessions/references.ts +113 -0
  347. package/src/modules/sessions/repo-context.ts +131 -0
  348. package/src/modules/sessions/schemas.ts +285 -0
  349. package/src/modules/sessions/service.ts +845 -0
  350. package/src/modules/sessions/store.ts +560 -0
  351. package/src/modules/sessions/summaries.ts +129 -0
  352. package/src/modules/sessions/utils.ts +18 -0
  353. package/src/modules/watches/actions.ts +115 -0
  354. package/src/modules/watches/index.ts +6 -0
  355. package/src/modules/watches/polling.ts +245 -0
  356. package/src/modules/watches/references.ts +293 -0
  357. package/src/modules/watches/schemas.ts +156 -0
  358. package/src/modules/watches/service.ts +557 -0
  359. package/src/modules/watches/store.ts +398 -0
  360. package/src/modules/watches/utils.ts +51 -0
  361. package/src/modules/worktree-verification/index.ts +256 -0
  362. package/src/modules/worktrees/access.ts +129 -0
  363. package/src/modules/worktrees/actions.ts +108 -0
  364. package/src/modules/worktrees/cleanup.ts +98 -0
  365. package/src/modules/worktrees/ensure-pr-worktree.ts +63 -0
  366. package/src/modules/worktrees/errors.ts +38 -0
  367. package/src/modules/worktrees/git.ts +48 -0
  368. package/src/modules/worktrees/index.ts +7 -0
  369. package/src/modules/worktrees/locks.ts +231 -0
  370. package/src/modules/worktrees/paths.ts +209 -0
  371. package/src/modules/worktrees/push-target.ts +39 -0
  372. package/src/modules/worktrees/queries.ts +31 -0
  373. package/src/modules/worktrees/schemas.ts +237 -0
  374. package/src/modules/worktrees/service.ts +680 -0
  375. package/src/modules/worktrees/store.ts +415 -0
  376. package/src/repo-edit/actions.ts +509 -0
  377. package/src/repo-edit/audit.ts +180 -0
  378. package/src/repo-edit/fuzzy-replace.ts +256 -0
  379. package/src/repo-edit/git.ts +830 -0
  380. package/src/repo-edit/index.ts +4 -0
  381. package/src/repo-edit/locks.ts +27 -0
  382. package/src/repo-edit/patch-parser.ts +212 -0
  383. package/src/repo-edit/patch-service.ts +572 -0
  384. package/src/repo-edit/path-safety.ts +299 -0
  385. package/src/repo-edit/schemas.ts +239 -0
  386. package/src/repo-edit/service.ts +488 -0
  387. package/src/repo-edit/support.ts +459 -0
  388. package/src/runtime-home/app-db/index.ts +74 -0
  389. package/src/runtime-home/app-db/migrate.ts +491 -0
  390. package/src/runtime-home/app-db/migrations/20260710061339_neondeck_pre_1_0_baseline/migration.sql +748 -0
  391. package/src/runtime-home/app-db/migrations/20260710061339_neondeck_pre_1_0_baseline/snapshot.json +7126 -0
  392. package/src/runtime-home/app-db/migrations/20260711171708_conversational_briefings/migration.sql +35 -0
  393. package/src/runtime-home/app-db/migrations/20260711171708_conversational_briefings/snapshot.json +7458 -0
  394. package/src/runtime-home/app-db/migrations/20260714191624_worktree_lock_revocation/migration.sql +1 -0
  395. package/src/runtime-home/app-db/migrations/20260714191624_worktree_lock_revocation/snapshot.json +7468 -0
  396. package/src/runtime-home/app-db/migrations/20260714213018_pr_reviews/migration.sql +34 -0
  397. package/src/runtime-home/app-db/migrations/20260714213018_pr_reviews/snapshot.json +7809 -0
  398. package/src/runtime-home/app-db/reconcile.ts +155 -0
  399. package/src/runtime-home/app-db/schema.ts +1209 -0
  400. package/src/runtime-home/bootstrap.ts +177 -0
  401. package/src/runtime-home/dashboard-migrations.ts +101 -0
  402. package/src/runtime-home/defaults.ts +54 -0
  403. package/src/runtime-home/files.ts +193 -0
  404. package/src/runtime-home/guardrails.ts +77 -0
  405. package/src/runtime-home/index.ts +71 -0
  406. package/src/runtime-home/paths.ts +75 -0
  407. package/src/runtime-home/schemas.ts +520 -0
  408. package/src/sandboxes/exedev.ts +676 -0
  409. package/src/server/app.ts +5 -0
  410. package/src/server/autopilot-push-dispatch.ts +326 -0
  411. package/src/server/create-app.ts +160 -0
  412. package/src/server/events/event-stream.ts +109 -0
  413. package/src/server/http.ts +56 -0
  414. package/src/server/learning-hooks.ts +489 -0
  415. package/src/server/middleware.ts +81 -0
  416. package/src/server/routes/autopilot.ts +318 -0
  417. package/src/server/routes/briefings.ts +34 -0
  418. package/src/server/routes/commands.ts +12 -0
  419. package/src/server/routes/config.ts +124 -0
  420. package/src/server/routes/execution.ts +71 -0
  421. package/src/server/routes/github.ts +559 -0
  422. package/src/server/routes/handoff.ts +69 -0
  423. package/src/server/routes/kilo.ts +179 -0
  424. package/src/server/routes/learning.ts +384 -0
  425. package/src/server/routes/mcp.ts +301 -0
  426. package/src/server/routes/memory.ts +99 -0
  427. package/src/server/routes/metrics.ts +12 -0
  428. package/src/server/routes/notifications.ts +48 -0
  429. package/src/server/routes/repo-edit.ts +115 -0
  430. package/src/server/routes/reports.ts +128 -0
  431. package/src/server/routes/repos.ts +50 -0
  432. package/src/server/routes/reviews.ts +257 -0
  433. package/src/server/routes/runtime.ts +48 -0
  434. package/src/server/routes/safety.ts +13 -0
  435. package/src/server/routes/scheduled-tasks.ts +60 -0
  436. package/src/server/routes/scheduler.ts +13 -0
  437. package/src/server/routes/sessions.ts +229 -0
  438. package/src/server/routes/skills.ts +103 -0
  439. package/src/server/routes/watches.ts +81 -0
  440. package/src/server/routes/workflows.ts +21 -0
  441. package/src/server/routes/worktrees.ts +64 -0
  442. package/src/server/scheduler-workflow.ts +541 -0
  443. package/src/server/serve.ts +100 -0
  444. package/src/setup.ts +162 -0
  445. package/src/skills/github-gh/SKILL.md +56 -0
  446. package/src/skills/neon-ci-fix/SKILL.md +15 -0
  447. package/src/skills/neon-docs-fix/SKILL.md +15 -0
  448. package/src/skills/neon-issue-triage/SKILL.md +13 -0
  449. package/src/skills/neon-pr-review/SKILL.md +19 -0
  450. package/src/skills/neondeck/SKILL.md +127 -0
  451. package/src/skills/neondeck-handoff/SKILL.md +31 -0
  452. package/src/workflows/briefing.ts +50 -0
  453. package/src/workflows/command-run.ts +15 -0
  454. package/src/workflows/comment-pr-autofix-result.ts +10 -0
  455. package/src/workflows/curate_learning_store.ts +37 -0
  456. package/src/workflows/dev-doctor.ts +10 -0
  457. package/src/workflows/fix-pr-ci-failure.ts +10 -0
  458. package/src/workflows/fix-pr-ci.ts +15 -0
  459. package/src/workflows/fix-pr-review-feedback.ts +10 -0
  460. package/src/workflows/handoff_to_kilo.ts +10 -0
  461. package/src/workflows/prepare-pr-worktree.ts +10 -0
  462. package/src/workflows/promote_kilo_result.ts +10 -0
  463. package/src/workflows/push-pr-autofix.ts +10 -0
  464. package/src/workflows/reconcile_kilo_task.ts +10 -0
  465. package/src/workflows/review-pr-for-human.ts +15 -0
  466. package/src/workflows/review_conversation_for_learning.ts +37 -0
  467. package/src/workflows/review_kilo_result.ts +10 -0
  468. package/src/workflows/review_pr_batch_for_learning.ts +37 -0
  469. package/src/workflows/scheduled-agent-instruction.ts +16 -0
  470. package/src/workflows/scheduler-tick.ts +10 -0
  471. package/src/workflows/summarize_kilo_session.ts +25 -0
  472. package/src/workflows/triage-pr-event.ts +10 -0
  473. package/src/workflows/verify-pr-worktree.ts +10 -0
  474. package/src/workflows/verify-then-push-pr-autofix.ts +82 -0
  475. package/src/workflows/verify_kilo_result.ts +10 -0
  476. package/src/workflows/watch-pr.ts +10 -0
  477. package/web/dist/assets/GitHubPrReview-Bf8PXCaq.js +3 -0
  478. package/web/dist/assets/MultiFileView-CFYStqTV.js +2970 -0
  479. package/web/dist/assets/PrReviewPopoutPage-CZN1CV82.js +1 -0
  480. package/web/dist/assets/abap-CLvhMVsD.js +1 -0
  481. package/web/dist/assets/actionscript-3--17pq3dv.js +1 -0
  482. package/web/dist/assets/ada-C5qYipkI.js +1 -0
  483. package/web/dist/assets/andromeeda-vGVdxbeo.js +1 -0
  484. package/web/dist/assets/angular-html-BVBpGdXr.js +1 -0
  485. package/web/dist/assets/angular-ts-BfdufMKP.js +1 -0
  486. package/web/dist/assets/apache-U0d_L8uA.js +1 -0
  487. package/web/dist/assets/apex-VAyPSnFM.js +1 -0
  488. package/web/dist/assets/apl-DWBSSoBH.js +1 -0
  489. package/web/dist/assets/applescript-CCn79oCD.js +1 -0
  490. package/web/dist/assets/ara-4CJ0cIlV.js +1 -0
  491. package/web/dist/assets/asciidoc-DE70LPWp.js +1 -0
  492. package/web/dist/assets/asm-Cmm7eHzH.js +1 -0
  493. package/web/dist/assets/astro-3LtMP0Sq.js +1 -0
  494. package/web/dist/assets/aurora-x-CDeNXAV0.js +1 -0
  495. package/web/dist/assets/awk-BWXHIvNe.js +1 -0
  496. package/web/dist/assets/ayu-dark-DluEY0Gj.js +1 -0
  497. package/web/dist/assets/ayu-light-C3h-C4tm.js +1 -0
  498. package/web/dist/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  499. package/web/dist/assets/ballerina-B7ZEbQpA.js +1 -0
  500. package/web/dist/assets/bat-Bo4NYOV-.js +1 -0
  501. package/web/dist/assets/beancount-D-usSTwE.js +1 -0
  502. package/web/dist/assets/berry-DKpUyyne.js +1 -0
  503. package/web/dist/assets/bibtex-Ci_nEsc7.js +1 -0
  504. package/web/dist/assets/bicep-CUHmPFLl.js +1 -0
  505. package/web/dist/assets/bird2-C6vDhewU.js +1 -0
  506. package/web/dist/assets/blade-llJRbbtR.js +1 -0
  507. package/web/dist/assets/bsl-BkkzgIyY.js +1 -0
  508. package/web/dist/assets/c-Wt1voDr2.js +1 -0
  509. package/web/dist/assets/c3-BFHwR3_K.js +1 -0
  510. package/web/dist/assets/cadence-CQ2zXKGN.js +1 -0
  511. package/web/dist/assets/cairo-DLTphjLi.js +1 -0
  512. package/web/dist/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  513. package/web/dist/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  514. package/web/dist/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  515. package/web/dist/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  516. package/web/dist/assets/ccount-CMHa3wy6.js +1 -0
  517. package/web/dist/assets/clarity-SemFz856.js +1 -0
  518. package/web/dist/assets/clojure-DqKBuwfJ.js +1 -0
  519. package/web/dist/assets/cmake-Bj61d0ZC.js +1 -0
  520. package/web/dist/assets/cobol-x_HIyl2P.js +1 -0
  521. package/web/dist/assets/codeowners-C8r90Shi.js +1 -0
  522. package/web/dist/assets/codeql-oeQT6MSM.js +1 -0
  523. package/web/dist/assets/coffee-CThvmt4R.js +1 -0
  524. package/web/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
  525. package/web/dist/assets/coq-BrsZFFmf.js +1 -0
  526. package/web/dist/assets/cpp-NtAeskI3.js +1 -0
  527. package/web/dist/assets/crystal-DNu_sX0G.js +1 -0
  528. package/web/dist/assets/csharp-oqKa8noW.js +1 -0
  529. package/web/dist/assets/css-DJp_X0uY.js +1 -0
  530. package/web/dist/assets/csv-Dx-8-gkx.js +1 -0
  531. package/web/dist/assets/cue-CE9AQfxI.js +1 -0
  532. package/web/dist/assets/cypher-ClKdZ_lG.js +1 -0
  533. package/web/dist/assets/d-qD-0Kul2.js +1 -0
  534. package/web/dist/assets/dark-plus-Cs2F2srj.js +1 -0
  535. package/web/dist/assets/dart-CnvKMtbv.js +1 -0
  536. package/web/dist/assets/dax-BkyTk9wS.js +1 -0
  537. package/web/dist/assets/desktop-Dlh5hvp9.js +1 -0
  538. package/web/dist/assets/diff-woXpYk--.js +1 -0
  539. package/web/dist/assets/docker-IyjqRm3v.js +1 -0
  540. package/web/dist/assets/dotenv-_5a1GRtc.js +1 -0
  541. package/web/dist/assets/dracula-BHWKrbxM.js +1 -0
  542. package/web/dist/assets/dracula-soft-5eyTD99u.js +1 -0
  543. package/web/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
  544. package/web/dist/assets/edge-ozw5tpLl.js +1 -0
  545. package/web/dist/assets/elixir-VhA6FeZt.js +1 -0
  546. package/web/dist/assets/elm-dREJmIFz.js +1 -0
  547. package/web/dist/assets/emacs-lisp-B4R74twV.js +1 -0
  548. package/web/dist/assets/erb-CIg6G69l.js +1 -0
  549. package/web/dist/assets/erlang-Cphh6RMH.js +1 -0
  550. package/web/dist/assets/everforest-dark-sB-x3p7T.js +1 -0
  551. package/web/dist/assets/everforest-light-Df2xbC6M.js +1 -0
  552. package/web/dist/assets/fennel-DQxkIbk2.js +1 -0
  553. package/web/dist/assets/fish-BJitypiv.js +1 -0
  554. package/web/dist/assets/fluent-C03EYrpw.js +1 -0
  555. package/web/dist/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  556. package/web/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
  557. package/web/dist/assets/fsharp-D13ZGOAj.js +1 -0
  558. package/web/dist/assets/gdresource-C0sCabJj.js +1 -0
  559. package/web/dist/assets/gdscript-Cp2uCuqX.js +1 -0
  560. package/web/dist/assets/gdshader-CBce3t8t.js +1 -0
  561. package/web/dist/assets/genie-CV2tkWYe.js +1 -0
  562. package/web/dist/assets/gherkin-DExj1W_8.js +1 -0
  563. package/web/dist/assets/git-commit-BSykSTBG.js +1 -0
  564. package/web/dist/assets/git-rebase-B44mJPta.js +1 -0
  565. package/web/dist/assets/github-dark-C-LZuMrd.js +1 -0
  566. package/web/dist/assets/github-dark-default-DXG-b-1a.js +1 -0
  567. package/web/dist/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  568. package/web/dist/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  569. package/web/dist/assets/github-light-EUqPIrTm.js +1 -0
  570. package/web/dist/assets/github-light-default-BXViO-2h.js +1 -0
  571. package/web/dist/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  572. package/web/dist/assets/gleam-CSRkHgEL.js +1 -0
  573. package/web/dist/assets/glimmer-js-vH_gHG0-.js +1 -0
  574. package/web/dist/assets/glimmer-ts--abOzSAQ.js +1 -0
  575. package/web/dist/assets/glsl-Dv5r7kPw.js +1 -0
  576. package/web/dist/assets/gn-ilITqXS6.js +1 -0
  577. package/web/dist/assets/gnuplot-7GGW24-e.js +1 -0
  578. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  579. package/web/dist/assets/graphql-CB4jsw2E.js +1 -0
  580. package/web/dist/assets/groovy-CacY0gHj.js +1 -0
  581. package/web/dist/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  582. package/web/dist/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  583. package/web/dist/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  584. package/web/dist/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  585. package/web/dist/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  586. package/web/dist/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  587. package/web/dist/assets/hack-DvEYX148.js +1 -0
  588. package/web/dist/assets/haml-zE6W3STP.js +1 -0
  589. package/web/dist/assets/handlebars-CzBR2SDs.js +1 -0
  590. package/web/dist/assets/haskell-D8IpX4py.js +1 -0
  591. package/web/dist/assets/haxe-OTjmBuCE.js +1 -0
  592. package/web/dist/assets/hcl-Dh228itO.js +1 -0
  593. package/web/dist/assets/hjson-CxZEssPk.js +1 -0
  594. package/web/dist/assets/hlsl-Cvrh5tZx.js +1 -0
  595. package/web/dist/assets/horizon-CE9ld1lL.js +1 -0
  596. package/web/dist/assets/horizon-bright-DSNQnXHK.js +1 -0
  597. package/web/dist/assets/houston-CsvMBhTu.js +1 -0
  598. package/web/dist/assets/html-C8UlPnhE.js +1 -0
  599. package/web/dist/assets/html-derivative-CY6NRz-J.js +1 -0
  600. package/web/dist/assets/http-Cyd7bS_S.js +1 -0
  601. package/web/dist/assets/hurl-CWPsiEpf.js +1 -0
  602. package/web/dist/assets/hxml-B0Qn7Nwc.js +1 -0
  603. package/web/dist/assets/hy-CZbG8q4J.js +1 -0
  604. package/web/dist/assets/imba-DsUTQ-LC.js +1 -0
  605. package/web/dist/assets/index-BTjK1c82.js +44 -0
  606. package/web/dist/assets/index-D0kg2-9O.css +2 -0
  607. package/web/dist/assets/ini-B5eOa1yu.js +1 -0
  608. package/web/dist/assets/java-CGc3VwQr.js +1 -0
  609. package/web/dist/assets/javascript-CUt1pgmJ.js +1 -0
  610. package/web/dist/assets/jinja-CD-Z-FLd.js +1 -0
  611. package/web/dist/assets/jison-imPNup1l.js +1 -0
  612. package/web/dist/assets/json-Bg9ijW3F.js +1 -0
  613. package/web/dist/assets/json5-BR5RXkoi.js +1 -0
  614. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  615. package/web/dist/assets/jsonl-CmCQp5Yx.js +1 -0
  616. package/web/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
  617. package/web/dist/assets/jssm-DXw9l8Rf.js +1 -0
  618. package/web/dist/assets/jsx-CY6oMTks.js +1 -0
  619. package/web/dist/assets/julia-Dc3O-irA.js +1 -0
  620. package/web/dist/assets/just-BhOq_Kbv.js +1 -0
  621. package/web/dist/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  622. package/web/dist/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  623. package/web/dist/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  624. package/web/dist/assets/kdl-CsD5j6eV.js +1 -0
  625. package/web/dist/assets/kilo-CvN-tXHs.js +1 -0
  626. package/web/dist/assets/kotlin-DhhofPvG.js +1 -0
  627. package/web/dist/assets/kusto-C7mF5XQf.js +1 -0
  628. package/web/dist/assets/laserwave-C_8bwKvT.js +1 -0
  629. package/web/dist/assets/latex-Cu4Y1d5w.js +1 -0
  630. package/web/dist/assets/lean-CewbzKMR.js +1 -0
  631. package/web/dist/assets/less-DVTAwKKz.js +1 -0
  632. package/web/dist/assets/light-plus-DVQuIRkW.js +1 -0
  633. package/web/dist/assets/liquid-CvXMrjlQ.js +1 -0
  634. package/web/dist/assets/llvm-Cm23YOpf.js +1 -0
  635. package/web/dist/assets/log-BNLmms1o.js +1 -0
  636. package/web/dist/assets/logo-Cluzi2Zq.js +1 -0
  637. package/web/dist/assets/lua-BjLEUjKY.js +1 -0
  638. package/web/dist/assets/luau-FMPmPwt6.js +1 -0
  639. package/web/dist/assets/make-Dixweg8N.js +1 -0
  640. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  641. package/web/dist/assets/marko-DvhNOisQ.js +1 -0
  642. package/web/dist/assets/material-theme-Bm3Qr25_.js +1 -0
  643. package/web/dist/assets/material-theme-darker-2IIEA8gg.js +1 -0
  644. package/web/dist/assets/material-theme-lighter-uhdI0v04.js +1 -0
  645. package/web/dist/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  646. package/web/dist/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  647. package/web/dist/assets/matlab-D7qyCx1q.js +1 -0
  648. package/web/dist/assets/mdc-Bm9TpL1X.js +1 -0
  649. package/web/dist/assets/mdx-DQZ5AkYe.js +1 -0
  650. package/web/dist/assets/mermaid-Bk4SNUv9.js +1 -0
  651. package/web/dist/assets/min-dark-BSWPekZh.js +1 -0
  652. package/web/dist/assets/min-light-DDpmG2fV.js +1 -0
  653. package/web/dist/assets/mipsasm-BMqwQI7S.js +1 -0
  654. package/web/dist/assets/mojo-BgCJLMeH.js +1 -0
  655. package/web/dist/assets/monokai-CdkpiU2Y.js +1 -0
  656. package/web/dist/assets/moonbit-CaWjb8XO.js +1 -0
  657. package/web/dist/assets/move-B1IS1UjX.js +1 -0
  658. package/web/dist/assets/narrat-_X_XdTYD.js +1 -0
  659. package/web/dist/assets/nextflow-BJtWHP5T.js +1 -0
  660. package/web/dist/assets/nextflow-groovy-DJMQeKeT.js +1 -0
  661. package/web/dist/assets/nginx-Bhc82uuv.js +1 -0
  662. package/web/dist/assets/night-owl-DhmEMT88.js +1 -0
  663. package/web/dist/assets/night-owl-light-eJ-hLW7d.js +1 -0
  664. package/web/dist/assets/nim-DXTVBFnF.js +1 -0
  665. package/web/dist/assets/nix-IvuFDN5E.js +1 -0
  666. package/web/dist/assets/nord-Cb4Vim4T.js +1 -0
  667. package/web/dist/assets/nushell-DcLAeLz5.js +1 -0
  668. package/web/dist/assets/objective-c-D1A_Heim.js +1 -0
  669. package/web/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
  670. package/web/dist/assets/ocaml-O90oeIOV.js +1 -0
  671. package/web/dist/assets/odin-B1RWQWA5.js +1 -0
  672. package/web/dist/assets/one-dark-pro-CLwyXe_n.js +1 -0
  673. package/web/dist/assets/one-light-D7Lr4KcI.js +1 -0
  674. package/web/dist/assets/openscad-BUDT5pXO.js +1 -0
  675. package/web/dist/assets/pascal-4ZHwLPI5.js +1 -0
  676. package/web/dist/assets/perl-C7veXV9z.js +1 -0
  677. package/web/dist/assets/php-BRiuMnnr.js +1 -0
  678. package/web/dist/assets/pierre-dark-CpLgRqie.js +1 -0
  679. package/web/dist/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  680. package/web/dist/assets/pierre-dark-soft-kZQmAZld.js +1 -0
  681. package/web/dist/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  682. package/web/dist/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
  683. package/web/dist/assets/pierre-light-CoaEpmwp.js +1 -0
  684. package/web/dist/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  685. package/web/dist/assets/pierre-light-soft-lWLdNTOI.js +1 -0
  686. package/web/dist/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  687. package/web/dist/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
  688. package/web/dist/assets/pkl-ot-7Btpt.js +1 -0
  689. package/web/dist/assets/plastic-DQwYfKfQ.js +1 -0
  690. package/web/dist/assets/plsql-DGHpHOYJ.js +1 -0
  691. package/web/dist/assets/po-BiJDBrnU.js +1 -0
  692. package/web/dist/assets/poimandres-DRFjx7u4.js +1 -0
  693. package/web/dist/assets/polar-C7UOKdEL.js +1 -0
  694. package/web/dist/assets/postcss-BXeXVLqQ.js +1 -0
  695. package/web/dist/assets/powerquery-DNMTfnFr.js +1 -0
  696. package/web/dist/assets/powershell-DshXNtvi.js +1 -0
  697. package/web/dist/assets/prisma-BsRQq5mF.js +1 -0
  698. package/web/dist/assets/prolog-iXnhIJG7.js +1 -0
  699. package/web/dist/assets/proto-DB4EqR-F.js +1 -0
  700. package/web/dist/assets/pug-C5hz5LQ7.js +1 -0
  701. package/web/dist/assets/puppet-CDv2pdJW.js +1 -0
  702. package/web/dist/assets/purescript-9MfHhQsQ.js +1 -0
  703. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  704. package/web/dist/assets/qml-BdUV3aTS.js +1 -0
  705. package/web/dist/assets/qmldir-DCQb3MpD.js +1 -0
  706. package/web/dist/assets/qss-Fe1Jh2GI.js +1 -0
  707. package/web/dist/assets/r-8R7vtdQc.js +1 -0
  708. package/web/dist/assets/racket-DcIDlBhZ.js +1 -0
  709. package/web/dist/assets/raku-B3gFvitq.js +1 -0
  710. package/web/dist/assets/razor-DRL52XO2.js +1 -0
  711. package/web/dist/assets/red-CJ3rzSJv.js +1 -0
  712. package/web/dist/assets/reg-CRGYupPL.js +1 -0
  713. package/web/dist/assets/regexp-Omp9DhTb.js +1 -0
  714. package/web/dist/assets/rel-BtDbiS_P.js +1 -0
  715. package/web/dist/assets/reviews-CUXp47M8.js +1 -0
  716. package/web/dist/assets/riscv-Ckw8ddFX.js +1 -0
  717. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  718. package/web/dist/assets/ron-VUp2lXgN.js +1 -0
  719. package/web/dist/assets/rose-pine-BthvhNj6.js +1 -0
  720. package/web/dist/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  721. package/web/dist/assets/rose-pine-moon-hon4tzzS.js +1 -0
  722. package/web/dist/assets/rosmsg-CAekHB0j.js +1 -0
  723. package/web/dist/assets/rst-BHX71KW9.js +1 -0
  724. package/web/dist/assets/ruby-B--HzjGU.js +1 -0
  725. package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  726. package/web/dist/assets/sas-DrLaYOK_.js +1 -0
  727. package/web/dist/assets/sass-DXrisJhu.js +1 -0
  728. package/web/dist/assets/scala-DKOlJaKm.js +1 -0
  729. package/web/dist/assets/scheme-DQCgrYNe.js +1 -0
  730. package/web/dist/assets/scss-DdSxiZKl.js +1 -0
  731. package/web/dist/assets/sdbl-bTVj8UrX.js +1 -0
  732. package/web/dist/assets/shaderlab-TOUzSsQk.js +1 -0
  733. package/web/dist/assets/shellscript-DwcUjJBL.js +1 -0
  734. package/web/dist/assets/shellsession-CPZkydE6.js +1 -0
  735. package/web/dist/assets/slack-dark-DnToyrRv.js +1 -0
  736. package/web/dist/assets/slack-ochin-B2OO5cIa.js +1 -0
  737. package/web/dist/assets/smalltalk-B16xEiuN.js +1 -0
  738. package/web/dist/assets/snazzy-light-4G7pJPwS.js +1 -0
  739. package/web/dist/assets/solarized-dark-DV17i1UV.js +1 -0
  740. package/web/dist/assets/solarized-light-DSh2HLQt.js +1 -0
  741. package/web/dist/assets/solidity-CKzVLygQ.js +1 -0
  742. package/web/dist/assets/soy-Br5FhD7c.js +1 -0
  743. package/web/dist/assets/sparql-D_iOobhT.js +1 -0
  744. package/web/dist/assets/splunk-BC2Px7Mm.js +1 -0
  745. package/web/dist/assets/sql-DNssxck8.js +1 -0
  746. package/web/dist/assets/ssh-config-BgfXC-Er.js +1 -0
  747. package/web/dist/assets/stata-DXn1tqOr.js +1 -0
  748. package/web/dist/assets/stylus-B6D30XZt.js +1 -0
  749. package/web/dist/assets/surfaces-Dlg1xLbg.js +1 -0
  750. package/web/dist/assets/surrealql-IeLNQw0f.js +1 -0
  751. package/web/dist/assets/svelte-DOdLCIlh.js +1 -0
  752. package/web/dist/assets/swift-DonLKvLd.js +1 -0
  753. package/web/dist/assets/synthwave-84-nFMaYfgc.js +1 -0
  754. package/web/dist/assets/system-verilog-DJ5XKQeo.js +1 -0
  755. package/web/dist/assets/systemd-BxMlprV5.js +1 -0
  756. package/web/dist/assets/talonscript-CohzipZa.js +1 -0
  757. package/web/dist/assets/tasl-DMoTqEGO.js +1 -0
  758. package/web/dist/assets/tcl-CZd0xW_V.js +1 -0
  759. package/web/dist/assets/templ-CIwIngms.js +1 -0
  760. package/web/dist/assets/terraform-DswuEJGm.js +1 -0
  761. package/web/dist/assets/tex-D8QMumu5.js +1 -0
  762. package/web/dist/assets/tokyo-night-oM2G3aXe.js +1 -0
  763. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  764. package/web/dist/assets/ts-tags-BMVY4q-l.js +1 -0
  765. package/web/dist/assets/tsv-sltzmVWM.js +1 -0
  766. package/web/dist/assets/tsx-5Eka4NBX.js +1 -0
  767. package/web/dist/assets/turtle-ByJddavk.js +1 -0
  768. package/web/dist/assets/twig-C8o_5mgw.js +1 -0
  769. package/web/dist/assets/typescript-DOu2WMV5.js +1 -0
  770. package/web/dist/assets/typespec-BRdr0IET.js +1 -0
  771. package/web/dist/assets/typst-DI99ib-x.js +1 -0
  772. package/web/dist/assets/v-DETTlOr0.js +1 -0
  773. package/web/dist/assets/vala-zf12oZj6.js +1 -0
  774. package/web/dist/assets/vb-Djn5o6TS.js +1 -0
  775. package/web/dist/assets/verilog-CiiDBU1e.js +1 -0
  776. package/web/dist/assets/vesper-DdrHHSXu.js +1 -0
  777. package/web/dist/assets/vhdl-BroJfC0k.js +1 -0
  778. package/web/dist/assets/viml-DvXPmvsu.js +1 -0
  779. package/web/dist/assets/vitesse-black-fwtXNY1n.js +1 -0
  780. package/web/dist/assets/vitesse-dark-BZCL-v6S.js +1 -0
  781. package/web/dist/assets/vitesse-light-VbXTXTou.js +1 -0
  782. package/web/dist/assets/vue-BU18DNDL.js +1 -0
  783. package/web/dist/assets/vue-html-BeluIYX0.js +1 -0
  784. package/web/dist/assets/vue-vine-DGUAbOCX.js +1 -0
  785. package/web/dist/assets/vyper-CgoNMtux.js +1 -0
  786. package/web/dist/assets/wasm-BnjxR4X6.js +1 -0
  787. package/web/dist/assets/wasm-ByWQv1Qj.js +1 -0
  788. package/web/dist/assets/wenyan-C8pVoKbM.js +1 -0
  789. package/web/dist/assets/wgsl-BsKzXJz4.js +1 -0
  790. package/web/dist/assets/wikitext-ClFFjSW2.js +1 -0
  791. package/web/dist/assets/wit-DdvCle-K.js +1 -0
  792. package/web/dist/assets/wolfram-DLL8P-h_.js +1 -0
  793. package/web/dist/assets/worker-05jVtNwz.js +160 -0
  794. package/web/dist/assets/xml-DIqSwXR3.js +1 -0
  795. package/web/dist/assets/xsl-Ct_-YIAy.js +1 -0
  796. package/web/dist/assets/yaml-DTtCYNlS.js +1 -0
  797. package/web/dist/assets/zenscript-BnlCZFoB.js +1 -0
  798. package/web/dist/assets/zig-CMLA9XwU.js +1 -0
  799. package/web/dist/icons/neondeck-icon-192.png +0 -0
  800. package/web/dist/icons/neondeck-icon-512.png +0 -0
  801. package/web/dist/icons/neondeck-icon.svg +41 -0
  802. package/web/dist/icons/neondeck-maskable-512.png +0 -0
  803. package/web/dist/index.html +27 -0
  804. package/web/dist/manifest.webmanifest +28 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefings-DuApznpN.js","names":[],"sources":["../../src/modules/briefings/schemas.ts","../../src/modules/commands/summaries.ts","../../src/modules/commands/utils.ts","../../src/modules/commands/handlers/queue.ts","../../src/modules/hygiene/service.ts","../../src/modules/briefings/snapshot.ts","../../src/modules/briefings/store.ts","../../src/modules/briefings/service.ts","../../src/modules/briefings/actions.ts"],"sourcesContent":["import type { JsonValue } from '@flue/runtime';\nimport * as v from 'valibot';\n\nexport const defaultBriefingProfileId = 'morning';\nexport const defaultBriefingInstructions =\n 'Summarize what needs my attention today. Prioritize review requests, failing checks, blocked automation, and time-sensitive follow-up. Keep the briefing concise and distinguish observed facts from inference.';\nexport const defaultBriefingSchedule = '0 8 * * 1-5';\n\nconst nonEmptyStringSchema = v.pipe(v.string(), v.trim(), v.minLength(1));\nconst timezoneSchema = v.pipe(\n nonEmptyStringSchema,\n v.check((value) => {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: value });\n return true;\n } catch {\n return false;\n }\n }, 'Timezone must be a valid IANA timezone.'),\n);\n\nexport const briefingProfileUpdateSchema = v.object({\n id: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(64))),\n name: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(96))),\n enabled: v.optional(v.boolean()),\n instructions: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(8_000))),\n schedule: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(160))),\n timezone: v.optional(timezoneSchema),\n});\n\nexport const briefingRunNowSchema = v.object({\n profileId: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(64))),\n sessionId: v.optional(nonEmptyStringSchema),\n commandEventId: v.optional(nonEmptyStringSchema),\n trigger: v.optional(v.picklist(['manual', 'dashboard'])),\n});\n\nexport const briefingWorkflowInputSchema = v.object({\n profileId: v.optional(v.pipe(nonEmptyStringSchema, v.maxLength(64))),\n taskId: v.optional(nonEmptyStringSchema),\n sessionId: v.optional(nonEmptyStringSchema),\n commandEventId: v.optional(nonEmptyStringSchema),\n trigger: v.optional(v.picklist(['manual', 'scheduled', 'dashboard'])),\n});\n\nexport const briefingSnapshotSchema = v.object({\n version: v.literal(1),\n collectedAt: nonEmptyStringSchema,\n byteSize: v.pipe(v.number(), v.integer(), v.minValue(0)),\n truncated: v.boolean(),\n sources: v.record(\n v.string(),\n v.object({\n status: v.picklist(['ok', 'partial', 'unavailable']),\n fetchedAt: nonEmptyStringSchema,\n truncated: v.boolean(),\n error: v.optional(v.string()),\n data: v.nullable(v.unknown()),\n }),\n ),\n});\n\nexport type BriefingSourceStatus = {\n status: 'ok' | 'partial' | 'unavailable';\n fetchedAt: string;\n truncated: boolean;\n error?: string;\n};\n\nexport type BriefingSnapshotSource = BriefingSourceStatus & {\n data: JsonValue | null;\n};\n\nexport type BriefingSnapshot = {\n version: 1;\n collectedAt: string;\n byteSize: number;\n truncated: boolean;\n sources: Record<string, BriefingSnapshotSource>;\n};\n\nexport type BriefingProfile = {\n id: string;\n name: string;\n enabled: boolean;\n instructions: string;\n instructionsVersion: number;\n schedule: string;\n timezone: string;\n sessionId: string | null;\n compatibility: boolean;\n createdAt: string | null;\n updatedAt: string | null;\n};\n\nexport type BriefingRunStatus = 'queued' | 'ready' | 'failed';\n\nexport type BriefingRun = {\n id: string;\n profileId: string | null;\n trigger: 'manual' | 'scheduled' | 'dashboard';\n snapshot: BriefingSnapshot;\n instructions: string;\n instructionsVersion: number;\n sessionId: string;\n commandEventId: string | null;\n dispatchId: string | null;\n workflowRunId: string | null;\n status: BriefingRunStatus;\n error: string | null;\n queuedAt: string;\n completedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type BriefingRunMetadata = Omit<\n BriefingRun,\n 'snapshot' | 'instructions'\n> & {\n snapshot: Pick<\n BriefingSnapshot,\n 'version' | 'collectedAt' | 'byteSize' | 'truncated'\n >;\n};\n","import { asJsonValue } from '../../lib/action-result';\nimport type { NeonCommandName, NeonCommandResult } from './schemas';\n\nexport function compactCommandSummary(result: NeonCommandResult) {\n if (\n result.command === 'review-queue' &&\n result.data &&\n typeof result.data === 'object'\n ) {\n const data = result.data as {\n fetchedAt?: unknown;\n login?: unknown;\n repos?: unknown;\n count?: unknown;\n truncated?: unknown;\n issues?: unknown;\n triage?: unknown;\n topActions?: unknown;\n };\n\n return {\n ok: result.ok,\n command: result.command,\n input: result.input,\n status: result.status,\n message: result.message,\n fetchedAt: data.fetchedAt,\n login: data.login,\n repos: data.repos,\n count: data.count,\n truncated: data.truncated,\n issues: data.issues,\n triage: data.triage,\n topActions: data.topActions,\n };\n }\n\n return result;\n}\n\nexport function completedCommand(\n command: NeonCommandName,\n input: string,\n message: string,\n data: unknown,\n): NeonCommandResult {\n return {\n ok: true,\n command,\n input,\n status: 'completed',\n message,\n data: asJsonValue(data),\n };\n}\n\nexport function runningCommand(\n command: NeonCommandName,\n input: string,\n message: string,\n data: unknown,\n): NeonCommandResult {\n return {\n ok: true,\n command,\n input,\n status: 'running',\n message,\n data: asJsonValue(data),\n };\n}\n\nexport function needsConfigCommand(\n command: NeonCommandName,\n input: string,\n message: string,\n details: Pick<NeonCommandResult, 'errors' | 'requires'>,\n): NeonCommandResult {\n return {\n ok: false,\n command,\n input,\n status: 'needs-config',\n message,\n ...(details.errors ? { errors: details.errors } : {}),\n ...(details.requires ? { requires: details.requires } : {}),\n };\n}\n\nexport function failedCommand(\n command: NeonCommandName,\n input: string,\n message: string,\n details: Pick<NeonCommandResult, 'errors' | 'requires'> & {\n data?: unknown;\n } = {},\n): NeonCommandResult {\n return {\n ok: false,\n command,\n input,\n status: 'failed',\n message,\n ...(details.errors ? { errors: details.errors } : {}),\n ...(details.requires ? { requires: details.requires } : {}),\n ...(details.data ? { data: asJsonValue(details.data) } : {}),\n };\n}\n","import type { JsonValue } from '@flue/runtime';\nimport type { MemoryScope } from '../memory';\nimport type { ThinkingLevel } from '../../runtime-home';\n\nexport const allThinkingLevels: ThinkingLevel[] = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n];\n\nexport function supportedReasoningLevelsForModel(\n model: string,\n): ThinkingLevel[] {\n const specifier = parseModelSpecifier(model);\n if (!specifier) return ['off'];\n\n if (specifier.provider === 'openai') {\n return isOpenAiReasoningModel(specifier.model)\n ? allThinkingLevels\n : ['off'];\n }\n\n if (specifier.provider === 'anthropic') {\n return isAnthropicReasoningModel(specifier.model)\n ? allThinkingLevels\n : ['off'];\n }\n\n if (specifier.provider === 'kilocode') {\n return isKilocodeReasoningModel(specifier.model)\n ? allThinkingLevels\n : ['off'];\n }\n\n return ['off'];\n}\n\nexport function parseModelSpecifier(model: string) {\n const slash = model.indexOf('/');\n if (slash <= 0 || slash === model.length - 1) return null;\n return {\n provider: model.slice(0, slash),\n model: model.slice(slash + 1),\n };\n}\n\nexport function isOpenAiReasoningModel(model: string) {\n return /^(gpt-5|o[1-9])(?:[.-]|$)/i.test(model);\n}\n\nexport function isAnthropicReasoningModel(model: string) {\n return /^claude-(?:.*-4|3-7)(?:[.-]|$)/i.test(model);\n}\n\nexport function isKilocodeReasoningModel(model: string) {\n const nested = parseModelSpecifier(model);\n if (nested?.provider === 'openai') {\n return isOpenAiReasoningModel(nested.model);\n }\n if (nested?.provider === 'anthropic') {\n return isAnthropicReasoningModel(nested.model);\n }\n\n return (\n /^kilo-auto(?:\\/|$)/i.test(model) ||\n isOpenAiReasoningModel(model) ||\n isAnthropicReasoningModel(model) ||\n /(?:^|\\/)(deepseek-r1|qwen.*thinking|.*reasoning.*)(?:[/:.-]|$)/i.test(\n model,\n )\n );\n}\n\nexport function formatList(values: string[]) {\n if (values.length === 0) return 'no';\n if (values.length === 1) return values[0] ?? '';\n return `${values.slice(0, -1).join(', ')} or ${values.at(-1)}`;\n}\n\nexport function isMemoryScope(value: string | undefined): value is MemoryScope {\n return value === 'user' || value === 'local' || value === 'project';\n}\n\nexport function isActiveMemoryScope(\n value: string | undefined,\n): value is 'user' | 'local' | 'project' {\n return value === 'user' || value === 'local' || value === 'project';\n}\n\nexport function parseMemoryValue(raw: string): JsonValue {\n try {\n return JSON.parse(raw) as JsonValue;\n } catch {\n return raw;\n }\n}\n\nexport function readStringArrayProperty(\n value: unknown,\n key: string,\n): string[] | undefined {\n if (!value || typeof value !== 'object' || !(key in value)) return undefined;\n const property = (value as Record<string, unknown>)[key];\n if (!Array.isArray(property)) return undefined;\n return property.filter((item): item is string => typeof item === 'string');\n}\n\nexport function errorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n","import type {\n GitHubPullRequestQueue,\n GitHubPullRequest,\n GitHubQueueIssue,\n} from '../../github';\nimport { fetchGitHubLogin, fetchPullRequestQueue } from '../../github';\nimport { createCiFailureDossierReport } from '../../autopilot';\nimport { readRepoRegistrySnapshot } from '../../repos';\nimport { listPrWatchRecords } from '../../watches';\nimport { startPrReview } from '../../pr-reviews';\nimport type { RuntimePaths } from '../../../runtime-home';\nimport type {\n CommandDependencies,\n NeonCommandResult,\n ParsedNeonCommand,\n ReviewQueueAction,\n} from '../schemas';\nimport {\n completedCommand,\n failedCommand,\n needsConfigCommand,\n runningCommand,\n} from '../summaries';\nimport { errorMessage } from '../utils';\n\nexport async function reviewQueueCommand(\n command: ParsedNeonCommand,\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const queue = await readReviewQueue(paths, dependencies);\n if (!queue.ok) {\n return needsConfigCommand(command.name, command.raw, queue.message, {\n requires: queue.requires,\n errors: queue.errors,\n });\n }\n const watches = await listPrWatchRecords(paths);\n const triage = triageReviewQueue(queue.queue, watches);\n\n return completedCommand(\n command.name,\n command.raw,\n reviewQueueMessage(triage),\n {\n fetchedAt: queue.queue.fetchedAt,\n login: queue.queue.login,\n repos: queue.queue.repos,\n count: queue.queue.items.length,\n truncated: queue.queue.truncated,\n issues: queue.queue.issues,\n items: queue.queue.items,\n triage,\n topActions: triage.topActions,\n },\n );\n}\n\nexport async function reviewPrCommand(\n command: ParsedNeonCommand,\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const ref = command.args.join(' ').trim();\n if (!ref) {\n return failedCommand(\n command.name,\n command.raw,\n '/review-pr requires a PR reference.',\n { requires: ['ref'] },\n );\n }\n\n const starter = dependencies.startPrReview ?? startPrReview;\n const { review, reviewId, runId } = await starter(\n { ref, origin: 'chat' },\n paths,\n dependencies.invokeReviewPrWorkflow\n ? {\n invokeWorkflow: (input) =>\n dependencies.invokeReviewPrWorkflow!({\n ref: input.ref,\n reviewId: input.reviewId,\n attemptId: input.attemptId,\n }),\n }\n : undefined,\n );\n return runningCommand(\n command.name,\n command.raw,\n `Reviewing ${review.repoFullName}#${review.prNumber}.`,\n {\n workflow: 'review-pr-for-human',\n reviewId,\n runId,\n ref: review.ref,\n queued: true,\n reviewUrl: review.reviewUrl,\n trustBoundary: review.trustBoundary,\n assistantBrief:\n 'Track the durable review record. It will transition to ready with report links and local draft counts; the human reviewer owns edits and submission.',\n },\n );\n}\n\nexport async function invokeReviewPrWorkflow(input: {\n ref: string;\n reviewId?: string;\n attemptId?: string;\n}) {\n const { invoke } = await import('@flue/runtime');\n const workflow = await import('../../../workflows/review-pr-for-human');\n return invoke(workflow.default, { input });\n}\n\nexport async function fixCiCommand(\n command: ParsedNeonCommand,\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const explicitRef = command.args.join(' ').trim();\n if (explicitRef) {\n const parsed = parsePullRequestRef(explicitRef);\n if (!parsed) {\n return failedCommand(\n command.name,\n command.raw,\n 'Expected a PR reference like repo#123, owner/repo#123, or a GitHub pull request URL.',\n { requires: ['pr'] },\n );\n }\n return queueFixCiWorkflow(\n command,\n `${parsed.repo}#${parsed.number}`,\n dependencies,\n );\n }\n\n const queue = await readReviewQueue(paths, dependencies);\n if (!queue.ok) {\n return needsConfigCommand(command.name, command.raw, queue.message, {\n requires: queue.requires,\n errors: queue.errors,\n });\n }\n\n const selected = selectPullRequest(queue.queue, command.args, {\n prefer: isCiFixCandidate,\n });\n if (!selected.ok) {\n return failedCommand(command.name, command.raw, selected.message, {\n requires: selected.requires,\n data: {\n available: summarizePullRequests(queue.queue.items).slice(0, 10),\n },\n });\n }\n if (!isCiFixCandidate(selected.item)) {\n return failedCommand(\n command.name,\n command.raw,\n `${selected.item.repo}#${selected.item.number} does not have failing or unknown CI checks.`,\n {\n requires: ['failingChecks'],\n data: { pr: summarizePullRequests([selected.item])[0] },\n },\n );\n }\n\n const ref = `${selected.item.repo}#${selected.item.number}`;\n return queueFixCiWorkflow(command, ref, dependencies);\n}\n\nasync function queueFixCiWorkflow(\n command: ParsedNeonCommand,\n ref: string,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const invokeWorkflow =\n dependencies.invokeFixCiWorkflow ?? invokeFixCiWorkflow;\n const { runId } = await invokeWorkflow({ ref });\n return completedCommand(\n command.name,\n command.raw,\n `Queued CI fix workflow ${runId} for ${ref}.`,\n {\n workflow: 'fix-pr-ci',\n runId,\n ref,\n queued: true,\n reportUrlHint: '/reports',\n trustBoundary:\n 'The workflow can create local reports, a managed local worktree, a Kilo task, and a prepared diff only; it does not push, comment, or submit a GitHub review.',\n assistantBrief:\n 'Track the returned workflow run id. The dossier report is local; any code changes must pass through the prepared-diff review loop.',\n },\n );\n}\n\nexport async function invokeFixCiWorkflow(input: { ref: string }) {\n const { invoke } = await import('@flue/runtime');\n const workflow = await import('../../../workflows/fix-pr-ci');\n return invoke(workflow.default, { input });\n}\n\nexport async function explainCiCommand(\n command: ParsedNeonCommand,\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const options = parseExplainCiArgs(command.args);\n const queue = await readReviewQueue(paths, dependencies);\n if (!queue.ok) {\n return needsConfigCommand(command.name, command.raw, queue.message, {\n requires: queue.requires,\n errors: queue.errors,\n });\n }\n\n const selected = selectPullRequest(queue.queue, options.args, {\n prefer: (item) =>\n item.checks?.status === 'failure' ||\n item.checkError !== undefined ||\n item.checks?.status === 'pending',\n });\n if (!selected.ok) {\n return failedCommand(command.name, command.raw, selected.message, {\n requires: selected.requires,\n data: {\n available: summarizePullRequests(queue.queue.items).slice(0, 10),\n },\n });\n }\n\n const pr = selected.item;\n const explanation = ciExplanation(pr);\n if (options.report) {\n const writer =\n dependencies.createCiFailureDossierReport ?? createCiFailureDossierReport;\n const report = await writer(\n { ref: `${pr.repo}#${pr.number}`, reportOnly: true },\n paths,\n );\n if (!report.ok) {\n const requires = 'requires' in report ? report.requires : undefined;\n const errors = 'errors' in report ? report.errors : undefined;\n return requires?.includes('GITHUB_TOKEN')\n ? needsConfigCommand(command.name, command.raw, report.message, {\n requires,\n errors,\n })\n : failedCommand(command.name, command.raw, report.message, {\n requires,\n errors,\n });\n }\n if (!('report' in report)) {\n return failedCommand(\n command.name,\n command.raw,\n 'CI dossier report writer did not return a report record.',\n { requires: ['report'] },\n );\n }\n return completedCommand(\n command.name,\n command.raw,\n `${explanation.message} Created CI dossier report ${report.report.id}.`,\n {\n pr: summarizePullRequests([pr])[0],\n checks: pr.checks,\n checkError: pr.checkError,\n explanation,\n report: {\n id: report.report.id,\n kind: report.report.kind,\n title: report.report.title,\n url: `/reports/${report.report.id}`,\n },\n assistantBrief:\n 'Use the deterministic CI dossier report and queue facts first. Separate observed facts from likely next debugging steps.',\n },\n );\n }\n return completedCommand(command.name, command.raw, explanation.message, {\n pr: summarizePullRequests([pr])[0],\n checks: pr.checks,\n checkError: pr.checkError,\n explanation,\n assistantBrief:\n 'Use these deterministic CI/check facts first. Separate observed facts from likely next debugging steps.',\n });\n}\n\nfunction parseExplainCiArgs(args: string[]) {\n return {\n report: args.includes('--report'),\n args: args.filter((arg) => arg !== '--report'),\n };\n}\n\nexport async function summarizePrCommand(\n command: ParsedNeonCommand,\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<NeonCommandResult> {\n const queue = await readReviewQueue(paths, dependencies);\n if (!queue.ok) {\n return needsConfigCommand(command.name, command.raw, queue.message, {\n requires: queue.requires,\n errors: queue.errors,\n });\n }\n\n const selected = selectPullRequest(queue.queue, command.args);\n if (!selected.ok) {\n return failedCommand(command.name, command.raw, selected.message, {\n requires: selected.requires,\n data: {\n available: summarizePullRequests(queue.queue.items).slice(0, 10),\n },\n });\n }\n\n const pr = selected.item;\n const summary = {\n headline: `${pr.repo}#${pr.number}: ${pr.title}`,\n state: pr.state,\n author: pr.author,\n relations: pr.relations,\n labels: pr.labels,\n comments: pr.comments,\n ageDays: pr.ageDays,\n stale: pr.stale,\n baseRef: pr.baseRef,\n headSha: pr.headSha,\n checks: pr.checks?.status ?? 'unknown',\n url: pr.url,\n };\n\n return completedCommand(\n command.name,\n command.raw,\n `Summarized ${pr.repo}#${pr.number}.`,\n {\n pr: summarizePullRequests([pr])[0],\n summary,\n assistantBrief:\n 'Summarize the PR from these deterministic facts. Do not invent diff contents that were not fetched.',\n },\n );\n}\n\nexport function triageReviewQueue(\n queue: GitHubPullRequestQueue,\n watches: Awaited<ReturnType<typeof listPrWatchRecords>>,\n) {\n const authored = queue.items.filter((item) =>\n item.relations.includes('authored'),\n );\n const assigned = queue.items.filter((item) =>\n item.relations.includes('assigned'),\n );\n const requestedReviews = queue.items.filter((item) =>\n item.relations.includes('review-requested'),\n );\n const failedChecks = queue.items.filter(\n (item) => item.checks?.status === 'failure',\n );\n const checkErrors = queue.items.filter((item) => item.checkError);\n const stalePrs = queue.items.filter((item) => item.stale);\n const activeWatches = watches.filter((watch) =>\n ['watching', 'merged', 'attention-needed'].includes(watch.status),\n );\n const watchedPrs = queue.items.filter((item) =>\n activeWatches.some(\n (watch) =>\n watch.repoFullName === item.repo && watch.prNumber === item.number,\n ),\n );\n\n return {\n summary: {\n authored: authored.length,\n assigned: assigned.length,\n requestedReviews: requestedReviews.length,\n failedChecks: failedChecks.length,\n checkErrors: checkErrors.length,\n stale: stalePrs.length,\n activeWatches: activeWatches.length,\n watchedPrs: watchedPrs.length,\n truncated: queue.truncated,\n issues: queue.issues.length,\n },\n authored: summarizePullRequests(authored),\n assigned: summarizePullRequests(assigned),\n requestedReviews: summarizePullRequests(requestedReviews),\n failedChecks: summarizePullRequests(failedChecks),\n checkErrors: summarizePullRequests(checkErrors),\n stalePrs: summarizePullRequests(stalePrs),\n issues: summarizeQueueIssues(queue.issues),\n activeWatches: activeWatches.map((watch) => ({\n id: watch.id,\n repo: watch.repoFullName,\n number: watch.prNumber,\n status: watch.status,\n desiredTerminalState: watch.desiredTerminalState,\n url: watch.url,\n updatedAt: watch.updatedAt,\n })),\n topActions: rankReviewQueueActions(\n queue.items,\n activeWatches,\n failedChecks,\n checkErrors,\n requestedReviews,\n assigned,\n stalePrs,\n authored,\n ).slice(0, 3),\n };\n}\n\nexport function summarizePullRequests(items: GitHubPullRequest[]) {\n return items.map((item) => ({\n repo: item.repo,\n number: item.number,\n title: item.title,\n url: item.url,\n author: item.author,\n relations: item.relations,\n checks: item.checks?.status ?? 'unknown',\n checkError: item.checkError,\n stale: item.stale,\n ageDays: item.ageDays,\n updatedAt: item.updatedAt,\n }));\n}\n\nexport function summarizeQueueIssues(issues: GitHubQueueIssue[]) {\n return issues.map((issue) => ({\n type: issue.type,\n message: issue.message,\n query: issue.query,\n repo: issue.repo,\n number: issue.number,\n }));\n}\n\nexport function rankReviewQueueActions(\n items: GitHubPullRequest[],\n watches: Awaited<ReturnType<typeof listPrWatchRecords>>,\n failedChecks: GitHubPullRequest[],\n checkErrors: GitHubPullRequest[],\n requestedReviews: GitHubPullRequest[],\n assigned: GitHubPullRequest[],\n stalePrs: GitHubPullRequest[],\n authored: GitHubPullRequest[],\n): ReviewQueueAction[] {\n const actions: ReviewQueueAction[] = [];\n for (const item of failedChecks) {\n actions.push(prAction(item, 'Fix failing checks', 'urgent'));\n }\n\n for (const item of checkErrors) {\n actions.push(prAction(item, 'Investigate unknown CI status', 'urgent'));\n }\n\n for (const watch of watches.filter(\n (item) => item.status === 'attention-needed',\n )) {\n actions.push({\n title: `Resolve watch ${watch.id}`,\n reason: `Watch is ${watch.status}.`,\n priority: 'urgent',\n url: watch.url,\n repo: watch.repoFullName,\n number: watch.prNumber,\n });\n }\n\n for (const item of requestedReviews) {\n actions.push(prAction(item, 'Review requested PR', 'high'));\n }\n\n for (const item of assigned) {\n actions.push(prAction(item, 'Move assigned PR forward', 'high'));\n }\n\n for (const item of stalePrs) {\n actions.push(prAction(item, 'Refresh stale PR', 'medium'));\n }\n\n for (const item of authored) {\n actions.push(prAction(item, 'Advance authored PR', 'medium'));\n }\n\n for (const item of items) {\n actions.push(prAction(item, 'Inspect open PR', 'low'));\n }\n\n return dedupeActions(actions);\n}\n\nexport function prAction(\n item: GitHubPullRequest,\n reason: string,\n priority: ReviewQueueAction['priority'],\n): ReviewQueueAction {\n return {\n title: `${reason}: ${item.repo}#${item.number}`,\n reason:\n item.checks?.status === 'failure'\n ? `${item.checks.failed} checks failed.`\n : item.checkError\n ? `GitHub enrichment failed: ${item.checkError}`\n : reason,\n priority,\n url: item.url,\n repo: item.repo,\n number: item.number,\n };\n}\n\nexport function dedupeActions(actions: ReviewQueueAction[]) {\n const seen = new Set<string>();\n return actions.filter((action) => {\n const key =\n action.repo && action.number\n ? `${action.repo}#${action.number}`\n : `${action.title}:${action.reason}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function isCiFixCandidate(item: GitHubPullRequest) {\n return item.checks?.status === 'failure' || item.checkError !== undefined;\n}\n\nexport function reviewQueueMessage(\n triage: ReturnType<typeof triageReviewQueue>,\n) {\n const { summary } = triage;\n const partial = summary.truncated || summary.issues > 0;\n return `Triaged ${summary.authored + summary.assigned + summary.requestedReviews} user-related PR signal${summary.authored + summary.assigned + summary.requestedReviews === 1 ? '' : 's'}: ${summary.requestedReviews} review request${summary.requestedReviews === 1 ? '' : 's'}, ${summary.failedChecks} failing check set${summary.failedChecks === 1 ? '' : 's'}, ${summary.checkErrors} unknown check state${summary.checkErrors === 1 ? '' : 's'}, ${summary.stale} stale PR${summary.stale === 1 ? '' : 's'}.${partial ? ' Results are partial; inspect queue issues.' : ''}`;\n}\n\nexport function selectPullRequest(\n queue: GitHubPullRequestQueue,\n args: string[],\n options: { prefer?: (item: GitHubPullRequest) => boolean } = {},\n):\n | { ok: true; item: GitHubPullRequest }\n | { ok: false; message: string; requires?: string[] } {\n const ref = args.join(' ').trim();\n if (ref) {\n const parsed = parsePullRequestRef(ref);\n if (!parsed) {\n return {\n ok: false,\n message:\n 'Expected a PR reference like repo#123, owner/repo#123, or a GitHub pull request URL.',\n requires: ['pr'],\n };\n }\n\n const match = queue.items.find(\n (item) =>\n item.number === parsed.number &&\n (item.repo.toLowerCase() === parsed.repo.toLowerCase() ||\n item.repo.split('/').at(1)?.toLowerCase() ===\n parsed.repo.toLowerCase()),\n );\n if (!match) {\n return {\n ok: false,\n message: `PR ${parsed.repo}#${parsed.number} was not found in the current review queue.`,\n requires: ['queuedPr'],\n };\n }\n\n return { ok: true, item: match };\n }\n\n const preferred = options.prefer\n ? queue.items.find(options.prefer)\n : undefined;\n const item = preferred ?? queue.items[0];\n if (!item) {\n return {\n ok: false,\n message: 'No pull requests are available in the current review queue.',\n requires: ['pr'],\n };\n }\n\n return { ok: true, item };\n}\n\nexport function parsePullRequestRef(ref: string) {\n const url = ref.match(/github\\.com\\/([^/\\s]+)\\/([^/\\s]+)\\/pull\\/(\\d+)/i);\n if (url) {\n return {\n repo: `${url[1]}/${url[2].replace(/\\.git$/, '')}`,\n number: Number(url[3]),\n };\n }\n\n const hash = ref.match(/^([A-Za-z0-9_.-]+(?:\\/[A-Za-z0-9_.-]+)?)#(\\d+)$/);\n if (!hash) return undefined;\n\n return {\n repo: hash[1],\n number: Number(hash[2]),\n };\n}\n\nexport function ciExplanation(pr: GitHubPullRequest) {\n if (pr.checkError) {\n return {\n status: 'unknown',\n message: `GitHub check status for ${pr.repo}#${pr.number} could not be enriched.`,\n facts: [`Enrichment error: ${pr.checkError}`],\n nextActions: [\n 'Open the PR checks page in GitHub.',\n 'Retry after confirming the token can read checks.',\n ],\n };\n }\n\n if (!pr.checks) {\n return {\n status: 'unknown',\n message: `${pr.repo}#${pr.number} has no check summary in the queue.`,\n facts: ['No check runs or commit statuses were available.'],\n nextActions: [\n 'Confirm the PR head SHA and configured repository access.',\n ],\n };\n }\n\n const facts = [\n `${pr.checks.total} total check signal${pr.checks.total === 1 ? '' : 's'}.`,\n `${pr.checks.failed} failed, ${pr.checks.pending} pending, ${pr.checks.successful} successful.`,\n `${pr.checks.statusContexts ?? 0} legacy status context${pr.checks.statusContexts === 1 ? '' : 's'}.`,\n ];\n const nextActions =\n pr.checks.status === 'failure'\n ? [\n 'Open the failing GitHub checks and inspect the first failed job log.',\n 'Run the matching local validation command if the repo exposes one.',\n 'After fixing, rerun failed checks or push an update.',\n ]\n : pr.checks.status === 'pending'\n ? [\n 'Wait for pending checks or inspect queued jobs for capacity issues.',\n ]\n : pr.checks.status === 'success'\n ? ['No CI action is needed unless review feedback remains.']\n : ['Confirm whether this repo is expected to publish checks.'];\n\n return {\n status: pr.checks.status,\n message: `${pr.repo}#${pr.number} CI is ${pr.checks.status}.`,\n facts,\n nextActions,\n };\n}\n\nexport async function readReviewQueue(\n paths: RuntimePaths,\n dependencies: CommandDependencies,\n): Promise<\n | { ok: true; queue: GitHubPullRequestQueue }\n | { ok: false; message: string; errors?: string[]; requires?: string[] }\n> {\n const token = process.env.GITHUB_TOKEN;\n if (!token) {\n return {\n ok: false,\n message: 'GITHUB_TOKEN is not configured.',\n requires: ['GITHUB_TOKEN'],\n };\n }\n\n try {\n const registry = await readRepoRegistrySnapshot(paths);\n const fetchLogin = dependencies.fetchGitHubLogin ?? fetchGitHubLogin;\n const fetchQueue =\n dependencies.fetchPullRequestQueue ?? fetchPullRequestQueue;\n const login = process.env.GITHUB_LOGIN ?? (await fetchLogin(token));\n return {\n ok: true,\n queue: await fetchQueue({\n token,\n login,\n repos: registry.repos,\n }),\n };\n } catch (error) {\n return {\n ok: false,\n message: 'Could not fetch GitHub review queue.',\n errors: [errorMessage(error)],\n };\n }\n}\n","import { openDb } from '../../lib/sqlite';\nimport { runBoundedGit, runBoundedGitLines } from '../../lib/git';\nimport { renderReportHtml } from '../../lib/report-html';\nimport type { AutomationExecutionResult } from '../app-state';\nimport type { JsonValue } from '@flue/runtime';\nimport { readAutomationHealth } from '../learning';\nimport { loadMemoryBackgroundContextSync } from '../memory';\nimport { listPreparedDiffs } from '../prepared-diffs';\nimport { writeReport } from '../reports';\nimport { readRepoRegistrySnapshot, repoFullName } from '../repos';\nimport { listPrWatchRecords } from '../watches';\nimport { listWorktrees } from '../worktrees';\nimport type { RuntimePaths } from '../../runtime-home';\n\ntype HygieneItem = {\n kind: string;\n label: string;\n detail: string;\n};\n\ntype ReportAutomationInput = {\n id: string;\n config: JsonValue | null;\n};\n\nexport async function runHygieneReport(\n job: ReportAutomationInput,\n paths: RuntimePaths,\n): Promise<AutomationExecutionResult> {\n try {\n return await runHygieneReportInner(job, paths);\n } catch (error) {\n return failed(job, `Hygiene failed: ${errorMessage(error)}.`);\n }\n}\n\nasync function runHygieneReportInner(\n job: ReportAutomationInput,\n paths: RuntimePaths,\n): Promise<AutomationExecutionResult> {\n const config = objectConfig(job.config);\n const staleBranchDays = numberConfig(config.staleBranchDays, 30);\n const stalledDecisionHours = numberConfig(config.stalledDecisionHours, 48);\n const registry = await readRepoRegistrySnapshot(paths);\n const repoRef = stringConfig(config.repo);\n const repos = repoRef\n ? registry.repos.filter(\n (repo) =>\n repo.id === repoRef ||\n repo.github.name === repoRef ||\n repoFullName(repo).toLowerCase() === repoRef.toLowerCase(),\n )\n : registry.repos;\n if (repoRef && repos.length === 0) {\n return failed(job, `Hygiene repository \"${repoRef}\" is not configured.`);\n }\n\n const [\n branchItems,\n worktreeItems,\n decisionItems,\n approvalItems,\n watchItems,\n todoItems,\n ] = await Promise.all([\n staleBranchItems(repos, staleBranchDays),\n worktreeCleanupItems(paths),\n stalledPreparedDiffItems(paths, stalledDecisionHours),\n unusedExecutionApprovalItems(paths),\n staleWatchItems(paths),\n todoAgingItems(repos),\n ]);\n const items = [\n ...branchItems,\n ...worktreeItems,\n ...decisionItems,\n ...approvalItems,\n ...watchItems,\n ...todoItems,\n ];\n const memoryContext = loadMemoryBackgroundContextSync(paths, {\n repoId: repos.length === 1 ? (repos[0]?.id ?? null) : null,\n });\n const automationHealth = await readAutomationHealth(paths);\n const result = {\n repoCount: repos.length,\n itemCount: items.length,\n counts: countKinds(items),\n memoryIds: memoryContext.memoryIds,\n automationHealth,\n checkedAt: new Date().toISOString(),\n };\n\n if (items.length === 0 && !automationHealthHasSignals(automationHealth)) {\n return {\n outcome: 'silent',\n message: 'Hygiene found no actionable items.',\n result,\n };\n }\n const reportSummary =\n items.length === 0\n ? 'No local hygiene items need review. Automation health was updated.'\n : `${items.length} local hygiene item${items.length === 1 ? '' : 's'} need review.`;\n\n const report = await writeReport(\n {\n kind: 'hygiene',\n title: 'Workspace hygiene',\n sourceRef: repoRef ?? 'all-repos',\n createdBy: `scheduler:${job.id}`,\n summary: result,\n html: renderReportHtml({\n title: 'Workspace hygiene',\n eyebrow: 'HYGIENE',\n summary: reportSummary,\n sections: [\n automationHealthReportSection(automationHealth),\n memoryReportSection(memoryContext),\n {\n title: 'Summary',\n items: Object.entries(result.counts).map(([kind, count]) => ({\n label: kind,\n value: String(count),\n })),\n },\n {\n title: 'Items',\n items: items.slice(0, 80).map((item) => ({\n label: item.label,\n value: `${item.kind}\\n${item.detail}`,\n })),\n },\n ],\n }),\n },\n paths,\n );\n\n return {\n outcome: 'updated',\n message:\n items.length === 0\n ? 'Hygiene found no actionable items; automation health was updated.'\n : `Hygiene found ${items.length} item${items.length === 1 ? '' : 's'}.`,\n result: { ...result, reportId: report.id },\n notifications: [\n {\n level: 'info',\n title: 'Hygiene report ready',\n message: reportSummary,\n source: 'hygiene',\n sourceId: job.id,\n data: {\n reportId: report.id,\n reportUrl: `/reports/${report.id}`,\n counts: result.counts,\n },\n },\n ],\n };\n}\n\nfunction automationHealthReportSection(\n health: Awaited<ReturnType<typeof readAutomationHealth>>,\n) {\n return {\n title: 'Automation Health',\n items: [\n {\n label: 'window',\n value: `${health.window.days} days (${health.window.since} to ${health.window.until})`,\n },\n {\n label: 'review assist',\n value: [\n `seed survival: ${formatRate(health.reviewAssist.survivalRate)}`,\n `seeded/submitted: ${health.reviewAssist.seeded}/${health.reviewAssist.submitted}`,\n `edited before submit: ${formatRate(health.reviewAssist.editedBeforeSubmitRate)}`,\n ].join('\\n'),\n },\n {\n label: 'revision loop',\n value: [\n `approval rate: ${formatRate(health.revisionLoop.approvalRate)}`,\n `runs: ${health.revisionLoop.runs}`,\n `re-revised/abandoned: ${health.revisionLoop.reRevised}/${health.revisionLoop.abandoned}`,\n ].join('\\n'),\n },\n {\n label: 'scheduled tasks',\n value: [\n `failure rate: ${formatRate(health.scheduledTasks.failureRate)}`,\n `runs/failures: ${health.scheduledTasks.runs}/${health.scheduledTasks.failures}`,\n `silent output rate: ${formatRate(health.scheduledTasks.silentOutputRate)}`,\n ].join('\\n'),\n },\n {\n label: 'drift and triage',\n value: [\n `docs acted on: ${formatRate(health.driftTriage.docsDriftActedOnRate)}`,\n `docs reports/staged fixes: ${health.driftTriage.docsDriftReports}/${health.driftTriage.docsDriftStagedFixes}`,\n `issue triage reports: ${health.driftTriage.issueTriageReports}`,\n `aged-out reports: ${health.driftTriage.agedOutReports}`,\n ].join('\\n'),\n },\n ],\n };\n}\n\nfunction automationHealthHasSignals(\n health: Awaited<ReturnType<typeof readAutomationHealth>>,\n) {\n return (\n health.reviewAssist.seeded > 0 ||\n health.revisionLoop.runs > 0 ||\n health.scheduledTasks.runs > 0 ||\n health.driftTriage.docsDriftReports > 0 ||\n health.driftTriage.issueTriageReports > 0\n );\n}\n\nfunction memoryReportSection(\n context: ReturnType<typeof loadMemoryBackgroundContextSync>,\n) {\n return {\n title: 'Memory Context',\n items: [\n {\n label: 'structured memory',\n value: context.text,\n },\n ],\n };\n}\n\nfunction formatRate(value: number | null) {\n return value === null ? 'n/a' : `${Math.round(value * 100)}%`;\n}\n\nexport async function readHygieneSummary(paths: RuntimePaths) {\n const [worktrees, preparedDiffs, watches] = await Promise.all([\n listWorktrees(paths),\n listPreparedDiffs({}, paths),\n listPrWatchRecords(paths),\n ]);\n const unusedApprovals = countUnusedExecutionApprovals(paths);\n return {\n worktreeCleanupCandidates: worktrees.worktrees.filter((worktree) =>\n ['cleanup-pending', 'failed', 'needs-sync'].includes(\n worktree.lifecycleStatus,\n ),\n ).length,\n stalledPreparedDiffs: (preparedDiffs.preparedDiffs ?? []).filter((diff) =>\n ['prepared', 'revision-requested', 'push-approved'].includes(diff.status),\n ).length,\n closedOrMergedWatches: watches.filter((watch) =>\n ['closed', 'merged'].includes(watch.status),\n ).length,\n unusedExecutionApprovals: unusedApprovals,\n };\n}\n\nasync function staleBranchItems(\n repos: Array<{\n id: string;\n path: string;\n defaultBranch: string;\n github: { owner: string; name: string };\n }>,\n staleAfterDays: number,\n) {\n const cutoff = Date.now() - staleAfterDays * 24 * 60 * 60 * 1000;\n const items: HygieneItem[] = [];\n for (const repo of repos) {\n const merged = new Set(\n await gitLines(repo.path, [\n 'branch',\n '--format=%(refname:short)',\n '--merged',\n repo.defaultBranch,\n ]).catch(() => []),\n );\n const branches = await gitLines(repo.path, [\n 'for-each-ref',\n '--format=%(refname:short)|%(committerdate:iso8601)',\n 'refs/heads',\n ]).catch(() => []);\n for (const branch of branches) {\n const [name, dateText] = branch.split('|');\n if (!name || name === repo.defaultBranch) continue;\n const updatedAt = Date.parse(dateText ?? '');\n if (!merged.has(name) && updatedAt >= cutoff) continue;\n items.push({\n kind: 'stale-branch',\n label: `${repoFullName(repo)}:${name}`,\n detail: `Last commit: ${dateText || 'unknown'}\\nMerged into ${repo.defaultBranch}: ${merged.has(name) ? 'yes' : 'no'}\\nSuggested command: git branch -d ${name}`,\n });\n }\n }\n return items.slice(0, 80);\n}\n\nasync function worktreeCleanupItems(paths: RuntimePaths) {\n const snapshot = await listWorktrees(paths);\n return snapshot.worktrees\n .filter((worktree) =>\n ['cleanup-pending', 'failed', 'needs-sync'].includes(\n worktree.lifecycleStatus,\n ),\n )\n .map((worktree) => ({\n kind: 'worktree-cleanup',\n label: worktree.id,\n detail: `${worktree.repoFullName} ${worktree.headRef}\\nstatus: ${worktree.lifecycleStatus}\\npath: ${worktree.localPath}`,\n }));\n}\n\nasync function stalledPreparedDiffItems(\n paths: RuntimePaths,\n stalledAfterHours: number,\n) {\n const cutoff = Date.now() - stalledAfterHours * 60 * 60 * 1000;\n const snapshot = await listPreparedDiffs({}, paths);\n return (snapshot.preparedDiffs ?? [])\n .filter(\n (diff) =>\n ['prepared', 'revision-requested', 'push-approved'].includes(\n diff.status,\n ) && Date.parse(diff.updatedAt) < cutoff,\n )\n .map((diff) => ({\n kind: 'stalled-decision',\n label: diff.id,\n detail: `${diff.repoFullName}${diff.prNumber ? `#${diff.prNumber}` : ''}\\nstatus: ${diff.status}\\nupdated: ${diff.updatedAt}`,\n }));\n}\n\nfunction unusedExecutionApprovalItems(paths: RuntimePaths) {\n const database = openDb(paths.neondeckDatabase, { readOnly: true });\n try {\n const rows = database\n .prepare(\n `\n SELECT id, command, backend, cwd, created_at, resolved_at, updated_at\n FROM execution_approvals\n WHERE status = 'approved'\n AND used_at IS NULL\n ORDER BY updated_at ASC\n LIMIT 40;\n `,\n )\n .all() as Array<{\n id: string;\n command: string;\n backend: string;\n cwd: string | null;\n created_at: string;\n resolved_at: string | null;\n updated_at: string;\n }>;\n return rows.map((row) => ({\n kind: 'unused-execution-approval',\n label: row.id,\n detail: `${row.backend}: ${row.command}\\ncwd: ${row.cwd ?? 'default'}\\napproved: ${row.resolved_at ?? row.updated_at}\\ncreated: ${row.created_at}`,\n }));\n } finally {\n database.close();\n }\n}\n\nfunction countUnusedExecutionApprovals(paths: RuntimePaths) {\n const database = openDb(paths.neondeckDatabase, { readOnly: true });\n try {\n const row = database\n .prepare(\n `\n SELECT COUNT(*) AS count\n FROM execution_approvals\n WHERE status = 'approved'\n AND used_at IS NULL;\n `,\n )\n .get() as { count?: number } | undefined;\n return typeof row?.count === 'number' ? row.count : 0;\n } finally {\n database.close();\n }\n}\n\nasync function staleWatchItems(paths: RuntimePaths) {\n const watches = await listPrWatchRecords(paths);\n return watches\n .filter((watch) => ['closed', 'merged'].includes(watch.status))\n .map((watch) => ({\n kind: 'stale-watch',\n label: watch.id,\n detail: `${watch.repoFullName}#${watch.prNumber}\\nstatus: ${watch.status}\\nlast checked: ${watch.lastCheckedAt ?? 'unknown'}`,\n }));\n}\n\nasync function todoAgingItems(\n repos: Array<{\n id: string;\n path: string;\n defaultBranch: string;\n github: { owner: string; name: string };\n }>,\n) {\n const items: HygieneItem[] = [];\n for (const repo of repos) {\n const lines = await gitLines(repo.path, [\n 'grep',\n '-n',\n '-I',\n '-E',\n 'TODO|FIXME|HACK',\n '--',\n '.',\n ]).catch(() => []);\n if (lines.length === 0) continue;\n\n const paths = [...new Set(lines.map(todoPath).filter(Boolean))].slice(\n 0,\n 30,\n ) as string[];\n let oldest: { path: string; date: string } | null = null;\n for (const path of paths) {\n const date = await git(repo.path, [\n 'log',\n '-1',\n '--format=%cI',\n '--',\n path,\n ]).catch(() => '');\n if (!date) continue;\n if (!oldest || Date.parse(date) < Date.parse(oldest.date)) {\n oldest = { path, date };\n }\n }\n\n items.push({\n kind: 'todo-aging',\n label: `${repoFullName(repo)} TODO/FIXME/HACK`,\n detail: [\n `${lines.length} tracked marker${lines.length === 1 ? '' : 's'} found.`,\n oldest ? `Oldest touched file: ${oldest.path} (${oldest.date})` : null,\n 'Examples:',\n ...lines.slice(0, 5),\n ]\n .filter(Boolean)\n .join('\\n'),\n });\n }\n return items;\n}\n\nfunction todoPath(line: string) {\n const separator = line.indexOf(':');\n return separator > 0 ? line.slice(0, separator) : null;\n}\n\nfunction countKinds(items: HygieneItem[]) {\n return items.reduce<Record<string, number>>((counts, item) => {\n counts[item.kind] = (counts[item.kind] ?? 0) + 1;\n return counts;\n }, {});\n}\n\nasync function gitLines(cwd: string, args: string[]) {\n return runBoundedGitLines(cwd, args);\n}\n\nasync function git(cwd: string, args: string[]) {\n return runBoundedGit(cwd, args);\n}\n\nfunction stringConfig(value: unknown) {\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nfunction numberConfig(value: unknown, fallback: number) {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction objectConfig(value: unknown) {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction errorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction failed(\n job: ReportAutomationInput,\n message: string,\n): AutomationExecutionResult {\n return {\n outcome: 'failed',\n message,\n notifications: [\n {\n level: 'attention',\n title: 'Hygiene failed',\n message,\n source: 'hygiene',\n sourceId: job.id,\n },\n ],\n };\n}\n","import { asJsonValue } from '../../lib/action-result';\nimport type { RuntimePaths } from '../../runtime-home';\nimport { listNotifications } from '../app-state';\nimport { readAutopilotState } from '../autopilot';\nimport type { CommandDependencies } from '../commands/schemas';\nimport { readReviewQueue } from '../commands/handlers/queue';\nimport { readHygieneSummary } from '../hygiene';\nimport { readRepoRegistrySnapshot } from '../repos';\nimport { listScheduledTasks } from '../scheduled-tasks';\nimport { listPrWatchRecords } from '../watches';\nimport type { BriefingSnapshot, BriefingSnapshotSource } from './schemas';\n\nconst collectionLimit = 40;\nconst snapshotByteLimit = 96_000;\n\nexport type BriefingSnapshotDependencies = CommandDependencies & {\n readRepos?: typeof readRepoRegistrySnapshot;\n readWatches?: typeof listPrWatchRecords;\n readTasks?: typeof listScheduledTasks;\n readNotifications?: typeof listNotifications;\n readHygiene?: typeof readHygieneSummary;\n readAutopilot?: typeof readAutopilotState;\n};\n\nexport async function collectBriefingSnapshot(\n paths: RuntimePaths,\n dependencies: BriefingSnapshotDependencies = {},\n): Promise<BriefingSnapshot> {\n const collectedAt = new Date().toISOString();\n const [\n repos,\n reviewQueue,\n watches,\n tasks,\n notifications,\n hygiene,\n autopilot,\n ] = await Promise.all([\n capture('repos', async () => {\n const registry = await (\n dependencies.readRepos ?? readRepoRegistrySnapshot\n )(paths);\n return boundedList(\n registry.repos.map((repo) => ({\n id: repo.id,\n fullName: `${repo.github.owner}/${repo.github.name}`,\n localPath: repo.path,\n })),\n );\n }),\n capture('reviewQueue', async () => {\n const result = await readReviewQueue(paths, dependencies);\n if (!result.ok) {\n return {\n data: {\n available: false,\n message: result.message,\n requires: result.requires ?? [],\n errors: result.errors ?? [],\n },\n partial: true,\n };\n }\n const items = result.queue.items.map((item) => ({\n repo: item.repo,\n number: item.number,\n title: item.title,\n url: item.url,\n author: item.author,\n checks: item.checks,\n updatedAt: item.updatedAt,\n }));\n return {\n ...boundedList(items),\n data: {\n ...boundedList(items).data,\n issues: result.queue.issues.slice(0, 12),\n fetchedAt: result.queue.fetchedAt,\n },\n partial: result.queue.truncated || result.queue.issues.length > 0,\n };\n }),\n capture('watches', async () => {\n const records = await (dependencies.readWatches ?? listPrWatchRecords)(\n paths,\n );\n return boundedList(\n records.map((watch) => ({\n id: watch.id,\n repoId: watch.repoId,\n prNumber: watch.prNumber,\n title: watch.title,\n status: watch.status,\n url: watch.url,\n lastCheckedAt: watch.lastCheckedAt,\n })),\n );\n }),\n capture('scheduledTasks', async () => {\n const records = await (dependencies.readTasks ?? listScheduledTasks)(\n paths,\n );\n return boundedList(\n records.map((task) => ({\n id: task.id,\n kind: task.spec.kind,\n enabled: task.enabled,\n nextRunAt: task.nextRunAt,\n lastRunAt: task.lastRunAt,\n })),\n );\n }),\n capture('notifications', async () => {\n const records = await (\n dependencies.readNotifications ?? listNotifications\n )(paths);\n return boundedList(\n records\n .filter((notification) => !notification.readAt)\n .map((notification) => ({\n id: notification.id,\n level: notification.level,\n title: notification.title,\n message: notification.message,\n source: notification.source,\n createdAt: notification.createdAt,\n })),\n );\n }),\n capture('hygiene', async () => ({\n data: await (dependencies.readHygiene ?? readHygieneSummary)(paths),\n })),\n capture('autopilot', async () => {\n const state = await (dependencies.readAutopilot ?? readAutopilotState)(\n paths,\n );\n return {\n data: {\n summary: state.summary,\n queue: state.queue.slice(0, collectionLimit),\n preparedDiffs: state.preparedDiffs.slice(0, collectionLimit),\n pendingApprovals: state.pendingApprovals.slice(0, collectionLimit),\n runningChecks: state.runningChecks.slice(0, collectionLimit),\n },\n truncated:\n state.queue.length > collectionLimit ||\n state.preparedDiffs.length > collectionLimit ||\n state.pendingApprovals.length > collectionLimit ||\n state.runningChecks.length > collectionLimit,\n };\n }),\n ]);\n\n const sources = {\n repos,\n reviewQueue,\n watches,\n scheduledTasks: tasks,\n notifications,\n hygiene,\n autopilot,\n };\n const initial = {\n version: 1 as const,\n collectedAt,\n byteSize: 0,\n truncated: Object.values(sources).some((source) => source.truncated),\n sources,\n };\n const sizedInitial = withByteSize(initial);\n if (sizedInitial.byteSize <= snapshotByteLimit) return sizedInitial;\n\n const compactSources = Object.fromEntries(\n Object.entries(sources).map(([name, source]) => [\n name,\n {\n ...source,\n status: source.status === 'unavailable' ? 'unavailable' : 'partial',\n truncated: true,\n ...(source.error ? { error: truncateText(source.error, 1_000) } : {}),\n data: asJsonValue(compactData(source.data)),\n },\n ]),\n ) as Record<string, BriefingSnapshotSource>;\n const compact = {\n version: 1 as const,\n collectedAt,\n byteSize: 0,\n truncated: true,\n sources: compactSources,\n };\n const sizedCompact = withByteSize(compact);\n if (sizedCompact.byteSize <= snapshotByteLimit) return sizedCompact;\n\n return withByteSize({\n ...compact,\n sources: Object.fromEntries(\n Object.entries(compactSources).map(([name, source]) => [\n name,\n {\n ...source,\n data: null,\n error: source.error ? truncateText(source.error, 300) : undefined,\n },\n ]),\n ),\n });\n}\n\nasync function capture(\n _name: string,\n read: () => Promise<{\n data: unknown;\n truncated?: boolean;\n partial?: boolean;\n }>,\n): Promise<BriefingSnapshotSource> {\n const fetchedAt = new Date().toISOString();\n try {\n const result = await read();\n return {\n status: result.partial || result.truncated ? 'partial' : 'ok',\n fetchedAt,\n truncated: Boolean(result.truncated),\n data: asJsonValue(result.data),\n };\n } catch (error) {\n return {\n status: 'unavailable',\n fetchedAt,\n truncated: false,\n error: truncateText(\n error instanceof Error ? error.message : String(error),\n 1_000,\n ),\n data: null,\n };\n }\n}\n\nfunction withByteSize(snapshot: BriefingSnapshot): BriefingSnapshot {\n let candidate = snapshot;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const byteSize = Buffer.byteLength(JSON.stringify(candidate), 'utf8');\n if (byteSize === candidate.byteSize) return candidate;\n candidate = { ...candidate, byteSize };\n }\n return candidate;\n}\n\nfunction truncateText(value: string, limit: number) {\n return value.length > limit ? `${value.slice(0, limit - 3)}...` : value;\n}\n\nfunction boundedList<T>(items: T[]) {\n return {\n data: {\n total: items.length,\n items: items.slice(0, collectionLimit),\n },\n truncated: items.length > collectionLimit,\n };\n}\n\nfunction compactData(data: unknown, depth = 0): unknown {\n if (typeof data === 'string') {\n return data.length > 300 ? `${data.slice(0, 297)}...` : data;\n }\n if (\n data === null ||\n typeof data === 'number' ||\n typeof data === 'boolean' ||\n data === undefined\n ) {\n return data ?? null;\n }\n if (depth >= 3) {\n return Array.isArray(data)\n ? { total: data.length, truncated: true }\n : { truncated: true };\n }\n if (Array.isArray(data)) {\n return data.slice(0, 3).map((value) => compactData(value, depth + 1));\n }\n if (typeof data !== 'object') return String(data);\n return Object.fromEntries(\n Object.entries(data)\n .slice(0, 3)\n .map(([key, value]) => [key, compactData(value, depth + 1)]),\n );\n}\n","import { randomUUID } from 'node:crypto';\nimport * as v from 'valibot';\nimport { asJsonValue } from '../../lib/action-result';\nimport { openDb } from '../../lib/sqlite';\nimport {\n ensureRuntimeHome,\n runtimePaths,\n type RuntimePaths,\n} from '../../runtime-home';\nimport type {\n BriefingProfile,\n BriefingRun,\n BriefingRunMetadata,\n BriefingSnapshot,\n} from './schemas';\nimport {\n defaultBriefingInstructions,\n defaultBriefingProfileId,\n defaultBriefingSchedule,\n briefingSnapshotSchema,\n} from './schemas';\nimport { readScheduledTask } from '../scheduled-tasks';\nimport {\n nextOccurrence,\n validateAutomationTrigger,\n} from '../scheduled-tasks/triggers';\n\nconst nullableString = v.nullable(v.string());\nconst persistedProfileSchema = v.object({\n id: v.string(),\n name: v.string(),\n enabled: v.number(),\n instructions: v.string(),\n instructions_version: v.number(),\n schedule: v.string(),\n timezone: v.string(),\n session_id: nullableString,\n created_at: v.string(),\n updated_at: v.string(),\n});\nconst persistedRunSchema = v.object({\n id: v.string(),\n profile_id: nullableString,\n trigger: v.picklist(['manual', 'scheduled', 'dashboard']),\n snapshot_json: v.string(),\n instructions: v.string(),\n instructions_version: v.number(),\n session_id: v.string(),\n command_event_id: nullableString,\n dispatch_id: nullableString,\n workflow_run_id: nullableString,\n status: v.picklist(['queued', 'ready', 'failed']),\n error: nullableString,\n queued_at: v.string(),\n completed_at: nullableString,\n created_at: v.string(),\n updated_at: v.string(),\n});\nconst persistedRunMetadataSchema = v.omit(persistedRunSchema, [\n 'snapshot_json',\n 'instructions',\n]);\nconst persistedBriefingTaskSchema = v.object({\n kind: v.string(),\n trigger_json: v.string(),\n next_run_at: nullableString,\n claim_id: nullableString,\n claim_expires_at: nullableString,\n last_run_at: nullableString,\n created_at: v.string(),\n});\n\nexport async function readBriefingProfile(\n id = defaultBriefingProfileId,\n paths: RuntimePaths = runtimePaths(),\n): Promise<BriefingProfile> {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n const row = database\n .prepare('SELECT * FROM briefing_profiles WHERE id = ?;')\n .get(id);\n if (row) return readProfileRow(row, false);\n } finally {\n database.close();\n }\n\n const compatibleTask = await readScheduledTask(`briefing:${id}`, paths);\n const timezone =\n compatibleTask?.trigger.kind === 'cron'\n ? compatibleTask.trigger.timezone\n : (Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'UTC');\n if (!compatibleTask) {\n const initialized = await writeBriefingProfileAndTask(\n {\n id,\n name: id === defaultBriefingProfileId ? 'Morning Briefing' : id,\n enabled: true,\n instructions: defaultBriefingInstructions,\n instructionsVersion: 1,\n schedule: defaultBriefingSchedule,\n timezone,\n sessionId: null,\n },\n paths,\n );\n return initialized.profile;\n }\n const cron =\n compatibleTask?.trigger.kind === 'cron'\n ? compatibleTask.trigger\n : undefined;\n return {\n id,\n name: id === defaultBriefingProfileId ? 'Morning Briefing' : id,\n enabled: compatibleTask.enabled,\n instructions: defaultBriefingInstructions,\n instructionsVersion: 1,\n schedule: cron?.expression ?? defaultBriefingSchedule,\n timezone,\n sessionId: null,\n compatibility: true,\n createdAt: null,\n updatedAt: compatibleTask?.updatedAt ?? null,\n };\n}\n\nexport async function writeBriefingProfile(\n profile: Omit<BriefingProfile, 'compatibility' | 'createdAt' | 'updatedAt'>,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n const now = new Date().toISOString();\n try {\n database.exec('BEGIN;');\n const before = database\n .prepare('SELECT * FROM briefing_profiles WHERE id = ?;')\n .get(profile.id);\n database\n .prepare(\n `INSERT INTO briefing_profiles (\n id, name, enabled, instructions, instructions_version, schedule,\n timezone, session_id, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n enabled = excluded.enabled,\n instructions = excluded.instructions,\n instructions_version = excluded.instructions_version,\n schedule = excluded.schedule,\n timezone = excluded.timezone,\n session_id = excluded.session_id,\n updated_at = excluded.updated_at;`,\n )\n .run(\n profile.id,\n profile.name,\n profile.enabled ? 1 : 0,\n profile.instructions,\n profile.instructionsVersion,\n profile.schedule,\n profile.timezone,\n profile.sessionId,\n now,\n now,\n );\n const after = database\n .prepare('SELECT * FROM briefing_profiles WHERE id = ?;')\n .get(profile.id);\n database\n .prepare(\n `INSERT INTO config_history (\n action, file, target, before_json, after_json, changed_at\n ) VALUES ('briefing_profile_update', 'briefing_profiles', ?, ?, ?, ?);`,\n )\n .run(\n profile.id,\n before ? JSON.stringify(readProfileRow(before, false)) : null,\n JSON.stringify(readProfileRow(after, false)),\n now,\n );\n database.exec('COMMIT;');\n return readProfileRow(after, false);\n } catch (error) {\n database.exec('ROLLBACK;');\n throw error;\n } finally {\n database.close();\n }\n}\n\nexport async function writeBriefingProfileAndTask(\n profile: Omit<BriefingProfile, 'compatibility' | 'createdAt' | 'updatedAt'>,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const triggerResult = validateAutomationTrigger({\n kind: 'cron',\n expression: profile.schedule,\n timezone: profile.timezone,\n });\n if (!triggerResult.ok) throw new Error(triggerResult.message);\n const trigger = triggerResult.trigger;\n const taskId = `briefing:${profile.id}`;\n const spec = { kind: 'run-briefing' as const, briefingId: profile.id };\n const database = openDb(paths.neondeckDatabase);\n const now = new Date();\n const nowIso = now.toISOString();\n try {\n database.exec('BEGIN IMMEDIATE;');\n const beforeProfile = database\n .prepare('SELECT * FROM briefing_profiles WHERE id = ?;')\n .get(profile.id);\n const beforeTaskRow = database\n .prepare('SELECT * FROM scheduled_tasks WHERE id = ?;')\n .get(taskId);\n const beforeTask = beforeTaskRow\n ? parsePersisted(\n persistedBriefingTaskSchema,\n beforeTaskRow,\n 'briefing scheduled task',\n )\n : undefined;\n if (beforeTask && beforeTask.kind !== 'run-briefing') {\n throw new Error(\n `Scheduled task \"${taskId}\" cannot be replaced with a briefing task.`,\n );\n }\n const triggerJson = JSON.stringify(asJsonValue(trigger));\n const nextRunAt =\n beforeTask && beforeTask.trigger_json === triggerJson\n ? (beforeTask.next_run_at as string | null)\n : nextOccurrence(trigger, now);\n database\n .prepare(\n `INSERT INTO scheduled_tasks (\n id, kind, trigger_json, payload_json, enabled, next_run_at,\n claim_id, claim_expires_at, last_run_at, created_at, updated_at\n ) VALUES (?, 'run-briefing', ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n kind = excluded.kind,\n trigger_json = excluded.trigger_json,\n payload_json = excluded.payload_json,\n enabled = excluded.enabled,\n next_run_at = excluded.next_run_at,\n updated_at = excluded.updated_at;`,\n )\n .run(\n taskId,\n triggerJson,\n JSON.stringify(asJsonValue(spec)),\n profile.enabled ? 1 : 0,\n nextRunAt,\n beforeTask?.claim_id ?? null,\n beforeTask?.claim_expires_at ?? null,\n beforeTask?.last_run_at ?? null,\n beforeTask?.created_at ?? nowIso,\n nowIso,\n );\n database\n .prepare(\n `INSERT INTO briefing_profiles (\n id, name, enabled, instructions, instructions_version, schedule,\n timezone, session_id, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n enabled = excluded.enabled,\n instructions = excluded.instructions,\n instructions_version = excluded.instructions_version,\n schedule = excluded.schedule,\n timezone = excluded.timezone,\n session_id = excluded.session_id,\n updated_at = excluded.updated_at;`,\n )\n .run(\n profile.id,\n profile.name,\n profile.enabled ? 1 : 0,\n profile.instructions,\n profile.instructionsVersion,\n profile.schedule,\n profile.timezone,\n profile.sessionId,\n nowIso,\n nowIso,\n );\n const afterProfile = database\n .prepare('SELECT * FROM briefing_profiles WHERE id = ?;')\n .get(profile.id);\n database\n .prepare(\n `INSERT INTO config_history (\n action, file, target, before_json, after_json, changed_at\n ) VALUES ('briefing_profile_update', 'briefing_profiles', ?, ?, ?, ?);`,\n )\n .run(\n profile.id,\n beforeProfile\n ? JSON.stringify(readProfileRow(beforeProfile, false))\n : null,\n JSON.stringify(readProfileRow(afterProfile, false)),\n nowIso,\n );\n database.exec('COMMIT;');\n return {\n profile: readProfileRow(afterProfile, false),\n task: {\n id: taskId,\n spec,\n trigger,\n enabled: profile.enabled,\n nextRunAt,\n claimId: beforeTask?.claim_id ?? null,\n claimExpiresAt: beforeTask?.claim_expires_at ?? null,\n lastRunAt: beforeTask?.last_run_at ?? null,\n createdAt: beforeTask?.created_at ?? nowIso,\n updatedAt: nowIso,\n },\n };\n } catch (error) {\n database.exec('ROLLBACK;');\n throw error;\n } finally {\n database.close();\n }\n}\n\nexport async function setBriefingProfileSession(\n id: string,\n sessionId: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n database\n .prepare(\n 'UPDATE briefing_profiles SET session_id = ?, updated_at = ? WHERE id = ?;',\n )\n .run(sessionId, new Date().toISOString(), id);\n } finally {\n database.close();\n }\n}\n\nexport async function createBriefingRun(\n input: {\n profileId: string | null;\n trigger: BriefingRun['trigger'];\n snapshot: BriefingSnapshot;\n instructions: string;\n instructionsVersion: number;\n sessionId: string;\n commandEventId?: string | null;\n },\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const now = new Date().toISOString();\n const id = `briefing:${now.replace(/\\D/g, '').slice(0, 14)}:${randomUUID().slice(0, 8)}`;\n const database = openDb(paths.neondeckDatabase);\n try {\n database\n .prepare(\n `INSERT INTO briefing_runs (\n id, profile_id, trigger, snapshot_json, instructions,\n instructions_version, session_id, command_event_id, dispatch_id,\n workflow_run_id, status, error, queued_at, completed_at, created_at,\n updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, 'queued', NULL, ?, NULL, ?, ?);`,\n )\n .run(\n id,\n input.profileId,\n input.trigger,\n JSON.stringify(input.snapshot),\n input.instructions,\n input.instructionsVersion,\n input.sessionId,\n input.commandEventId ?? null,\n now,\n now,\n now,\n );\n return readBriefingRun(id, paths);\n } finally {\n database.close();\n }\n}\n\nexport async function attachBriefingDispatch(\n id: string,\n dispatchId: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n const database = openDb(paths.neondeckDatabase);\n try {\n database\n .prepare(\n 'UPDATE briefing_runs SET dispatch_id = ?, updated_at = ? WHERE id = ?;',\n )\n .run(dispatchId, new Date().toISOString(), id);\n } finally {\n database.close();\n }\n}\n\nexport async function attachBriefingWorkflowRun(\n id: string,\n workflowRunId: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n const database = openDb(paths.neondeckDatabase);\n try {\n database\n .prepare(\n 'UPDATE briefing_runs SET workflow_run_id = ?, updated_at = ? WHERE id = ?;',\n )\n .run(workflowRunId, new Date().toISOString(), id);\n } finally {\n database.close();\n }\n}\n\nexport async function settleBriefingRun(\n dispatchId: string,\n status: 'ready' | 'failed',\n error: string | null,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n try {\n const update = database\n .prepare(\n `UPDATE briefing_runs\n SET status = ?, error = ?, completed_at = ?, updated_at = ?\n WHERE dispatch_id = ? AND status = 'queued';`,\n )\n .run(status, error, now, now, dispatchId);\n const row = database\n .prepare('SELECT * FROM briefing_runs WHERE dispatch_id = ?;')\n .get(dispatchId);\n return {\n changed: update.changes === 1,\n run: row ? readRunRow(row) : null,\n };\n } finally {\n database.close();\n }\n}\n\nexport async function failBriefingRunBeforeDispatch(\n id: string,\n error: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n const database = openDb(paths.neondeckDatabase);\n const now = new Date().toISOString();\n try {\n database\n .prepare(\n `UPDATE briefing_runs SET status = 'failed', error = ?, completed_at = ?, updated_at = ? WHERE id = ?;`,\n )\n .run(error, now, now, id);\n } finally {\n database.close();\n }\n}\n\nexport async function readBriefingRun(\n id: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n const row = database\n .prepare('SELECT * FROM briefing_runs WHERE id = ?;')\n .get(id);\n return row ? readRunRow(row) : null;\n } finally {\n database.close();\n }\n}\n\nexport async function readBriefingRunByDispatch(\n dispatchId: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n const row = database\n .prepare('SELECT * FROM briefing_runs WHERE dispatch_id = ?;')\n .get(dispatchId);\n return row ? readRunRow(row) : null;\n } finally {\n database.close();\n }\n}\n\nexport async function listBriefingRuns(\n paths: RuntimePaths = runtimePaths(),\n limit = 20,\n) {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n return database\n .prepare('SELECT * FROM briefing_runs ORDER BY created_at DESC LIMIT ?;')\n .all(limit)\n .map(readRunRow);\n } finally {\n database.close();\n }\n}\n\nexport async function listBriefingRunMetadata(\n paths: RuntimePaths = runtimePaths(),\n limit = 20,\n): Promise<BriefingRunMetadata[]> {\n await ensureRuntimeHome(paths);\n const database = openDb(paths.neondeckDatabase);\n try {\n return database\n .prepare(\n `SELECT\n id, profile_id, trigger, instructions_version, session_id,\n command_event_id, dispatch_id, workflow_run_id, status, error,\n queued_at, completed_at, created_at, updated_at,\n json_extract(snapshot_json, '$.version') AS snapshot_version,\n json_extract(snapshot_json, '$.collectedAt') AS snapshot_collected_at,\n json_extract(snapshot_json, '$.byteSize') AS snapshot_byte_size,\n json_extract(snapshot_json, '$.truncated') AS snapshot_truncated\n FROM briefing_runs\n ORDER BY created_at DESC\n LIMIT ?;`,\n )\n .all(limit)\n .map(readRunMetadataRow);\n } finally {\n database.close();\n }\n}\n\nfunction readProfileRow(row: unknown, compatibility: boolean): BriefingProfile {\n const value = parsePersisted(persistedProfileSchema, row, 'briefing profile');\n return {\n id: value.id,\n name: value.name,\n enabled: value.enabled === 1,\n instructions: value.instructions,\n instructionsVersion: value.instructions_version,\n schedule: value.schedule,\n timezone: value.timezone,\n sessionId: value.session_id,\n compatibility,\n createdAt: value.created_at,\n updatedAt: value.updated_at,\n };\n}\n\nfunction readRunRow(row: unknown): BriefingRun {\n const value = parsePersisted(persistedRunSchema, row, 'briefing run');\n let snapshot: BriefingSnapshot;\n try {\n snapshot = v.parse(\n briefingSnapshotSchema,\n JSON.parse(value.snapshot_json),\n ) as BriefingSnapshot;\n } catch (error) {\n throw new Error(`Invalid persisted briefing snapshot for ${value.id}.`, {\n cause: error,\n });\n }\n return {\n id: value.id,\n profileId: value.profile_id,\n trigger: value.trigger,\n snapshot,\n instructions: value.instructions,\n instructionsVersion: value.instructions_version,\n sessionId: value.session_id,\n commandEventId: value.command_event_id,\n dispatchId: value.dispatch_id,\n workflowRunId: value.workflow_run_id,\n status: value.status,\n error: value.error,\n queuedAt: value.queued_at,\n completedAt: value.completed_at,\n createdAt: value.created_at,\n updatedAt: value.updated_at,\n };\n}\n\nfunction readRunMetadataRow(row: unknown): BriefingRunMetadata {\n const value = parsePersisted(\n v.object({\n ...persistedRunMetadataSchema.entries,\n snapshot_version: v.literal(1),\n snapshot_collected_at: v.string(),\n snapshot_byte_size: v.number(),\n snapshot_truncated: v.number(),\n }),\n row,\n 'briefing run metadata',\n );\n return {\n id: value.id,\n profileId: value.profile_id,\n trigger: value.trigger,\n instructionsVersion: value.instructions_version,\n sessionId: value.session_id,\n commandEventId: value.command_event_id,\n dispatchId: value.dispatch_id,\n workflowRunId: value.workflow_run_id,\n status: value.status,\n error: value.error,\n queuedAt: value.queued_at,\n completedAt: value.completed_at,\n createdAt: value.created_at,\n updatedAt: value.updated_at,\n snapshot: {\n version: 1,\n collectedAt: value.snapshot_collected_at,\n byteSize: value.snapshot_byte_size,\n truncated: value.snapshot_truncated === 1,\n },\n };\n}\n\nfunction parsePersisted<\n TSchema extends v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>>,\n>(schema: TSchema, value: unknown, label: string): v.InferOutput<TSchema> {\n try {\n return v.parse(schema, value);\n } catch (error) {\n throw new Error(`Invalid persisted ${label}.`, { cause: error });\n }\n}\n","import {\n dispatch,\n type DispatchReceipt,\n type FlueObservation,\n} from '@flue/runtime';\nimport * as v from 'valibot';\nimport type { RuntimePaths } from '../../runtime-home';\nimport { runtimePaths } from '../../runtime-home';\nimport { addNotification, listNotifications } from '../app-state';\nimport {\n createChatSession,\n publishSessionEvent,\n readChatSession,\n updateChatSessionCommandEvent,\n} from '../sessions';\nimport {\n briefingProfileUpdateSchema,\n briefingRunNowSchema,\n defaultBriefingProfileId,\n type BriefingProfile,\n type BriefingRun,\n} from './schemas';\nimport {\n collectBriefingSnapshot,\n type BriefingSnapshotDependencies,\n} from './snapshot';\nimport {\n attachBriefingDispatch,\n attachBriefingWorkflowRun,\n createBriefingRun,\n failBriefingRunBeforeDispatch,\n listBriefingRunMetadata,\n readBriefingRun,\n readBriefingRunByDispatch,\n readBriefingProfile,\n setBriefingProfileSession,\n settleBriefingRun,\n writeBriefingProfileAndTask,\n} from './store';\n\ntype BriefingServiceDependencies = BriefingSnapshotDependencies & {\n dispatchAgent?: (request: {\n agent: string;\n id: string;\n input: string;\n }) => Promise<DispatchReceipt>;\n invokeWorkflow?: (input: {\n profileId: string;\n sessionId?: string;\n commandEventId?: string;\n trigger: 'manual' | 'dashboard';\n }) => Promise<{ runId: string }>;\n};\n\ntype BriefingTerminal = {\n failed: boolean;\n error: string | null;\n instanceId: string;\n recordedAt: number;\n};\nconst pendingBriefingTerminals = new Map<string, BriefingTerminal>();\nconst pendingTerminalTtlMs = 30_000;\n\nexport async function readBriefingState(paths: RuntimePaths = runtimePaths()) {\n const profile = await readBriefingProfile(defaultBriefingProfileId, paths);\n const [runs, notifications, linkedSession] = await Promise.all([\n listBriefingRunMetadata(paths),\n listNotifications(paths),\n profile.sessionId\n ? readChatSession(\n { id: profile.sessionId, reason: 'briefing-state-read' },\n paths,\n )\n : null,\n ]);\n const session =\n linkedSession && 'session' in linkedSession ? linkedSession.session : null;\n return {\n ok: true,\n action: 'briefing_state_read',\n changed: false,\n profile,\n latestRun: runs[0] ?? null,\n runs,\n sessionStaleReasons: session?.staleReasons ?? [],\n unreadCount: notifications.filter(\n (notification) =>\n notification.source === 'briefing' && !notification.readAt,\n ).length,\n fetchedAt: new Date().toISOString(),\n } as const;\n}\n\nexport async function rotateBriefingSession(\n rawInput: unknown,\n paths: RuntimePaths = runtimePaths(),\n) {\n const parsed = v.safeParse(\n v.object({ id: v.optional(v.string()) }),\n rawInput,\n );\n if (!parsed.success) {\n return {\n ok: false,\n action: 'briefing_session_rotate',\n changed: false,\n message: 'Invalid briefing session rotation request.',\n } as const;\n }\n const profile = await readBriefingProfile(\n parsed.output.id ?? defaultBriefingProfileId,\n paths,\n );\n if (profile.compatibility) {\n await writeBriefingProfileAndTask(\n {\n id: profile.id,\n name: profile.name,\n enabled: profile.enabled,\n instructions: profile.instructions,\n instructionsVersion: profile.instructionsVersion,\n schedule: profile.schedule,\n timezone: profile.timezone,\n sessionId: null,\n },\n paths,\n );\n }\n const created = await createChatSession(\n {\n title: profile.name,\n kind: 'briefing',\n linkedTaskId: `briefing:${profile.id}:rotation:${Date.now()}`,\n activate: false,\n surface: 'dashboard',\n reason: 'explicit-briefing-session-rotation',\n uiMetadata: { briefingProfileId: profile.id },\n },\n paths,\n );\n if (!('session' in created)) {\n return {\n ok: false,\n action: 'briefing_session_rotate',\n changed: false,\n message: 'A fresh briefing conversation could not be created.',\n } as const;\n }\n await setBriefingProfileSession(profile.id, created.session.id, paths);\n const updated = await readBriefingProfile(profile.id, paths);\n return {\n ok: true,\n action: 'briefing_session_rotate',\n changed: true,\n message: 'Started a fresh briefing conversation.',\n profile: updated,\n session: created.session,\n } as const;\n}\n\nexport async function readBriefingRunDetails(\n id: string,\n paths: RuntimePaths = runtimePaths(),\n) {\n const run = await readBriefingRun(id, paths);\n if (!run) {\n return {\n ok: false,\n action: 'briefing_run_read',\n changed: false,\n message: `Briefing run \"${id}\" was not found.`,\n } as const;\n }\n return {\n ok: true,\n action: 'briefing_run_read',\n changed: false,\n message: `Read briefing run \"${id}\".`,\n run,\n } as const;\n}\n\nexport async function updateBriefingProfile(\n rawInput: unknown,\n paths: RuntimePaths = runtimePaths(),\n) {\n const parsed = v.safeParse(briefingProfileUpdateSchema, rawInput);\n if (!parsed.success) {\n return {\n ok: false,\n action: 'briefing_profile_update',\n changed: false,\n message: 'Invalid briefing profile.',\n errors: [v.summarize(parsed.issues)],\n } as const;\n }\n const id = parsed.output.id ?? defaultBriefingProfileId;\n const current = await readBriefingProfile(id, paths);\n const instructions = parsed.output.instructions ?? current.instructions;\n const desired = {\n id,\n name: parsed.output.name ?? current.name,\n enabled: parsed.output.enabled ?? current.enabled,\n instructions,\n instructionsVersion:\n instructions === current.instructions\n ? current.instructionsVersion\n : current.instructionsVersion + 1,\n schedule: parsed.output.schedule ?? current.schedule,\n timezone: parsed.output.timezone ?? current.timezone,\n sessionId: current.sessionId,\n };\n try {\n const updated = await writeBriefingProfileAndTask(desired, paths);\n return {\n ok: true,\n action: 'briefing_profile_update',\n changed: true,\n message: 'Updated the morning briefing profile and schedule.',\n profile: updated.profile,\n task: updated.task,\n } as const;\n } catch (error) {\n return {\n ok: false,\n action: 'briefing_profile_update',\n changed: false,\n message: `The briefing profile was not changed: ${error instanceof Error ? error.message : String(error)}`,\n } as const;\n }\n}\n\nexport async function runBriefingNow(\n rawInput: unknown,\n paths: RuntimePaths = runtimePaths(),\n dependencies: BriefingServiceDependencies = {},\n) {\n const parsed = v.safeParse(briefingRunNowSchema, rawInput);\n if (!parsed.success) {\n return {\n ok: false,\n action: 'briefing_run',\n changed: false,\n message: 'Invalid briefing run request.',\n errors: [v.summarize(parsed.issues)],\n } as const;\n }\n try {\n const input = {\n profileId: parsed.output.profileId ?? defaultBriefingProfileId,\n sessionId: parsed.output.sessionId,\n commandEventId: parsed.output.commandEventId,\n trigger: parsed.output.trigger ?? ('dashboard' as const),\n };\n const invokeWorkflow =\n dependencies.invokeWorkflow ?? invokeBriefingWorkflow;\n const { runId } = await invokeWorkflow(input);\n return {\n ok: true,\n action: 'briefing_run',\n changed: true,\n message: `Briefing workflow ${runId} queued.`,\n workflowRunId: runId,\n } as const;\n } catch (error) {\n return {\n ok: false,\n action: 'briefing_run',\n changed: false,\n message: error instanceof Error ? error.message : String(error),\n } as const;\n }\n}\n\nasync function invokeBriefingWorkflow(input: {\n profileId: string;\n sessionId?: string;\n commandEventId?: string;\n trigger: 'manual' | 'dashboard';\n}) {\n const { invoke } = await import('@flue/runtime');\n const workflow = await import('../../workflows/briefing');\n return invoke(workflow.default, { input });\n}\n\nexport async function admitBriefing(\n input: {\n profileId: string;\n trigger: BriefingRun['trigger'];\n sessionId?: string;\n commandEventId?: string;\n },\n paths: RuntimePaths = runtimePaths(),\n dependencies: BriefingServiceDependencies = {},\n) {\n const profile = await readBriefingProfile(input.profileId, paths);\n const sessionId = input.sessionId\n ? await validateRequestedBriefingSession(input.sessionId, paths)\n : await resolveScheduledBriefingSession(profile, paths);\n const snapshot = await collectBriefingSnapshot(paths, dependencies);\n const run = await createBriefingRun(\n {\n profileId: profile.id,\n trigger: input.trigger,\n snapshot,\n instructions: profile.instructions,\n instructionsVersion: profile.instructionsVersion,\n sessionId,\n commandEventId: input.commandEventId,\n },\n paths,\n );\n if (!run) throw new Error('Briefing run could not be persisted.');\n\n try {\n const dispatchAgent = dependencies.dispatchAgent ?? dispatch;\n const receipt = await dispatchAgent({\n agent: 'display-assistant',\n id: sessionId,\n input: composeBriefingInput(run, profile),\n });\n await attachBriefingDispatch(run.id, receipt.dispatchId, paths);\n await reconcilePendingBriefingTerminal(receipt.dispatchId, paths);\n return { ...run, dispatchId: receipt.dispatchId };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await failBriefingRunBeforeDispatch(run.id, message, paths);\n await addNotification(\n {\n level: 'attention',\n title: 'Morning briefing failed',\n message: 'Neon could not start the briefing conversation.',\n source: 'briefing',\n sourceId: run.id,\n data: { runId: run.id, sessionId, error: message },\n },\n paths,\n );\n throw error;\n }\n}\n\nexport async function settleBriefingObservation(\n event: Extract<\n FlueObservation,\n { type: 'agent_end' | 'operation' | 'submission_settled' }\n >,\n paths: RuntimePaths = runtimePaths(),\n) {\n if (!event.dispatchId) return null;\n const observation = event as unknown as Record<string, unknown>;\n if (observation.taskId || observation.parentSession) return null;\n if (\n typeof observation.agentName === 'string' &&\n observation.agentName !== 'display-assistant'\n ) {\n return null;\n }\n if (\n event.type === 'operation' &&\n (event.operationKind !== 'prompt' || !event.isError)\n ) {\n return null;\n }\n const failed =\n event.type === 'operation'\n ? event.isError\n : event.type === 'submission_settled'\n ? event.outcome !== 'completed'\n : false;\n const error = failed ? briefingObservationError(event) : null;\n const instanceId =\n typeof observation.instanceId === 'string' ? observation.instanceId : '';\n let correlated = await readBriefingRunByDispatch(event.dispatchId, paths);\n if (!correlated) {\n const runId = briefingRunIdFromObservation(observation);\n if (runId) {\n const candidate = await readBriefingRun(runId, paths);\n if (\n candidate?.status === 'queued' &&\n (!instanceId || candidate.sessionId === instanceId)\n ) {\n await attachBriefingDispatch(runId, event.dispatchId, paths);\n correlated = await readBriefingRunByDispatch(event.dispatchId, paths);\n }\n }\n }\n if (!correlated) {\n rememberPendingBriefingTerminal(paths, event.dispatchId, {\n failed,\n error,\n instanceId,\n recordedAt: Date.now(),\n });\n return null;\n }\n if (instanceId && correlated.sessionId !== instanceId) return null;\n return finalizeBriefingTerminal(\n event.dispatchId,\n { failed, error, instanceId, recordedAt: Date.now() },\n paths,\n );\n}\n\nasync function finalizeBriefingTerminal(\n dispatchId: string,\n terminal: BriefingTerminal,\n paths: RuntimePaths,\n) {\n const { failed, error } = terminal;\n const settled = await settleBriefingRun(\n dispatchId,\n failed ? 'failed' : 'ready',\n error,\n paths,\n );\n if (!settled.changed || !settled.run) return settled.run;\n\n const run = settled.run;\n if (run.commandEventId) {\n await updateChatSessionCommandEvent(\n {\n sessionId: run.sessionId,\n eventId: run.commandEventId,\n status: failed ? 'failed' : 'completed',\n result: null,\n reason: 'briefing-submission-settled',\n },\n paths,\n );\n }\n await addNotification(\n {\n level: failed ? 'attention' : 'ready',\n title: failed ? 'Morning briefing failed' : 'Morning briefing ready',\n message: failed\n ? 'Neon could not complete the briefing. Open the conversation for context.'\n : \"Neon has added today's briefing to your Morning Briefing conversation.\",\n source: 'briefing',\n sourceId: run.id,\n data: { runId: run.id, sessionId: run.sessionId },\n },\n paths,\n );\n const sessionResult = await readChatSession(\n { id: run.sessionId, reason: 'briefing-submission-settled' },\n paths,\n );\n if ('session' in sessionResult && sessionResult.session) {\n publishSessionEvent('updated', sessionResult.session, null);\n }\n return run;\n}\n\nfunction briefingObservationError(\n event: Extract<\n FlueObservation,\n { type: 'agent_end' | 'operation' | 'submission_settled' }\n >,\n) {\n if (event.type === 'submission_settled') {\n return event.error?.message ?? `Briefing submission ${event.outcome}.`;\n }\n if (event.type === 'operation') {\n if (event.error instanceof Error) return event.error.message;\n if (typeof event.error === 'string') return event.error;\n return event.errorInfo?.message ?? 'Briefing model operation failed.';\n }\n return null;\n}\n\nexport async function linkBriefingWorkflowObservation(\n event: Extract<FlueObservation, { type: 'run_end' }>,\n paths: RuntimePaths = runtimePaths(),\n) {\n if (\n !('result' in event) ||\n !event.result ||\n typeof event.result !== 'object'\n ) {\n return;\n }\n const briefingRunId = (event.result as Record<string, unknown>).briefingRunId;\n if (typeof briefingRunId === 'string') {\n await attachBriefingWorkflowRun(briefingRunId, event.runId, paths);\n }\n}\n\nexport function composeBriefingInput(\n run: BriefingRun,\n profile: BriefingProfile,\n) {\n const triggerLabel =\n run.trigger === 'scheduled' ? 'scheduled morning' : 'manual';\n return [\n `[NEONDECK_INTERNAL_BRIEFING_INPUT v1 trigger=${run.trigger} run=${run.id}]`,\n `Prepare the ${triggerLabel} briefing for ${run.snapshot.collectedAt}.`,\n `Briefing snapshot id: ${run.id}.`,\n 'Neondeck fact snapshot:',\n JSON.stringify(run.snapshot, null, 2),\n 'User briefing instructions:',\n profile.instructions,\n 'Respond to the user normally in this conversation. Use any configured MCP tools relevant to their instructions; do not assume a named external source was consulted unless you actually used it. If a deterministic or MCP source is unavailable, needs login, is denied, or awaits approval, explain that naturally and continue with the useful context you do have. Distinguish observed facts from inference. This briefing is informational; do not mutate external systems or auto-approve tool calls.',\n ].join('\\n\\n');\n}\n\nfunction briefingRunIdFromObservation(observation: Record<string, unknown>) {\n const agentInput = observation.agentInput;\n if (!agentInput || typeof agentInput !== 'object') return null;\n const raw = (agentInput as Record<string, unknown>).text;\n if (typeof raw !== 'string') return null;\n let text = raw;\n if (raw.startsWith('\"')) {\n try {\n const decoded = JSON.parse(raw) as unknown;\n if (typeof decoded === 'string') text = decoded;\n } catch {\n return null;\n }\n }\n return (\n text.match(\n /\\[NEONDECK_INTERNAL_BRIEFING_INPUT v1 trigger=\\w+ run=([^\\]\\s]+)\\]/,\n )?.[1] ?? null\n );\n}\n\nfunction pendingTerminalKey(paths: RuntimePaths, dispatchId: string) {\n return `${paths.home}:${dispatchId}`;\n}\n\nfunction rememberPendingBriefingTerminal(\n paths: RuntimePaths,\n dispatchId: string,\n terminal: BriefingTerminal,\n) {\n const cutoff = Date.now() - pendingTerminalTtlMs;\n for (const [key, value] of pendingBriefingTerminals) {\n if (value.recordedAt < cutoff) pendingBriefingTerminals.delete(key);\n }\n if (pendingBriefingTerminals.size >= 100) {\n const oldest = pendingBriefingTerminals.keys().next().value;\n if (oldest) pendingBriefingTerminals.delete(oldest);\n }\n pendingBriefingTerminals.set(pendingTerminalKey(paths, dispatchId), terminal);\n}\n\nasync function reconcilePendingBriefingTerminal(\n dispatchId: string,\n paths: RuntimePaths,\n) {\n const key = pendingTerminalKey(paths, dispatchId);\n const terminal = pendingBriefingTerminals.get(key);\n if (!terminal) return;\n pendingBriefingTerminals.delete(key);\n if (Date.now() - terminal.recordedAt > pendingTerminalTtlMs) return;\n const run = await readBriefingRunByDispatch(dispatchId, paths);\n if (!run || (terminal.instanceId && run.sessionId !== terminal.instanceId)) {\n return;\n }\n await finalizeBriefingTerminal(dispatchId, terminal, paths);\n}\n\nasync function resolveScheduledBriefingSession(\n profile: BriefingProfile,\n paths: RuntimePaths,\n) {\n if (profile.sessionId) {\n const existing = await readChatSession(\n { id: profile.sessionId, reason: 'scheduled-briefing-reuse' },\n paths,\n );\n if ('session' in existing && !existing.session.archivedAt) {\n if (existing.session.staleReasons.length > 0) {\n throw new Error(\n 'The briefing conversation context is stale. Start a fresh briefing conversation before running again.',\n );\n }\n return profile.sessionId;\n }\n }\n\n if (profile.compatibility) {\n await writeBriefingProfileAndTask(\n {\n id: profile.id,\n name: profile.name,\n enabled: profile.enabled,\n instructions: profile.instructions,\n instructionsVersion: profile.instructionsVersion,\n schedule: profile.schedule,\n timezone: profile.timezone,\n sessionId: null,\n },\n paths,\n );\n }\n\n const created = await createChatSession(\n {\n title: profile.name,\n kind: 'briefing',\n linkedTaskId: `briefing:${profile.id}`,\n activate: false,\n surface: 'dashboard',\n reason: 'scheduled-briefing-session',\n uiMetadata: { briefingProfileId: profile.id },\n },\n paths,\n );\n if (!('session' in created)) {\n throw new Error('Briefing session could not be created.');\n }\n if (created.session.staleReasons.length > 0) {\n throw new Error(\n 'The briefing conversation context is stale. Start a fresh briefing conversation before running again.',\n );\n }\n await setBriefingProfileSession(profile.id, created.session.id, paths);\n return created.session.id;\n}\n\nasync function validateRequestedBriefingSession(\n sessionId: string,\n paths: RuntimePaths,\n) {\n const result = await readChatSession(\n { id: sessionId, reason: 'manual-briefing-admission' },\n paths,\n );\n if (\n !('session' in result) ||\n result.session.archivedAt ||\n result.session.agentName !== 'display-assistant' ||\n result.session.staleReasons.length > 0\n ) {\n throw new Error(\n 'Manual briefings require an active display-assistant chat session.',\n );\n }\n return result.session.id;\n}\n","import { defineAction } from '@flue/runtime';\nimport * as v from 'valibot';\nimport { briefingProfileUpdateSchema, briefingRunNowSchema } from './schemas';\nimport {\n readBriefingRunDetails,\n readBriefingState,\n rotateBriefingSession,\n runBriefingNow,\n updateBriefingProfile,\n} from './service';\n\nconst outputSchema = v.looseObject({\n ok: v.boolean(),\n action: v.string(),\n changed: v.boolean(),\n message: v.optional(v.string()),\n});\n\nexport const briefingProfileReadAction = defineAction({\n name: 'neondeck_briefing_profile_read',\n description:\n 'Read the typed morning briefing profile, its durable conversation link, and recent operational run metadata.',\n input: v.object({}),\n output: outputSchema,\n async run() {\n return readBriefingState();\n },\n});\n\nexport const briefingProfileUpdateAction = defineAction({\n name: 'neondeck_briefing_profile_update',\n description:\n 'Update the enabled state, cron schedule, timezone, title, or user-authored instructions for the morning briefing profile.',\n input: briefingProfileUpdateSchema,\n output: outputSchema,\n async run({ input }) {\n return updateBriefingProfile(input);\n },\n});\n\nexport const briefingRunReadAction = defineAction({\n name: 'neondeck_briefing_run_read',\n description:\n 'Read one exact persisted deterministic briefing snapshot and its operational dispatch metadata. This never reads or parses the assistant transcript.',\n input: v.object({ id: v.pipe(v.string(), v.minLength(1)) }),\n output: outputSchema,\n async run({ input }) {\n return readBriefingRunDetails(input.id);\n },\n});\n\nexport const briefingRunNowAction = defineAction({\n name: 'neondeck_briefing_run_now',\n description:\n 'Queue an informational briefing in its persistent briefing conversation. All configured display-assistant MCP tools remain available under their normal auth and approval controls.',\n input: briefingRunNowSchema,\n output: outputSchema,\n async run({ input }) {\n return runBriefingNow(input);\n },\n});\n\nexport const briefingSessionRotateAction = defineAction({\n name: 'neondeck_briefing_session_rotate',\n description:\n 'Explicitly start a fresh durable briefing conversation when its captured model, SOUL, memory, skill, or provider context is stale. The old transcript remains preserved.',\n input: v.object({ id: v.optional(v.string()) }),\n output: outputSchema,\n async run({ input }) {\n return rotateBriefingSession(input);\n },\n});\n\nexport const neondeckBriefingActions = [\n briefingProfileReadAction,\n briefingProfileUpdateAction,\n briefingRunReadAction,\n briefingRunNowAction,\n briefingSessionRotateAction,\n];\n"],"mappings":";;;;;;AAGA,IAAa,2BAA2B;AACxC,IAAa,8BACX;AACF,IAAa,0BAA0B;AAEvC,IAAM,uBAAuB,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,KAAK,GAAG,EAAE,UAAU,CAAC,CAAC;AACxE,IAAM,iBAAiB,EAAE,KACvB,sBACA,EAAE,OAAO,UAAU;CACjB,IAAI;EACF,IAAI,KAAK,eAAe,SAAS,EAAE,UAAU,MAAM,CAAC;EACpD,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAAG,yCAAyC,CAC9C;AAEA,IAAa,8BAA8B,EAAE,OAAO;CAClD,IAAI,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,EAAE,CAAC,CAAC;CAC5D,MAAM,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,EAAE,CAAC,CAAC;CAC9D,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;CAC/B,cAAc,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,GAAK,CAAC,CAAC;CACzE,UAAU,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,GAAG,CAAC,CAAC;CACnE,UAAU,EAAE,SAAS,cAAc;AACrC,CAAC;AAED,IAAa,uBAAuB,EAAE,OAAO;CAC3C,WAAW,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,EAAE,CAAC,CAAC;CACnE,WAAW,EAAE,SAAS,oBAAoB;CAC1C,gBAAgB,EAAE,SAAS,oBAAoB;CAC/C,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,IAAa,8BAA8B,EAAE,OAAO;CAClD,WAAW,EAAE,SAAS,EAAE,KAAK,sBAAsB,EAAE,UAAU,EAAE,CAAC,CAAC;CACnE,QAAQ,EAAE,SAAS,oBAAoB;CACvC,WAAW,EAAE,SAAS,oBAAoB;CAC1C,gBAAgB,EAAE,SAAS,oBAAoB;CAC/C,SAAS,EAAE,SAAS,EAAE,SAAS;EAAC;EAAU;EAAa;CAAW,CAAC,CAAC;AACtE,CAAC;AAED,IAAa,yBAAyB,EAAE,OAAO;CAC7C,SAAS,EAAE,QAAQ,CAAC;CACpB,aAAa;CACb,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,SAAS,CAAC,CAAC;CACvD,WAAW,EAAE,QAAQ;CACrB,SAAS,EAAE,OACT,EAAE,OAAO,GACT,EAAE,OAAO;EACP,QAAQ,EAAE,SAAS;GAAC;GAAM;GAAW;EAAa,CAAC;EACnD,WAAW;EACX,WAAW,EAAE,QAAQ;EACrB,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;EAC5B,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;CAC9B,CAAC,CACH;AACF,CAAC;;;ACzDD,SAAgB,sBAAsB,QAA2B;CAC/D,IACE,OAAO,YAAY,kBACnB,OAAO,QACP,OAAO,OAAO,SAAS,UACvB;EACA,MAAM,OAAO,OAAO;EAWpB,OAAO;GACL,IAAI,OAAO;GACX,SAAS,OAAO;GAChB,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,SAAS,OAAO;GAChB,WAAW,KAAK;GAChB,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,YAAY,KAAK;EACnB;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,iBACd,SACA,OACA,SACA,MACmB;CACnB,OAAO;EACL,IAAI;EACJ;EACA;EACA,QAAQ;EACR;EACA,MAAM,YAAY,IAAI;CACxB;AACF;AAEA,SAAgB,eACd,SACA,OACA,SACA,MACmB;CACnB,OAAO;EACL,IAAI;EACJ;EACA;EACA,QAAQ;EACR;EACA,MAAM,YAAY,IAAI;CACxB;AACF;AAEA,SAAgB,mBACd,SACA,OACA,SACA,SACmB;CACnB,OAAO;EACL,IAAI;EACJ;EACA;EACA,QAAQ;EACR;EACA,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;CAC3D;AACF;AAEA,SAAgB,cACd,SACA,OACA,SACA,UAEI,CAAC,GACc;CACnB,OAAO;EACL,IAAI;EACJ;EACA;EACA,QAAQ;EACR;EACA,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EACzD,GAAI,QAAQ,OAAO,EAAE,MAAM,YAAY,QAAQ,IAAI,EAAE,IAAI,CAAC;CAC5D;AACF;;;ACvGA,IAAa,oBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,iCACd,OACiB;CACjB,MAAM,YAAY,oBAAoB,KAAK;CAC3C,IAAI,CAAC,WAAW,OAAO,CAAC,KAAK;CAE7B,IAAI,UAAU,aAAa,UACzB,OAAO,uBAAuB,UAAU,KAAK,IACzC,oBACA,CAAC,KAAK;CAGZ,IAAI,UAAU,aAAa,aACzB,OAAO,0BAA0B,UAAU,KAAK,IAC5C,oBACA,CAAC,KAAK;CAGZ,IAAI,UAAU,aAAa,YACzB,OAAO,yBAAyB,UAAU,KAAK,IAC3C,oBACA,CAAC,KAAK;CAGZ,OAAO,CAAC,KAAK;AACf;AAEA,SAAgB,oBAAoB,OAAe;CACjD,MAAM,QAAQ,MAAM,QAAQ,GAAG;CAC/B,IAAI,SAAS,KAAK,UAAU,MAAM,SAAS,GAAG,OAAO;CACrD,OAAO;EACL,UAAU,MAAM,MAAM,GAAG,KAAK;EAC9B,OAAO,MAAM,MAAM,QAAQ,CAAC;CAC9B;AACF;AAEA,SAAgB,uBAAuB,OAAe;CACpD,OAAO,6BAA6B,KAAK,KAAK;AAChD;AAEA,SAAgB,0BAA0B,OAAe;CACvD,OAAO,kCAAkC,KAAK,KAAK;AACrD;AAEA,SAAgB,yBAAyB,OAAe;CACtD,MAAM,SAAS,oBAAoB,KAAK;CACxC,IAAI,QAAQ,aAAa,UACvB,OAAO,uBAAuB,OAAO,KAAK;CAE5C,IAAI,QAAQ,aAAa,aACvB,OAAO,0BAA0B,OAAO,KAAK;CAG/C,OACE,sBAAsB,KAAK,KAAK,KAChC,uBAAuB,KAAK,KAC5B,0BAA0B,KAAK,KAC/B,kEAAkE,KAChE,KACF;AAEJ;AAEA,SAAgB,WAAW,QAAkB;CAC3C,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,IAAI,OAAO,WAAW,GAAG,OAAO,OAAO,MAAM;CAC7C,OAAO,GAAG,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,OAAO,GAAG,EAAE;AAC7D;AAEA,SAAgB,cAAc,OAAiD;CAC7E,OAAO,UAAU,UAAU,UAAU,WAAW,UAAU;AAC5D;AAEA,SAAgB,oBACd,OACuC;CACvC,OAAO,UAAU,UAAU,UAAU,WAAW,UAAU;AAC5D;AAEA,SAAgB,iBAAiB,KAAwB;CACvD,IAAI;EACF,OAAO,KAAK,MAAM,GAAG;CACvB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,wBACd,OACA,KACsB;CACtB,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,EAAE,OAAO,QAAQ,OAAO,KAAA;CACnE,MAAM,WAAY,MAAkC;CACpD,IAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG,OAAO,KAAA;CACrC,OAAO,SAAS,QAAQ,SAAyB,OAAO,SAAS,QAAQ;AAC3E;AAEA,SAAgB,aAAa,OAAgB;CAC3C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;ACvFA,eAAsB,mBACpB,SACA,OACA,cAC4B;CAC5B,MAAM,QAAQ,MAAM,gBAAgB,OAAO,YAAY;CACvD,IAAI,CAAC,MAAM,IACT,OAAO,mBAAmB,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClE,UAAU,MAAM;EAChB,QAAQ,MAAM;CAChB,CAAC;CAEH,MAAM,UAAU,MAAM,mBAAmB,KAAK;CAC9C,MAAM,SAAS,kBAAkB,MAAM,OAAO,OAAO;CAErD,OAAO,iBACL,QAAQ,MACR,QAAQ,KACR,mBAAmB,MAAM,GACzB;EACE,WAAW,MAAM,MAAM;EACvB,OAAO,MAAM,MAAM;EACnB,OAAO,MAAM,MAAM;EACnB,OAAO,MAAM,MAAM,MAAM;EACzB,WAAW,MAAM,MAAM;EACvB,QAAQ,MAAM,MAAM;EACpB,OAAO,MAAM,MAAM;EACnB;EACA,YAAY,OAAO;CACrB,CACF;AACF;AAEA,eAAsB,gBACpB,SACA,OACA,cAC4B;CAC5B,MAAM,MAAM,QAAQ,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK;CACxC,IAAI,CAAC,KACH,OAAO,cACL,QAAQ,MACR,QAAQ,KACR,uCACA,EAAE,UAAU,CAAC,KAAK,EAAE,CACtB;CAIF,MAAM,EAAE,QAAQ,UAAU,UAAU,OADpB,aAAa,iBAAiB,cAAA,CAE5C;EAAE;EAAK,QAAQ;CAAO,GACtB,OACA,aAAa,yBACT,EACE,iBAAiB,UACf,aAAa,uBAAwB;EACnC,KAAK,MAAM;EACX,UAAU,MAAM;EAChB,WAAW,MAAM;CACnB,CAAC,EACL,IACA,KAAA,CACN;CACA,OAAO,eACL,QAAQ,MACR,QAAQ,KACR,aAAa,OAAO,aAAa,GAAG,OAAO,SAAS,IACpD;EACE,UAAU;EACV;EACA;EACA,KAAK,OAAO;EACZ,QAAQ;EACR,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,gBACE;CACJ,CACF;AACF;AAYA,eAAsB,aACpB,SACA,OACA,cAC4B;CAC5B,MAAM,cAAc,QAAQ,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK;CAChD,IAAI,aAAa;EACf,MAAM,SAAS,oBAAoB,WAAW;EAC9C,IAAI,CAAC,QACH,OAAO,cACL,QAAQ,MACR,QAAQ,KACR,wFACA,EAAE,UAAU,CAAC,IAAI,EAAE,CACrB;EAEF,OAAO,mBACL,SACA,GAAG,OAAO,KAAK,GAAG,OAAO,UACzB,YACF;CACF;CAEA,MAAM,QAAQ,MAAM,gBAAgB,OAAO,YAAY;CACvD,IAAI,CAAC,MAAM,IACT,OAAO,mBAAmB,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClE,UAAU,MAAM;EAChB,QAAQ,MAAM;CAChB,CAAC;CAGH,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,MAAM,EAC5D,QAAQ,iBACV,CAAC;CACD,IAAI,CAAC,SAAS,IACZ,OAAO,cAAc,QAAQ,MAAM,QAAQ,KAAK,SAAS,SAAS;EAChE,UAAU,SAAS;EACnB,MAAM,EACJ,WAAW,sBAAsB,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,EACjE;CACF,CAAC;CAEH,IAAI,CAAC,iBAAiB,SAAS,IAAI,GACjC,OAAO,cACL,QAAQ,MACR,QAAQ,KACR,GAAG,SAAS,KAAK,KAAK,GAAG,SAAS,KAAK,OAAO,+CAC9C;EACE,UAAU,CAAC,eAAe;EAC1B,MAAM,EAAE,IAAI,sBAAsB,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG;CACxD,CACF;CAIF,OAAO,mBAAmB,SAAS,GADpB,SAAS,KAAK,KAAK,GAAG,SAAS,KAAK,UACX,YAAY;AACtD;AAEA,eAAe,mBACb,SACA,KACA,cAC4B;CAG5B,MAAM,EAAE,UAAU,OADhB,aAAa,uBAAuB,oBAAA,CACC,EAAE,IAAI,CAAC;CAC9C,OAAO,iBACL,QAAQ,MACR,QAAQ,KACR,0BAA0B,MAAM,OAAO,IAAI,IAC3C;EACE,UAAU;EACV;EACA;EACA,QAAQ;EACR,eAAe;EACf,eACE;EACF,gBACE;CACJ,CACF;AACF;AAEA,eAAsB,oBAAoB,OAAwB;CAChE,MAAM,EAAE,WAAW,MAAM,OAAO;CAEhC,OAAO,QAAO,MADS,OAAO,2BAAA,CACP,SAAS,EAAE,MAAM,CAAC;AAC3C;AAEA,eAAsB,iBACpB,SACA,OACA,cAC4B;CAC5B,MAAM,UAAU,mBAAmB,QAAQ,IAAI;CAC/C,MAAM,QAAQ,MAAM,gBAAgB,OAAO,YAAY;CACvD,IAAI,CAAC,MAAM,IACT,OAAO,mBAAmB,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClE,UAAU,MAAM;EAChB,QAAQ,MAAM;CAChB,CAAC;CAGH,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,MAAM,EAC5D,SAAS,SACP,KAAK,QAAQ,WAAW,aACxB,KAAK,eAAe,KAAA,KACpB,KAAK,QAAQ,WAAW,UAC5B,CAAC;CACD,IAAI,CAAC,SAAS,IACZ,OAAO,cAAc,QAAQ,MAAM,QAAQ,KAAK,SAAS,SAAS;EAChE,UAAU,SAAS;EACnB,MAAM,EACJ,WAAW,sBAAsB,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,EACjE;CACF,CAAC;CAGH,MAAM,KAAK,SAAS;CACpB,MAAM,cAAc,cAAc,EAAE;CACpC,IAAI,QAAQ,QAAQ;EAGlB,MAAM,SAAS,OADb,aAAa,gCAAgC,6BAAA,CAE7C;GAAE,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG;GAAU,YAAY;EAAK,GACnD,KACF;EACA,IAAI,CAAC,OAAO,IAAI;GACd,MAAM,WAAW,cAAc,SAAS,OAAO,WAAW,KAAA;GAC1D,MAAM,SAAS,YAAY,SAAS,OAAO,SAAS,KAAA;GACpD,OAAO,UAAU,SAAS,cAAc,IACpC,mBAAmB,QAAQ,MAAM,QAAQ,KAAK,OAAO,SAAS;IAC5D;IACA;GACF,CAAC,IACD,cAAc,QAAQ,MAAM,QAAQ,KAAK,OAAO,SAAS;IACvD;IACA;GACF,CAAC;EACP;EACA,IAAI,EAAE,YAAY,SAChB,OAAO,cACL,QAAQ,MACR,QAAQ,KACR,4DACA,EAAE,UAAU,CAAC,QAAQ,EAAE,CACzB;EAEF,OAAO,iBACL,QAAQ,MACR,QAAQ,KACR,GAAG,YAAY,QAAQ,6BAA6B,OAAO,OAAO,GAAG,IACrE;GACE,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;GAChC,QAAQ,GAAG;GACX,YAAY,GAAG;GACf;GACA,QAAQ;IACN,IAAI,OAAO,OAAO;IAClB,MAAM,OAAO,OAAO;IACpB,OAAO,OAAO,OAAO;IACrB,KAAK,YAAY,OAAO,OAAO;GACjC;GACA,gBACE;EACJ,CACF;CACF;CACA,OAAO,iBAAiB,QAAQ,MAAM,QAAQ,KAAK,YAAY,SAAS;EACtE,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;EAChC,QAAQ,GAAG;EACX,YAAY,GAAG;EACf;EACA,gBACE;CACJ,CAAC;AACH;AAEA,SAAS,mBAAmB,MAAgB;CAC1C,OAAO;EACL,QAAQ,KAAK,SAAS,UAAU;EAChC,MAAM,KAAK,QAAQ,QAAQ,QAAQ,UAAU;CAC/C;AACF;AAEA,eAAsB,mBACpB,SACA,OACA,cAC4B;CAC5B,MAAM,QAAQ,MAAM,gBAAgB,OAAO,YAAY;CACvD,IAAI,CAAC,MAAM,IACT,OAAO,mBAAmB,QAAQ,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClE,UAAU,MAAM;EAChB,QAAQ,MAAM;CAChB,CAAC;CAGH,MAAM,WAAW,kBAAkB,MAAM,OAAO,QAAQ,IAAI;CAC5D,IAAI,CAAC,SAAS,IACZ,OAAO,cAAc,QAAQ,MAAM,QAAQ,KAAK,SAAS,SAAS;EAChE,UAAU,SAAS;EACnB,MAAM,EACJ,WAAW,sBAAsB,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,EACjE;CACF,CAAC;CAGH,MAAM,KAAK,SAAS;CACpB,MAAM,UAAU;EACd,UAAU,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,IAAI,GAAG;EACzC,OAAO,GAAG;EACV,QAAQ,GAAG;EACX,WAAW,GAAG;EACd,QAAQ,GAAG;EACX,UAAU,GAAG;EACb,SAAS,GAAG;EACZ,OAAO,GAAG;EACV,SAAS,GAAG;EACZ,SAAS,GAAG;EACZ,QAAQ,GAAG,QAAQ,UAAU;EAC7B,KAAK,GAAG;CACV;CAEA,OAAO,iBACL,QAAQ,MACR,QAAQ,KACR,cAAc,GAAG,KAAK,GAAG,GAAG,OAAO,IACnC;EACE,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;EAChC;EACA,gBACE;CACJ,CACF;AACF;AAEA,SAAgB,kBACd,OACA,SACA;CACA,MAAM,WAAW,MAAM,MAAM,QAAQ,SACnC,KAAK,UAAU,SAAS,UAAU,CACpC;CACA,MAAM,WAAW,MAAM,MAAM,QAAQ,SACnC,KAAK,UAAU,SAAS,UAAU,CACpC;CACA,MAAM,mBAAmB,MAAM,MAAM,QAAQ,SAC3C,KAAK,UAAU,SAAS,kBAAkB,CAC5C;CACA,MAAM,eAAe,MAAM,MAAM,QAC9B,SAAS,KAAK,QAAQ,WAAW,SACpC;CACA,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,KAAK,UAAU;CAChE,MAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,KAAK,KAAK;CACxD,MAAM,gBAAgB,QAAQ,QAAQ,UACpC;EAAC;EAAY;EAAU;CAAkB,CAAC,CAAC,SAAS,MAAM,MAAM,CAClE;CACA,MAAM,aAAa,MAAM,MAAM,QAAQ,SACrC,cAAc,MACX,UACC,MAAM,iBAAiB,KAAK,QAAQ,MAAM,aAAa,KAAK,MAChE,CACF;CAEA,OAAO;EACL,SAAS;GACP,UAAU,SAAS;GACnB,UAAU,SAAS;GACnB,kBAAkB,iBAAiB;GACnC,cAAc,aAAa;GAC3B,aAAa,YAAY;GACzB,OAAO,SAAS;GAChB,eAAe,cAAc;GAC7B,YAAY,WAAW;GACvB,WAAW,MAAM;GACjB,QAAQ,MAAM,OAAO;EACvB;EACA,UAAU,sBAAsB,QAAQ;EACxC,UAAU,sBAAsB,QAAQ;EACxC,kBAAkB,sBAAsB,gBAAgB;EACxD,cAAc,sBAAsB,YAAY;EAChD,aAAa,sBAAsB,WAAW;EAC9C,UAAU,sBAAsB,QAAQ;EACxC,QAAQ,qBAAqB,MAAM,MAAM;EACzC,eAAe,cAAc,KAAK,WAAW;GAC3C,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,sBAAsB,MAAM;GAC5B,KAAK,MAAM;GACX,WAAW,MAAM;EACnB,EAAE;EACF,YAAY,uBACV,MAAM,OACN,eACA,cACA,aACA,kBACA,UACA,UACA,QACF,CAAC,CAAC,MAAM,GAAG,CAAC;CACd;AACF;AAEA,SAAgB,sBAAsB,OAA4B;CAChE,OAAO,MAAM,KAAK,UAAU;EAC1B,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,KAAK,KAAK;EACV,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB,QAAQ,KAAK,QAAQ,UAAU;EAC/B,YAAY,KAAK;EACjB,OAAO,KAAK;EACZ,SAAS,KAAK;EACd,WAAW,KAAK;CAClB,EAAE;AACJ;AAEA,SAAgB,qBAAqB,QAA4B;CAC/D,OAAO,OAAO,KAAK,WAAW;EAC5B,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,OAAO,MAAM;EACb,MAAM,MAAM;EACZ,QAAQ,MAAM;CAChB,EAAE;AACJ;AAEA,SAAgB,uBACd,OACA,SACA,cACA,aACA,kBACA,UACA,UACA,UACqB;CACrB,MAAM,UAA+B,CAAC;CACtC,KAAK,MAAM,QAAQ,cACjB,QAAQ,KAAK,SAAS,MAAM,sBAAsB,QAAQ,CAAC;CAG7D,KAAK,MAAM,QAAQ,aACjB,QAAQ,KAAK,SAAS,MAAM,iCAAiC,QAAQ,CAAC;CAGxE,KAAK,MAAM,SAAS,QAAQ,QACzB,SAAS,KAAK,WAAW,kBAC5B,GACE,QAAQ,KAAK;EACX,OAAO,iBAAiB,MAAM;EAC9B,QAAQ,YAAY,MAAM,OAAO;EACjC,UAAU;EACV,KAAK,MAAM;EACX,MAAM,MAAM;EACZ,QAAQ,MAAM;CAChB,CAAC;CAGH,KAAK,MAAM,QAAQ,kBACjB,QAAQ,KAAK,SAAS,MAAM,uBAAuB,MAAM,CAAC;CAG5D,KAAK,MAAM,QAAQ,UACjB,QAAQ,KAAK,SAAS,MAAM,4BAA4B,MAAM,CAAC;CAGjE,KAAK,MAAM,QAAQ,UACjB,QAAQ,KAAK,SAAS,MAAM,oBAAoB,QAAQ,CAAC;CAG3D,KAAK,MAAM,QAAQ,UACjB,QAAQ,KAAK,SAAS,MAAM,uBAAuB,QAAQ,CAAC;CAG9D,KAAK,MAAM,QAAQ,OACjB,QAAQ,KAAK,SAAS,MAAM,mBAAmB,KAAK,CAAC;CAGvD,OAAO,cAAc,OAAO;AAC9B;AAEA,SAAgB,SACd,MACA,QACA,UACmB;CACnB,OAAO;EACL,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,KAAK;EACvC,QACE,KAAK,QAAQ,WAAW,YACpB,GAAG,KAAK,OAAO,OAAO,mBACtB,KAAK,aACH,6BAA6B,KAAK,eAClC;EACR;EACA,KAAK,KAAK;EACV,MAAM,KAAK;EACX,QAAQ,KAAK;CACf;AACF;AAEA,SAAgB,cAAc,SAA8B;CAC1D,MAAM,uBAAO,IAAI,IAAY;CAC7B,OAAO,QAAQ,QAAQ,WAAW;EAChC,MAAM,MACJ,OAAO,QAAQ,OAAO,SAClB,GAAG,OAAO,KAAK,GAAG,OAAO,WACzB,GAAG,OAAO,MAAM,GAAG,OAAO;EAChC,IAAI,KAAK,IAAI,GAAG,GAAG,OAAO;EAC1B,KAAK,IAAI,GAAG;EACZ,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,iBAAiB,MAAyB;CACxD,OAAO,KAAK,QAAQ,WAAW,aAAa,KAAK,eAAe,KAAA;AAClE;AAEA,SAAgB,mBACd,QACA;CACA,MAAM,EAAE,YAAY;CACpB,MAAM,UAAU,QAAQ,aAAa,QAAQ,SAAS;CACtD,OAAO,WAAW,QAAQ,WAAW,QAAQ,WAAW,QAAQ,iBAAiB,yBAAyB,QAAQ,WAAW,QAAQ,WAAW,QAAQ,qBAAqB,IAAI,KAAK,IAAI,IAAI,QAAQ,iBAAiB,iBAAiB,QAAQ,qBAAqB,IAAI,KAAK,IAAI,IAAI,QAAQ,aAAa,oBAAoB,QAAQ,iBAAiB,IAAI,KAAK,IAAI,IAAI,QAAQ,YAAY,sBAAsB,QAAQ,gBAAgB,IAAI,KAAK,IAAI,IAAI,QAAQ,MAAM,WAAW,QAAQ,UAAU,IAAI,KAAK,IAAI,GAAG,UAAU,gDAAgD;AACnjB;AAEA,SAAgB,kBACd,OACA,MACA,UAA6D,CAAC,GAGR;CACtD,MAAM,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK;CAChC,IAAI,KAAK;EACP,MAAM,SAAS,oBAAoB,GAAG;EACtC,IAAI,CAAC,QACH,OAAO;GACL,IAAI;GACJ,SACE;GACF,UAAU,CAAC,IAAI;EACjB;EAGF,MAAM,QAAQ,MAAM,MAAM,MACvB,SACC,KAAK,WAAW,OAAO,WACtB,KAAK,KAAK,YAAY,MAAM,OAAO,KAAK,YAAY,KACnD,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,MACtC,OAAO,KAAK,YAAY,EAChC;EACA,IAAI,CAAC,OACH,OAAO;GACL,IAAI;GACJ,SAAS,MAAM,OAAO,KAAK,GAAG,OAAO,OAAO;GAC5C,UAAU,CAAC,UAAU;EACvB;EAGF,OAAO;GAAE,IAAI;GAAM,MAAM;EAAM;CACjC;CAKA,MAAM,QAHY,QAAQ,SACtB,MAAM,MAAM,KAAK,QAAQ,MAAM,IAC/B,KAAA,MACsB,MAAM,MAAM;CACtC,IAAI,CAAC,MACH,OAAO;EACL,IAAI;EACJ,SAAS;EACT,UAAU,CAAC,IAAI;CACjB;CAGF,OAAO;EAAE,IAAI;EAAM;CAAK;AAC1B;AAEA,SAAgB,oBAAoB,KAAa;CAC/C,MAAM,MAAM,IAAI,MAAM,iDAAiD;CACvE,IAAI,KACF,OAAO;EACL,MAAM,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC,QAAQ,UAAU,EAAE;EAC9C,QAAQ,OAAO,IAAI,EAAE;CACvB;CAGF,MAAM,OAAO,IAAI,MAAM,iDAAiD;CACxE,IAAI,CAAC,MAAM,OAAO,KAAA;CAElB,OAAO;EACL,MAAM,KAAK;EACX,QAAQ,OAAO,KAAK,EAAE;CACxB;AACF;AAEA,SAAgB,cAAc,IAAuB;CACnD,IAAI,GAAG,YACL,OAAO;EACL,QAAQ;EACR,SAAS,2BAA2B,GAAG,KAAK,GAAG,GAAG,OAAO;EACzD,OAAO,CAAC,qBAAqB,GAAG,YAAY;EAC5C,aAAa,CACX,sCACA,mDACF;CACF;CAGF,IAAI,CAAC,GAAG,QACN,OAAO;EACL,QAAQ;EACR,SAAS,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO;EACjC,OAAO,CAAC,kDAAkD;EAC1D,aAAa,CACX,2DACF;CACF;CAGF,MAAM,QAAQ;EACZ,GAAG,GAAG,OAAO,MAAM,qBAAqB,GAAG,OAAO,UAAU,IAAI,KAAK,IAAI;EACzE,GAAG,GAAG,OAAO,OAAO,WAAW,GAAG,OAAO,QAAQ,YAAY,GAAG,OAAO,WAAW;EAClF,GAAG,GAAG,OAAO,kBAAkB,EAAE,wBAAwB,GAAG,OAAO,mBAAmB,IAAI,KAAK,IAAI;CACrG;CACA,MAAM,cACJ,GAAG,OAAO,WAAW,YACjB;EACE;EACA;EACA;CACF,IACA,GAAG,OAAO,WAAW,YACnB,CACE,qEACF,IACA,GAAG,OAAO,WAAW,YACnB,CAAC,wDAAwD,IACzD,CAAC,0DAA0D;CAErE,OAAO;EACL,QAAQ,GAAG,OAAO;EAClB,SAAS,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,SAAS,GAAG,OAAO,OAAO;EAC3D;EACA;CACF;AACF;AAEA,eAAsB,gBACpB,OACA,cAIA;CACA,MAAM,QAAQ,QAAQ,IAAI;CAC1B,IAAI,CAAC,OACH,OAAO;EACL,IAAI;EACJ,SAAS;EACT,UAAU,CAAC,cAAc;CAC3B;CAGF,IAAI;EACF,MAAM,WAAW,MAAM,yBAAyB,KAAK;EACrD,MAAM,aAAa,aAAa,oBAAoB;EAIpD,OAAO;GACL,IAAI;GACJ,OAAO,OAJP,aAAa,yBAAyB,sBAAA,CAId;IACtB;IACA,OALU,QAAQ,IAAI,gBAAiB,MAAM,WAAW,KAAK;IAM7D,OAAO,SAAS;GAClB,CAAC;EACH;CACF,SAAS,OAAO;EACd,OAAO;GACL,IAAI;GACJ,SAAS;GACT,QAAQ,CAAC,aAAa,KAAK,CAAC;EAC9B;CACF;AACF;;;ACrdA,eAAsB,mBAAmB,OAAqB;CAC5D,MAAM,CAAC,WAAW,eAAe,WAAW,MAAM,QAAQ,IAAI;EAC5D,cAAc,KAAK;EACnB,kBAAkB,CAAC,GAAG,KAAK;EAC3B,mBAAmB,KAAK;CAC1B,CAAC;CACD,MAAM,kBAAkB,8BAA8B,KAAK;CAC3D,OAAO;EACL,2BAA2B,UAAU,UAAU,QAAQ,aACrD;GAAC;GAAmB;GAAU;EAAY,CAAC,CAAC,SAC1C,SAAS,eACX,CACF,CAAC,CAAC;EACF,uBAAuB,cAAc,iBAAiB,CAAC,EAAA,CAAG,QAAQ,SAChE;GAAC;GAAY;GAAsB;EAAe,CAAC,CAAC,SAAS,KAAK,MAAM,CAC1E,CAAC,CAAC;EACF,uBAAuB,QAAQ,QAAQ,UACrC,CAAC,UAAU,QAAQ,CAAC,CAAC,SAAS,MAAM,MAAM,CAC5C,CAAC,CAAC;EACF,0BAA0B;CAC5B;AACF;AA8GA,SAAS,8BAA8B,OAAqB;CAC1D,MAAM,WAAW,OAAO,MAAM,kBAAkB,EAAE,UAAU,KAAK,CAAC;CAClE,IAAI;EACF,MAAM,MAAM,SACT,QACC;;;;;OAMF,CAAC,CACA,IAAI;EACP,OAAO,OAAO,KAAK,UAAU,WAAW,IAAI,QAAQ;CACtD,UAAU;EACR,SAAS,MAAM;CACjB;AACF;;;ACxXA,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAW1B,eAAsB,wBACpB,OACA,eAA6C,CAAC,GACnB;CAC3B,MAAM,+BAAc,IAAI,KAAK,EAAA,CAAE,YAAY;CAC3C,MAAM,CACJ,OACA,aACA,SACA,OACA,eACA,SACA,aACE,MAAM,QAAQ,IAAI;EACpB,QAAQ,SAAS,YAAY;GAI3B,OAAO,aACL,OAHA,aAAa,aAAa,yBAAA,CAC1B,KAAK,EAAA,CAEI,MAAM,KAAK,UAAU;IAC5B,IAAI,KAAK;IACT,UAAU,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO;IAC9C,WAAW,KAAK;GAClB,EAAE,CACJ;EACF,CAAC;EACD,QAAQ,eAAe,YAAY;GACjC,MAAM,SAAS,MAAM,gBAAgB,OAAO,YAAY;GACxD,IAAI,CAAC,OAAO,IACV,OAAO;IACL,MAAM;KACJ,WAAW;KACX,SAAS,OAAO;KAChB,UAAU,OAAO,YAAY,CAAC;KAC9B,QAAQ,OAAO,UAAU,CAAC;IAC5B;IACA,SAAS;GACX;GAEF,MAAM,QAAQ,OAAO,MAAM,MAAM,KAAK,UAAU;IAC9C,MAAM,KAAK;IACX,QAAQ,KAAK;IACb,OAAO,KAAK;IACZ,KAAK,KAAK;IACV,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb,WAAW,KAAK;GAClB,EAAE;GACF,OAAO;IACL,GAAG,YAAY,KAAK;IACpB,MAAM;KACJ,GAAG,YAAY,KAAK,CAAC,CAAC;KACtB,QAAQ,OAAO,MAAM,OAAO,MAAM,GAAG,EAAE;KACvC,WAAW,OAAO,MAAM;IAC1B;IACA,SAAS,OAAO,MAAM,aAAa,OAAO,MAAM,OAAO,SAAS;GAClE;EACF,CAAC;EACD,QAAQ,WAAW,YAAY;GAI7B,OAAO,aACL,OAJqB,aAAa,eAAe,mBAAA,CACjD,KACF,EAAA,CAEU,KAAK,WAAW;IACtB,IAAI,MAAM;IACV,QAAQ,MAAM;IACd,UAAU,MAAM;IAChB,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,KAAK,MAAM;IACX,eAAe,MAAM;GACvB,EAAE,CACJ;EACF,CAAC;EACD,QAAQ,kBAAkB,YAAY;GAIpC,OAAO,aACL,OAJqB,aAAa,aAAa,mBAAA,CAC/C,KACF,EAAA,CAEU,KAAK,UAAU;IACrB,IAAI,KAAK;IACT,MAAM,KAAK,KAAK;IAChB,SAAS,KAAK;IACd,WAAW,KAAK;IAChB,WAAW,KAAK;GAClB,EAAE,CACJ;EACF,CAAC;EACD,QAAQ,iBAAiB,YAAY;GAInC,OAAO,aACL,OAHA,aAAa,qBAAqB,kBAAA,CAClC,KAAK,EAAA,CAGF,QAAQ,iBAAiB,CAAC,aAAa,MAAM,CAAC,CAC9C,KAAK,kBAAkB;IACtB,IAAI,aAAa;IACjB,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,SAAS,aAAa;IACtB,QAAQ,aAAa;IACrB,WAAW,aAAa;GAC1B,EAAE,CACN;EACF,CAAC;EACD,QAAQ,WAAW,aAAa,EAC9B,MAAM,OAAO,aAAa,eAAe,mBAAA,CAAoB,KAAK,EACpE,EAAE;EACF,QAAQ,aAAa,YAAY;GAC/B,MAAM,QAAQ,OAAO,aAAa,iBAAiB,mBAAA,CACjD,KACF;GACA,OAAO;IACL,MAAM;KACJ,SAAS,MAAM;KACf,OAAO,MAAM,MAAM,MAAM,GAAG,eAAe;KAC3C,eAAe,MAAM,cAAc,MAAM,GAAG,eAAe;KAC3D,kBAAkB,MAAM,iBAAiB,MAAM,GAAG,eAAe;KACjE,eAAe,MAAM,cAAc,MAAM,GAAG,eAAe;IAC7D;IACA,WACE,MAAM,MAAM,SAAS,mBACrB,MAAM,cAAc,SAAS,mBAC7B,MAAM,iBAAiB,SAAS,mBAChC,MAAM,cAAc,SAAS;GACjC;EACF,CAAC;CACH,CAAC;CAED,MAAM,UAAU;EACd;EACA;EACA;EACA,gBAAgB;EAChB;EACA;EACA;CACF;CAQA,MAAM,eAAe,aAAa;EANhC,SAAS;EACT;EACA,UAAU;EACV,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC,MAAM,WAAW,OAAO,SAAS;EACnE;CAEgC,CAAO;CACzC,IAAI,aAAa,YAAY,mBAAmB,OAAO;CAEvD,MAAM,iBAAiB,OAAO,YAC5B,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAC9C,MACA;EACE,GAAG;EACH,QAAQ,OAAO,WAAW,gBAAgB,gBAAgB;EAC1D,WAAW;EACX,GAAI,OAAO,QAAQ,EAAE,OAAO,aAAa,OAAO,OAAO,GAAK,EAAE,IAAI,CAAC;EACnE,MAAM,YAAY,YAAY,OAAO,IAAI,CAAC;CAC5C,CACF,CAAC,CACH;CACA,MAAM,UAAU;EACd,SAAS;EACT;EACA,UAAU;EACV,WAAW;EACX,SAAS;CACX;CACA,MAAM,eAAe,aAAa,OAAO;CACzC,IAAI,aAAa,YAAY,mBAAmB,OAAO;CAEvD,OAAO,aAAa;EAClB,GAAG;EACH,SAAS,OAAO,YACd,OAAO,QAAQ,cAAc,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CACrD,MACA;GACE,GAAG;GACH,MAAM;GACN,OAAO,OAAO,QAAQ,aAAa,OAAO,OAAO,GAAG,IAAI,KAAA;EAC1D,CACF,CAAC,CACH;CACF,CAAC;AACH;AAEA,eAAe,QACb,OACA,MAKiC;CACjC,MAAM,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;CACzC,IAAI;EACF,MAAM,SAAS,MAAM,KAAK;EAC1B,OAAO;GACL,QAAQ,OAAO,WAAW,OAAO,YAAY,YAAY;GACzD;GACA,WAAW,QAAQ,OAAO,SAAS;GACnC,MAAM,YAAY,OAAO,IAAI;EAC/B;CACF,SAAS,OAAO;EACd,OAAO;GACL,QAAQ;GACR;GACA,WAAW;GACX,OAAO,aACL,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GACrD,GACF;GACA,MAAM;EACR;CACF;AACF;AAEA,SAAS,aAAa,UAA8C;CAClE,IAAI,YAAY;CAChB,KAAK,IAAI,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;EAC/C,MAAM,WAAW,OAAO,WAAW,KAAK,UAAU,SAAS,GAAG,MAAM;EACpE,IAAI,aAAa,UAAU,UAAU,OAAO;EAC5C,YAAY;GAAE,GAAG;GAAW;EAAS;CACvC;CACA,OAAO;AACT;AAEA,SAAS,aAAa,OAAe,OAAe;CAClD,OAAO,MAAM,SAAS,QAAQ,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,OAAO;AACpE;AAEA,SAAS,YAAe,OAAY;CAClC,OAAO;EACL,MAAM;GACJ,OAAO,MAAM;GACb,OAAO,MAAM,MAAM,GAAG,eAAe;EACvC;EACA,WAAW,MAAM,SAAS;CAC5B;AACF;AAEA,SAAS,YAAY,MAAe,QAAQ,GAAY;CACtD,IAAI,OAAO,SAAS,UAClB,OAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,EAAE,OAAO;CAE1D,IACE,SAAS,QACT,OAAO,SAAS,YAChB,OAAO,SAAS,aAChB,SAAS,KAAA,GAET,OAAO,QAAQ;CAEjB,IAAI,SAAS,GACX,OAAO,MAAM,QAAQ,IAAI,IACrB;EAAE,OAAO,KAAK;EAAQ,WAAW;CAAK,IACtC,EAAE,WAAW,KAAK;CAExB,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,YAAY,OAAO,QAAQ,CAAC,CAAC;CAEtE,IAAI,OAAO,SAAS,UAAU,OAAO,OAAO,IAAI;CAChD,OAAO,OAAO,YACZ,OAAO,QAAQ,IAAI,CAAC,CACjB,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,YAAY,OAAO,QAAQ,CAAC,CAAC,CAAC,CAC/D;AACF;;;ACvQA,IAAM,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC;AAC5C,IAAM,yBAAyB,EAAE,OAAO;CACtC,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,OAAO;CAClB,cAAc,EAAE,OAAO;CACvB,sBAAsB,EAAE,OAAO;CAC/B,UAAU,EAAE,OAAO;CACnB,UAAU,EAAE,OAAO;CACnB,YAAY;CACZ,YAAY,EAAE,OAAO;CACrB,YAAY,EAAE,OAAO;AACvB,CAAC;AACD,IAAM,qBAAqB,EAAE,OAAO;CAClC,IAAI,EAAE,OAAO;CACb,YAAY;CACZ,SAAS,EAAE,SAAS;EAAC;EAAU;EAAa;CAAW,CAAC;CACxD,eAAe,EAAE,OAAO;CACxB,cAAc,EAAE,OAAO;CACvB,sBAAsB,EAAE,OAAO;CAC/B,YAAY,EAAE,OAAO;CACrB,kBAAkB;CAClB,aAAa;CACb,iBAAiB;CACjB,QAAQ,EAAE,SAAS;EAAC;EAAU;EAAS;CAAQ,CAAC;CAChD,OAAO;CACP,WAAW,EAAE,OAAO;CACpB,cAAc;CACd,YAAY,EAAE,OAAO;CACrB,YAAY,EAAE,OAAO;AACvB,CAAC;AACD,IAAM,6BAA6B,EAAE,KAAK,oBAAoB,CAC5D,iBACA,cACF,CAAC;AACD,IAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,OAAO;CACf,cAAc,EAAE,OAAO;CACvB,aAAa;CACb,UAAU;CACV,kBAAkB;CAClB,aAAa;CACb,YAAY,EAAE,OAAO;AACvB,CAAC;AAED,eAAsB,oBACpB,KAAK,0BACL,QAAsB,aAAa,GACT;CAC1B,MAAM,kBAAkB,KAAK;CAC7B,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,MAAM,MAAM,SACT,QAAQ,+CAA+C,CAAC,CACxD,IAAI,EAAE;EACT,IAAI,KAAK,OAAO,eAAe,KAAK,KAAK;CAC3C,UAAU;EACR,SAAS,MAAM;CACjB;CAEA,MAAM,iBAAiB,MAAM,kBAAkB,YAAY,MAAM,KAAK;CACtE,MAAM,WACJ,gBAAgB,QAAQ,SAAS,SAC7B,eAAe,QAAQ,WACtB,KAAK,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC,YAAY;CAC3D,IAAI,CAAC,gBAcH,QAAO,MAbmB,4BACxB;EACE;EACA,MAAM,OAAA,YAAkC,qBAAqB;EAC7D,SAAS;EACT,cAAc;EACd,qBAAqB;EACrB,UAAU;EACV;EACA,WAAW;CACb,GACA,KACF,EAAA,CACmB;CAErB,MAAM,OACJ,gBAAgB,QAAQ,SAAS,SAC7B,eAAe,UACf,KAAA;CACN,OAAO;EACL;EACA,MAAM,OAAA,YAAkC,qBAAqB;EAC7D,SAAS,eAAe;EACxB,cAAc;EACd,qBAAqB;EACrB,UAAU,MAAM,cAAA;EAChB;EACA,WAAW;EACX,eAAe;EACf,WAAW;EACX,WAAW,gBAAgB,aAAa;CAC1C;AACF;AAmEA,eAAsB,4BACpB,SACA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,gBAAgB,0BAA0B;EAC9C,MAAM;EACN,YAAY,QAAQ;EACpB,UAAU,QAAQ;CACpB,CAAC;CACD,IAAI,CAAC,cAAc,IAAI,MAAM,IAAI,MAAM,cAAc,OAAO;CAC5D,MAAM,UAAU,cAAc;CAC9B,MAAM,SAAS,YAAY,QAAQ;CACnC,MAAM,OAAO;EAAE,MAAM;EAAyB,YAAY,QAAQ;CAAG;CACrE,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,SAAS,IAAI,YAAY;CAC/B,IAAI;EACF,SAAS,KAAK,kBAAkB;EAChC,MAAM,gBAAgB,SACnB,QAAQ,+CAA+C,CAAC,CACxD,IAAI,QAAQ,EAAE;EACjB,MAAM,gBAAgB,SACnB,QAAQ,6CAA6C,CAAC,CACtD,IAAI,MAAM;EACb,MAAM,aAAa,gBACf,eACE,6BACA,eACA,yBACF,IACA,KAAA;EACJ,IAAI,cAAc,WAAW,SAAS,gBACpC,MAAM,IAAI,MACR,mBAAmB,OAAO,2CAC5B;EAEF,MAAM,cAAc,KAAK,UAAU,YAAY,OAAO,CAAC;EACvD,MAAM,YACJ,cAAc,WAAW,iBAAiB,cACrC,WAAW,cACZ,eAAe,SAAS,GAAG;EACjC,SACG,QACC;;;;;;;;;;4CAWF,CAAC,CACA,IACC,QACA,aACA,KAAK,UAAU,YAAY,IAAI,CAAC,GAChC,QAAQ,UAAU,IAAI,GACtB,WACA,YAAY,YAAY,MACxB,YAAY,oBAAoB,MAChC,YAAY,eAAe,MAC3B,YAAY,cAAc,QAC1B,MACF;EACF,SACG,QACC;;;;;;;;;;;;4CAaF,CAAC,CACA,IACC,QAAQ,IACR,QAAQ,MACR,QAAQ,UAAU,IAAI,GACtB,QAAQ,cACR,QAAQ,qBACR,QAAQ,UACR,QAAQ,UACR,QAAQ,WACR,QACA,MACF;EACF,MAAM,eAAe,SAClB,QAAQ,+CAA+C,CAAC,CACxD,IAAI,QAAQ,EAAE;EACjB,SACG,QACC;;+EAGF,CAAC,CACA,IACC,QAAQ,IACR,gBACI,KAAK,UAAU,eAAe,eAAe,KAAK,CAAC,IACnD,MACJ,KAAK,UAAU,eAAe,cAAc,KAAK,CAAC,GAClD,MACF;EACF,SAAS,KAAK,SAAS;EACvB,OAAO;GACL,SAAS,eAAe,cAAc,KAAK;GAC3C,MAAM;IACJ,IAAI;IACJ;IACA;IACA,SAAS,QAAQ;IACjB;IACA,SAAS,YAAY,YAAY;IACjC,gBAAgB,YAAY,oBAAoB;IAChD,WAAW,YAAY,eAAe;IACtC,WAAW,YAAY,cAAc;IACrC,WAAW;GACb;EACF;CACF,SAAS,OAAO;EACd,SAAS,KAAK,WAAW;EACzB,MAAM;CACR,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,0BACpB,IACA,WACA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,SACG,QACC,2EACF,CAAC,CACA,IAAI,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY,GAAG,EAAE;CAChD,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,kBACpB,OASA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;CACnC,MAAM,KAAK,YAAY,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;CACrF,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,SACG,QACC;;;;;sFAMF,CAAC,CACA,IACC,IACA,MAAM,WACN,MAAM,SACN,KAAK,UAAU,MAAM,QAAQ,GAC7B,MAAM,cACN,MAAM,qBACN,MAAM,WACN,MAAM,kBAAkB,MACxB,KACA,KACA,GACF;EACF,OAAO,gBAAgB,IAAI,KAAK;CAClC,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,uBACpB,IACA,YACA,QAAsB,aAAa,GACnC;CACA,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,SACG,QACC,wEACF,CAAC,CACA,IAAI,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY,GAAG,EAAE;CACjD,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,0BACpB,IACA,eACA,QAAsB,aAAa,GACnC;CACA,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,SACG,QACC,4EACF,CAAC,CACA,IAAI,gCAAe,IAAI,KAAK,EAAA,CAAE,YAAY,GAAG,EAAE;CACpD,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,kBACpB,YACA,QACA,OACA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;CACnC,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,MAAM,SAAS,SACZ,QACC;;sDAGF,CAAC,CACA,IAAI,QAAQ,OAAO,KAAK,KAAK,UAAU;EAC1C,MAAM,MAAM,SACT,QAAQ,oDAAoD,CAAC,CAC7D,IAAI,UAAU;EACjB,OAAO;GACL,SAAS,OAAO,YAAY;GAC5B,KAAK,MAAM,WAAW,GAAG,IAAI;EAC/B;CACF,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,8BACpB,IACA,OACA,QAAsB,aAAa,GACnC;CACA,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,MAAM,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;CACnC,IAAI;EACF,SACG,QACC,uGACF,CAAC,CACA,IAAI,OAAO,KAAK,KAAK,EAAE;CAC5B,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,gBACpB,IACA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,MAAM,MAAM,SACT,QAAQ,2CAA2C,CAAC,CACpD,IAAI,EAAE;EACT,OAAO,MAAM,WAAW,GAAG,IAAI;CACjC,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,eAAsB,0BACpB,YACA,QAAsB,aAAa,GACnC;CACA,MAAM,kBAAkB,KAAK;CAC7B,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,MAAM,MAAM,SACT,QAAQ,oDAAoD,CAAC,CAC7D,IAAI,UAAU;EACjB,OAAO,MAAM,WAAW,GAAG,IAAI;CACjC,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAkBA,eAAsB,wBACpB,QAAsB,aAAa,GACnC,QAAQ,IACwB;CAChC,MAAM,kBAAkB,KAAK;CAC7B,MAAM,WAAW,OAAO,MAAM,gBAAgB;CAC9C,IAAI;EACF,OAAO,SACJ,QACC;;;;;;;;;;iBAWF,CAAC,CACA,IAAI,KAAK,CAAC,CACV,IAAI,kBAAkB;CAC3B,UAAU;EACR,SAAS,MAAM;CACjB;AACF;AAEA,SAAS,eAAe,KAAc,eAAyC;CAC7E,MAAM,QAAQ,eAAe,wBAAwB,KAAK,kBAAkB;CAC5E,OAAO;EACL,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,SAAS,MAAM,YAAY;EAC3B,cAAc,MAAM;EACpB,qBAAqB,MAAM;EAC3B,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB;EACA,WAAW,MAAM;EACjB,WAAW,MAAM;CACnB;AACF;AAEA,SAAS,WAAW,KAA2B;CAC7C,MAAM,QAAQ,eAAe,oBAAoB,KAAK,cAAc;CACpE,IAAI;CACJ,IAAI;EACF,WAAW,EAAE,MACX,wBACA,KAAK,MAAM,MAAM,aAAa,CAChC;CACF,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,2CAA2C,MAAM,GAAG,IAAI,EACtE,OAAO,MACT,CAAC;CACH;CACA,OAAO;EACL,IAAI,MAAM;EACV,WAAW,MAAM;EACjB,SAAS,MAAM;EACf;EACA,cAAc,MAAM;EACpB,qBAAqB,MAAM;EAC3B,WAAW,MAAM;EACjB,gBAAgB,MAAM;EACtB,YAAY,MAAM;EAClB,eAAe,MAAM;EACrB,QAAQ,MAAM;EACd,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,aAAa,MAAM;EACnB,WAAW,MAAM;EACjB,WAAW,MAAM;CACnB;AACF;AAEA,SAAS,mBAAmB,KAAmC;CAC7D,MAAM,QAAQ,eACZ,EAAE,OAAO;EACP,GAAG,2BAA2B;EAC9B,kBAAkB,EAAE,QAAQ,CAAC;EAC7B,uBAAuB,EAAE,OAAO;EAChC,oBAAoB,EAAE,OAAO;EAC7B,oBAAoB,EAAE,OAAO;CAC/B,CAAC,GACD,KACA,uBACF;CACA,OAAO;EACL,IAAI,MAAM;EACV,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,qBAAqB,MAAM;EAC3B,WAAW,MAAM;EACjB,gBAAgB,MAAM;EACtB,YAAY,MAAM;EAClB,eAAe,MAAM;EACrB,QAAQ,MAAM;EACd,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,aAAa,MAAM;EACnB,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,UAAU;GACR,SAAS;GACT,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,WAAW,MAAM,uBAAuB;EAC1C;CACF;AACF;AAEA,SAAS,eAEP,QAAiB,OAAgB,OAAuC;CACxE,IAAI;EACF,OAAO,EAAE,MAAM,QAAQ,KAAK;CAC9B,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,qBAAqB,MAAM,IAAI,EAAE,OAAO,MAAM,CAAC;CACjE;AACF;;;ACvkBA,IAAM,2CAA2B,IAAI,IAA8B;AACnE,IAAM,uBAAuB;AAE7B,eAAsB,kBAAkB,QAAsB,aAAa,GAAG;CAC5E,MAAM,UAAU,MAAM,oBAAoB,0BAA0B,KAAK;CACzE,MAAM,CAAC,MAAM,eAAe,iBAAiB,MAAM,QAAQ,IAAI;EAC7D,wBAAwB,KAAK;EAC7B,kBAAkB,KAAK;EACvB,QAAQ,YACJ,gBACE;GAAE,IAAI,QAAQ;GAAW,QAAQ;EAAsB,GACvD,KACF,IACA;CACN,CAAC;CACD,MAAM,UACJ,iBAAiB,aAAa,gBAAgB,cAAc,UAAU;CACxE,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT;EACA,WAAW,KAAK,MAAM;EACtB;EACA,qBAAqB,SAAS,gBAAgB,CAAC;EAC/C,aAAa,cAAc,QACxB,iBACC,aAAa,WAAW,cAAc,CAAC,aAAa,MACxD,CAAC,CAAC;EACF,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;CACpC;AACF;AAEA,eAAsB,sBACpB,UACA,QAAsB,aAAa,GACnC;CACA,MAAM,SAAS,EAAE,UACf,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,GACvC,QACF;CACA,IAAI,CAAC,OAAO,SACV,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS;CACX;CAEF,MAAM,UAAU,MAAM,oBACpB,OAAO,OAAO,MAAA,WACd,KACF;CACA,IAAI,QAAQ,eACV,MAAM,4BACJ;EACE,IAAI,QAAQ;EACZ,MAAM,QAAQ;EACd,SAAS,QAAQ;EACjB,cAAc,QAAQ;EACtB,qBAAqB,QAAQ;EAC7B,UAAU,QAAQ;EAClB,UAAU,QAAQ;EAClB,WAAW;CACb,GACA,KACF;CAEF,MAAM,UAAU,MAAM,kBACpB;EACE,OAAO,QAAQ;EACf,MAAM;EACN,cAAc,YAAY,QAAQ,GAAG,YAAY,KAAK,IAAI;EAC1D,UAAU;EACV,SAAS;EACT,QAAQ;EACR,YAAY,EAAE,mBAAmB,QAAQ,GAAG;CAC9C,GACA,KACF;CACA,IAAI,EAAE,aAAa,UACjB,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS;CACX;CAEF,MAAM,0BAA0B,QAAQ,IAAI,QAAQ,QAAQ,IAAI,KAAK;CAErE,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS;EACT,SAAS,MANW,oBAAoB,QAAQ,IAAI,KAAK;EAOzD,SAAS,QAAQ;CACnB;AACF;AAEA,eAAsB,uBACpB,IACA,QAAsB,aAAa,GACnC;CACA,MAAM,MAAM,MAAM,gBAAgB,IAAI,KAAK;CAC3C,IAAI,CAAC,KACH,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS,iBAAiB,GAAG;CAC/B;CAEF,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS,sBAAsB,GAAG;EAClC;CACF;AACF;AAEA,eAAsB,sBACpB,UACA,QAAsB,aAAa,GACnC;CACA,MAAM,SAAS,EAAE,UAAU,6BAA6B,QAAQ;CAChE,IAAI,CAAC,OAAO,SACV,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS;EACT,QAAQ,CAAC,EAAE,UAAU,OAAO,MAAM,CAAC;CACrC;CAEF,MAAM,KAAK,OAAO,OAAO,MAAA;CACzB,MAAM,UAAU,MAAM,oBAAoB,IAAI,KAAK;CACnD,MAAM,eAAe,OAAO,OAAO,gBAAgB,QAAQ;CAC3D,MAAM,UAAU;EACd;EACA,MAAM,OAAO,OAAO,QAAQ,QAAQ;EACpC,SAAS,OAAO,OAAO,WAAW,QAAQ;EAC1C;EACA,qBACE,iBAAiB,QAAQ,eACrB,QAAQ,sBACR,QAAQ,sBAAsB;EACpC,UAAU,OAAO,OAAO,YAAY,QAAQ;EAC5C,UAAU,OAAO,OAAO,YAAY,QAAQ;EAC5C,WAAW,QAAQ;CACrB;CACA,IAAI;EACF,MAAM,UAAU,MAAM,4BAA4B,SAAS,KAAK;EAChE,OAAO;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,SAAS;GACT,SAAS,QAAQ;GACjB,MAAM,QAAQ;EAChB;CACF,SAAS,OAAO;EACd,OAAO;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,SAAS,yCAAyC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACzG;CACF;AACF;AAEA,eAAsB,eACpB,UACA,QAAsB,aAAa,GACnC,eAA4C,CAAC,GAC7C;CACA,MAAM,SAAS,EAAE,UAAU,sBAAsB,QAAQ;CACzD,IAAI,CAAC,OAAO,SACV,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,SAAS;EACT,SAAS;EACT,QAAQ,CAAC,EAAE,UAAU,OAAO,MAAM,CAAC;CACrC;CAEF,IAAI;EACF,MAAM,QAAQ;GACZ,WAAW,OAAO,OAAO,aAAA;GACzB,WAAW,OAAO,OAAO;GACzB,gBAAgB,OAAO,OAAO;GAC9B,SAAS,OAAO,OAAO,WAAY;EACrC;EAGA,MAAM,EAAE,UAAU,OADhB,aAAa,kBAAkB,uBAAA,CACM,KAAK;EAC5C,OAAO;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,SAAS,qBAAqB,MAAM;GACpC,eAAe;EACjB;CACF,SAAS,OAAO;EACd,OAAO;GACL,IAAI;GACJ,QAAQ;GACR,SAAS;GACT,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAChE;CACF;AACF;AAEA,eAAe,uBAAuB,OAKnC;CACD,MAAM,EAAE,WAAW,MAAM,OAAO;CAEhC,OAAO,QAAO,MADS,OAAO,0BAAA,CACP,SAAS,EAAE,MAAM,CAAC;AAC3C;AAEA,eAAsB,cACpB,OAMA,QAAsB,aAAa,GACnC,eAA4C,CAAC,GAC7C;CACA,MAAM,UAAU,MAAM,oBAAoB,MAAM,WAAW,KAAK;CAChE,MAAM,YAAY,MAAM,YACpB,MAAM,iCAAiC,MAAM,WAAW,KAAK,IAC7D,MAAM,gCAAgC,SAAS,KAAK;CACxD,MAAM,WAAW,MAAM,wBAAwB,OAAO,YAAY;CAClE,MAAM,MAAM,MAAM,kBAChB;EACE,WAAW,QAAQ;EACnB,SAAS,MAAM;EACf;EACA,cAAc,QAAQ;EACtB,qBAAqB,QAAQ;EAC7B;EACA,gBAAgB,MAAM;CACxB,GACA,KACF;CACA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,sCAAsC;CAEhE,IAAI;EAEF,MAAM,UAAU,OADM,aAAa,iBAAiB,SAAA,CAChB;GAClC,OAAO;GACP,IAAI;GACJ,OAAO,qBAAqB,KAAK,OAAO;EAC1C,CAAC;EACD,MAAM,uBAAuB,IAAI,IAAI,QAAQ,YAAY,KAAK;EAC9D,MAAM,iCAAiC,QAAQ,YAAY,KAAK;EAChE,OAAO;GAAE,GAAG;GAAK,YAAY,QAAQ;EAAW;CAClD,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,MAAM,8BAA8B,IAAI,IAAI,SAAS,KAAK;EAC1D,MAAM,gBACJ;GACE,OAAO;GACP,OAAO;GACP,SAAS;GACT,QAAQ;GACR,UAAU,IAAI;GACd,MAAM;IAAE,OAAO,IAAI;IAAI;IAAW,OAAO;GAAQ;EACnD,GACA,KACF;EACA,MAAM;CACR;AACF;AAEA,eAAsB,0BACpB,OAIA,QAAsB,aAAa,GACnC;CACA,IAAI,CAAC,MAAM,YAAY,OAAO;CAC9B,MAAM,cAAc;CACpB,IAAI,YAAY,UAAU,YAAY,eAAe,OAAO;CAC5D,IACE,OAAO,YAAY,cAAc,YACjC,YAAY,cAAc,qBAE1B,OAAO;CAET,IACE,MAAM,SAAS,gBACd,MAAM,kBAAkB,YAAY,CAAC,MAAM,UAE5C,OAAO;CAET,MAAM,SACJ,MAAM,SAAS,cACX,MAAM,UACN,MAAM,SAAS,uBACb,MAAM,YAAY,cAClB;CACR,MAAM,QAAQ,SAAS,yBAAyB,KAAK,IAAI;CACzD,MAAM,aACJ,OAAO,YAAY,eAAe,WAAW,YAAY,aAAa;CACxE,IAAI,aAAa,MAAM,0BAA0B,MAAM,YAAY,KAAK;CACxE,IAAI,CAAC,YAAY;EACf,MAAM,QAAQ,6BAA6B,WAAW;EACtD,IAAI,OAAO;GACT,MAAM,YAAY,MAAM,gBAAgB,OAAO,KAAK;GACpD,IACE,WAAW,WAAW,aACrB,CAAC,cAAc,UAAU,cAAc,aACxC;IACA,MAAM,uBAAuB,OAAO,MAAM,YAAY,KAAK;IAC3D,aAAa,MAAM,0BAA0B,MAAM,YAAY,KAAK;GACtE;EACF;CACF;CACA,IAAI,CAAC,YAAY;EACf,gCAAgC,OAAO,MAAM,YAAY;GACvD;GACA;GACA;GACA,YAAY,KAAK,IAAI;EACvB,CAAC;EACD,OAAO;CACT;CACA,IAAI,cAAc,WAAW,cAAc,YAAY,OAAO;CAC9D,OAAO,yBACL,MAAM,YACN;EAAE;EAAQ;EAAO;EAAY,YAAY,KAAK,IAAI;CAAE,GACpD,KACF;AACF;AAEA,eAAe,yBACb,YACA,UACA,OACA;CACA,MAAM,EAAE,QAAQ,UAAU;CAC1B,MAAM,UAAU,MAAM,kBACpB,YACA,SAAS,WAAW,SACpB,OACA,KACF;CACA,IAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,KAAK,OAAO,QAAQ;CAErD,MAAM,MAAM,QAAQ;CACpB,IAAI,IAAI,gBACN,MAAM,8BACJ;EACE,WAAW,IAAI;EACf,SAAS,IAAI;EACb,QAAQ,SAAS,WAAW;EAC5B,QAAQ;EACR,QAAQ;CACV,GACA,KACF;CAEF,MAAM,gBACJ;EACE,OAAO,SAAS,cAAc;EAC9B,OAAO,SAAS,4BAA4B;EAC5C,SAAS,SACL,6EACA;EACJ,QAAQ;EACR,UAAU,IAAI;EACd,MAAM;GAAE,OAAO,IAAI;GAAI,WAAW,IAAI;EAAU;CAClD,GACA,KACF;CACA,MAAM,gBAAgB,MAAM,gBAC1B;EAAE,IAAI,IAAI;EAAW,QAAQ;CAA8B,GAC3D,KACF;CACA,IAAI,aAAa,iBAAiB,cAAc,SAC9C,oBAAoB,WAAW,cAAc,SAAS,IAAI;CAE5D,OAAO;AACT;AAEA,SAAS,yBACP,OAIA;CACA,IAAI,MAAM,SAAS,sBACjB,OAAO,MAAM,OAAO,WAAW,uBAAuB,MAAM,QAAQ;CAEtE,IAAI,MAAM,SAAS,aAAa;EAC9B,IAAI,MAAM,iBAAiB,OAAO,OAAO,MAAM,MAAM;EACrD,IAAI,OAAO,MAAM,UAAU,UAAU,OAAO,MAAM;EAClD,OAAO,MAAM,WAAW,WAAW;CACrC;CACA,OAAO;AACT;AAEA,eAAsB,gCACpB,OACA,QAAsB,aAAa,GACnC;CACA,IACE,EAAE,YAAY,UACd,CAAC,MAAM,UACP,OAAO,MAAM,WAAW,UAExB;CAEF,MAAM,gBAAiB,MAAM,OAAmC;CAChE,IAAI,OAAO,kBAAkB,UAC3B,MAAM,0BAA0B,eAAe,MAAM,OAAO,KAAK;AAErE;AAEA,SAAgB,qBACd,KACA,SACA;CACA,MAAM,eACJ,IAAI,YAAY,cAAc,sBAAsB;CACtD,OAAO;EACL,gDAAgD,IAAI,QAAQ,OAAO,IAAI,GAAG;EAC1E,eAAe,aAAa,gBAAgB,IAAI,SAAS,YAAY;EACrE,yBAAyB,IAAI,GAAG;EAChC;EACA,KAAK,UAAU,IAAI,UAAU,MAAM,CAAC;EACpC;EACA,QAAQ;EACR;CACF,CAAC,CAAC,KAAK,MAAM;AACf;AAEA,SAAS,6BAA6B,aAAsC;CAC1E,MAAM,aAAa,YAAY;CAC/B,IAAI,CAAC,cAAc,OAAO,eAAe,UAAU,OAAO;CAC1D,MAAM,MAAO,WAAuC;CACpD,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,IAAI,OAAO;CACX,IAAI,IAAI,WAAW,IAAG,GACpB,IAAI;EACF,MAAM,UAAU,KAAK,MAAM,GAAG;EAC9B,IAAI,OAAO,YAAY,UAAU,OAAO;CAC1C,QAAQ;EACN,OAAO;CACT;CAEF,OACE,KAAK,MACH,oEACF,CAAC,GAAG,MAAM;AAEd;AAEA,SAAS,mBAAmB,OAAqB,YAAoB;CACnE,OAAO,GAAG,MAAM,KAAK,GAAG;AAC1B;AAEA,SAAS,gCACP,OACA,YACA,UACA;CACA,MAAM,SAAS,KAAK,IAAI,IAAI;CAC5B,KAAK,MAAM,CAAC,KAAK,UAAU,0BACzB,IAAI,MAAM,aAAa,QAAQ,yBAAyB,OAAO,GAAG;CAEpE,IAAI,yBAAyB,QAAQ,KAAK;EACxC,MAAM,SAAS,yBAAyB,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACtD,IAAI,QAAQ,yBAAyB,OAAO,MAAM;CACpD;CACA,yBAAyB,IAAI,mBAAmB,OAAO,UAAU,GAAG,QAAQ;AAC9E;AAEA,eAAe,iCACb,YACA,OACA;CACA,MAAM,MAAM,mBAAmB,OAAO,UAAU;CAChD,MAAM,WAAW,yBAAyB,IAAI,GAAG;CACjD,IAAI,CAAC,UAAU;CACf,yBAAyB,OAAO,GAAG;CACnC,IAAI,KAAK,IAAI,IAAI,SAAS,aAAa,sBAAsB;CAC7D,MAAM,MAAM,MAAM,0BAA0B,YAAY,KAAK;CAC7D,IAAI,CAAC,OAAQ,SAAS,cAAc,IAAI,cAAc,SAAS,YAC7D;CAEF,MAAM,yBAAyB,YAAY,UAAU,KAAK;AAC5D;AAEA,eAAe,gCACb,SACA,OACA;CACA,IAAI,QAAQ,WAAW;EACrB,MAAM,WAAW,MAAM,gBACrB;GAAE,IAAI,QAAQ;GAAW,QAAQ;EAA2B,GAC5D,KACF;EACA,IAAI,aAAa,YAAY,CAAC,SAAS,QAAQ,YAAY;GACzD,IAAI,SAAS,QAAQ,aAAa,SAAS,GACzC,MAAM,IAAI,MACR,uGACF;GAEF,OAAO,QAAQ;EACjB;CACF;CAEA,IAAI,QAAQ,eACV,MAAM,4BACJ;EACE,IAAI,QAAQ;EACZ,MAAM,QAAQ;EACd,SAAS,QAAQ;EACjB,cAAc,QAAQ;EACtB,qBAAqB,QAAQ;EAC7B,UAAU,QAAQ;EAClB,UAAU,QAAQ;EAClB,WAAW;CACb,GACA,KACF;CAGF,MAAM,UAAU,MAAM,kBACpB;EACE,OAAO,QAAQ;EACf,MAAM;EACN,cAAc,YAAY,QAAQ;EAClC,UAAU;EACV,SAAS;EACT,QAAQ;EACR,YAAY,EAAE,mBAAmB,QAAQ,GAAG;CAC9C,GACA,KACF;CACA,IAAI,EAAE,aAAa,UACjB,MAAM,IAAI,MAAM,wCAAwC;CAE1D,IAAI,QAAQ,QAAQ,aAAa,SAAS,GACxC,MAAM,IAAI,MACR,uGACF;CAEF,MAAM,0BAA0B,QAAQ,IAAI,QAAQ,QAAQ,IAAI,KAAK;CACrE,OAAO,QAAQ,QAAQ;AACzB;AAEA,eAAe,iCACb,WACA,OACA;CACA,MAAM,SAAS,MAAM,gBACnB;EAAE,IAAI;EAAW,QAAQ;CAA4B,GACrD,KACF;CACA,IACE,EAAE,aAAa,WACf,OAAO,QAAQ,cACf,OAAO,QAAQ,cAAc,uBAC7B,OAAO,QAAQ,aAAa,SAAS,GAErC,MAAM,IAAI,MACR,oEACF;CAEF,OAAO,OAAO,QAAQ;AACxB;;;ACtnBA,IAAM,eAAe,EAAE,YAAY;CACjC,IAAI,EAAE,QAAQ;CACd,QAAQ,EAAE,OAAO;CACjB,SAAS,EAAE,QAAQ;CACnB,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;AAChC,CAAC;AAyDD,IAAa,0BAA0B;CAvDE,aAAa;EACpD,MAAM;EACN,aACE;EACF,OAAO,EAAE,OAAO,CAAC,CAAC;EAClB,QAAQ;EACR,MAAM,MAAM;GACV,OAAO,kBAAkB;EAC3B;CACF,CA+CE;CA7CyC,aAAa;EACtD,MAAM;EACN,aACE;EACF,OAAO;EACP,QAAQ;EACR,MAAM,IAAI,EAAE,SAAS;GACnB,OAAO,sBAAsB,KAAK;EACpC;CACF,CAqCE;CAnCmC,aAAa;EAChD,MAAM;EACN,aACE;EACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;EAC1D,QAAQ;EACR,MAAM,IAAI,EAAE,SAAS;GACnB,OAAO,uBAAuB,MAAM,EAAE;EACxC;CACF,CA2BE;CAzBkC,aAAa;EAC/C,MAAM;EACN,aACE;EACF,OAAO;EACP,QAAQ;EACR,MAAM,IAAI,EAAE,SAAS;GACnB,OAAO,eAAe,KAAK;EAC7B;CACF,CAiBE;CAfyC,aAAa;EACtD,MAAM;EACN,aACE;EACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;EAC9C,QAAQ;EACR,MAAM,IAAI,EAAE,SAAS;GACnB,OAAO,sBAAsB,KAAK;EACpC;CACF,CAOE;AACF"}
@@ -0,0 +1,20 @@
1
+ import { to as __exportAll } from "./autopilot-B8lfWyA1.js";
2
+ import { l as commandRunWorkflowAction } from "./safety-BQC7exnI.js";
3
+ import { t as display_assistant_default } from "./display-assistant-CKU4YJlc.js";
4
+ import { defineWorkflow } from "@flue/runtime";
5
+ //#region src/workflows/command-run.ts
6
+ var command_run_exports = /* @__PURE__ */ __exportAll({
7
+ default: () => command_run_default,
8
+ route: () => route,
9
+ runs: () => runs
10
+ });
11
+ var route = async (_c, next) => next();
12
+ var runs = async (_c, next) => next();
13
+ var command_run_default = defineWorkflow({
14
+ agent: display_assistant_default,
15
+ action: commandRunWorkflowAction
16
+ });
17
+ //#endregion
18
+ export { runs as i, command_run_exports as n, route as r, command_run_default as t };
19
+
20
+ //# sourceMappingURL=command-run-CnPOA8iY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-run-CnPOA8iY.js","names":[],"sources":["../../src/workflows/command-run.ts"],"sourcesContent":["import {\n defineWorkflow,\n type WorkflowRouteHandler,\n type WorkflowRunsHandler,\n} from '@flue/runtime';\nimport displayAssistant from '../agents/display-assistant';\nimport { commandRunWorkflowAction } from '../modules/commands';\n\nexport const route: WorkflowRouteHandler = async (_c, next) => next();\nexport const runs: WorkflowRunsHandler = async (_c, next) => next();\n\nexport default defineWorkflow({\n agent: displayAssistant,\n action: commandRunWorkflowAction,\n});\n"],"mappings":";;;;;;;;;;AAQA,IAAa,QAA8B,OAAO,IAAI,SAAS,KAAK;AACpE,IAAa,OAA4B,OAAO,IAAI,SAAS,KAAK;AAElE,IAAA,sBAAe,eAAe;CAC5B,OAAO;CACP,QAAQ;AACV,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { t as command_run_default } from "./command-run-CnPOA8iY.js";
2
+ export { command_run_default as default };