issue-flow 0.17.0 → 0.19.1

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 (239) hide show
  1. package/README.md +34 -100
  2. package/dist/agent-EWKA7357.js +32 -0
  3. package/dist/{analyze-6M3KEOX7.js → analyze-Z7ODC27F.js} +42 -41
  4. package/dist/analyze-Z7ODC27F.js.map +1 -0
  5. package/dist/{apply-ADB3ZK7W.js → apply-VNSWQS6O.js} +22 -24
  6. package/dist/apply-VNSWQS6O.js.map +1 -0
  7. package/dist/artifacts-AMJQJFFV.js +82 -0
  8. package/dist/artifacts-AMJQJFFV.js.map +1 -0
  9. package/dist/{bench-FM7I7EIV.js → bench-ZJEIACUK.js} +42 -42
  10. package/dist/{chunk-RYOUZ6EK.js → chunk-23VHVVKW.js} +3 -3
  11. package/dist/chunk-2EYLOS5I.js +99 -0
  12. package/dist/chunk-2EYLOS5I.js.map +1 -0
  13. package/dist/{chunk-ANI2NTR4.js → chunk-2EZW4X57.js} +28 -25
  14. package/dist/chunk-2EZW4X57.js.map +1 -0
  15. package/dist/{chunk-E6KXCV3T.js → chunk-2Q6PG3MT.js} +15 -15
  16. package/dist/chunk-2Q6PG3MT.js.map +1 -0
  17. package/dist/{chunk-C5TL7T4V.js → chunk-2YM2VH6R.js} +2 -2
  18. package/dist/{chunk-LPWPFIIB.js → chunk-2YYP7AE6.js} +14 -16
  19. package/dist/{chunk-LPWPFIIB.js.map → chunk-2YYP7AE6.js.map} +1 -1
  20. package/dist/chunk-3JD25HHJ.js +278 -0
  21. package/dist/chunk-3JD25HHJ.js.map +1 -0
  22. package/dist/{chunk-ISZ54SVE.js → chunk-46S7APLQ.js} +41 -17
  23. package/dist/chunk-46S7APLQ.js.map +1 -0
  24. package/dist/chunk-6AOZCWN2.js +21 -0
  25. package/dist/chunk-6AOZCWN2.js.map +1 -0
  26. package/dist/{chunk-QPGEFLMY.js → chunk-7CMVL4X6.js} +7 -7
  27. package/dist/chunk-7MJGYPHF.js +1571 -0
  28. package/dist/chunk-7MJGYPHF.js.map +1 -0
  29. package/dist/chunk-7ZZUSMBJ.js +35 -0
  30. package/dist/chunk-7ZZUSMBJ.js.map +1 -0
  31. package/dist/{chunk-DUS5ZNKL.js → chunk-DIMDAYZS.js} +7 -6
  32. package/dist/{chunk-DGRTJD5R.js → chunk-DXH4TQRB.js} +7 -7
  33. package/dist/{chunk-CRGIQFUQ.js → chunk-E2H3JV2E.js} +3 -1
  34. package/dist/chunk-E2H3JV2E.js.map +1 -0
  35. package/dist/{chunk-YUNBOUQH.js → chunk-ERAG5IQB.js} +8 -8
  36. package/dist/{chunk-D6ZBGJ3L.js → chunk-F2NFJ27Z.js} +130 -36
  37. package/dist/chunk-F2NFJ27Z.js.map +1 -0
  38. package/dist/{chunk-SOM4QA6C.js → chunk-GD7JZMSJ.js} +93 -18
  39. package/dist/chunk-GD7JZMSJ.js.map +1 -0
  40. package/dist/{chunk-YII4U7ZD.js → chunk-HEHHQU4G.js} +70 -81
  41. package/dist/chunk-HEHHQU4G.js.map +1 -0
  42. package/dist/{chunk-KZ5EY5XX.js → chunk-HHXWAWU6.js} +159 -114
  43. package/dist/chunk-HHXWAWU6.js.map +1 -0
  44. package/dist/{chunk-SGTTR4XW.js → chunk-HWWB22HC.js} +152 -100
  45. package/dist/chunk-HWWB22HC.js.map +1 -0
  46. package/dist/chunk-IMB6FA2F.js +673 -0
  47. package/dist/chunk-IMB6FA2F.js.map +1 -0
  48. package/dist/{chunk-6YQT3SSM.js → chunk-IQYXXFRC.js} +22 -6
  49. package/dist/chunk-IQYXXFRC.js.map +1 -0
  50. package/dist/chunk-J6VJ5M2U.js +1201 -0
  51. package/dist/chunk-J6VJ5M2U.js.map +1 -0
  52. package/dist/{chunk-B3TSS7BT.js → chunk-KDQRNVBZ.js} +3 -3
  53. package/dist/{chunk-A4H7P7T7.js → chunk-LRWIP7QS.js} +41 -26
  54. package/dist/chunk-LRWIP7QS.js.map +1 -0
  55. package/dist/{chunk-DV7HUC4Z.js → chunk-LYC57OXF.js} +20 -117
  56. package/dist/chunk-LYC57OXF.js.map +1 -0
  57. package/dist/{chunk-HAKDLR6N.js → chunk-MAJ6QDRL.js} +65 -78
  58. package/dist/chunk-MAJ6QDRL.js.map +1 -0
  59. package/dist/{chunk-HJBF4WD2.js → chunk-MHA7Q3KU.js} +288 -108
  60. package/dist/chunk-MHA7Q3KU.js.map +1 -0
  61. package/dist/{chunk-UK4E2FUA.js → chunk-MQTVMB7W.js} +103 -76
  62. package/dist/chunk-MQTVMB7W.js.map +1 -0
  63. package/dist/chunk-NP47HRX2.js +136 -0
  64. package/dist/chunk-NP47HRX2.js.map +1 -0
  65. package/dist/{chunk-MI5TREN3.js → chunk-NYDAHE3Y.js} +52 -46
  66. package/dist/chunk-NYDAHE3Y.js.map +1 -0
  67. package/dist/{chunk-UWDCIFTP.js → chunk-P7ZYOC23.js} +41 -57
  68. package/dist/chunk-P7ZYOC23.js.map +1 -0
  69. package/dist/{chunk-3R27MJ5R.js → chunk-PFWHHYEO.js} +3 -3
  70. package/dist/{chunk-2SUFAE6X.js → chunk-PHPAK2L6.js} +44 -33
  71. package/dist/{chunk-2SUFAE6X.js.map → chunk-PHPAK2L6.js.map} +1 -1
  72. package/dist/{chunk-PPZ3K4YM.js → chunk-PRGPSNGA.js} +2 -2
  73. package/dist/{chunk-32JSYXEK.js → chunk-RGFMQFX7.js} +9 -23
  74. package/dist/{chunk-32JSYXEK.js.map → chunk-RGFMQFX7.js.map} +1 -1
  75. package/dist/{chunk-YVPZUN6X.js → chunk-TJVX42KY.js} +335 -38
  76. package/dist/chunk-TJVX42KY.js.map +1 -0
  77. package/dist/{chunk-RCZJQUTC.js → chunk-UDRAD7MF.js} +60 -27
  78. package/dist/chunk-UDRAD7MF.js.map +1 -0
  79. package/dist/{chunk-HY5HLFDU.js → chunk-UHDXXLYH.js} +148 -135
  80. package/dist/chunk-UHDXXLYH.js.map +1 -0
  81. package/dist/{chunk-RNFUVKC3.js → chunk-UPAAZU4W.js} +30 -13
  82. package/dist/chunk-UPAAZU4W.js.map +1 -0
  83. package/dist/{chunk-L6HSKTQE.js → chunk-W7LZLJAF.js} +4 -4
  84. package/dist/{chunk-HLAPOUEM.js → chunk-WB2FVIUS.js} +44 -12
  85. package/dist/chunk-WB2FVIUS.js.map +1 -0
  86. package/dist/{chunk-VE3IYNDN.js → chunk-WPHC6JBR.js} +9 -9
  87. package/dist/chunk-WPHC6JBR.js.map +1 -0
  88. package/dist/{chunk-KZXQWC7U.js → chunk-XHCP6ZNO.js} +201 -64
  89. package/dist/chunk-XHCP6ZNO.js.map +1 -0
  90. package/dist/{chunk-7F7LGMVO.js → chunk-XKR3VD2Z.js} +12 -12
  91. package/dist/{chunk-7F7LGMVO.js.map → chunk-XKR3VD2Z.js.map} +1 -1
  92. package/dist/{chunk-ICM463EO.js → chunk-XNK5UN2D.js} +5 -649
  93. package/dist/chunk-XNK5UN2D.js.map +1 -0
  94. package/dist/{chunk-Z5O2XBWA.js → chunk-XQLNZW7I.js} +40 -30
  95. package/dist/chunk-XQLNZW7I.js.map +1 -0
  96. package/dist/{chunk-QMIQR7EE.js → chunk-ZAYATXJD.js} +32 -316
  97. package/dist/chunk-ZAYATXJD.js.map +1 -0
  98. package/dist/cli.js +128 -60
  99. package/dist/cli.js.map +1 -1
  100. package/dist/compat-YPDZB34U.js +24 -0
  101. package/dist/{config-KGZUPAUP.js → config-56B4OHZE.js} +20 -17
  102. package/dist/{contract-JH2WBIO6.js → contract-HWLFFL3F.js} +2 -2
  103. package/dist/{conventions-RYN7OXJN.js → conventions-DW2CM5I3.js} +20 -16
  104. package/dist/{conventions-RYN7OXJN.js.map → conventions-DW2CM5I3.js.map} +1 -1
  105. package/dist/db-5NU77PJA.js +264 -0
  106. package/dist/db-5NU77PJA.js.map +1 -0
  107. package/dist/diagnostics-UCTS2VUF.js +25 -0
  108. package/dist/execute-R7AVOLNG.js +38 -0
  109. package/dist/{generate-CX6KNHZS.js → generate-O7GUXLN4.js} +46 -43
  110. package/dist/generate-O7GUXLN4.js.map +1 -0
  111. package/dist/{git-A2IP32PQ.js → git-LCG45YXD.js} +2 -3
  112. package/dist/history-6GSURU3H.js +101 -0
  113. package/dist/history-6GSURU3H.js.map +1 -0
  114. package/dist/init-DD6DBRC5.js +28 -0
  115. package/dist/{operations-CAKIT2BO.js → operations-HU5ZFEBA.js} +78 -52
  116. package/dist/operations-HU5ZFEBA.js.map +1 -0
  117. package/dist/{permissions-G4XCAESF.js → permissions-NNNSRC4P.js} +5 -6
  118. package/dist/plan-XR6B7EM3.js +38 -0
  119. package/dist/{policy-WX6O2JID.js → policy-RFJOJQL6.js} +17 -15
  120. package/dist/{policy-WX6O2JID.js.map → policy-RFJOJQL6.js.map} +1 -1
  121. package/dist/pr-OSCNJCOO.js +42 -0
  122. package/dist/pr-review-IKIYHFBO.js +33 -0
  123. package/dist/prd-HFDZJJQR.js +37 -0
  124. package/dist/{ps-76L6ZAZL.js → ps-AKRHGPSR.js} +26 -15
  125. package/dist/ps-AKRHGPSR.js.map +1 -0
  126. package/dist/{recorder-N7U66HCO.js → recorder-T7426CKV.js} +11 -7
  127. package/dist/registry-DWRKD65A.js +17 -0
  128. package/dist/repository-TABBRW2C.js +80 -0
  129. package/dist/resume-GDXKK5XP.js +278 -0
  130. package/dist/resume-GDXKK5XP.js.map +1 -0
  131. package/dist/review-JJHMQA2O.js +38 -0
  132. package/dist/routing-FPNUVE7T.js +35 -0
  133. package/dist/run-RLCURLLL.js +61 -0
  134. package/dist/{session-publisher-KAJQRHNZ.js → session-publisher-Q5TNEZPX.js} +3 -3
  135. package/dist/session-publisher-Q5TNEZPX.js.map +1 -0
  136. package/dist/{state-manager-UPHO2EA2.js → state-manager-IGNTD4AB.js} +9 -4
  137. package/dist/state-manager-IGNTD4AB.js.map +1 -0
  138. package/dist/{usage-U7QNGCPK.js → usage-XW27AL5K.js} +69 -63
  139. package/dist/usage-XW27AL5K.js.map +1 -0
  140. package/dist/web-NCDBVZ5Y.js +205 -0
  141. package/dist/web-NCDBVZ5Y.js.map +1 -0
  142. package/package.json +20 -7
  143. package/prompts/analyze.md +16 -19
  144. package/prompts/execute.md +73 -144
  145. package/prompts/generate.md +23 -10
  146. package/prompts/plan.md +32 -60
  147. package/prompts/pr-review.md +58 -40
  148. package/prompts/pr.md +50 -16
  149. package/prompts/prd.md +26 -19
  150. package/prompts/review.md +41 -18
  151. package/web/AGENTS.md +115 -7
  152. package/web/public/app.css +393 -245
  153. package/web/public/app.js +212 -143
  154. package/web/public/index.html +106 -78
  155. package/dist/agent-TB6W7PT7.js +0 -30
  156. package/dist/analyze-6M3KEOX7.js.map +0 -1
  157. package/dist/apply-ADB3ZK7W.js.map +0 -1
  158. package/dist/chunk-6YQT3SSM.js.map +0 -1
  159. package/dist/chunk-A4H7P7T7.js.map +0 -1
  160. package/dist/chunk-ANI2NTR4.js.map +0 -1
  161. package/dist/chunk-CRGIQFUQ.js.map +0 -1
  162. package/dist/chunk-D6ZBGJ3L.js.map +0 -1
  163. package/dist/chunk-DV7HUC4Z.js.map +0 -1
  164. package/dist/chunk-E6KXCV3T.js.map +0 -1
  165. package/dist/chunk-HAKDLR6N.js.map +0 -1
  166. package/dist/chunk-HJBF4WD2.js.map +0 -1
  167. package/dist/chunk-HLAPOUEM.js.map +0 -1
  168. package/dist/chunk-HY5HLFDU.js.map +0 -1
  169. package/dist/chunk-ICM463EO.js.map +0 -1
  170. package/dist/chunk-ISZ54SVE.js.map +0 -1
  171. package/dist/chunk-KZ5EY5XX.js.map +0 -1
  172. package/dist/chunk-KZXQWC7U.js.map +0 -1
  173. package/dist/chunk-MI5TREN3.js.map +0 -1
  174. package/dist/chunk-QMIQR7EE.js.map +0 -1
  175. package/dist/chunk-RCZJQUTC.js.map +0 -1
  176. package/dist/chunk-RNFUVKC3.js.map +0 -1
  177. package/dist/chunk-SGTTR4XW.js.map +0 -1
  178. package/dist/chunk-SOM4QA6C.js.map +0 -1
  179. package/dist/chunk-UK4E2FUA.js.map +0 -1
  180. package/dist/chunk-UWDCIFTP.js.map +0 -1
  181. package/dist/chunk-VE3IYNDN.js.map +0 -1
  182. package/dist/chunk-WCCZJL7W.js +0 -141
  183. package/dist/chunk-WCCZJL7W.js.map +0 -1
  184. package/dist/chunk-XEYH6ZZI.js +0 -289
  185. package/dist/chunk-XEYH6ZZI.js.map +0 -1
  186. package/dist/chunk-XZUEFTUP.js +0 -243
  187. package/dist/chunk-XZUEFTUP.js.map +0 -1
  188. package/dist/chunk-YII4U7ZD.js.map +0 -1
  189. package/dist/chunk-YVPZUN6X.js.map +0 -1
  190. package/dist/chunk-Z5O2XBWA.js.map +0 -1
  191. package/dist/diagnostics-HTCWF7F4.js +0 -23
  192. package/dist/execute-QL3ZQIAP.js +0 -37
  193. package/dist/generate-CX6KNHZS.js.map +0 -1
  194. package/dist/init-PDVQDRS6.js +0 -24
  195. package/dist/operations-CAKIT2BO.js.map +0 -1
  196. package/dist/plan-PRORGS3L.js +0 -34
  197. package/dist/pr-27RMQI5F.js +0 -39
  198. package/dist/pr-review-VNESMAMT.js +0 -32
  199. package/dist/prd-ZNC4T5BS.js +0 -33
  200. package/dist/ps-76L6ZAZL.js.map +0 -1
  201. package/dist/registry-XLHHYLTR.js +0 -15
  202. package/dist/resume-VLWIE264.js +0 -244
  203. package/dist/resume-VLWIE264.js.map +0 -1
  204. package/dist/review-7CREJDKB.js +0 -35
  205. package/dist/routing-VCDYHSXA.js +0 -33
  206. package/dist/run-3MPORLF5.js +0 -56
  207. package/dist/usage-U7QNGCPK.js.map +0 -1
  208. package/dist/web-HUNDHCJ4.js +0 -172
  209. package/dist/web-HUNDHCJ4.js.map +0 -1
  210. /package/dist/{agent-TB6W7PT7.js.map → agent-EWKA7357.js.map} +0 -0
  211. /package/dist/{bench-FM7I7EIV.js.map → bench-ZJEIACUK.js.map} +0 -0
  212. /package/dist/{chunk-RYOUZ6EK.js.map → chunk-23VHVVKW.js.map} +0 -0
  213. /package/dist/{chunk-C5TL7T4V.js.map → chunk-2YM2VH6R.js.map} +0 -0
  214. /package/dist/{chunk-QPGEFLMY.js.map → chunk-7CMVL4X6.js.map} +0 -0
  215. /package/dist/{chunk-DUS5ZNKL.js.map → chunk-DIMDAYZS.js.map} +0 -0
  216. /package/dist/{chunk-DGRTJD5R.js.map → chunk-DXH4TQRB.js.map} +0 -0
  217. /package/dist/{chunk-YUNBOUQH.js.map → chunk-ERAG5IQB.js.map} +0 -0
  218. /package/dist/{chunk-B3TSS7BT.js.map → chunk-KDQRNVBZ.js.map} +0 -0
  219. /package/dist/{chunk-3R27MJ5R.js.map → chunk-PFWHHYEO.js.map} +0 -0
  220. /package/dist/{chunk-PPZ3K4YM.js.map → chunk-PRGPSNGA.js.map} +0 -0
  221. /package/dist/{chunk-L6HSKTQE.js.map → chunk-W7LZLJAF.js.map} +0 -0
  222. /package/dist/{config-KGZUPAUP.js.map → compat-YPDZB34U.js.map} +0 -0
  223. /package/dist/{contract-JH2WBIO6.js.map → config-56B4OHZE.js.map} +0 -0
  224. /package/dist/{diagnostics-HTCWF7F4.js.map → contract-HWLFFL3F.js.map} +0 -0
  225. /package/dist/{execute-QL3ZQIAP.js.map → diagnostics-UCTS2VUF.js.map} +0 -0
  226. /package/dist/{git-A2IP32PQ.js.map → execute-R7AVOLNG.js.map} +0 -0
  227. /package/dist/{init-PDVQDRS6.js.map → git-LCG45YXD.js.map} +0 -0
  228. /package/dist/{permissions-G4XCAESF.js.map → init-DD6DBRC5.js.map} +0 -0
  229. /package/dist/{plan-PRORGS3L.js.map → permissions-NNNSRC4P.js.map} +0 -0
  230. /package/dist/{pr-27RMQI5F.js.map → plan-XR6B7EM3.js.map} +0 -0
  231. /package/dist/{pr-review-VNESMAMT.js.map → pr-OSCNJCOO.js.map} +0 -0
  232. /package/dist/{prd-ZNC4T5BS.js.map → pr-review-IKIYHFBO.js.map} +0 -0
  233. /package/dist/{recorder-N7U66HCO.js.map → prd-HFDZJJQR.js.map} +0 -0
  234. /package/dist/{registry-XLHHYLTR.js.map → recorder-T7426CKV.js.map} +0 -0
  235. /package/dist/{review-7CREJDKB.js.map → registry-DWRKD65A.js.map} +0 -0
  236. /package/dist/{routing-VCDYHSXA.js.map → repository-TABBRW2C.js.map} +0 -0
  237. /package/dist/{run-3MPORLF5.js.map → review-JJHMQA2O.js.map} +0 -0
  238. /package/dist/{session-publisher-KAJQRHNZ.js.map → routing-FPNUVE7T.js.map} +0 -0
  239. /package/dist/{state-manager-UPHO2EA2.js.map → run-RLCURLLL.js.map} +0 -0
