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,521 @@
1
+ import { Ja as runtimePaths, Va as ensureRuntimeHome, Ya as openDb, fi as fetchPullRequestReviews, gi as fetchGitHubLogin, mn as resolvePullRequestTarget, si as fetchPullRequestDetail } from "./autopilot-B8lfWyA1.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/modules/pr-reviews/events.ts
4
+ var listeners = /* @__PURE__ */ new Set();
5
+ function publishPrReviewEvent(event) {
6
+ for (const listener of listeners) try {
7
+ listener(event);
8
+ } catch (error) {
9
+ listeners.delete(listener);
10
+ console.error("[neondeck] PR review event listener failed", error);
11
+ }
12
+ }
13
+ function subscribePrReviewEvents(listener) {
14
+ listeners.add(listener);
15
+ return () => {
16
+ listeners.delete(listener);
17
+ };
18
+ }
19
+ function formatPrReviewServerSentEvent(event) {
20
+ return [
21
+ "event: review-change",
22
+ `data: ${JSON.stringify(event)}`,
23
+ "",
24
+ ""
25
+ ].join("\n");
26
+ }
27
+ //#endregion
28
+ //#region src/modules/pr-reviews/store.ts
29
+ function readPrReview(id, paths) {
30
+ return readOne("id = ?", id.trim(), paths);
31
+ }
32
+ function readPrReviewByRunId(runId, paths) {
33
+ return readOne("run_id = ?", runId.trim(), paths);
34
+ }
35
+ function readPrReviewForTarget(repoFullName, prNumber, paths) {
36
+ const database = openDb(paths.neondeckDatabase);
37
+ try {
38
+ const row = database.prepare(`SELECT * FROM pr_reviews
39
+ WHERE lower(repo_full_name) = lower(?) AND pr_number = ?
40
+ LIMIT 1;`).get(repoFullName.trim(), prNumber);
41
+ return row ? readPrReviewRow(row) : null;
42
+ } finally {
43
+ database.close();
44
+ }
45
+ }
46
+ function listPrReviews(paths, options = {}) {
47
+ const database = openDb(paths.neondeckDatabase);
48
+ const limit = Math.max(1, Math.min(options.limit ?? 100, 200));
49
+ try {
50
+ return (options.submittedSince ? database.prepare(`SELECT * FROM pr_reviews
51
+ WHERE status != 'submitted' OR submitted_at >= ?
52
+ ORDER BY updated_at DESC
53
+ LIMIT ?;`).all(options.submittedSince, limit) : database.prepare(`SELECT * FROM pr_reviews
54
+ ORDER BY updated_at DESC
55
+ LIMIT ?;`).all(limit)).map(readPrReviewRow);
56
+ } finally {
57
+ database.close();
58
+ }
59
+ }
60
+ function readPrReviewRow(row) {
61
+ const value = row;
62
+ return {
63
+ id: stringValue(value.id),
64
+ ref: stringValue(value.ref),
65
+ repoFullName: stringValue(value.repo_full_name),
66
+ prNumber: numberValue(value.pr_number),
67
+ title: stringValue(value.title),
68
+ author: nullableString(value.author),
69
+ prUrl: stringValue(value.pr_url),
70
+ status: statusValue(value.status),
71
+ runId: nullableString(value.run_id),
72
+ headSha: stringValue(value.head_sha),
73
+ origin: originValue(value.origin),
74
+ reviewUrl: stringValue(value.review_url),
75
+ reportIds: stringArray(value.report_ids_json),
76
+ findingCount: numberValue(value.finding_count),
77
+ seededCount: numberValue(value.seeded_count),
78
+ reportOnlyCount: numberValue(value.report_only_count),
79
+ reportOnlyFindings: reportOnlyFindings(value.report_only_findings_json),
80
+ trustBoundary: stringValue(value.trust_boundary),
81
+ verdict: verdictValue(value.verdict),
82
+ previousVerdict: verdictValue(value.previous_verdict),
83
+ githubReviewUrl: nullableString(value.github_review_url),
84
+ failureMessage: nullableString(value.failure_message),
85
+ createdAt: stringValue(value.created_at),
86
+ updatedAt: stringValue(value.updated_at),
87
+ readyAt: nullableString(value.ready_at),
88
+ submittedAt: nullableString(value.submitted_at),
89
+ failedAt: nullableString(value.failed_at)
90
+ };
91
+ }
92
+ function readOne(where, value, paths) {
93
+ const database = openDb(paths.neondeckDatabase);
94
+ try {
95
+ const row = database.prepare(`SELECT * FROM pr_reviews WHERE ${where} LIMIT 1;`).get(value);
96
+ return row ? readPrReviewRow(row) : null;
97
+ } finally {
98
+ database.close();
99
+ }
100
+ }
101
+ function stringValue(value) {
102
+ return typeof value === "string" ? value : "";
103
+ }
104
+ function nullableString(value) {
105
+ return typeof value === "string" ? value : null;
106
+ }
107
+ function numberValue(value) {
108
+ return typeof value === "number" ? value : Number(value) || 0;
109
+ }
110
+ function statusValue(value) {
111
+ return value === "ready" || value === "submitting" || value === "submitted" || value === "failed" || value === "reviewing" ? value : "failed";
112
+ }
113
+ function originValue(value) {
114
+ return value === "chat" || value === "panel" || value === "api" ? value : "api";
115
+ }
116
+ function verdictValue(value) {
117
+ return value === "comment" || value === "approve" || value === "request-changes" ? value : null;
118
+ }
119
+ function stringArray(value) {
120
+ try {
121
+ const parsed = JSON.parse(stringValue(value));
122
+ return Array.isArray(parsed) ? parsed.filter((item) => typeof item === "string") : [];
123
+ } catch {
124
+ return [];
125
+ }
126
+ }
127
+ function reportOnlyFindings(value) {
128
+ try {
129
+ const parsed = JSON.parse(stringValue(value));
130
+ if (!Array.isArray(parsed)) return [];
131
+ return parsed.filter(isReportOnlyFinding);
132
+ } catch {
133
+ return [];
134
+ }
135
+ }
136
+ function isReportOnlyFinding(value) {
137
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
138
+ const item = value;
139
+ return (item.severity === "critical" || item.severity === "major" || item.severity === "minor" || item.severity === "nit") && typeof item.path === "string" && (item.line === null || typeof item.line === "number") && typeof item.summary === "string" && typeof item.suggestedFix === "string" && typeof item.reason === "string";
140
+ }
141
+ //#endregion
142
+ //#region src/modules/pr-reviews/types.ts
143
+ var prReviewTrustBoundary = "Local drafts only; nothing is sent to GitHub until you submit the review.";
144
+ //#endregion
145
+ //#region src/modules/pr-reviews/service.ts
146
+ var submissionReconcileGraceMs = 3e4;
147
+ var activeSubmissionAttempts = /* @__PURE__ */ new Set();
148
+ async function startPrReview(input, paths = runtimePaths(), dependencies = {}) {
149
+ await ensureRuntimeHome(paths);
150
+ const ref = input.ref.trim();
151
+ if (!ref) throw new Error("A pull request reference is required.");
152
+ const target = await (dependencies.resolveTarget ?? defaultResolveTarget)(ref, paths);
153
+ const detail = await (dependencies.fetchDetail ?? defaultFetchDetail)(target);
154
+ const attemptId = randomUUID();
155
+ const review = upsertReviewingRecord({
156
+ ref,
157
+ origin: input.origin,
158
+ target,
159
+ detail,
160
+ attemptId
161
+ }, paths);
162
+ publish(review, review.createdAt === review.updatedAt ? "created" : "changed");
163
+ try {
164
+ const admission = await (dependencies.invokeWorkflow ?? invokeReviewPrWorkflow)({
165
+ ref: `${target.repoFullName}#${target.number}`,
166
+ reviewId: review.id,
167
+ attemptId
168
+ });
169
+ const attached = attachPrReviewAttemptRun(review.id, attemptId, admission.runId, paths);
170
+ if (!attached) throw new Error("This review attempt was superseded by a newer start.");
171
+ return {
172
+ review: attached,
173
+ reviewId: attached.id,
174
+ runId: admission.runId
175
+ };
176
+ } catch (error) {
177
+ failPrReview({
178
+ reviewId: review.id,
179
+ attemptId,
180
+ message: errorMessage(error)
181
+ }, paths);
182
+ throw error;
183
+ }
184
+ }
185
+ async function invokeReviewPrWorkflow(input) {
186
+ const { invoke } = await import("@flue/runtime");
187
+ return invoke((await import("./review-pr-for-human-CEciM46A.js")).default, { input });
188
+ }
189
+ function completePrReview(input, paths = runtimePaths()) {
190
+ const transition = findReviewTransition(input, paths);
191
+ if (!transition) return null;
192
+ const { current, column, value } = transition;
193
+ const now = (/* @__PURE__ */ new Date()).toISOString();
194
+ const database = openDb(paths.neondeckDatabase);
195
+ let changed = false;
196
+ try {
197
+ changed = database.prepare(`UPDATE pr_reviews
198
+ SET status = 'ready',
199
+ run_id = COALESCE(?, run_id),
200
+ head_sha = ?,
201
+ report_ids_json = ?,
202
+ review_url = ?,
203
+ finding_count = ?,
204
+ seeded_count = ?,
205
+ report_only_count = ?,
206
+ report_only_findings_json = ?,
207
+ failure_message = NULL,
208
+ failed_at = NULL,
209
+ ready_at = ?,
210
+ updated_at = ?
211
+ WHERE id = ? AND ${column} = ? AND status = 'reviewing';`).run(input.runId ?? null, input.headSha, JSON.stringify(input.reportIds), input.reviewUrl, input.findingCount, input.seededCount, input.reportOnlyCount, JSON.stringify(input.reportOnlyFindings), now, now, current.id, value).changes === 1;
212
+ } finally {
213
+ database.close();
214
+ }
215
+ if (!changed) return null;
216
+ const updated = requireReview(current.id, paths);
217
+ publish(updated, "changed");
218
+ return updated;
219
+ }
220
+ function failPrReview(input, paths = runtimePaths()) {
221
+ const transition = findReviewTransition(input, paths);
222
+ if (!transition) return null;
223
+ const { current, column, value } = transition;
224
+ const now = (/* @__PURE__ */ new Date()).toISOString();
225
+ const database = openDb(paths.neondeckDatabase);
226
+ let changed = false;
227
+ try {
228
+ changed = database.prepare(`UPDATE pr_reviews
229
+ SET status = 'failed', run_id = COALESCE(?, run_id),
230
+ failure_message = ?, failed_at = ?, updated_at = ?
231
+ WHERE id = ? AND ${column} = ?
232
+ AND (status = 'reviewing' OR (? = 1 AND status = 'ready'));`).run(input.runId ?? null, input.message.trim(), now, now, current.id, value, input.allowReady ? 1 : 0).changes === 1;
233
+ } finally {
234
+ database.close();
235
+ }
236
+ if (!changed) return null;
237
+ const updated = requireReview(current.id, paths);
238
+ publish(updated, "changed");
239
+ return updated;
240
+ }
241
+ function reservePrReviewSubmission(input, paths = runtimePaths()) {
242
+ const current = readPrReviewForTarget(input.repoFullName, input.prNumber, paths);
243
+ if (!current) return null;
244
+ const now = (/* @__PURE__ */ new Date()).toISOString();
245
+ const database = openDb(paths.neondeckDatabase);
246
+ let changed = false;
247
+ try {
248
+ changed = database.prepare(`UPDATE pr_reviews
249
+ SET status = 'submitting', verdict = ?, updated_at = ?
250
+ WHERE id = ? AND status = 'ready' AND head_sha = ?;`).run(input.verdict, now, current.id, input.headSha).changes === 1;
251
+ } finally {
252
+ database.close();
253
+ }
254
+ if (!changed) return null;
255
+ const updated = requireReview(current.id, paths);
256
+ publish(updated, "changed");
257
+ return updated;
258
+ }
259
+ function releasePrReviewSubmission(input, paths = runtimePaths()) {
260
+ const now = (/* @__PURE__ */ new Date()).toISOString();
261
+ const database = openDb(paths.neondeckDatabase);
262
+ let changed = false;
263
+ try {
264
+ changed = database.prepare(`UPDATE pr_reviews
265
+ SET status = 'ready', verdict = NULL, updated_at = ?
266
+ WHERE id = ? AND status = 'submitting' AND head_sha = ?;`).run(now, input.reviewId, input.headSha).changes === 1;
267
+ } finally {
268
+ database.close();
269
+ }
270
+ if (!changed) return null;
271
+ const updated = requireReview(input.reviewId, paths);
272
+ publish(updated, "changed");
273
+ return updated;
274
+ }
275
+ function beginPrReviewSubmissionAttempt(reviewId) {
276
+ activeSubmissionAttempts.add(reviewId);
277
+ let active = true;
278
+ return () => {
279
+ if (!active) return;
280
+ active = false;
281
+ activeSubmissionAttempts.delete(reviewId);
282
+ };
283
+ }
284
+ function submitPrReview(input, paths = runtimePaths()) {
285
+ const current = readPrReview(input.reviewId, paths);
286
+ if (!current) return null;
287
+ if (current.status === "submitted") return current;
288
+ const now = (/* @__PURE__ */ new Date()).toISOString();
289
+ const database = openDb(paths.neondeckDatabase);
290
+ let changed = false;
291
+ try {
292
+ changed = database.prepare(`UPDATE pr_reviews
293
+ SET status = 'submitted', verdict = ?, github_review_url = ?,
294
+ submitted_at = ?, updated_at = ?
295
+ WHERE id = ? AND status = 'submitting';`).run(input.verdict, input.githubReviewUrl, now, now, current.id).changes === 1;
296
+ } finally {
297
+ database.close();
298
+ }
299
+ if (!changed) return null;
300
+ const updated = requireReview(current.id, paths);
301
+ publish(updated, "changed");
302
+ return updated;
303
+ }
304
+ async function reconcilePrReviewSubmission(input, paths = runtimePaths(), dependencies = {}) {
305
+ await ensureRuntimeHome(paths);
306
+ const current = readPrReview(input.reviewId, paths);
307
+ if (!current) throw new Error("PR review not found.");
308
+ if (current.status !== "submitting") return {
309
+ outcome: "unchanged",
310
+ review: current
311
+ };
312
+ if (activeSubmissionAttempts.has(current.id)) return {
313
+ outcome: "pending",
314
+ review: current
315
+ };
316
+ const endReconciliation = beginPrReviewSubmissionAttempt(current.id);
317
+ try {
318
+ return await reconcileInactivePrReviewSubmission(current, paths, dependencies);
319
+ } finally {
320
+ endReconciliation();
321
+ }
322
+ }
323
+ async function reconcileInactivePrReviewSubmission(current, paths, dependencies) {
324
+ if (!current.verdict) throw new Error("The reserved review is missing its submission verdict.");
325
+ const token = dependencies.token ?? process.env.GITHUB_TOKEN;
326
+ if (!token) throw new Error("GITHUB_TOKEN is not configured.");
327
+ const [owner, repo] = splitRepoFullName(current.repoFullName);
328
+ const [login, reviews] = await Promise.all([(dependencies.fetchLogin ?? fetchGitHubLogin)(token), (dependencies.fetchReviews ?? fetchPullRequestReviews)({
329
+ token,
330
+ owner,
331
+ repo,
332
+ number: current.prNumber
333
+ })]);
334
+ const submittedReview = matchingSubmittedReview(current, login, reviews);
335
+ if (submittedReview) {
336
+ const submitted = submitPrReview({
337
+ reviewId: current.id,
338
+ verdict: current.verdict,
339
+ githubReviewUrl: submittedReview.url
340
+ }, paths);
341
+ if (submitted) return {
342
+ outcome: "submitted",
343
+ review: submitted
344
+ };
345
+ const settled = readPrReview(current.id, paths);
346
+ if (settled?.status === "submitted") return {
347
+ outcome: "submitted",
348
+ review: settled
349
+ };
350
+ throw new Error("Could not settle the recovered GitHub review locally.");
351
+ }
352
+ const now = (dependencies.now ?? Date.now)();
353
+ const reservedAt = Date.parse(current.updatedAt);
354
+ if (Number.isFinite(reservedAt) && now - reservedAt < submissionReconcileGraceMs) return {
355
+ outcome: "pending",
356
+ review: current
357
+ };
358
+ const released = releasePrReviewSubmission({
359
+ reviewId: current.id,
360
+ headSha: current.headSha
361
+ }, paths);
362
+ if (released) return {
363
+ outcome: "ready",
364
+ review: released
365
+ };
366
+ const settled = readPrReview(current.id, paths);
367
+ if (settled) return {
368
+ outcome: "unchanged",
369
+ review: settled
370
+ };
371
+ throw new Error("Could not release the interrupted submission locally.");
372
+ }
373
+ function recentPrReviews(paths = runtimePaths()) {
374
+ return listPrReviews(paths, { submittedSince: (/* @__PURE__ */ new Date(Date.now() - 10080 * 60 * 1e3)).toISOString() });
375
+ }
376
+ function matchingSubmittedReview(current, login, reviews) {
377
+ const reservedAt = Date.parse(current.updatedAt);
378
+ const earliestSubmittedAt = Number.isFinite(reservedAt) ? Math.floor(reservedAt / 1e3) * 1e3 : 0;
379
+ const expectedState = githubReviewState(current.verdict);
380
+ return reviews.filter((review) => {
381
+ const submittedAt = review.submittedAt ? Date.parse(review.submittedAt) : NaN;
382
+ return review.authorLogin?.toLowerCase() === login.toLowerCase() && review.commitId === current.headSha && review.state === expectedState && Number.isFinite(submittedAt) && submittedAt >= earliestSubmittedAt;
383
+ }).sort((left, right) => Date.parse(right.submittedAt ?? "") - Date.parse(left.submittedAt ?? ""))[0];
384
+ }
385
+ function githubReviewState(verdict) {
386
+ if (verdict === "approve") return "APPROVED";
387
+ if (verdict === "request-changes") return "CHANGES_REQUESTED";
388
+ return "COMMENTED";
389
+ }
390
+ function splitRepoFullName(repoFullName) {
391
+ const [owner, repo, ...rest] = repoFullName.split("/");
392
+ if (!owner || !repo || rest.length > 0) throw new Error(`Invalid GitHub repository name: ${repoFullName}`);
393
+ return [owner, repo];
394
+ }
395
+ function upsertReviewingRecord(input, paths) {
396
+ const repoFullName = input.target.repoFullName.toLowerCase();
397
+ const existing = readPrReviewForTarget(repoFullName, input.target.number, paths);
398
+ if (existing?.status === "reviewing" || existing?.status === "submitting") throw new Error(`A review is already ${existing.status === "submitting" ? "being submitted" : "in progress"} for ${repoFullName}#${input.target.number}.`);
399
+ const id = existing?.id ?? randomUUID();
400
+ const now = (/* @__PURE__ */ new Date()).toISOString();
401
+ const reviewUrl = reviewSurfaceUrl(repoFullName, input.target.number);
402
+ const database = openDb(paths.neondeckDatabase);
403
+ try {
404
+ database.prepare(`INSERT INTO pr_reviews (
405
+ id, ref, repo_full_name, pr_number, title, author, pr_url, status,
406
+ attempt_id, run_id, head_sha, origin, review_url, report_ids_json,
407
+ finding_count, seeded_count, report_only_count,
408
+ report_only_findings_json, trust_boundary, verdict,
409
+ previous_verdict, github_review_url, failure_message,
410
+ created_at, updated_at, ready_at, submitted_at, failed_at
411
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'reviewing', ?, NULL, ?, ?, ?, '[]',
412
+ 0, 0, 0, '[]', ?, NULL, ?, NULL, NULL, ?, ?, NULL, NULL, NULL)
413
+ ON CONFLICT(repo_full_name, pr_number) DO UPDATE SET
414
+ ref = excluded.ref,
415
+ title = excluded.title,
416
+ author = excluded.author,
417
+ pr_url = excluded.pr_url,
418
+ status = 'reviewing',
419
+ attempt_id = excluded.attempt_id,
420
+ run_id = NULL,
421
+ head_sha = excluded.head_sha,
422
+ origin = excluded.origin,
423
+ review_url = excluded.review_url,
424
+ report_ids_json = '[]',
425
+ finding_count = 0,
426
+ seeded_count = 0,
427
+ report_only_count = 0,
428
+ report_only_findings_json = '[]',
429
+ verdict = NULL,
430
+ previous_verdict = CASE
431
+ WHEN pr_reviews.verdict IS NOT NULL THEN pr_reviews.verdict
432
+ ELSE pr_reviews.previous_verdict
433
+ END,
434
+ github_review_url = NULL,
435
+ failure_message = NULL,
436
+ ready_at = NULL,
437
+ submitted_at = NULL,
438
+ failed_at = NULL,
439
+ updated_at = excluded.updated_at;`).run(id, input.ref, repoFullName, input.target.number, input.detail.title, input.detail.author ?? null, input.detail.url, input.attemptId, input.detail.headSha, input.origin, reviewUrl, prReviewTrustBoundary, existing?.verdict ?? existing?.previousVerdict ?? null, existing?.createdAt ?? now, now);
440
+ } finally {
441
+ database.close();
442
+ }
443
+ return requireReview(id, paths);
444
+ }
445
+ function attachPrReviewAttemptRun(id, attemptId, runId, paths) {
446
+ const now = (/* @__PURE__ */ new Date()).toISOString();
447
+ const database = openDb(paths.neondeckDatabase);
448
+ try {
449
+ if (database.prepare(`UPDATE pr_reviews SET run_id = ?, updated_at = ?
450
+ WHERE id = ? AND attempt_id = ? AND run_id IS NULL;`).run(runId, now, id, attemptId).changes === 1) {
451
+ const updated = requireReview(id, paths);
452
+ publish(updated, "changed");
453
+ return updated;
454
+ }
455
+ if (database.prepare(`SELECT run_id FROM pr_reviews
456
+ WHERE id = ? AND attempt_id = ? LIMIT 1;`).get(id, attemptId)?.run_id !== runId) return null;
457
+ } finally {
458
+ database.close();
459
+ }
460
+ return requireReview(id, paths);
461
+ }
462
+ async function defaultResolveTarget(ref, paths) {
463
+ const resolved = await resolvePullRequestTarget({ ref }, paths, "pr_review_start");
464
+ if (!resolved.ok) throw new Error(resolved.result.message);
465
+ return resolved.target;
466
+ }
467
+ async function defaultFetchDetail(target) {
468
+ const token = process.env.GITHUB_TOKEN;
469
+ if (!token) throw new Error("GITHUB_TOKEN is not configured.");
470
+ return fetchPullRequestDetail({
471
+ token,
472
+ owner: target.owner,
473
+ repo: target.repo,
474
+ number: target.number
475
+ });
476
+ }
477
+ function findReviewTransition(input, paths) {
478
+ if (input.attemptId && input.reviewId) {
479
+ const current = readPrReview(input.reviewId, paths);
480
+ return current ? {
481
+ current,
482
+ column: "attempt_id",
483
+ value: input.attemptId
484
+ } : null;
485
+ }
486
+ if (input.runId) {
487
+ const current = readPrReviewByRunId(input.runId, paths);
488
+ return current ? {
489
+ current,
490
+ column: "run_id",
491
+ value: input.runId
492
+ } : null;
493
+ }
494
+ return null;
495
+ }
496
+ function requireReview(id, paths) {
497
+ const review = readPrReview(id, paths);
498
+ if (!review) throw new Error(`PR review record ${id} was not found.`);
499
+ return review;
500
+ }
501
+ function publish(review, action) {
502
+ publishPrReviewEvent({
503
+ id: review.id,
504
+ action,
505
+ review,
506
+ changedAt: review.updatedAt
507
+ });
508
+ }
509
+ function reviewSurfaceUrl(repoFullName, prNumber) {
510
+ return `/review?${new URLSearchParams({
511
+ repo: repoFullName,
512
+ number: String(prNumber)
513
+ }).toString()}`;
514
+ }
515
+ function errorMessage(error) {
516
+ return error instanceof Error ? error.message : String(error);
517
+ }
518
+ //#endregion
519
+ export { recentPrReviews as a, reservePrReviewSubmission as c, readPrReview as d, readPrReviewForTarget as f, failPrReview as i, startPrReview as l, subscribePrReviewEvents as m, beginPrReviewSubmissionAttempt as n, reconcilePrReviewSubmission as o, formatPrReviewServerSentEvent as p, completePrReview as r, releasePrReviewSubmission as s, attachPrReviewAttemptRun as t, submitPrReview as u };
520
+
521
+ //# sourceMappingURL=pr-reviews-BtJ5cm5P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-reviews-BtJ5cm5P.js","names":[],"sources":["../../src/modules/pr-reviews/events.ts","../../src/modules/pr-reviews/store.ts","../../src/modules/pr-reviews/types.ts","../../src/modules/pr-reviews/service.ts"],"sourcesContent":["import type { PrReviewRecord } from './types';\n\nexport type PrReviewEvent = {\n id: string;\n action: 'created' | 'changed';\n review: PrReviewRecord;\n changedAt: string;\n};\n\ntype PrReviewEventListener = (event: PrReviewEvent) => void;\n\nconst listeners = new Set<PrReviewEventListener>();\n\nexport function publishPrReviewEvent(event: PrReviewEvent) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n listeners.delete(listener);\n console.error('[neondeck] PR review event listener failed', error);\n }\n }\n}\n\nexport function subscribePrReviewEvents(listener: PrReviewEventListener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function formatPrReviewServerSentEvent(event: PrReviewEvent) {\n return [\n 'event: review-change',\n `data: ${JSON.stringify(event)}`,\n '',\n '',\n ].join('\\n');\n}\n","import { openDb } from '../../lib/sqlite';\nimport type { RuntimePaths } from '../../runtime-home';\nimport type {\n PrReviewOrigin,\n PrReviewRecord,\n PrReviewReportOnlyFinding,\n PrReviewStatus,\n PrReviewVerdict,\n} from './types';\n\nexport function readPrReview(id: string, paths: RuntimePaths) {\n return readOne('id = ?', id.trim(), paths);\n}\n\nexport function readPrReviewByRunId(runId: string, paths: RuntimePaths) {\n return readOne('run_id = ?', runId.trim(), paths);\n}\n\nexport function readPrReviewForTarget(\n repoFullName: string,\n prNumber: number,\n paths: RuntimePaths,\n) {\n const database = openDb(paths.neondeckDatabase);\n try {\n const row = database\n .prepare(\n `SELECT * FROM pr_reviews\n WHERE lower(repo_full_name) = lower(?) AND pr_number = ?\n LIMIT 1;`,\n )\n .get(repoFullName.trim(), prNumber);\n return row ? readPrReviewRow(row) : null;\n } finally {\n database.close();\n }\n}\n\nexport function listPrReviews(\n paths: RuntimePaths,\n options: { submittedSince?: string; limit?: number } = {},\n) {\n const database = openDb(paths.neondeckDatabase);\n const limit = Math.max(1, Math.min(options.limit ?? 100, 200));\n try {\n const rows = options.submittedSince\n ? database\n .prepare(\n `SELECT * FROM pr_reviews\n WHERE status != 'submitted' OR submitted_at >= ?\n ORDER BY updated_at DESC\n LIMIT ?;`,\n )\n .all(options.submittedSince, limit)\n : database\n .prepare(\n `SELECT * FROM pr_reviews\n ORDER BY updated_at DESC\n LIMIT ?;`,\n )\n .all(limit);\n return rows.map(readPrReviewRow);\n } finally {\n database.close();\n }\n}\n\nexport function readPrReviewRow(row: unknown): PrReviewRecord {\n const value = row as Record<string, unknown>;\n return {\n id: stringValue(value.id),\n ref: stringValue(value.ref),\n repoFullName: stringValue(value.repo_full_name),\n prNumber: numberValue(value.pr_number),\n title: stringValue(value.title),\n author: nullableString(value.author),\n prUrl: stringValue(value.pr_url),\n status: statusValue(value.status),\n runId: nullableString(value.run_id),\n headSha: stringValue(value.head_sha),\n origin: originValue(value.origin),\n reviewUrl: stringValue(value.review_url),\n reportIds: stringArray(value.report_ids_json),\n findingCount: numberValue(value.finding_count),\n seededCount: numberValue(value.seeded_count),\n reportOnlyCount: numberValue(value.report_only_count),\n reportOnlyFindings: reportOnlyFindings(value.report_only_findings_json),\n trustBoundary: stringValue(value.trust_boundary),\n verdict: verdictValue(value.verdict),\n previousVerdict: verdictValue(value.previous_verdict),\n githubReviewUrl: nullableString(value.github_review_url),\n failureMessage: nullableString(value.failure_message),\n createdAt: stringValue(value.created_at),\n updatedAt: stringValue(value.updated_at),\n readyAt: nullableString(value.ready_at),\n submittedAt: nullableString(value.submitted_at),\n failedAt: nullableString(value.failed_at),\n };\n}\n\nfunction readOne(where: string, value: string, paths: RuntimePaths) {\n const database = openDb(paths.neondeckDatabase);\n try {\n const row = database\n .prepare(`SELECT * FROM pr_reviews WHERE ${where} LIMIT 1;`)\n .get(value);\n return row ? readPrReviewRow(row) : null;\n } finally {\n database.close();\n }\n}\n\nfunction stringValue(value: unknown) {\n return typeof value === 'string' ? value : '';\n}\n\nfunction nullableString(value: unknown) {\n return typeof value === 'string' ? value : null;\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === 'number' ? value : Number(value) || 0;\n}\n\nfunction statusValue(value: unknown): PrReviewStatus {\n return value === 'ready' ||\n value === 'submitting' ||\n value === 'submitted' ||\n value === 'failed' ||\n value === 'reviewing'\n ? value\n : 'failed';\n}\n\nfunction originValue(value: unknown): PrReviewOrigin {\n return value === 'chat' || value === 'panel' || value === 'api'\n ? value\n : 'api';\n}\n\nfunction verdictValue(value: unknown): PrReviewVerdict | null {\n return value === 'comment' ||\n value === 'approve' ||\n value === 'request-changes'\n ? value\n : null;\n}\n\nfunction stringArray(value: unknown): string[] {\n try {\n const parsed = JSON.parse(stringValue(value));\n return Array.isArray(parsed)\n ? parsed.filter((item): item is string => typeof item === 'string')\n : [];\n } catch {\n return [];\n }\n}\n\nfunction reportOnlyFindings(value: unknown): PrReviewReportOnlyFinding[] {\n try {\n const parsed = JSON.parse(stringValue(value));\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(isReportOnlyFinding);\n } catch {\n return [];\n }\n}\n\nfunction isReportOnlyFinding(\n value: unknown,\n): value is PrReviewReportOnlyFinding {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const item = value as Record<string, unknown>;\n return (\n (item.severity === 'critical' ||\n item.severity === 'major' ||\n item.severity === 'minor' ||\n item.severity === 'nit') &&\n typeof item.path === 'string' &&\n (item.line === null || typeof item.line === 'number') &&\n typeof item.summary === 'string' &&\n typeof item.suggestedFix === 'string' &&\n typeof item.reason === 'string'\n );\n}\n","export type PrReviewStatus =\n 'reviewing' | 'ready' | 'submitting' | 'submitted' | 'failed';\n\nexport type PrReviewOrigin = 'chat' | 'panel' | 'api';\n\nexport type PrReviewVerdict = 'comment' | 'approve' | 'request-changes';\n\nexport type PrReviewReportOnlyFinding = {\n severity: 'critical' | 'major' | 'minor' | 'nit';\n path: string;\n line: number | null;\n summary: string;\n suggestedFix: string;\n reason: string;\n};\n\nexport type PrReviewRecord = {\n id: string;\n ref: string;\n repoFullName: string;\n prNumber: number;\n title: string;\n author: string | null;\n prUrl: string;\n status: PrReviewStatus;\n runId: string | null;\n headSha: string;\n origin: PrReviewOrigin;\n reviewUrl: string;\n reportIds: string[];\n findingCount: number;\n seededCount: number;\n reportOnlyCount: number;\n reportOnlyFindings: PrReviewReportOnlyFinding[];\n trustBoundary: string;\n verdict: PrReviewVerdict | null;\n previousVerdict: PrReviewVerdict | null;\n githubReviewUrl: string | null;\n failureMessage: string | null;\n createdAt: string;\n updatedAt: string;\n readyAt: string | null;\n submittedAt: string | null;\n failedAt: string | null;\n};\n\nexport const prReviewTrustBoundary =\n 'Local drafts only; nothing is sent to GitHub until you submit the review.';\n","import { randomUUID } from 'node:crypto';\nimport { openDb } from '../../lib/sqlite';\nimport {\n ensureRuntimeHome,\n runtimePaths,\n type RuntimePaths,\n} from '../../runtime-home';\nimport {\n fetchGitHubLogin,\n fetchPullRequestDetail,\n fetchPullRequestReviews,\n type GitHubPullRequestReview,\n type GitHubPullRequestDetail,\n} from '../github';\nimport { resolvePullRequestTarget, type PullRequestTarget } from '../pr-events';\nimport { publishPrReviewEvent } from './events';\nimport {\n listPrReviews,\n readPrReview,\n readPrReviewByRunId,\n readPrReviewForTarget,\n} from './store';\nimport {\n prReviewTrustBoundary,\n type PrReviewOrigin,\n type PrReviewRecord,\n type PrReviewReportOnlyFinding,\n type PrReviewVerdict,\n} from './types';\n\nexport type StartPrReviewDependencies = {\n resolveTarget?: (\n ref: string,\n paths: RuntimePaths,\n ) => Promise<PullRequestTarget>;\n fetchDetail?: (target: PullRequestTarget) => Promise<GitHubPullRequestDetail>;\n invokeWorkflow?: (input: {\n ref: string;\n reviewId: string;\n attemptId: string;\n }) => Promise<{ runId: string }>;\n};\n\nexport type ReconcilePrReviewSubmissionDependencies = {\n token?: string;\n now?: () => number;\n fetchLogin?: (token: string) => Promise<string>;\n fetchReviews?: (input: {\n token: string;\n owner: string;\n repo: string;\n number: number;\n }) => Promise<GitHubPullRequestReview[]>;\n};\n\nconst submissionReconcileGraceMs = 30_000;\nconst activeSubmissionAttempts = new Set<string>();\n\nexport async function startPrReview(\n input: { ref: string; origin: PrReviewOrigin },\n paths = runtimePaths(),\n dependencies: StartPrReviewDependencies = {},\n) {\n await ensureRuntimeHome(paths);\n const ref = input.ref.trim();\n if (!ref) throw new Error('A pull request reference is required.');\n\n const target = await (dependencies.resolveTarget ?? defaultResolveTarget)(\n ref,\n paths,\n );\n const detail = await (dependencies.fetchDetail ?? defaultFetchDetail)(target);\n const attemptId = randomUUID();\n const review = upsertReviewingRecord(\n { ref, origin: input.origin, target, detail, attemptId },\n paths,\n );\n publish(\n review,\n review.createdAt === review.updatedAt ? 'created' : 'changed',\n );\n\n try {\n const admission = await (\n dependencies.invokeWorkflow ?? invokeReviewPrWorkflow\n )({\n ref: `${target.repoFullName}#${target.number}`,\n reviewId: review.id,\n attemptId,\n });\n const attached = attachPrReviewAttemptRun(\n review.id,\n attemptId,\n admission.runId,\n paths,\n );\n if (!attached) {\n throw new Error('This review attempt was superseded by a newer start.');\n }\n return { review: attached, reviewId: attached.id, runId: admission.runId };\n } catch (error) {\n failPrReview(\n { reviewId: review.id, attemptId, message: errorMessage(error) },\n paths,\n );\n throw error;\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 function completePrReview(\n input: {\n reviewId?: string;\n attemptId?: string;\n runId?: string;\n headSha: string;\n reportIds: string[];\n reviewUrl: string;\n findingCount: number;\n seededCount: number;\n reportOnlyCount: number;\n reportOnlyFindings: PrReviewReportOnlyFinding[];\n },\n paths = runtimePaths(),\n) {\n const transition = findReviewTransition(input, paths);\n if (!transition) return null;\n const { current, column, value } = transition;\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n let changed = false;\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews\n SET status = 'ready',\n run_id = COALESCE(?, run_id),\n head_sha = ?,\n report_ids_json = ?,\n review_url = ?,\n finding_count = ?,\n seeded_count = ?,\n report_only_count = ?,\n report_only_findings_json = ?,\n failure_message = NULL,\n failed_at = NULL,\n ready_at = ?,\n updated_at = ?\n WHERE id = ? AND ${column} = ? AND status = 'reviewing';`,\n )\n .run(\n input.runId ?? null,\n input.headSha,\n JSON.stringify(input.reportIds),\n input.reviewUrl,\n input.findingCount,\n input.seededCount,\n input.reportOnlyCount,\n JSON.stringify(input.reportOnlyFindings),\n now,\n now,\n current.id,\n value,\n );\n changed = result.changes === 1;\n } finally {\n database.close();\n }\n if (!changed) return null;\n const updated = requireReview(current.id, paths);\n publish(updated, 'changed');\n return updated;\n}\n\nexport function failPrReview(\n input: {\n reviewId?: string;\n attemptId?: string;\n runId?: string;\n allowReady?: boolean;\n message: string;\n },\n paths = runtimePaths(),\n) {\n const transition = findReviewTransition(input, paths);\n if (!transition) return null;\n const { current, column, value } = transition;\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n let changed = false;\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews\n SET status = 'failed', run_id = COALESCE(?, run_id),\n failure_message = ?, failed_at = ?, updated_at = ?\n WHERE id = ? AND ${column} = ?\n AND (status = 'reviewing' OR (? = 1 AND status = 'ready'));`,\n )\n .run(\n input.runId ?? null,\n input.message.trim(),\n now,\n now,\n current.id,\n value,\n input.allowReady ? 1 : 0,\n );\n changed = result.changes === 1;\n } finally {\n database.close();\n }\n if (!changed) return null;\n const updated = requireReview(current.id, paths);\n publish(updated, 'changed');\n return updated;\n}\n\nexport function reservePrReviewSubmission(\n input: {\n repoFullName: string;\n prNumber: number;\n headSha: string;\n verdict: PrReviewVerdict;\n },\n paths = runtimePaths(),\n) {\n const current = readPrReviewForTarget(\n input.repoFullName,\n input.prNumber,\n paths,\n );\n if (!current) return null;\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n let changed = false;\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews\n SET status = 'submitting', verdict = ?, updated_at = ?\n WHERE id = ? AND status = 'ready' AND head_sha = ?;`,\n )\n .run(input.verdict, now, current.id, input.headSha);\n changed = result.changes === 1;\n } finally {\n database.close();\n }\n if (!changed) return null;\n const updated = requireReview(current.id, paths);\n publish(updated, 'changed');\n return updated;\n}\n\nexport function releasePrReviewSubmission(\n input: { reviewId: string; headSha: string },\n paths = runtimePaths(),\n) {\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n let changed = false;\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews\n SET status = 'ready', verdict = NULL, updated_at = ?\n WHERE id = ? AND status = 'submitting' AND head_sha = ?;`,\n )\n .run(now, input.reviewId, input.headSha);\n changed = result.changes === 1;\n } finally {\n database.close();\n }\n if (!changed) return null;\n const updated = requireReview(input.reviewId, paths);\n publish(updated, 'changed');\n return updated;\n}\n\nexport function beginPrReviewSubmissionAttempt(reviewId: string) {\n activeSubmissionAttempts.add(reviewId);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n activeSubmissionAttempts.delete(reviewId);\n };\n}\n\nexport function submitPrReview(\n input: {\n reviewId: string;\n verdict: PrReviewVerdict;\n githubReviewUrl: string | null;\n },\n paths = runtimePaths(),\n) {\n const current = readPrReview(input.reviewId, paths);\n if (!current) return null;\n if (current.status === 'submitted') return current;\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n let changed = false;\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews\n SET status = 'submitted', verdict = ?, github_review_url = ?,\n submitted_at = ?, updated_at = ?\n WHERE id = ? AND status = 'submitting';`,\n )\n .run(input.verdict, input.githubReviewUrl, now, now, current.id);\n changed = result.changes === 1;\n } finally {\n database.close();\n }\n if (!changed) return null;\n const updated = requireReview(current.id, paths);\n publish(updated, 'changed');\n return updated;\n}\n\nexport async function reconcilePrReviewSubmission(\n input: { reviewId: string },\n paths = runtimePaths(),\n dependencies: ReconcilePrReviewSubmissionDependencies = {},\n) {\n await ensureRuntimeHome(paths);\n const current = readPrReview(input.reviewId, paths);\n if (!current) throw new Error('PR review not found.');\n if (current.status !== 'submitting') {\n return { outcome: 'unchanged' as const, review: current };\n }\n if (activeSubmissionAttempts.has(current.id)) {\n return { outcome: 'pending' as const, review: current };\n }\n const endReconciliation = beginPrReviewSubmissionAttempt(current.id);\n try {\n return await reconcileInactivePrReviewSubmission(\n current,\n paths,\n dependencies,\n );\n } finally {\n endReconciliation();\n }\n}\n\nasync function reconcileInactivePrReviewSubmission(\n current: PrReviewRecord,\n paths: RuntimePaths,\n dependencies: ReconcilePrReviewSubmissionDependencies,\n) {\n if (!current.verdict) {\n throw new Error('The reserved review is missing its submission verdict.');\n }\n\n const token = dependencies.token ?? process.env.GITHUB_TOKEN;\n if (!token) throw new Error('GITHUB_TOKEN is not configured.');\n const [owner, repo] = splitRepoFullName(current.repoFullName);\n const [login, reviews] = await Promise.all([\n (dependencies.fetchLogin ?? fetchGitHubLogin)(token),\n (dependencies.fetchReviews ?? fetchPullRequestReviews)({\n token,\n owner,\n repo,\n number: current.prNumber,\n }),\n ]);\n const submittedReview = matchingSubmittedReview(current, login, reviews);\n if (submittedReview) {\n const submitted = submitPrReview(\n {\n reviewId: current.id,\n verdict: current.verdict,\n githubReviewUrl: submittedReview.url,\n },\n paths,\n );\n if (submitted) {\n return { outcome: 'submitted' as const, review: submitted };\n }\n const settled = readPrReview(current.id, paths);\n if (settled?.status === 'submitted') {\n return { outcome: 'submitted' as const, review: settled };\n }\n throw new Error('Could not settle the recovered GitHub review locally.');\n }\n\n const now = (dependencies.now ?? Date.now)();\n const reservedAt = Date.parse(current.updatedAt);\n if (\n Number.isFinite(reservedAt) &&\n now - reservedAt < submissionReconcileGraceMs\n ) {\n return { outcome: 'pending' as const, review: current };\n }\n\n const released = releasePrReviewSubmission(\n { reviewId: current.id, headSha: current.headSha },\n paths,\n );\n if (released) return { outcome: 'ready' as const, review: released };\n const settled = readPrReview(current.id, paths);\n if (settled) return { outcome: 'unchanged' as const, review: settled };\n throw new Error('Could not release the interrupted submission locally.');\n}\n\nexport function recentPrReviews(paths = runtimePaths()) {\n const submittedSince = new Date(\n Date.now() - 7 * 24 * 60 * 60 * 1000,\n ).toISOString();\n return listPrReviews(paths, { submittedSince });\n}\n\nfunction matchingSubmittedReview(\n current: PrReviewRecord,\n login: string,\n reviews: GitHubPullRequestReview[],\n) {\n const reservedAt = Date.parse(current.updatedAt);\n const earliestSubmittedAt = Number.isFinite(reservedAt)\n ? Math.floor(reservedAt / 1_000) * 1_000\n : 0;\n const expectedState = githubReviewState(current.verdict);\n return reviews\n .filter((review) => {\n const submittedAt = review.submittedAt\n ? Date.parse(review.submittedAt)\n : Number.NaN;\n return (\n review.authorLogin?.toLowerCase() === login.toLowerCase() &&\n review.commitId === current.headSha &&\n review.state === expectedState &&\n Number.isFinite(submittedAt) &&\n submittedAt >= earliestSubmittedAt\n );\n })\n .sort(\n (left, right) =>\n Date.parse(right.submittedAt ?? '') -\n Date.parse(left.submittedAt ?? ''),\n )[0];\n}\n\nfunction githubReviewState(verdict: PrReviewVerdict | null) {\n if (verdict === 'approve') return 'APPROVED';\n if (verdict === 'request-changes') return 'CHANGES_REQUESTED';\n return 'COMMENTED';\n}\n\nfunction splitRepoFullName(repoFullName: string): [string, string] {\n const [owner, repo, ...rest] = repoFullName.split('/');\n if (!owner || !repo || rest.length > 0) {\n throw new Error(`Invalid GitHub repository name: ${repoFullName}`);\n }\n return [owner, repo];\n}\n\nfunction upsertReviewingRecord(\n input: {\n ref: string;\n origin: PrReviewOrigin;\n target: PullRequestTarget;\n detail: GitHubPullRequestDetail;\n attemptId: string;\n },\n paths: RuntimePaths,\n) {\n const repoFullName = input.target.repoFullName.toLowerCase();\n const existing = readPrReviewForTarget(\n repoFullName,\n input.target.number,\n paths,\n );\n if (existing?.status === 'reviewing' || existing?.status === 'submitting') {\n throw new Error(\n `A review is already ${existing.status === 'submitting' ? 'being submitted' : 'in progress'} for ${repoFullName}#${input.target.number}.`,\n );\n }\n const id = existing?.id ?? randomUUID();\n const now = new Date().toISOString();\n const reviewUrl = reviewSurfaceUrl(repoFullName, input.target.number);\n const database = openDb(paths.neondeckDatabase);\n try {\n database\n .prepare(\n `INSERT INTO pr_reviews (\n id, ref, repo_full_name, pr_number, title, author, pr_url, status,\n attempt_id, run_id, head_sha, origin, review_url, report_ids_json,\n finding_count, seeded_count, report_only_count,\n report_only_findings_json, trust_boundary, verdict,\n previous_verdict, github_review_url, failure_message,\n created_at, updated_at, ready_at, submitted_at, failed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'reviewing', ?, NULL, ?, ?, ?, '[]',\n 0, 0, 0, '[]', ?, NULL, ?, NULL, NULL, ?, ?, NULL, NULL, NULL)\n ON CONFLICT(repo_full_name, pr_number) DO UPDATE SET\n ref = excluded.ref,\n title = excluded.title,\n author = excluded.author,\n pr_url = excluded.pr_url,\n status = 'reviewing',\n attempt_id = excluded.attempt_id,\n run_id = NULL,\n head_sha = excluded.head_sha,\n origin = excluded.origin,\n review_url = excluded.review_url,\n report_ids_json = '[]',\n finding_count = 0,\n seeded_count = 0,\n report_only_count = 0,\n report_only_findings_json = '[]',\n verdict = NULL,\n previous_verdict = CASE\n WHEN pr_reviews.verdict IS NOT NULL THEN pr_reviews.verdict\n ELSE pr_reviews.previous_verdict\n END,\n github_review_url = NULL,\n failure_message = NULL,\n ready_at = NULL,\n submitted_at = NULL,\n failed_at = NULL,\n updated_at = excluded.updated_at;`,\n )\n .run(\n id,\n input.ref,\n repoFullName,\n input.target.number,\n input.detail.title,\n input.detail.author ?? null,\n input.detail.url,\n input.attemptId,\n input.detail.headSha,\n input.origin,\n reviewUrl,\n prReviewTrustBoundary,\n existing?.verdict ?? existing?.previousVerdict ?? null,\n existing?.createdAt ?? now,\n now,\n );\n } finally {\n database.close();\n }\n return requireReview(id, paths);\n}\n\nexport function attachPrReviewAttemptRun(\n id: string,\n attemptId: string,\n runId: string,\n paths: RuntimePaths,\n) {\n const now = new Date().toISOString();\n const database = openDb(paths.neondeckDatabase);\n try {\n const result = database\n .prepare(\n `UPDATE pr_reviews SET run_id = ?, updated_at = ?\n WHERE id = ? AND attempt_id = ? AND run_id IS NULL;`,\n )\n .run(runId, now, id, attemptId);\n if (result.changes === 1) {\n const updated = requireReview(id, paths);\n publish(updated, 'changed');\n return updated;\n }\n const row = database\n .prepare(\n `SELECT run_id FROM pr_reviews\n WHERE id = ? AND attempt_id = ? LIMIT 1;`,\n )\n .get(id, attemptId) as { run_id?: unknown } | undefined;\n if (row?.run_id !== runId) return null;\n } finally {\n database.close();\n }\n return requireReview(id, paths);\n}\n\nasync function defaultResolveTarget(ref: string, paths: RuntimePaths) {\n const resolved = await resolvePullRequestTarget(\n { ref },\n paths,\n 'pr_review_start',\n );\n if (!resolved.ok) throw new Error(resolved.result.message);\n return resolved.target;\n}\n\nasync function defaultFetchDetail(target: PullRequestTarget) {\n const token = process.env.GITHUB_TOKEN;\n if (!token) throw new Error('GITHUB_TOKEN is not configured.');\n return fetchPullRequestDetail({\n token,\n owner: target.owner,\n repo: target.repo,\n number: target.number,\n });\n}\n\nfunction findReviewTransition(\n input: { reviewId?: string; attemptId?: string; runId?: string },\n paths: RuntimePaths,\n) {\n if (input.attemptId && input.reviewId) {\n const current = readPrReview(input.reviewId, paths);\n return current\n ? { current, column: 'attempt_id' as const, value: input.attemptId }\n : null;\n }\n if (input.runId) {\n const current = readPrReviewByRunId(input.runId, paths);\n return current\n ? { current, column: 'run_id' as const, value: input.runId }\n : null;\n }\n return null;\n}\n\nfunction requireReview(id: string, paths: RuntimePaths) {\n const review = readPrReview(id, paths);\n if (!review) throw new Error(`PR review record ${id} was not found.`);\n return review;\n}\n\nfunction publish(review: PrReviewRecord, action: 'created' | 'changed') {\n publishPrReviewEvent({\n id: review.id,\n action,\n review,\n changedAt: review.updatedAt,\n });\n}\n\nfunction reviewSurfaceUrl(repoFullName: string, prNumber: number) {\n const params = new URLSearchParams({\n repo: repoFullName,\n number: String(prNumber),\n });\n return `/review?${params.toString()}`;\n}\n\nfunction errorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { t as prepare_pr_worktree_default } from "./prepare-pr-worktree-C7SmiaTp.js";
2
+ export { prepare_pr_worktree_default as default };
@@ -0,0 +1,17 @@
1
+ import { to as __exportAll, x as preparePrWorktreeAction } from "./autopilot-B8lfWyA1.js";
2
+ import { t as display_assistant_default } from "./display-assistant-CKU4YJlc.js";
3
+ import { defineWorkflow } from "@flue/runtime";
4
+ //#region src/workflows/prepare-pr-worktree.ts
5
+ var prepare_pr_worktree_exports = /* @__PURE__ */ __exportAll({
6
+ default: () => prepare_pr_worktree_default,
7
+ runs: () => runs
8
+ });
9
+ var runs = async (_c, next) => next();
10
+ var prepare_pr_worktree_default = defineWorkflow({
11
+ agent: display_assistant_default,
12
+ action: preparePrWorktreeAction
13
+ });
14
+ //#endregion
15
+ export { prepare_pr_worktree_exports as n, runs as r, prepare_pr_worktree_default as t };
16
+
17
+ //# sourceMappingURL=prepare-pr-worktree-C7SmiaTp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-pr-worktree-C7SmiaTp.js","names":[],"sources":["../../src/workflows/prepare-pr-worktree.ts"],"sourcesContent":["import { defineWorkflow, type WorkflowRunsHandler } from '@flue/runtime';\nimport displayAssistant from '../agents/display-assistant';\nimport { preparePrWorktreeAction } from '../modules/autopilot';\n\nexport const runs: WorkflowRunsHandler = async (_c, next) => next();\n\nexport default defineWorkflow({\n agent: displayAssistant,\n action: preparePrWorktreeAction,\n});\n"],"mappings":";;;;;;;;AAIA,IAAa,OAA4B,OAAO,IAAI,SAAS,KAAK;AAElE,IAAA,8BAAe,eAAe;CAC5B,OAAO;CACP,QAAQ;AACV,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { S as pushPrAutofixAction, to as __exportAll } from "./autopilot-B8lfWyA1.js";
2
+ import { t as display_assistant_default } from "./display-assistant-CKU4YJlc.js";
3
+ import { defineWorkflow } from "@flue/runtime";
4
+ //#region src/workflows/push-pr-autofix.ts
5
+ var push_pr_autofix_exports = /* @__PURE__ */ __exportAll({
6
+ default: () => push_pr_autofix_default,
7
+ runs: () => runs
8
+ });
9
+ var runs = async (_c, next) => next();
10
+ var push_pr_autofix_default = defineWorkflow({
11
+ agent: display_assistant_default,
12
+ action: pushPrAutofixAction
13
+ });
14
+ //#endregion
15
+ export { push_pr_autofix_exports as n, runs as r, push_pr_autofix_default as t };
16
+
17
+ //# sourceMappingURL=push-pr-autofix-CsMbrnXR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-pr-autofix-CsMbrnXR.js","names":[],"sources":["../../src/workflows/push-pr-autofix.ts"],"sourcesContent":["import { defineWorkflow, type WorkflowRunsHandler } from '@flue/runtime';\nimport displayAssistant from '../agents/display-assistant';\nimport { pushPrAutofixAction } from '../modules/autopilot';\n\nexport const runs: WorkflowRunsHandler = async (_c, next) => next();\n\nexport default defineWorkflow({\n agent: displayAssistant,\n action: pushPrAutofixAction,\n});\n"],"mappings":";;;;;;;;AAIA,IAAa,OAA4B,OAAO,IAAI,SAAS,KAAK;AAElE,IAAA,0BAAe,eAAe;CAC5B,OAAO;CACP,QAAQ;AACV,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { t as push_pr_autofix_default } from "./push-pr-autofix-CsMbrnXR.js";
2
+ export { push_pr_autofix_default as default };
@@ -0,0 +1,2 @@
1
+ import { t as review_pr_for_human_default } from "./review-pr-for-human-TPiQNRWV.js";
2
+ export { review_pr_for_human_default as default };