@@ -1,108 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/agents/types.ts
4
- var AGENT_PHASES = [
5
- "analyze",
6
- "generate",
7
- "prd",
8
- "plan",
9
- "execute",
10
- "review",
11
- "pr",
12
- "pr-review"
13
- ];
14
- function isAgentPhase(value) {
15
- return AGENT_PHASES.includes(value);
16
- }
17
- function isAgentProviderId(value) {
18
- return value === "claude" || value === "codex" || value === "cursor" || value === "antigravity";
19
- }
20
- var CLAUDE_CAPABILITIES = {
21
- extraDirectories: "flag",
22
- addDirs: true,
23
- toolAllowlist: true,
24
- maxTurns: true,
25
- osSandbox: false,
26
- modelSelection: true,
27
- modelDiscovery: false,
28
- usage: "tokens-and-cost",
29
- reportsUsage: true,
30
- reportsCost: true,
31
- sessionResume: false,
32
- authProbe: "none",
33
- bareModelAliases: true,
34
- promptChannel: "both",
35
- nativeTimeout: false,
36
- contextFileName: "CLAUDE.md",
37
- contextFileMaxBytes: null,
38
- toolNameCase: "CamelCase",
39
- readOnlyMode: "native"
40
- };
41
- var CODEX_CAPABILITIES = {
42
- extraDirectories: "flag",
43
- addDirs: true,
44
- toolAllowlist: false,
45
- maxTurns: false,
46
- osSandbox: true,
47
- modelSelection: true,
48
- modelDiscovery: false,
49
- usage: "tokens-only",
50
- reportsUsage: true,
51
- reportsCost: false,
52
- sessionResume: true,
53
- authProbe: "exit-code",
54
- bareModelAliases: false,
55
- promptChannel: "both",
56
- nativeTimeout: false,
57
- contextFileName: "AGENTS.md",
58
- contextFileMaxBytes: 32 * 1024,
59
- toolNameCase: "none",
60
- readOnlyMode: "sandbox"
61
- };
62
- var CURSOR_CAPABILITIES = {
63
- extraDirectories: "permission-file",
64
- addDirs: false,
65
- toolAllowlist: false,
66
- maxTurns: false,
67
- osSandbox: true,
68
- modelSelection: true,
69
- modelDiscovery: true,
70
- usage: "none",
71
- reportsUsage: false,
72
- reportsCost: false,
73
- sessionResume: true,
74
- authProbe: "text",
75
- bareModelAliases: false,
76
- promptChannel: "argv",
77
- nativeTimeout: false,
78
- contextFileName: "AGENTS.md",
79
- contextFileMaxBytes: null,
80
- toolNameCase: "lowercase",
81
- readOnlyMode: "native"
82
- };
83
- var ANTIGRAVITY_CAPABILITIES = {
84
- extraDirectories: "flag",
85
- addDirs: true,
86
- toolAllowlist: false,
87
- maxTurns: false,
88
- osSandbox: true,
89
- modelSelection: true,
90
- modelDiscovery: true,
91
- usage: "tokens-only",
92
- reportsUsage: true,
93
- reportsCost: false,
94
- sessionResume: true,
95
- authProbe: "none",
96
- bareModelAliases: false,
97
- promptChannel: "argv",
98
- nativeTimeout: true,
99
- contextFileName: "AGENTS.md",
100
- contextFileMaxBytes: null,
101
- toolNameCase: "CamelCase",
102
- readOnlyMode: "native"
103
- };
104
- var AGENT_SCHEMA_VERSION = 1;
105
-
106
3
  // src/schemas.ts
107
4
  import { z as z2 } from "zod";
108
5
 
@@ -409,6 +306,8 @@ var executionRecordSchema = z2.object({
409
306
  }).nullable().optional()
410
307
  });
411
308
  var taskPlanSchema = z2.object({
309
+ closeIssue: z2.boolean().optional(),
310
+ issueClosedAt: z2.string().optional(),
412
311
  project: z2.string(),
413
312
  issueNumber: z2.union([z2.number().int().positive(), z2.string().min(1)]),
414
313
  issueUrl: z2.string().optional().default(""),
@@ -756,538 +655,10 @@ var routingConfigSchema = z2.object({
756
655
  })
757
656
  });
758
657
 
759
- // src/storage/lock.ts
760
- import { mkdir, readFile, rm, writeFile } from "fs/promises";
761
- import { hostname } from "os";
762
- import { dirname } from "path";
763
-
764
- // src/storage/schemas.ts
765
- import { z as z4 } from "zod";
766
-
767
- // src/agents/schemas.ts
768
- import { z as z3 } from "zod";
769
- var agentProviderIdSchema = z3.enum(["claude", "codex", "cursor", "antigravity"]);
770
- var codexSandboxSchema = z3.enum(["read-only", "workspace-write", "danger-full-access"]);
771
- var codexReasoningEffortSchema = z3.enum(["minimal", "low", "medium", "high", "xhigh"]);
772
- var claudeSettingsSchema = z3.object({
773
- ignoreUserConfig: z3.boolean(),
774
- strictMcpConfig: z3.boolean()
775
- }).partial();
776
- var codexSettingsSchema = z3.object({
777
- reasoningEffort: codexReasoningEffortSchema,
778
- sandbox: codexSandboxSchema,
779
- ignoreUserConfig: z3.boolean(),
780
- skipGitRepoCheck: z3.boolean(),
781
- configOverrides: z3.record(z3.string(), z3.union([z3.string(), z3.number(), z3.boolean()]))
782
- }).partial();
783
- var cursorSandboxSchema = z3.enum(["enabled", "disabled"]);
784
- var cursorPermissionsFileSchema = z3.enum(["global", "project", "none"]);
785
- var cursorSettingsSchema = z3.object({
786
- sandbox: cursorSandboxSchema,
787
- approveMcps: z3.boolean(),
788
- permissionsFile: cursorPermissionsFileSchema,
789
- minVersion: z3.string().min(1),
790
- force: z3.boolean().refine((value) => value !== false, {
791
- message: "agent.cursor.force cannot be false: without --force, Cursor finishes with exit 0 and writes nothing."
792
- })
793
- }).partial();
794
- var antigravityEffortSchema = z3.enum(["low", "medium", "high"]);
795
- var antigravitySettingsSchema = z3.object({
796
- effort: antigravityEffortSchema,
797
- sandbox: z3.boolean(),
798
- executeTimeout: z3.union([z3.number().int(), z3.string().min(1), z3.null()]),
799
- maxPromptBytes: z3.number().int().positive(),
800
- minVersion: z3.string().min(1),
801
- skipPermissions: z3.boolean().refine((value) => value !== false, {
802
- message: "agent.antigravity.skipPermissions cannot be false: without --dangerously-skip-permissions, Antigravity finishes SUCCESS and writes nothing."
803
- })
804
- }).partial();
805
- var agentBlockSchema = z3.object({
806
- provider: agentProviderIdSchema,
807
- model: z3.string().min(1).nullable(),
808
- claude: claudeSettingsSchema,
809
- codex: codexSettingsSchema,
810
- cursor: cursorSettingsSchema,
811
- antigravity: antigravitySettingsSchema
812
- }).partial();
813
- var agentPhasesSchema = z3.object({
814
- analyze: agentBlockSchema,
815
- generate: agentBlockSchema,
816
- prd: agentBlockSchema,
817
- plan: agentBlockSchema,
818
- execute: agentBlockSchema,
819
- review: agentBlockSchema,
820
- pr: agentBlockSchema,
821
- "pr-review": agentBlockSchema
822
- }).partial();
823
- var agentConfigInputSchema = z3.object({
824
- provider: agentProviderIdSchema,
825
- model: z3.string().min(1).nullable(),
826
- claude: claudeSettingsSchema,
827
- codex: codexSettingsSchema,
828
- cursor: cursorSettingsSchema,
829
- antigravity: antigravitySettingsSchema,
830
- phases: agentPhasesSchema
831
- }).partial();
832
- function parsePhasesInput(value, warn) {
833
- if (value === void 0 || value === null) return {};
834
- if (typeof value !== "object" || Array.isArray(value)) {
835
- warn('Ignoring "agent.phases": expected an object.');
836
- return {};
837
- }
838
- const result = {};
839
- for (const [key, raw] of Object.entries(value)) {
840
- if (!AGENT_PHASES.includes(key)) {
841
- warn(`Ignoring unknown agent phase "${key}".`);
842
- continue;
843
- }
844
- const parsed = agentBlockSchema.safeParse(raw);
845
- if (!parsed.success) {
846
- warn(`Ignoring agent.phases.${key}: ${parsed.error.issues[0]?.message ?? "invalid value"}.`);
847
- continue;
848
- }
849
- result[key] = parsed.data;
850
- }
851
- return result;
852
- }
853
-
854
- // src/storage/schemas.ts
855
- var STORAGE_SCHEMA_VERSION = 1;
856
- var userStoryNumberingSourceSchema = z4.enum(["history", "start-us", "none"]);
857
- var userStoryNumberingDecisionSchema = z4.object({
858
- /** The `US-NNN` number the `plan` prompt was told to continue from. */
859
- nextNumber: z4.number().int().positive(),
860
- source: userStoryNumberingSourceSchema,
861
- /** Issue the decision was made for. */
862
- issueNumber: z4.string().min(1),
863
- decidedAt: z4.string().min(1),
864
- /** Human-readable origin, e.g. the previous story id and issue it came from. */
865
- detail: z4.string().optional()
866
- });
867
- var projectMetadataSchema = z4.object({
868
- schemaVersion: z4.number().int().positive(),
869
- projectId: z4.string().min(1),
870
- root: z4.string().min(1),
871
- /** Normalized remote (`host/org/repo`), or null when the project has none. */
872
- remoteUrl: z4.string().nullable(),
873
- createdAt: z4.string().min(1),
874
- updatedAt: z4.string().min(1),
875
- /** Null until the project is used by a pipeline run. */
876
- lastAttemptAt: z4.string().nullable(),
877
- /**
878
- * Most recent User Story numbering decision made by `plan` (issue #36).
879
- * Absent on a project whose `plan` never ran through the numbering
880
- * resolver, or on a `metadata.json` written before the feature existed.
881
- */
882
- userStoryNumbering: userStoryNumberingDecisionSchema.optional()
883
- });
884
- var webShape = webConfigSchema.shape;
885
- var globalWebConfigSchema = z4.object({
886
- port: webShape.port.unwrap(),
887
- host: webShape.host.unwrap(),
888
- refreshSeconds: webShape.refreshSeconds.unwrap(),
889
- logLimit: webShape.logLimit.unwrap()
890
- }).partial();
891
- var globalRetryConfigSchema = z4.object({
892
- retryLimit: z4.number().int().nonnegative(),
893
- retryForever: z4.boolean(),
894
- backoffBaseSeconds: z4.number().nonnegative(),
895
- backoffMaxSeconds: z4.number().nonnegative()
896
- }).partial();
897
- var resilienceProfileSchema = z4.enum([
898
- "default",
899
- "continuous"
900
- ]);
901
- var jitterSchema = z4.enum(["none", "full"]);
902
- var failoverModeSchema = z4.enum([
903
- "never",
904
- "after_attempts",
905
- "immediate"
906
- ]);
907
- var exhaustedActionSchema = z4.enum(["fail", "block"]);
908
- var retryPolicyOverrideSchema = z4.object({
909
- maxAttempts: z4.number().int().nonnegative(),
910
- initialDelayMs: z4.number().nonnegative(),
911
- maxDelayMs: z4.number().nonnegative(),
912
- backoffFactor: z4.number().min(1),
913
- jitter: jitterSchema,
914
- retryForever: z4.boolean(),
915
- failover: failoverModeSchema,
916
- failoverAfterAttempts: z4.number().int().positive(),
917
- onExhausted: exhaustedActionSchema
918
- }).partial();
919
- var retryOverridesByKind = {
920
- network: retryPolicyOverrideSchema,
921
- timeout: retryPolicyOverrideSchema,
922
- stalled: retryPolicyOverrideSchema,
923
- rateLimit: retryPolicyOverrideSchema,
924
- providerDown: retryPolicyOverrideSchema,
925
- providerCrash: retryPolicyOverrideSchema,
926
- authentication: retryPolicyOverrideSchema,
927
- configuration: retryPolicyOverrideSchema,
928
- repositoryState: retryPolicyOverrideSchema,
929
- taskExecution: retryPolicyOverrideSchema,
930
- internal: retryPolicyOverrideSchema,
931
- unknown: retryPolicyOverrideSchema
932
- };
933
- var resilienceRetryConfigSchema = z4.object(retryOverridesByKind).partial();
934
- var resilienceProvidersConfigSchema = z4.object({
935
- failover: z4.boolean(),
936
- chain: z4.array(z4.string().min(1)),
937
- cooldownMs: z4.number().nonnegative(),
938
- maxCooldownMs: z4.number().nonnegative(),
939
- failureWindowMs: z4.number().positive(),
940
- failuresToTrip: z4.number().int().positive()
941
- }).partial();
942
- var providerHealthStatusSchema = z4.enum([
943
- "healthy",
944
- "degraded",
945
- "unavailable",
946
- "rate_limited",
947
- "auth_failed",
948
- "half_open"
949
- ]);
950
- var providerHealthRecordSchema = z4.object({
951
- status: providerHealthStatusSchema.default("healthy"),
952
- failures: z4.array(
953
- z4.object({
954
- at: z4.string(),
955
- kind: z4.enum([
956
- "network",
957
- "timeout",
958
- "stalled",
959
- "rate_limit",
960
- "provider_down",
961
- "provider_crash",
962
- "authentication",
963
- "configuration",
964
- "repository_state",
965
- "task_execution",
966
- "internal",
967
- "unknown"
968
- ])
969
- })
970
- ).default([]),
971
- consecutiveFailures: z4.number().int().nonnegative().default(0),
972
- cooldownLevel: z4.number().int().nonnegative().default(0),
973
- cooldownUntil: z4.string().nullable().default(null),
974
- lastFailureKind: z4.enum([
975
- "network",
976
- "timeout",
977
- "stalled",
978
- "rate_limit",
979
- "provider_down",
980
- "provider_crash",
981
- "authentication",
982
- "configuration",
983
- "repository_state",
984
- "task_execution",
985
- "internal",
986
- "unknown"
987
- ]).nullable().default(null),
988
- lastFailureAt: z4.string().nullable().default(null),
989
- lastSuccessAt: z4.string().nullable().default(null),
990
- probeInFlight: z4.boolean().default(false),
991
- probeStartedAt: z4.string().nullable().default(null)
992
- });
993
- var providersHealthSchema = z4.object({
994
- schemaVersion: z4.literal(1).default(1),
995
- providers: z4.record(z4.string(), providerHealthRecordSchema).default({})
996
- });
997
- var resilienceQueueConfigSchema = z4.object({
998
- onIssueFailure: z4.enum(["stop", "skip", "block"]),
999
- maxIssueAttempts: z4.number().int().positive()
1000
- }).partial();
1001
- var resilienceWatchdogConfigSchema = z4.object({
1002
- inactivityTimeoutMs: z4.number().int().nonnegative()
1003
- }).partial();
1004
- var resilienceJournalConfigSchema = z4.object({
1005
- enabled: z4.boolean(),
1006
- maxFileBytes: z4.number().int().positive()
1007
- }).partial();
1008
- var resilienceDecomposeConfigSchema = z4.object({
1009
- auto: z4.boolean()
1010
- }).partial();
1011
- var resilienceConfigSchema = z4.object({
1012
- profile: resilienceProfileSchema,
1013
- /** Whether a credential failure may migrate to another provider. */
1014
- failoverOnAuth: z4.boolean(),
1015
- retry: resilienceRetryConfigSchema,
1016
- providers: resilienceProvidersConfigSchema,
1017
- queue: resilienceQueueConfigSchema,
1018
- watchdog: resilienceWatchdogConfigSchema,
1019
- journal: resilienceJournalConfigSchema,
1020
- decompose: resilienceDecomposeConfigSchema
1021
- }).partial();
1022
- var telemetryPricingOverrideSchema = z4.object({
1023
- inputPerMillion: z4.number(),
1024
- outputPerMillion: z4.number(),
1025
- cacheReadPerMillion: z4.number(),
1026
- cacheWritePerMillion: z4.number()
1027
- }).partial();
1028
- var telemetryConfigInputSchema = z4.object({
1029
- enabled: z4.boolean(),
1030
- maxExecutions: z4.number().int().positive(),
1031
- pricing: z4.object({
1032
- estimate: z4.boolean(),
1033
- overrides: z4.record(z4.string(), telemetryPricingOverrideSchema)
1034
- }).partial()
1035
- }).partial();
1036
- var globalCommitConfigSchema = z4.object({
1037
- signoff: z4.boolean(),
1038
- conventional: z4.boolean()
1039
- }).partial();
1040
- var globalConfigSchema = z4.object({
1041
- schemaVersion: z4.number().int().positive(),
1042
- /** Override for the directory holding `projects/`. */
1043
- storageDir: z4.string().min(1),
1044
- web: globalWebConfigSchema,
1045
- retry: globalRetryConfigSchema,
1046
- commit: globalCommitConfigSchema,
1047
- resilience: resilienceConfigSchema,
1048
- agent: agentConfigInputSchema,
1049
- telemetry: telemetryConfigInputSchema,
1050
- routing: routingConfigInputSchema
1051
- }).partial();
1052
- var webLockSchema = z4.object({
1053
- pid: z4.number().int().positive(),
1054
- port: z4.number().int().positive(),
1055
- host: z4.string().min(1),
1056
- startedAt: z4.string().min(1),
1057
- /** Added in a backward-compatible way: locks from older releases remain valid. */
1058
- instanceId: z4.string().min(1).optional()
1059
- });
1060
- var runLockSchema = z4.object({
1061
- pid: z4.number().int().positive(),
1062
- /** `os.hostname()`. A pid only means something on the host that wrote it. */
1063
- host: z4.string().min(1),
1064
- /** The issue (or queue) identifier the owner is running. */
1065
- target: z4.string().min(1),
1066
- startedAt: z4.string().min(1),
1067
- lastHeartbeatAt: z4.string().min(1),
1068
- /** Absent on a foreground run written before this field existed. */
1069
- detached: z4.boolean().optional()
1070
- });
1071
- var executionPlanIssueSchema = z4.object({
1072
- id: z4.string().min(1),
1073
- number: z4.number().int().positive().nullable(),
1074
- title: z4.string(),
1075
- url: z4.string().nullable(),
1076
- source: z4.string().min(1),
1077
- position: z4.number().int().positive(),
1078
- // `blocked` and `skipped` are additive: no plan written before them can
1079
- // carry one, and a reader that does not know them was never given one.
1080
- status: z4.enum(["pending", "in_progress", "completed", "failed", "blocked", "skipped"]),
1081
- origin: z4.enum(["requested", "discovered"]),
1082
- role: z4.enum(["executable", "container"]).default("executable"),
1083
- externalDependencies: z4.array(z4.string()).default([]),
1084
- dependsOn: z4.array(z4.string()).default([]),
1085
- parent: z4.string().nullable().default(null),
1086
- priority: z4.enum(["high", "medium", "low"]).nullable().default(null),
1087
- heuristic: z4.boolean().default(false),
1088
- failedPhase: z4.string().nullable().default(null),
1089
- lastError: z4.object({ category: z4.string(), message: z4.string(), at: z4.string() }).nullable().default(null),
1090
- startedAt: z4.string().nullable().default(null),
1091
- completedAt: z4.string().nullable().default(null),
1092
- // Both default, so an execution-plan.json written by an earlier release
1093
- // parses unchanged and reads as "never attempted, not blocked".
1094
- attempts: z4.number().int().min(0).default(0),
1095
- blockedReason: z4.string().nullable().default(null)
1096
- });
1097
- var executionPlanSchema = z4.object({
1098
- schemaVersion: z4.literal(1),
1099
- id: z4.string().min(1),
1100
- project: z4.string().min(1),
1101
- requested: z4.array(z4.string().min(1)),
1102
- branchName: z4.string().nullable().default(null),
1103
- noBranch: z4.boolean().default(false),
1104
- prReview: z4.boolean().default(false),
1105
- status: z4.enum(["pending", "in_progress", "completed", "failed"]),
1106
- createdAt: z4.string().min(1),
1107
- updatedAt: z4.string().min(1),
1108
- truncated: z4.boolean().default(false),
1109
- issues: z4.array(executionPlanIssueSchema),
1110
- excluded: z4.array(
1111
- z4.object({
1112
- id: z4.string().min(1),
1113
- number: z4.number().int().positive().nullable(),
1114
- title: z4.string(),
1115
- url: z4.string().nullable(),
1116
- reason: z4.string()
1117
- })
1118
- ).default([]),
1119
- pullRequest: pullRequestRefSchema.optional()
1120
- });
1121
-
1122
- // src/storage/lock.ts
1123
- var RUN_LOCK_HEARTBEAT_MS = 1e4;
1124
- var RUN_LOCK_STALE_INTERVALS = 3;
1125
- var CLAIM_RETRIES = 3;
1126
- function isProcessAlive(pid) {
1127
- try {
1128
- process.kill(pid, 0);
1129
- return true;
1130
- } catch (err) {
1131
- return err.code === "EPERM";
1132
- }
1133
- }
1134
- async function readRunLock(lockFile) {
1135
- let raw;
1136
- try {
1137
- raw = await readFile(lockFile, "utf-8");
1138
- } catch {
1139
- return null;
1140
- }
1141
- try {
1142
- const result = runLockSchema.safeParse(JSON.parse(raw));
1143
- return result.success ? result.data : null;
1144
- } catch {
1145
- return null;
1146
- }
1147
- }
1148
- async function removeRunLock(lockFile) {
1149
- try {
1150
- await rm(lockFile, { force: true });
1151
- } catch {
1152
- }
1153
- }
1154
- function isRunLockStale(lock, options = {}) {
1155
- const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;
1156
- const staleIntervals = options.staleIntervals ?? RUN_LOCK_STALE_INTERVALS;
1157
- const now = (options.clock ?? Date.now)();
1158
- const host = options.host ?? hostname();
1159
- const beat = Date.parse(lock.lastHeartbeatAt);
1160
- const silent = Number.isNaN(beat) || now - beat > heartbeatMs * staleIntervals;
1161
- if (lock.host !== host) return silent;
1162
- return silent || !isProcessAlive(lock.pid);
1163
- }
1164
- function isSelf(lock, pid, host) {
1165
- return lock.pid === pid && lock.host === host;
1166
- }
1167
- function describeRunLockOwner(lock) {
1168
- return `pid ${lock.pid} on ${lock.host} (issue ${lock.target}, started ${lock.startedAt}, last heartbeat ${lock.lastHeartbeatAt})`;
1169
- }
1170
- async function touchRunLock(lockFile, lock, at) {
1171
- const next = { ...lock, lastHeartbeatAt: at };
1172
- try {
1173
- await writeFile(lockFile, `${JSON.stringify(next, null, 2)}
1174
- `, "utf-8");
1175
- } catch {
1176
- }
1177
- return next;
1178
- }
1179
- async function claim(lockFile, lock) {
1180
- try {
1181
- await mkdir(dirname(lockFile), { recursive: true });
1182
- await writeFile(lockFile, `${JSON.stringify(lock, null, 2)}
1183
- `, {
1184
- encoding: "utf-8",
1185
- flag: "wx"
1186
- });
1187
- return true;
1188
- } catch (err) {
1189
- if (err.code === "EEXIST") return false;
1190
- throw err;
1191
- }
1192
- }
1193
- async function acquireRunLock(lockFile, options) {
1194
- const pid = options.pid ?? process.pid;
1195
- const host = options.host ?? hostname();
1196
- const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;
1197
- const clock = options.clock ?? Date.now;
1198
- const staleness = {
1199
- heartbeatMs,
1200
- ...options.staleIntervals === void 0 ? {} : { staleIntervals: options.staleIntervals },
1201
- clock,
1202
- pid,
1203
- host
1204
- };
1205
- let reclaimedFrom = null;
1206
- for (let attempt = 0; attempt <= CLAIM_RETRIES; attempt++) {
1207
- const at = new Date(clock()).toISOString();
1208
- const mine = {
1209
- pid,
1210
- host,
1211
- target: options.target,
1212
- startedAt: at,
1213
- lastHeartbeatAt: at,
1214
- ...options.detached === true ? { detached: true } : {}
1215
- };
1216
- if (await claim(lockFile, mine)) {
1217
- return { ok: true, handle: startHandle(lockFile, mine, reclaimedFrom, options) };
1218
- }
1219
- const existing = await readRunLock(lockFile);
1220
- if (existing === null) {
1221
- await removeRunLock(lockFile);
1222
- continue;
1223
- }
1224
- if (isSelf(existing, pid, host)) {
1225
- return { ok: true, handle: nestedHandle(existing) };
1226
- }
1227
- if (!isRunLockStale(existing, staleness)) {
1228
- return { ok: false, owner: existing };
1229
- }
1230
- reclaimedFrom = existing;
1231
- try {
1232
- options.onTakeover?.(existing);
1233
- } catch {
1234
- }
1235
- await removeRunLock(lockFile);
1236
- }
1237
- const owner = await readRunLock(lockFile);
1238
- if (owner !== null) return { ok: false, owner };
1239
- return {
1240
- ok: false,
1241
- owner: {
1242
- pid: 0,
1243
- host,
1244
- target: options.target,
1245
- startedAt: new Date(clock()).toISOString(),
1246
- lastHeartbeatAt: new Date(clock()).toISOString()
1247
- }
1248
- };
1249
- }
1250
- function startHandle(lockFile, lock, reclaimedFrom, options) {
1251
- const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;
1252
- const clock = options.clock ?? Date.now;
1253
- let current = lock;
1254
- let timer = null;
1255
- if (options.heartbeat !== false) {
1256
- timer = setInterval(() => {
1257
- void touchRunLock(lockFile, current, new Date(clock()).toISOString()).then((next) => {
1258
- current = next;
1259
- });
1260
- }, heartbeatMs);
1261
- timer.unref();
1262
- }
1263
- return {
1264
- lock,
1265
- reclaimedFrom,
1266
- release: async () => {
1267
- if (timer !== null) {
1268
- clearInterval(timer);
1269
- timer = null;
1270
- }
1271
- await removeRunLock(lockFile);
1272
- }
1273
- };
1274
- }
1275
- function nestedHandle(lock) {
1276
- return { lock, reclaimedFrom: null, release: async () => {
1277
- } };
1278
- }
1279
-
1280
658
  export {
1281
- AGENT_PHASES,
1282
- isAgentPhase,
1283
- isAgentProviderId,
1284
- CLAUDE_CAPABILITIES,
1285
- CODEX_CAPABILITIES,
1286
- CURSOR_CAPABILITIES,
1287
- ANTIGRAVITY_CAPABILITIES,
1288
- AGENT_SCHEMA_VERSION,
1289
659
  policyConfigSchema,
1290
660
  policyConfigInputSchema,
661
+ pullRequestRefSchema,
1291
662
  issueMetadataSchema,
1292
663
  taskPlanSchema,
1293
664
  sessionSnapshotSchema,
@@ -1296,21 +667,6 @@ export {
1296
667
  prReviewConfigSchema,
1297
668
  verifyConfigSchema,
1298
669
  routingConfigInputSchema,
1299
- routingConfigSchema,
1300
- agentConfigInputSchema,
1301
- parsePhasesInput,
1302
- STORAGE_SCHEMA_VERSION,
1303
- projectMetadataSchema,
1304
- providersHealthSchema,
1305
- resilienceConfigSchema,
1306
- telemetryConfigInputSchema,
1307
- globalConfigSchema,
1308
- webLockSchema,
1309
- executionPlanSchema,
1310
- isProcessAlive,
1311
- readRunLock,
1312
- isRunLockStale,
1313
- describeRunLockOwner,
1314
- acquireRunLock
670
+ routingConfigSchema
1315
671
  };
1316
- //# sourceMappingURL=chunk-ICM463EO.js.map
672
+ //# sourceMappingURL=chunk-XNK5UN2D.js.map