@maycombhq/atticus 2.0.0-beta.22 → 2.0.0-beta.23

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 (279) hide show
  1. package/dist/bin.js +12 -7
  2. package/dist/{chunk-LYBNHMVZ.js → chunk-27AJAKX7.js} +3 -3
  3. package/dist/{chunk-KXITGYLF.js → chunk-2QPJ4E4Z.js} +2 -2
  4. package/dist/{chunk-EIPTLPFC.js → chunk-2UMSHYCB.js} +24 -24
  5. package/dist/{chunk-6PPOWY5E.js → chunk-2WUTCPPJ.js} +6 -6
  6. package/dist/{chunk-VNU26RCO.js → chunk-2YSD6E6V.js} +33 -32
  7. package/dist/{chunk-P32RUW3B.js → chunk-3424TLIJ.js} +39 -7
  8. package/dist/{chunk-2MMCFP5C.js → chunk-3ASYYMOX.js} +8 -8
  9. package/dist/{chunk-PKBHS4AA.js → chunk-3EWKO457.js} +48 -17
  10. package/dist/{chunk-J3IOLXWM.js → chunk-3EX5HCZD.js} +5 -5
  11. package/dist/{chunk-BDKC6H5P.js → chunk-3MYBT62N.js} +5 -5
  12. package/dist/{chunk-ZFL7NY4F.js → chunk-3UHV76UD.js} +69 -41
  13. package/dist/{chunk-Q4K5WB2W.js → chunk-3ZA3AK2D.js} +10 -10
  14. package/dist/{chunk-O7FDLW7L.js → chunk-4ETO2FXE.js} +5 -5
  15. package/dist/{chunk-AFWUDXEM.js → chunk-4FLNCK6Q.js} +26 -11
  16. package/dist/{chunk-745DAZ4L.js → chunk-4GAB5ZOZ.js} +901 -332
  17. package/dist/{chunk-3RM4UK6W.js → chunk-4MYHETJ3.js} +18 -18
  18. package/dist/chunk-4R3TO4VL.js +94 -0
  19. package/dist/chunk-5MYE42AP.js +43 -0
  20. package/dist/chunk-5O7U67UA.js +57 -0
  21. package/dist/{chunk-Y2EQNWKV.js → chunk-5OXKCH4Z.js} +31 -31
  22. package/dist/{chunk-O45HFTFS.js → chunk-5VTIWEWP.js} +2 -2
  23. package/dist/{chunk-UNAGJYET.js → chunk-63NFFAGI.js} +12 -12
  24. package/dist/{chunk-6ZJ5A7AF.js → chunk-66AQ2JIU.js} +9 -9
  25. package/dist/chunk-6JVPBGQG.js +50 -0
  26. package/dist/{chunk-VY72R2XZ.js → chunk-6NCPLIIP.js} +124 -2
  27. package/dist/{chunk-D73UEXYW.js → chunk-6NN36LVK.js} +3 -3
  28. package/dist/{chunk-7FTTA3HD.js → chunk-6R5VHR3N.js} +5 -5
  29. package/dist/{chunk-CADWLE2T.js → chunk-6RQOINER.js} +4 -4
  30. package/dist/{chunk-WG5U3F5V.js → chunk-6RYB3EET.js} +12 -12
  31. package/dist/{chunk-RXPJMEOW.js → chunk-6SNTHK43.js} +10 -10
  32. package/dist/{chunk-ZFFYNRIO.js → chunk-6Y4FXOMI.js} +24 -22
  33. package/dist/{chunk-SQV37XO2.js → chunk-6ZFF7XSL.js} +6 -6
  34. package/dist/{chunk-JA5FI3QV.js → chunk-6ZSYLZ7O.js} +3 -3
  35. package/dist/{chunk-JENSEMXF.js → chunk-73CC73I4.js} +1 -1
  36. package/dist/{chunk-2F4CYZKJ.js → chunk-73GFVW2L.js} +5 -5
  37. package/dist/{chunk-M3NANSDZ.js → chunk-73V2OONC.js} +15 -15
  38. package/dist/{chunk-WKUJ3KPV.js → chunk-75OMRKY2.js} +4 -4
  39. package/dist/{chunk-7BR7IPOH.js → chunk-7IFTSAHP.js} +8 -8
  40. package/dist/{chunk-OWNCM4ZN.js → chunk-7K5OH45X.js} +136 -16
  41. package/dist/{chunk-VCTWPLAO.js → chunk-7NQAGYK4.js} +8 -8
  42. package/dist/{chunk-O4GXGGBX.js → chunk-7XWJ6ED2.js} +12 -12
  43. package/dist/{chunk-MFR5OPBD.js → chunk-7XYLNQFO.js} +5 -5
  44. package/dist/{chunk-GCWRWSU7.js → chunk-7YQBDE5W.js} +4 -4
  45. package/dist/{chunk-QKUJMING.js → chunk-A4JXVO5O.js} +5 -5
  46. package/dist/{chunk-LKOR5UET.js → chunk-AFBCNZRZ.js} +24 -24
  47. package/dist/{chunk-BXYMYEJ4.js → chunk-AGOLEMHK.js} +13 -14
  48. package/dist/{chunk-AVTBS4OW.js → chunk-AHFQHPFF.js} +22 -22
  49. package/dist/{chunk-NY2XSR5K.js → chunk-APDN6UOR.js} +116 -18
  50. package/dist/chunk-AQRUQNFB.js +322 -0
  51. package/dist/{chunk-5NMKONLP.js → chunk-AVMWESFZ.js} +3 -2
  52. package/dist/chunk-B4AEL3RF.js +1011 -0
  53. package/dist/{chunk-H7KM7LZE.js → chunk-BAY4K55I.js} +11 -11
  54. package/dist/{chunk-XD75VZIH.js → chunk-BFL4PO64.js} +7 -7
  55. package/dist/{chunk-34S2WGOB.js → chunk-BFMTGNAQ.js} +5 -3
  56. package/dist/{chunk-SLXZOMA6.js → chunk-BP33TBLI.js} +4 -4
  57. package/dist/{chunk-IFKEI4SA.js → chunk-BUUJ7N4O.js} +11 -11
  58. package/dist/{chunk-EGQRREQH.js → chunk-BYBU2EIB.js} +26 -15
  59. package/dist/{chunk-SFUP7TTO.js → chunk-C6ORPLCN.js} +4 -4
  60. package/dist/{chunk-IVBOQAGB.js → chunk-CA3DKO4D.js} +24 -2
  61. package/dist/{chunk-57TDNMI3.js → chunk-CFUDAW3R.js} +15 -15
  62. package/dist/{chunk-FFTRTL6R.js → chunk-CJEBRJBS.js} +4 -4
  63. package/dist/{chunk-EPCJQQWD.js → chunk-CKVBDVIW.js} +4 -4
  64. package/dist/{chunk-FPJPLKDW.js → chunk-CMB7FXHJ.js} +38 -16
  65. package/dist/{chunk-INQHESFB.js → chunk-CQ7RF4QN.js} +4 -4
  66. package/dist/{chunk-63YRMR6J.js → chunk-CS4BMJLL.js} +5 -5
  67. package/dist/{chunk-BPK5P77O.js → chunk-CT6NINGR.js} +3 -3
  68. package/dist/chunk-CXTG6AWM.js +40 -0
  69. package/dist/{chunk-CXJ6FUKN.js → chunk-CZ2ZS7AT.js} +9 -4
  70. package/dist/{chunk-S4PMJU6H.js → chunk-D6BVLTDV.js} +85 -29
  71. package/dist/{chunk-M32BLWDH.js → chunk-DCRYOMTM.js} +12 -12
  72. package/dist/{chunk-REWWDVQB.js → chunk-DHKDH464.js} +4 -4
  73. package/dist/{chunk-2LGRMVCA.js → chunk-DSHRA72L.js} +10 -10
  74. package/dist/{chunk-THDMSZ3R.js → chunk-E3PDCQRH.js} +2765 -665
  75. package/dist/chunk-EHXDB3SA.js +25 -0
  76. package/dist/{chunk-BTGPE6CR.js → chunk-EMVZIOOD.js} +7 -7
  77. package/dist/{chunk-DOBQKHIF.js → chunk-ENH6Z4TY.js} +28 -27
  78. package/dist/{chunk-LGFL54FP.js → chunk-EVTI22PQ.js} +6 -2
  79. package/dist/{chunk-7MJSQTL5.js → chunk-EXJZBL5N.js} +20 -20
  80. package/dist/{chunk-N3XIYPU3.js → chunk-FBCVC2GJ.js} +12 -12
  81. package/dist/{chunk-UWOJLHFT.js → chunk-FJVUHQPS.js} +34 -23
  82. package/dist/{chunk-7IGKHZ4Z.js → chunk-FL344WQD.js} +218 -211
  83. package/dist/{chunk-IH2XURVQ.js → chunk-FMJYKLDY.js} +5 -5
  84. package/dist/chunk-FMR2D3AZ.js +41 -0
  85. package/dist/{chunk-Q2TECDIT.js → chunk-FPBUTZI5.js} +2201 -326
  86. package/dist/{chunk-PJSJPMJI.js → chunk-FQVSLBTV.js} +3 -3
  87. package/dist/{chunk-NXJ5URP6.js → chunk-FRAEQVYN.js} +23 -22
  88. package/dist/{chunk-RLDGWLQ7.js → chunk-FRCOKUU4.js} +7 -7
  89. package/dist/{chunk-DCZWQLYT.js → chunk-FSN6JFXB.js} +18 -15
  90. package/dist/{chunk-W7VWI2YH.js → chunk-FTLYXMHA.js} +5 -5
  91. package/dist/{chunk-7GJS6DNX.js → chunk-FVYZ4Y52.js} +11 -3
  92. package/dist/{chunk-CQDGOPGH.js → chunk-G6EFXTUO.js} +2 -2
  93. package/dist/{chunk-JB5LINEM.js → chunk-G7VBMOZH.js} +3 -3
  94. package/dist/{chunk-7ASNL4Q4.js → chunk-GM4EFHUX.js} +15 -15
  95. package/dist/chunk-GOZLTLRY.js +232 -0
  96. package/dist/chunk-GPNMSX5H.js +36 -0
  97. package/dist/{chunk-BQ4SQQC6.js → chunk-GUGQSIQM.js} +9 -9
  98. package/dist/{chunk-E3ISYXO3.js → chunk-HJQVUOUL.js} +12 -12
  99. package/dist/{chunk-MFHL5URL.js → chunk-HMWJWYE2.js} +16 -16
  100. package/dist/{chunk-YYY3AZFE.js → chunk-HMZ2DRBC.js} +2 -2
  101. package/dist/{chunk-C3RY6KU6.js → chunk-HRS5O7VV.js} +500 -163
  102. package/dist/{chunk-AJQ72EBM.js → chunk-HUGQZQ2K.js} +6 -6
  103. package/dist/{chunk-AJYXNTNZ.js → chunk-ICBGVVRI.js} +10 -10
  104. package/dist/{chunk-J2JAKCIW.js → chunk-IKAW2KJU.js} +17 -17
  105. package/dist/{chunk-OUBGGKDU.js → chunk-IMZFOMVX.js} +1 -1
  106. package/dist/{chunk-LDLL7LB3.js → chunk-ISG547IS.js} +22 -22
  107. package/dist/{chunk-GZY6RUZ6.js → chunk-IYNCSYU4.js} +5 -2
  108. package/dist/{chunk-H5HBGNXU.js → chunk-J25YOUIZ.js} +4 -4
  109. package/dist/chunk-J2CDBSFP.js +69 -0
  110. package/dist/chunk-J2H7YG3K.js +34 -0
  111. package/dist/{chunk-SFSPGFCV.js → chunk-J32IPTVQ.js} +20 -20
  112. package/dist/{chunk-BEVTIBRH.js → chunk-J4CPHJUL.js} +5 -5
  113. package/dist/{chunk-F3P7N7SF.js → chunk-JFFKHIM6.js} +1 -1
  114. package/dist/{chunk-RUGXBPWI.js → chunk-JMEWJPF2.js} +8 -8
  115. package/dist/{chunk-WERM6KPJ.js → chunk-JSP73CDW.js} +9 -4
  116. package/dist/{chunk-66PPNOON.js → chunk-JXAKYP45.js} +26 -25
  117. package/dist/{chunk-7JITZFJC.js → chunk-K4OXYSGS.js} +4 -4
  118. package/dist/{chunk-EHA7RMZ3.js → chunk-K4RNVDR4.js} +4 -4
  119. package/dist/{chunk-R44CYFPV.js → chunk-K757G7AD.js} +12 -12
  120. package/dist/{chunk-FUJM6RTF.js → chunk-KDJ2YKAZ.js} +7 -7
  121. package/dist/{chunk-QAXW2N3B.js → chunk-KT6Q44CA.js} +28 -30
  122. package/dist/{chunk-EBL2R3YG.js → chunk-KTNOBTV5.js} +4 -4
  123. package/dist/chunk-KVVNAUIG.js +66 -0
  124. package/dist/{chunk-X5F3Q5LV.js → chunk-L3RCQWVQ.js} +21 -18
  125. package/dist/{chunk-7IOWA5D5.js → chunk-LHH5KG5A.js} +13 -3
  126. package/dist/{chunk-TNR75OXT.js → chunk-LM45GMMB.js} +11 -8
  127. package/dist/{chunk-FSMSFDLD.js → chunk-LO6Y7OTG.js} +4 -4
  128. package/dist/{chunk-WF7B67YE.js → chunk-LPDTDFKA.js} +10 -10
  129. package/dist/{chunk-SU74NDMQ.js → chunk-LSHSDC6S.js} +17 -17
  130. package/dist/{chunk-LJXMYKZJ.js → chunk-LZVHP7CT.js} +5 -5
  131. package/dist/{chunk-3NWDLGG6.js → chunk-M3EOFSPY.js} +26 -26
  132. package/dist/chunk-MBYYQHPM.js +31 -0
  133. package/dist/{chunk-KQGURXFU.js → chunk-MEJ63LDG.js} +32 -11
  134. package/dist/{chunk-FZOJFH7Q.js → chunk-MH2ZK67S.js} +11 -11
  135. package/dist/{chunk-R7NYHMUU.js → chunk-MLGWSBF4.js} +5108 -3895
  136. package/dist/{chunk-WJF2CS6M.js → chunk-MNIPPBCT.js} +5 -5
  137. package/dist/{chunk-XERYFDB5.js → chunk-MWF4PXQR.js} +32 -31
  138. package/dist/{chunk-BO4KX37X.js → chunk-N2YX6JMY.js} +18 -18
  139. package/dist/{chunk-GUX3PTYM.js → chunk-NAPHHWW2.js} +3 -3
  140. package/dist/{chunk-UUU4CLJG.js → chunk-NC755EKE.js} +5 -1
  141. package/dist/{chunk-WMTRHUI5.js → chunk-NCLZJCXA.js} +21 -21
  142. package/dist/chunk-NKJDO4UC.js +39 -0
  143. package/dist/chunk-NOYOFYAJ.js +59 -0
  144. package/dist/{chunk-ZQ3ON2VQ.js → chunk-NROSSWMS.js} +5 -5
  145. package/dist/{chunk-UWMJKX5U.js → chunk-OBUB3H72.js} +12 -12
  146. package/dist/{chunk-VW62D6QE.js → chunk-OCQWSFJD.js} +7 -7
  147. package/dist/{chunk-UPOY4YSQ.js → chunk-OK6JGLE7.js} +12 -12
  148. package/dist/{chunk-TYQBFTBR.js → chunk-OPWGPQ2N.js} +5 -5
  149. package/dist/{chunk-PPD7HTDP.js → chunk-OSYHGGL3.js} +18 -18
  150. package/dist/chunk-OXXZZ7HQ.js +50 -0
  151. package/dist/{chunk-5BD2KYLE.js → chunk-P22EPEBR.js} +16 -16
  152. package/dist/chunk-P4YUT7W7.js +45 -0
  153. package/dist/chunk-PCCLVIDP.js +217 -0
  154. package/dist/{chunk-CMDXGQTS.js → chunk-PFULMC2D.js} +21 -20
  155. package/dist/chunk-PGAMTKBI.js +16 -0
  156. package/dist/{chunk-6MUGR4LS.js → chunk-PNSSE7JM.js} +93 -18
  157. package/dist/{chunk-HYU5VLGA.js → chunk-POEMZECG.js} +1 -1
  158. package/dist/{chunk-UCROWG2D.js → chunk-POSDBRKV.js} +23 -23
  159. package/dist/{chunk-KDNTAPLX.js → chunk-POSZFDSQ.js} +3 -3
  160. package/dist/{chunk-3NFFJL5D.js → chunk-PQQKZPBU.js} +1 -1
  161. package/dist/{chunk-4EURQWQD.js → chunk-PRMUQUWN.js} +10 -10
  162. package/dist/{chunk-MO6P2JZH.js → chunk-PT4USJNN.js} +7 -7
  163. package/dist/{chunk-BTY3HZBO.js → chunk-PWXB5GBB.js} +16 -16
  164. package/dist/{chunk-S7FCV7S5.js → chunk-PXW2RZGQ.js} +1 -1
  165. package/dist/{chunk-NDCF4R6S.js → chunk-Q367UGYN.js} +3 -3
  166. package/dist/{chunk-IUPG3UKI.js → chunk-QAVRDONY.js} +187 -123
  167. package/dist/{chunk-E6ZIEVOI.js → chunk-QBMLBCQH.js} +12 -12
  168. package/dist/{chunk-VZALIKIF.js → chunk-QLQIFJP3.js} +12 -12
  169. package/dist/{chunk-EMRIQUND.js → chunk-QLWDIKO4.js} +82 -27
  170. package/dist/{chunk-PMUAJGLI.js → chunk-QVVGJVVX.js} +16 -16
  171. package/dist/{chunk-LNBQOP7D.js → chunk-QX4MAMUG.js} +21 -21
  172. package/dist/{chunk-X3WY6MN3.js → chunk-QZWRPQTI.js} +6 -6
  173. package/dist/{chunk-ISUAAMGS.js → chunk-RCG5IAAT.js} +18 -11
  174. package/dist/chunk-RGZFOKVO.js +106 -0
  175. package/dist/{chunk-O5PXQR67.js → chunk-RLZFL76D.js} +4 -4
  176. package/dist/{chunk-UF4AZOZB.js → chunk-RPQITJNX.js} +5 -5
  177. package/dist/{chunk-NR2UJWOC.js → chunk-RQQYEDAC.js} +8 -8
  178. package/dist/chunk-RQSLHZ7T.js +36 -0
  179. package/dist/{chunk-UPS2DGFC.js → chunk-RRQUQAXP.js} +1 -1
  180. package/dist/chunk-RYQ4JCFT.js +65 -0
  181. package/dist/{chunk-JLUCKAEL.js → chunk-S35DIFJH.js} +17 -17
  182. package/dist/{chunk-UGUP3ZM6.js → chunk-S5GSQPIN.js} +9 -9
  183. package/dist/chunk-S5XFO4GY.js +42 -0
  184. package/dist/chunk-S6LW2RRC.js +25 -0
  185. package/dist/{chunk-W62H2XSO.js → chunk-S6W3D5GS.js} +23 -23
  186. package/dist/{chunk-CX4RZ2KS.js → chunk-S7GUZ45I.js} +3 -3
  187. package/dist/{chunk-L27SV425.js → chunk-SCT4CEF7.js} +20 -20
  188. package/dist/{chunk-VTZMAJ3W.js → chunk-SK5RVP7X.js} +8 -8
  189. package/dist/{chunk-JAVI7JSP.js → chunk-SRTUETF5.js} +23 -22
  190. package/dist/{chunk-MZCGSXVR.js → chunk-SVGGMBJI.js} +13 -13
  191. package/dist/{chunk-SDKLKB6I.js → chunk-SWNKO4C4.js} +32 -25
  192. package/dist/chunk-SYP56T2D.js +65 -0
  193. package/dist/{chunk-5SJZW52K.js → chunk-T33TPFGI.js} +22 -22
  194. package/dist/{chunk-ZJXLNDH4.js → chunk-T3FNG2H2.js} +12 -12
  195. package/dist/{chunk-BIGDQDHD.js → chunk-T6MAWL5P.js} +4 -4
  196. package/dist/{chunk-RGERPOIV.js → chunk-T6MX7WXM.js} +14 -11
  197. package/dist/{chunk-QFWA2DPH.js → chunk-T7IIEDA3.js} +5 -5
  198. package/dist/{chunk-Z5IA3WDR.js → chunk-TABH4RBZ.js} +156 -79
  199. package/dist/{chunk-6ZGLAACW.js → chunk-TDSCKP3V.js} +2 -2
  200. package/dist/{chunk-G6X77UJZ.js → chunk-TMFMXQEN.js} +21 -21
  201. package/dist/{chunk-P2V7QW4D.js → chunk-TNCF26JK.js} +11 -11
  202. package/dist/{chunk-2GF7OLF3.js → chunk-TUM52SOE.js} +19 -15
  203. package/dist/{chunk-PBPBMP2B.js → chunk-TV56QLLV.js} +3 -3
  204. package/dist/{chunk-SYV5LHML.js → chunk-TVQSXWWV.js} +33 -33
  205. package/dist/{chunk-VBTP56CE.js → chunk-TXNSQ24G.js} +9 -8
  206. package/dist/{chunk-ZX57KSEQ.js → chunk-UALE35WK.js} +3 -3
  207. package/dist/{chunk-42SIDKEU.js → chunk-UJF7PIMP.js} +26 -26
  208. package/dist/{chunk-ONUPY3H6.js → chunk-UMCDODBX.js} +24 -24
  209. package/dist/{chunk-JJF6HALY.js → chunk-UTPIFH4I.js} +3 -3
  210. package/dist/{chunk-O7XLYEFA.js → chunk-V7PEHQZU.js} +54 -22
  211. package/dist/{chunk-XI2LCCYQ.js → chunk-VJFXQISZ.js} +8 -8
  212. package/dist/{chunk-AFZ3QA6W.js → chunk-VJZI6KFP.js} +22 -22
  213. package/dist/{chunk-Q6DFNVRJ.js → chunk-VK7WYA64.js} +12 -12
  214. package/dist/{chunk-6OJQOPUN.js → chunk-VKTXFFOZ.js} +2 -2
  215. package/dist/{chunk-MG4ZL5RW.js → chunk-VNIN7Q6Q.js} +16 -16
  216. package/dist/{chunk-ZQXZ2SES.js → chunk-VRO7KSGL.js} +21 -21
  217. package/dist/{chunk-OHVTTOPS.js → chunk-W3AZE7LN.js} +3 -3
  218. package/dist/chunk-W4TNCEI4.js +44 -0
  219. package/dist/{chunk-X4CXA2IL.js → chunk-W5VYJWOG.js} +22 -22
  220. package/dist/{chunk-7DOR27HL.js → chunk-WF3RCZNO.js} +6 -6
  221. package/dist/{chunk-LGBMTVNT.js → chunk-WOMQQWTO.js} +5 -5
  222. package/dist/{chunk-2Q56PQPS.js → chunk-WXVTYLVH.js} +2 -2
  223. package/dist/{chunk-UOR2DTHH.js → chunk-WYGTSZHR.js} +16 -14
  224. package/dist/{chunk-IDKCWSM5.js → chunk-WZYM5M4U.js} +388 -104
  225. package/dist/{chunk-U76OWS3Q.js → chunk-X5ZHDSLU.js} +23 -23
  226. package/dist/chunk-X7XVMYIL.js +5 -0
  227. package/dist/{chunk-2IIMFOPM.js → chunk-X7ZKNSK4.js} +18 -18
  228. package/dist/{chunk-UF4GLFBX.js → chunk-XAPXKFIS.js} +22 -22
  229. package/dist/{chunk-LQJPN536.js → chunk-XF6TSZW2.js} +2 -2
  230. package/dist/{chunk-T6DQR5TV.js → chunk-XFDDJQT7.js} +12 -12
  231. package/dist/{chunk-OHNCWBKF.js → chunk-XGO74QWR.js} +4 -4
  232. package/dist/chunk-XLZAAAPX.js +43 -0
  233. package/dist/{chunk-2RLKFUUL.js → chunk-XMUWPA56.js} +23 -23
  234. package/dist/{chunk-JRBFANFE.js → chunk-XNFM6WUK.js} +15 -15
  235. package/dist/{chunk-LO6P2VYG.js → chunk-XOMEQVLK.js} +2 -2
  236. package/dist/{chunk-YHCMZC2J.js → chunk-Y2H7X3VI.js} +7 -7
  237. package/dist/{chunk-ZZK56BLP.js → chunk-Y5IE6YKD.js} +4 -4
  238. package/dist/{chunk-KFAVQZSX.js → chunk-YD3KTW4H.js} +12 -12
  239. package/dist/{chunk-LZ7NUC62.js → chunk-YDCOZOER.js} +18 -18
  240. package/dist/{chunk-LFGTYX5U.js → chunk-YERAAEO4.js} +17 -17
  241. package/dist/{chunk-BHT7QK4G.js → chunk-YHMPDIRG.js} +4 -4
  242. package/dist/{chunk-ZJFRMSJT.js → chunk-Z2D4P3R3.js} +12 -12
  243. package/dist/{chunk-O66DM6DJ.js → chunk-Z3H27OMV.js} +4 -4
  244. package/dist/{chunk-7UOMVMFG.js → chunk-Z3RAFU5B.js} +15 -15
  245. package/dist/{chunk-FFLNS6VP.js → chunk-ZENHDXRZ.js} +21 -17
  246. package/dist/{chunk-23XVSEV5.js → chunk-ZFHFC74B.js} +18 -18
  247. package/dist/{chunk-53T4O55J.js → chunk-ZJGCGKA4.js} +3 -3
  248. package/dist/{chunk-WXFLMQSR.js → chunk-ZLQEQR3D.js} +5 -5
  249. package/dist/{chunk-HNM2YQT2.js → chunk-ZNHQGG7J.js} +7 -7
  250. package/dist/{chunk-2Q5EDGEO.js → chunk-ZNTTW4IT.js} +5 -5
  251. package/dist/{chunk-ZQ7SKESZ.js → chunk-ZR6J4QFQ.js} +7 -7
  252. package/dist/{chunk-PAQ2AS5E.js → chunk-ZSNOILL5.js} +1 -1
  253. package/dist/files.json +563 -511
  254. package/dist/packages/sdk/npm/index.js +1043 -43
  255. package/dist/packages/ui/dist/assets/{elk-api-CIf-0gz5.js → elk-api-DxfAMOJq.js} +2 -2
  256. package/dist/packages/ui/dist/assets/index-Buit9TfP.js +62 -0
  257. package/dist/packages/ui/dist/assets/index-Jyc9dFeZ.css +1 -0
  258. package/dist/packages/ui/dist/index.html +2 -2
  259. package/package.json +4 -4
  260. package/dist/chunk-2SKB4O2E.js +0 -59
  261. package/dist/chunk-4U276ICE.js +0 -39
  262. package/dist/chunk-6H3Z5JHH.js +0 -64
  263. package/dist/chunk-C4R4JLHE.js +0 -40
  264. package/dist/chunk-CBGGOQWU.js +0 -82
  265. package/dist/chunk-DLOBCJL6.js +0 -48
  266. package/dist/chunk-GIW4ZVDB.js +0 -39
  267. package/dist/chunk-IP74LCOQ.js +0 -57
  268. package/dist/chunk-IPHHDDC6.js +0 -45
  269. package/dist/chunk-KJXD4PNL.js +0 -50
  270. package/dist/chunk-KN5BXMWN.js +0 -44
  271. package/dist/chunk-OMI6FPPN.js +0 -43
  272. package/dist/chunk-OTLDSZDV.js +0 -69
  273. package/dist/chunk-PSOFBQWB.js +0 -42
  274. package/dist/chunk-T4YPZIQN.js +0 -36
  275. package/dist/chunk-TUULXQRW.js +0 -420
  276. package/dist/chunk-WNKPRSGI.js +0 -36
  277. package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +0 -47
  278. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +0 -1
  279. package/dist/{chunk-24XLDU72.js → chunk-PXMV2LLY.js} +3 -3
@@ -1273,16 +1273,24 @@ var MetarepoStamp = z4.strictObject({
1273
1273
  });
1274
1274
 
1275
1275
  // packages/core/dist/schema/question.js
1276
- var QUESTION_SCHEMA_VERSION = 5;
1276
+ var QUESTION_SCHEMA_VERSION = 6;
1277
1277
  var QuestionSchemaVersion = z5.union([
1278
1278
  z5.literal(1),
1279
1279
  z5.literal(2),
1280
1280
  z5.literal(3),
1281
1281
  z5.literal(4),
1282
+ z5.literal(5),
1282
1283
  z5.literal(QUESTION_SCHEMA_VERSION)
1283
1284
  ]).overwrite(() => QUESTION_SCHEMA_VERSION);
1284
1285
  var QUESTION_ROLES = ["product", "architecture", "analysis", "delivery"];
1285
1286
  var QuestionRole = z5.enum(QUESTION_ROLES);
1287
+ var QUESTION_ASKS = ["business", "design", "delivery"];
1288
+ var QuestionAsks = z5.enum(QUESTION_ASKS);
1289
+ var QuestionRouted = z5.strictObject({
1290
+ from: QuestionRole.optional(),
1291
+ by: z5.string().trim().min(1),
1292
+ at: IsoDateTime
1293
+ });
1286
1294
  var AI_RUNTIMES = ["copilot-acp", "hand-off"];
1287
1295
  var DECIDE_BARS = ["confident", "agrees-with-shapes", "person-rule"];
1288
1296
  var DecideBar = z5.enum(DECIDE_BARS);
@@ -1413,6 +1421,10 @@ var Question = z5.strictObject({
1413
1421
  * that raised it unless the question said otherwise. Left out where no stage owns it.
1414
1422
  */
1415
1423
  role: QuestionRole.optional(),
1424
+ /** Version 6 (ADR 0191): what the question asks, as the AI tagged it when it raised it. */
1425
+ asks: QuestionAsks.optional(),
1426
+ /** Version 6 (ADR 0191): a person re-routed it; `role` is the role they gave it. */
1427
+ routed: QuestionRouted.optional(),
1416
1428
  /**
1417
1429
  * Version 5 (ninth UX walk): a critic knowledge gap a person routed with Ask: who it is
1418
1430
  * asked of (a team or a person, the finding's owner unless they named another).
@@ -1491,6 +1503,12 @@ var QuestionDraft = z5.strictObject({
1491
1503
  * design stage asking the product owner what the brief meant). Left out, the stage's role.
1492
1504
  */
1493
1505
  role: QuestionRole.optional(),
1506
+ /**
1507
+ * ADR 0191: what the question asks (business, design or delivery). It decides the role that
1508
+ * owns it when `role` is left out, so a business question a design stage raises goes to the
1509
+ * product owner, not the architect.
1510
+ */
1511
+ asks: QuestionAsks.optional(),
1494
1512
  /**
1495
1513
  * The step's own reading (ADR 0117): this question is one already on file (same), or asks
1496
1514
  * part of one (narrower), with the words of the earlier question that say so. Atticus checks
@@ -2590,7 +2608,7 @@ var Approver = z11.strictObject({
2590
2608
  groups: z11.array(z11.string().min(1)).default([]),
2591
2609
  people: z11.array(z11.string().min(1)).default([])
2592
2610
  }).refine((a) => a.roles.length + a.groups.length + a.people.length > 0, "name at least one role, group or person");
2593
- var ROLES_SCHEMA_VERSION = 2;
2611
+ var ROLES_SCHEMA_VERSION = 3;
2594
2612
  var TeamPerson = z11.string().min(1).max(100).regex(/^@?[A-Za-z0-9][A-Za-z0-9._-]*$/, "a person's Git handle, such as pat or pat.doe");
2595
2613
  var Team = z11.strictObject({
2596
2614
  /** The id a repo manifest's `owner` names, e.g. team-ledger. */
@@ -2598,12 +2616,16 @@ var Team = z11.strictObject({
2598
2616
  /** What people call it, e.g. Ledger team. */
2599
2617
  name: z11.string().min(1).optional(),
2600
2618
  /** The Git handles of the people on it. */
2601
- people: z11.array(TeamPerson).default([])
2619
+ people: z11.array(TeamPerson).default([]),
2620
+ /** Version 3 (ADR 0191): who on the team takes each role on its repos' changes. */
2621
+ roles: z11.record(RecordId, z11.array(TeamPerson).min(1)).optional()
2602
2622
  });
2603
2623
  var Roles = z11.strictObject({
2604
- schemaVersion: z11.union([V2, z11.literal(ROLES_SCHEMA_VERSION)]),
2624
+ schemaVersion: z11.union([V2, z11.literal(2), z11.literal(ROLES_SCHEMA_VERSION)]),
2605
2625
  /** Version 2 (ADR 0140): the teams repos are owned by, and who is on each. */
2606
2626
  teams: z11.array(Team).default([]),
2627
+ /** Version 3 (ADR 0191): the organisation's person for each role, when no team names one. */
2628
+ defaults: z11.record(RecordId, z11.array(TeamPerson).min(1)).optional(),
2607
2629
  /** Extra roles; each is based on a built-in role's view. */
2608
2630
  custom: z11.array(z11.strictObject({ id: RecordId, name: z11.string().min(1), basedOn: z11.enum(BUILT_IN_ROLES) })).default([]),
2609
2631
  /** Optional roles this organisation uses. Core roles are always on. */
@@ -2620,12 +2642,31 @@ var Roles = z11.strictObject({
2620
2642
  const known = /* @__PURE__ */ new Set([...BUILT_IN_ROLES, ...r.custom.map((c) => c.id)]);
2621
2643
  unique(r.custom, (c) => c.id, ctx, "custom");
2622
2644
  unique(r.teams, (t) => t.id, ctx, "teams");
2623
- if (r.teams.length && r.schemaVersion < ROLES_SCHEMA_VERSION)
2645
+ if (r.teams.length && r.schemaVersion < 2)
2624
2646
  ctx.addIssue({
2625
2647
  code: "custom",
2626
2648
  path: ["teams"],
2627
2649
  message: "teams needs schemaVersion 2: run atticus upgrade"
2628
2650
  });
2651
+ const named = [
2652
+ ...r.defaults ? [{ path: ["defaults"], roles: r.defaults }] : [],
2653
+ ...r.teams.flatMap((t, i) => t.roles ? [{ path: ["teams", i, "roles"], roles: t.roles }] : [])
2654
+ ];
2655
+ for (const n of named) {
2656
+ if (r.schemaVersion < ROLES_SCHEMA_VERSION)
2657
+ ctx.addIssue({
2658
+ code: "custom",
2659
+ path: n.path,
2660
+ message: "who takes each role needs schemaVersion 3: run atticus upgrade"
2661
+ });
2662
+ for (const role of Object.keys(n.roles))
2663
+ if (!known.has(role))
2664
+ ctx.addIssue({
2665
+ code: "custom",
2666
+ path: [...n.path, role],
2667
+ message: `unknown role ${role}`
2668
+ });
2669
+ }
2629
2670
  r.custom.forEach((c, i) => {
2630
2671
  if (BUILT_IN_ROLES.includes(c.id)) {
2631
2672
  ctx.addIssue({
@@ -3072,8 +3113,9 @@ var RuntimeFields = z11.strictObject({
3072
3113
  */
3073
3114
  modes: z11.strictObject({
3074
3115
  allowed: z11.array(ConfiguredMode).min(1),
3075
- default: ConfiguredMode
3076
- }).refine((m) => m.allowed.includes(m.default), "the default mode must be allowed").default({ allowed: ["hand-off"], default: "hand-off" }),
3116
+ /** Left out: the first mode `allowed` lists (review round 50). */
3117
+ default: ConfiguredMode.optional()
3118
+ }).refine((m) => m.default === void 0 || m.allowed.includes(m.default), "the default mode must be allowed").transform((m) => ({ allowed: m.allowed, default: m.default ?? m.allowed[0] })).default({ allowed: ["hand-off"], default: "hand-off" }),
3077
3119
  models: z11.strictObject({
3078
3120
  allowed: z11.array(z11.string().min(1)).default([]),
3079
3121
  /** A recommended model per task type, shown in the assistant's picker hints. */
@@ -5407,7 +5449,7 @@ var DEFAULT_ROLES = Roles.parse({
5407
5449
  ]
5408
5450
  });
5409
5451
  var DEFAULT_RUNTIME = Runtime.parse({
5410
- schemaVersion: 2,
5452
+ schemaVersion: RUNTIME_SCHEMA_VERSION,
5411
5453
  assistants: { allowed: ["copilot", "claude-code"], default: "copilot" }
5412
5454
  });
5413
5455
  var DEFAULT_SOURCES = Sources.parse({ schemaVersion: 1 });
@@ -5442,6 +5484,7 @@ import { parse as parse5 } from "yaml";
5442
5484
 
5443
5485
  // packages/core/dist/api.js
5444
5486
  import { z as z30 } from "zod";
5487
+ var NextStep = z30.object({ step: z30.literal("sync"), repos: z30.array(z30.string()) });
5445
5488
  var Problem = z30.object({
5446
5489
  type: z30.string(),
5447
5490
  title: z30.string(),
@@ -5450,7 +5493,9 @@ var Problem = z30.object({
5450
5493
  /** Field-level problems for 400s. */
5451
5494
  errors: z30.array(z30.object({ path: z30.string(), message: z30.string() })).optional(),
5452
5495
  /** For 403s on gated actions: who can act, e.g. "Needs an architect: R. Patel". */
5453
- needs: z30.object({ role: z30.string(), names: z30.array(z30.string()) }).optional()
5496
+ needs: z30.object({ role: z30.string(), names: z30.array(z30.string()) }).optional(),
5497
+ /** 3.9.0: what the app offers next, e.g. Sync the repos with no base clone here. */
5498
+ next: NextStep.optional()
5454
5499
  });
5455
5500
  var Kind3 = z30.enum(RECORD_KINDS);
5456
5501
  var CatalogRecord2 = z30.union(RECORD_KINDS.map((k) => RECORD_SCHEMAS[k]));
@@ -5677,9 +5722,11 @@ var Coverage = z30.object({
5677
5722
  var JobState = z30.enum(["queued", "running", "done", "failed", "cancelled"]);
5678
5723
  var Job = z30.object({
5679
5724
  id: z30.string(),
5680
- kind: z30.enum(["scan", "sync", "reconcile", "index", "intake", "step", "local"]),
5725
+ kind: z30.enum(["scan", "sync", "reconcile", "index", "intake", "step", "local", "work"]),
5681
5726
  state: JobState,
5682
5727
  progress: z30.object({ done: z30.number().int(), total: z30.number().int(), message: z30.string() }),
5728
+ /** 3.1.0 (ADR 0187): what the job is, in words, for the Console. */
5729
+ title: z30.string().optional(),
5683
5730
  startedAt: z30.string(),
5684
5731
  finishedAt: z30.string().optional(),
5685
5732
  errors: z30.array(z30.string()),
@@ -5724,7 +5771,12 @@ var ChangeSummary = z30.object({
5724
5771
  }),
5725
5772
  updatedAt: z30.string(),
5726
5773
  /** ADR 0113: it takes the fast path, one step from brief to tasks (its type is small, or its brief says so). */
5727
- fastPath: z30.boolean().optional()
5774
+ fastPath: z30.boolean().optional(),
5775
+ /**
5776
+ * 3.9.0 (beta.23 review): the viewer's roles on the change, from its owners (any case, the
5777
+ * words people write for a role, roles.yaml's custom roles); empty when it names them nowhere.
5778
+ */
5779
+ yourRoles: z30.array(QuestionRole).optional()
5728
5780
  });
5729
5781
  var ChangeDetail = ChangeSummary.extend({
5730
5782
  /** 2.66.0 (review round 35): what a hand-off said, such as a branch it couldn't push. */
@@ -5737,7 +5789,13 @@ var ChangeDetail = ChangeSummary.extend({
5737
5789
  handoff: z30.object({
5738
5790
  phase: Phase,
5739
5791
  pr: z30.string().optional(),
5740
- state: z30.enum(["none", "open", "merged", "closed"])
5792
+ state: z30.enum(["none", "open", "merged", "closed"]),
5793
+ /**
5794
+ * 3.3.0 (app-only audit): the open hand-off's branch is here but not on the remote as it is
5795
+ * here (its push failed); POST .../handoff/push is Push again. Absent once it is there.
5796
+ */
5797
+ unpushed: z30.boolean().optional(),
5798
+ branch: z30.string().optional()
5741
5799
  }).optional()
5742
5800
  });
5743
5801
  var ArtifactContent = z30.object({
@@ -5793,7 +5851,16 @@ var Task = z30.object({
5793
5851
  * dependencies, and the earlier tasks of its own repo in tasks.md order); `sameRepo` names the
5794
5852
  * ones of its own repo. Absent when it waits for none, or once it is done.
5795
5853
  */
5796
- waits: z30.object({ tasks: z30.array(z30.string()), sameRepo: z30.array(z30.string()) }).optional()
5854
+ waits: z30.object({ tasks: z30.array(z30.string()), sameRepo: z30.array(z30.string()) }).optional(),
5855
+ /**
5856
+ * 3.3.0 (app-only audit): the task branch has commits the change branch here hasn't, so its
5857
+ * code isn't in the change yet (its PR raised and merged takes it in). Absent when it has none.
5858
+ */
5859
+ unmerged: z30.object({ commits: z30.number().int().positive(), branch: z30.string() }).optional(),
5860
+ /** 3.3.0: a person decided the task's work isn't needed in the change, and why. */
5861
+ decision: z30.object({ by: z30.string(), at: z30.string(), reason: z30.string() }).optional(),
5862
+ /** 3.3.0: whether the task's repo has a build command now (repos.manifest.yaml). */
5863
+ repoBuilds: z30.boolean().optional()
5797
5864
  });
5798
5865
  var RunView = RunSummary.extend({
5799
5866
  /**
@@ -5834,10 +5901,17 @@ var RunListItem = RunView.extend({
5834
5901
  toolCalls: z30.number().int().min(0).optional()
5835
5902
  });
5836
5903
  var StartStepRequest = z30.object({ args: z30.array(z30.string().min(1)).min(2) });
5904
+ var RunDoneRequest = z30.strictObject({ job: z30.boolean().optional() });
5837
5905
  var RunDoneView = RunView.extend({
5838
5906
  lines: z30.array(z30.string()).optional(),
5839
- next: z30.string().optional()
5840
- });
5907
+ next: z30.string().optional(),
5908
+ /** 3.5.0 (ADR 0188): the repo a read's last batch put on the map (verify --write). */
5909
+ applied: z30.string().optional()
5910
+ });
5911
+ var TaskContextView = z30.object({ markdown: z30.string() });
5912
+ var HistoryRecordingRequest = z30.object({ on: z30.boolean() });
5913
+ var HistoryRecordingView = z30.object({ on: z30.boolean() });
5914
+ var PruneRequest = z30.object({ change: z30.string().optional() });
5841
5915
  var PreparedStepView = z30.object({
5842
5916
  /** Left out when the step had nothing left to hand off: its lines say what it did. */
5843
5917
  runId: z30.string().optional(),
@@ -6198,7 +6272,20 @@ var ChangeKnowledgeItem = z30.object({
6198
6272
  tasks: z30.array(z30.string()).optional(),
6199
6273
  /** 2.30.0 (ADR 0132): the source of the page it is read from, and how much its word counts. */
6200
6274
  source: z30.string().optional(),
6201
- authority: z30.enum(SOURCE_AUTHORITIES).optional()
6275
+ authority: z30.enum(SOURCE_AUTHORITIES).optional(),
6276
+ /**
6277
+ * 3.6.0 (ADR 0191): what it says, to open it in place: a section's own text with its page and
6278
+ * heading, or an item's quote with its page. Left out when the page can't be read.
6279
+ */
6280
+ passage: z30.object({
6281
+ source: z30.string(),
6282
+ page: z30.string(),
6283
+ path: z30.string(),
6284
+ heading: z30.string(),
6285
+ line: z30.number().int(),
6286
+ text: z30.string(),
6287
+ quote: z30.string().optional()
6288
+ }).optional()
6202
6289
  });
6203
6290
  var KnowledgeConflictView = z30.object({
6204
6291
  /** The items it is about and its pages, each sorted: the same key is never asked twice. */
@@ -6698,6 +6785,117 @@ var StageCommentResult = z30.object({
6698
6785
  commit: z30.string(),
6699
6786
  next: z30.object({ command: z30.string(), slash: z30.string() })
6700
6787
  });
6788
+ var THREAD_STAGES = ["proposal", "feature", "architecture", "stories", "small"];
6789
+ var ThreadStage = z30.enum(THREAD_STAGES);
6790
+ var ThreadRunDetails = z30.object({
6791
+ agent: z30.string(),
6792
+ runtime: z30.string(),
6793
+ promptPath: z30.string(),
6794
+ output: z30.string().optional(),
6795
+ promptTokens: z30.number().int().min(0).optional(),
6796
+ model: z30.string().optional(),
6797
+ attempt: z30.number().int().min(1)
6798
+ });
6799
+ var ThreadItem = z30.discriminatedUnion("kind", [
6800
+ /** A prompt handed to the assistant (the stage's drafter, or the critic's lenses). */
6801
+ z30.object({
6802
+ kind: z30.literal("prompt"),
6803
+ at: z30.string(),
6804
+ runId: z30.string(),
6805
+ who: z30.enum(["drafter", "critic"]),
6806
+ prompt: z30.string(),
6807
+ state: RunState,
6808
+ details: ThreadRunDetails
6809
+ }),
6810
+ /** What came back, and what its checks said. */
6811
+ z30.object({
6812
+ kind: z30.literal("answer"),
6813
+ at: z30.string(),
6814
+ runId: z30.string(),
6815
+ who: z30.enum(["drafter", "critic"]),
6816
+ /** passed: the checks read it; failed: they found problems (listed); checking: not yet. */
6817
+ checked: z30.enum(["passed", "failed", "checking"]),
6818
+ /** Who checked it: the app when the file arrived (ADR 0189), or a person's Done. */
6819
+ by: z30.enum(["app", "person"]).optional(),
6820
+ summary: z30.array(z30.string()),
6821
+ problems: z30.array(z30.string())
6822
+ }),
6823
+ /** The files the stage wrote from an answer. */
6824
+ z30.object({ kind: z30.literal("changed"), at: z30.string(), files: z30.array(z30.string()) }),
6825
+ z30.object({
6826
+ kind: z30.literal("finding"),
6827
+ at: z30.string(),
6828
+ view: StageFindingView,
6829
+ /**
6830
+ * Whether the stage's assistant writes the file the finding cites: Fix then goes to it in the
6831
+ * next round; otherwise Fix opens the file at its line in the app's editor (`edit`).
6832
+ */
6833
+ assistantWrites: z30.boolean(),
6834
+ edit: z30.object({
6835
+ artifact: z30.string(),
6836
+ file: z30.string().optional(),
6837
+ line: z30.number().int().optional()
6838
+ }).optional()
6839
+ }),
6840
+ z30.object({ kind: z30.literal("question"), at: z30.string(), question: Question }),
6841
+ z30.object({
6842
+ kind: z30.literal("reply"),
6843
+ at: z30.string(),
6844
+ text: z30.string(),
6845
+ by: z30.string(),
6846
+ /** A round of the stage has read it. */
6847
+ read: z30.boolean(),
6848
+ /** The finding it is about, for a comment on one. */
6849
+ about: z30.string().optional()
6850
+ }),
6851
+ z30.object({
6852
+ kind: z30.literal("correction"),
6853
+ at: z30.string(),
6854
+ text: z30.string(),
6855
+ label: z30.string(),
6856
+ by: z30.string(),
6857
+ state: z30.string()
6858
+ }),
6859
+ /** A question the assistant raised that couldn't be kept: its evidence was no line. */
6860
+ z30.object({
6861
+ kind: z30.literal("dropped"),
6862
+ at: z30.string(),
6863
+ key: z30.string(),
6864
+ question: z30.string(),
6865
+ evidence: z30.array(z30.string()),
6866
+ nearest: z30.string().optional()
6867
+ }),
6868
+ z30.object({ kind: z30.literal("note"), at: z30.string(), text: z30.string() })
6869
+ ]);
6870
+ var StageThreadView = z30.object({
6871
+ change: z30.string(),
6872
+ stage: ThreadStage,
6873
+ /** Where the stage is, in one word, and the one sentence the thread opens with. */
6874
+ state: z30.enum(["not-started", "waiting", "questions", "drafting", "stopped", "done"]),
6875
+ headline: z30.string(),
6876
+ items: z30.array(ThreadItem),
6877
+ /** The run waiting for the assistant's answer, if one does. */
6878
+ waiting: z30.object({ runId: z30.string(), prompt: z30.string() }).optional(),
6879
+ /** The step's words, for POST /api/runs/handoff (the next round's prompt). */
6880
+ step: z30.array(z30.string()),
6881
+ /** Whether a reply is taken now, and if not, why. */
6882
+ reply: z30.object({ open: z30.boolean(), why: z30.string().optional() }),
6883
+ problems: z30.array(z30.object({ file: z30.string(), message: z30.string() }))
6884
+ });
6885
+ var StageThreadPost = z30.discriminatedUnion("kind", [
6886
+ z30.strictObject({ kind: z30.literal("reply"), text: z30.string().trim().min(1).max(4e3) }),
6887
+ z30.strictObject({
6888
+ kind: z30.literal("finding"),
6889
+ finding: z30.string().min(1),
6890
+ gate: z30.string().optional(),
6891
+ text: z30.string().trim().min(1).max(4e3)
6892
+ }),
6893
+ z30.strictObject({ kind: z30.literal("keep"), key: z30.string().regex(/^[0-9a-f]{12}$/) })
6894
+ ]);
6895
+ var StageThreadPostResult = z30.object({
6896
+ files: z30.array(z30.string()),
6897
+ thread: StageThreadView
6898
+ });
6701
6899
  var DRAFT_PAGES = ["feature", "architecture", "stories", "tasks"];
6702
6900
  var DraftPage = z30.enum(DRAFT_PAGES);
6703
6901
  var DraftProvenance = z30.object({
@@ -7135,14 +7333,25 @@ var Health = z30.object({
7135
7333
  openspec: z30.string().optional(),
7136
7334
  user: z30.string(),
7137
7335
  /** 2.22.0: started with `atticus ui --full`, so the app offers every page, not only the six. */
7138
- full: z30.boolean().optional()
7336
+ full: z30.boolean().optional(),
7337
+ /**
7338
+ * 3.5.0 (ADR 0190): whether the folder the app runs in is a metarepo (org-pack/, or
7339
+ * .atticus/org-pack/). When it isn't, the app offers Create the metarepo here.
7340
+ */
7341
+ metarepo: z30.boolean().optional()
7139
7342
  });
7140
7343
  var ScanRequest = z30.strictObject({
7141
7344
  repos: z30.array(RecordId).optional(),
7142
7345
  /** Ignore the cache and rescan everything. */
7143
7346
  full: z30.boolean().default(false),
7144
7347
  /** Another branch, scanned beside the baseline into catalog/branches/<branch>/ (ADR 0123). */
7145
- ref: GitRef.optional()
7348
+ ref: GitRef.optional(),
7349
+ /**
7350
+ * 3.3.0 (app-only audit): the app's scan is a cross-check with the built-in readers, and asks
7351
+ * which repo answers on an unknown host only for the repos the assistant has read (facts on
7352
+ * file); `askAll` asks for every repo, as the command line's `atticus scan` does.
7353
+ */
7354
+ askAll: z30.boolean().optional()
7146
7355
  });
7147
7356
  var RepoBranchesView = z30.object({
7148
7357
  id: RecordId,
@@ -7230,6 +7439,8 @@ var ChangeCockpit = z30.object({
7230
7439
  */
7231
7440
  openQuestionsByRole: z30.partialRecord(QuestionRole, z30.number().int()).optional(),
7232
7441
  yourRoles: z30.array(QuestionRole).optional(),
7442
+ /** 3.6.0 (ADR 0191): who the change waits on now, by role and name. */
7443
+ waitsOn: z30.lazy(() => WaitsOn).optional(),
7233
7444
  repos: z30.array(z30.object({ id: z30.string(), branch: z30.string(), base: z30.string(), pr: z30.string().optional() }))
7234
7445
  });
7235
7446
  var NewChangeRequest = z30.strictObject({
@@ -7289,13 +7500,19 @@ var CONFIRMED_WRITES = [
7289
7500
  "propose",
7290
7501
  "step-run",
7291
7502
  "ai-model",
7292
- "ai-test"
7503
+ "ai-test",
7504
+ // 3.6.0 (ADR 0191): the plan's work items in a live work tracker, and an owner question sent.
7505
+ "work-items",
7506
+ "owner-ask"
7293
7507
  ];
7294
7508
  var ConfirmedWrite = z30.enum(CONFIRMED_WRITES);
7295
7509
  var Confirmation = z30.string().regex(/^[A-Za-z0-9_-]{16,128}$/, "a confirmation");
7296
7510
  var ConfirmationRequest = z30.strictObject({
7297
7511
  write: ConfirmedWrite,
7298
- /** What the write is for: the change, `<change>/<task>`, the step, the scope, `me` or `model`. */
7512
+ /**
7513
+ * What the write is for: the change, `<change>/<task>`, the step, the scope, the digest's
7514
+ * channel (3.1.0; `me` before) or `model`.
7515
+ */
7299
7516
  target: z30.string().min(1).max(400),
7300
7517
  /** The page's own key, from its <meta name="atticus-page-key">; never printed. */
7301
7518
  pageKey: z30.string().max(200).optional()
@@ -7559,7 +7776,21 @@ var SyncRequest = z30.strictObject({
7559
7776
  confirmation: Confirmation.optional()
7560
7777
  });
7561
7778
  var ReleasePrsRequest = z30.strictObject({ confirmation: Confirmation.optional() });
7562
- var TaskDoneRequest = z30.strictObject({ done: z30.boolean() });
7779
+ var TaskDoneRequest = z30.strictObject({
7780
+ done: z30.boolean(),
7781
+ /**
7782
+ * 3.3.0 (app-only audit): why the task's work isn't needed, when its branch has commits the
7783
+ * change branch hasn't (else marking it done is 409); recorded with the person's name.
7784
+ */
7785
+ reason: z30.string().max(2e3).optional()
7786
+ });
7787
+ var UpstreamRequest = z30.strictObject({
7788
+ upstream: z30.string().regex(/^[A-Za-z0-9][\w.-]*\/[\w./-]+$/, "a remote branch, such as origin/main")
7789
+ });
7790
+ var TaskBuildRequest = z30.strictObject({
7791
+ raise: z30.boolean().optional(),
7792
+ confirmation: Confirmation.optional()
7793
+ });
7563
7794
  var CHANGE_OWNER_ROLES = [
7564
7795
  "product-owner",
7565
7796
  "architect",
@@ -7745,6 +7976,8 @@ var QuestionList = z30.object({
7745
7976
  * the stage's that asked. Left out for a question no change's phase raised.
7746
7977
  */
7747
7978
  role: QuestionRole.optional(),
7979
+ /** 3.6.0 (ADR 0191): what it asks (business, design, delivery), its own or its role's. */
7980
+ asks: QuestionAsks.optional(),
7748
7981
  /**
7749
7982
  * 2.36.0 (ADR 0144, Q5): the answer the assistant proposed, for an open question, when
7750
7983
  * every line it cites says what it quotes. A person accepts it or answers otherwise.
@@ -8403,6 +8636,159 @@ var UpgradeView = z30.object({
8403
8636
  stamp: z30.string().optional(),
8404
8637
  pending: z30.array(z30.object({ id: z30.string(), summary: z30.string(), files: z30.array(z30.string()) }))
8405
8638
  });
8639
+ var FileEditView = z30.object({
8640
+ path: z30.string(),
8641
+ changes: z30.array(z30.object({ was: z30.string().optional(), now: z30.string().optional() })),
8642
+ written: z30.boolean(),
8643
+ note: z30.string(),
8644
+ /** The raw editor's runtime.yaml edit moves where the model's key goes: the write needs `ai-model`. */
8645
+ confirm: z30.literal("ai-model").optional()
8646
+ });
8647
+ var SetupMetarepoView = z30.object({
8648
+ metarepo: z30.boolean(),
8649
+ root: z30.string(),
8650
+ folder: z30.string(),
8651
+ suggested: z30.object({ name: z30.string(), platform: z30.string() }),
8652
+ /** The folder's origin, when it is a clone (without credentials). */
8653
+ origin: z30.string().optional(),
8654
+ /** The metarepo's id on the Git host, read from origin. */
8655
+ metarepoId: z30.string().optional()
8656
+ });
8657
+ var CreateMetarepoRequest = z30.strictObject({
8658
+ name: RecordId,
8659
+ platform: RecordId,
8660
+ owner: z30.string().trim().min(1).max(100).optional(),
8661
+ /** The metarepo's repo on the Git host, written under runtime.yaml's manual Git host. */
8662
+ metarepo: z30.string().trim().min(1).max(300).optional()
8663
+ });
8664
+ var OpenFolderRequest = z30.strictObject({ path: z30.string().min(1).max(4096) });
8665
+ var OpenFolderView = z30.object({
8666
+ url: z30.string(),
8667
+ root: z30.string(),
8668
+ metarepo: z30.boolean()
8669
+ });
8670
+ var ReposPlanRequest = z30.strictObject({
8671
+ urls: z30.string().max(2e5).optional(),
8672
+ dir: z30.string().min(1).max(4096).optional(),
8673
+ platform: RecordId.optional()
8674
+ }).refine((b) => !!b.urls?.trim() !== !!b.dir, "send urls or dir, one of them");
8675
+ var PlannedRepoView = z30.object({
8676
+ id: z30.string(),
8677
+ url: z30.string(),
8678
+ /** What the person gave, when the URL was normalised from it. */
8679
+ given: z30.string().optional(),
8680
+ type: z30.string(),
8681
+ defaultBranch: z30.string().optional(),
8682
+ /** The id it would have had, and why it got another (`-2`). */
8683
+ renamed: z30.object({ from: z30.string(), why: z30.string() }).optional(),
8684
+ detected: z30.object({ signals: z30.array(z30.string()), confidence: z30.string() }).optional()
8685
+ });
8686
+ var ReposPlanView = z30.object({
8687
+ platform: z30.string().optional(),
8688
+ platforms: z30.array(z30.string()),
8689
+ repos: z30.array(PlannedRepoView),
8690
+ /** Given, but a manifest lists that clone URL already: left out. */
8691
+ listed: z30.array(z30.object({ url: z30.string(), id: z30.string() })),
8692
+ refused: z30.array(z30.object({ given: z30.string(), why: z30.string() })),
8693
+ /** Folders repos discover looked at that aren't repos. */
8694
+ skipped: z30.array(z30.object({ path: z30.string(), reason: z30.string() }))
8695
+ });
8696
+ var AddReposRequest = z30.strictObject({
8697
+ platform: RecordId.optional(),
8698
+ repos: z30.array(z30.strictObject({
8699
+ id: RecordId,
8700
+ url: z30.string().min(1).max(2e3),
8701
+ type: z30.string().max(100).optional(),
8702
+ owner: z30.string().max(100).optional(),
8703
+ defaultBranch: z30.string().max(250).optional(),
8704
+ /** What it is, in the person's words (ADR 0128); optional. */
8705
+ description: z30.string().max(300).optional()
8706
+ })).min(1).max(500),
8707
+ preview: z30.boolean().optional()
8708
+ });
8709
+ var RepoTypeDetectView = z30.object({
8710
+ repo: z30.string(),
8711
+ /** The org pack's repo types (atticus repo-type detect), or the files as repo add reads them. */
8712
+ from: z30.enum(["repo-types", "files"]),
8713
+ verdict: z30.string(),
8714
+ /** The type to write, when the match settles one. */
8715
+ type: z30.string().optional(),
8716
+ signals: z30.array(z30.string()).optional(),
8717
+ confidence: z30.string().optional(),
8718
+ matches: z30.array(z30.object({ type: z30.string(), name: z30.string(), score: z30.number() }))
8719
+ });
8720
+ var RepoTypeRequest = z30.strictObject({
8721
+ type: z30.string().trim().min(1).max(100),
8722
+ preview: z30.boolean().optional()
8723
+ });
8724
+ var AdapterSettingValue = z30.union([z30.string(), z30.number(), z30.boolean(), z30.array(z30.string())]);
8725
+ var AdaptersView = z30.object({
8726
+ /** runtime.yaml, metarepo-relative. */
8727
+ path: z30.string(),
8728
+ /** 3.9.0: runtime.yaml's sha256 as read, sent back as a write's `baseSha256`. */
8729
+ sha256: z30.string(),
8730
+ kinds: z30.array(z30.object({
8731
+ kind: z30.string(),
8732
+ types: z30.array(z30.string()),
8733
+ /** The settings Atticus reads for this kind; a plugin may read more. */
8734
+ fields: z30.array(z30.object({ name: z30.string(), list: z30.boolean() })),
8735
+ current: z30.object({ type: z30.string(), settings: z30.record(z30.string(), AdapterSettingValue) }).nullable()
8736
+ })),
8737
+ problems: z30.array(z30.string())
8738
+ });
8739
+ var AdapterRequest = z30.strictObject({
8740
+ /** The adapter, or null to take it out of runtime.yaml. */
8741
+ value: z30.strictObject({
8742
+ type: z30.string().min(1).max(100),
8743
+ settings: z30.record(z30.string().max(100), AdapterSettingValue).optional()
8744
+ }).nullable(),
8745
+ /**
8746
+ * 3.9.0: runtime.yaml's sha256 as the form read it (AdaptersView's), so a write onto a file
8747
+ * changed since is refused (409), never overwriting the newer edit.
8748
+ */
8749
+ baseSha256: z30.string().regex(/^[0-9a-f]{64}$/).optional(),
8750
+ preview: z30.boolean().optional()
8751
+ });
8752
+ var OrgPackFileView = z30.object({
8753
+ path: z30.string(),
8754
+ /** Relative to the org pack folder. */
8755
+ rel: z30.string(),
8756
+ content: z30.string(),
8757
+ sha256: z30.string(),
8758
+ exists: z30.boolean(),
8759
+ /** Checked with its schema before it is written (a YAML file Atticus reads). */
8760
+ checked: z30.boolean()
8761
+ });
8762
+ var OrgPackFileRequest = z30.strictObject({
8763
+ path: z30.string().min(1).max(500),
8764
+ content: z30.string().max(2e6),
8765
+ /** The file's sha256 as opened (GET's), so an edit made meanwhile is refused. */
8766
+ baseSha256: z30.string().regex(/^[0-9a-f]{64}$/),
8767
+ preview: z30.boolean().optional(),
8768
+ confirmation: Confirmation.optional()
8769
+ });
8770
+ var PatternRequest = z30.strictObject({
8771
+ code: z30.string().min(1).max(60),
8772
+ name: z30.string().min(1).max(200),
8773
+ definition: z30.string().min(1).max(2e3),
8774
+ interaction: z30.string(),
8775
+ route: z30.string(),
8776
+ targetType: z30.string(),
8777
+ controls: z30.array(z30.string().max(200)).max(50).optional(),
8778
+ source: z30.string().min(1).max(500),
8779
+ version: z30.string().max(40).optional(),
8780
+ status: z30.string().optional(),
8781
+ preview: z30.boolean().optional()
8782
+ });
8783
+ var SourceRequest = z30.strictObject({
8784
+ type: z30.string().min(1).max(40),
8785
+ location: z30.string().min(1).max(2e3),
8786
+ id: RecordId.optional(),
8787
+ /** A git wiki's folder of pages, and its branch or tag. */
8788
+ path: z30.string().max(500).optional(),
8789
+ ref: z30.string().max(250).optional(),
8790
+ preview: z30.boolean().optional()
8791
+ });
8406
8792
  var ConnectLinksRequest = z30.object({
8407
8793
  from: z30.string().min(1),
8408
8794
  to: LinkBox,
@@ -8471,7 +8857,7 @@ var FileChangeResult = z30.object({
8471
8857
  commit: z30.string()
8472
8858
  });
8473
8859
  var SketchStrokeRequest = z30.object({
8474
- stroke: z30.object({ kind: z30.enum(["call", "topic", "table", "remove", "retarget", "undo"]) }).passthrough(),
8860
+ stroke: z30.object({ kind: z30.enum(["call", "topic", "table", "remove", "retarget", "undo", "retire"]) }).passthrough(),
8475
8861
  /** Say what it would write; write nothing. */
8476
8862
  preview: z30.boolean().optional(),
8477
8863
  /** The preview's fingerprint of the target flows: the write is refused (409) when they changed since. */
@@ -8653,8 +9039,102 @@ var CopilotRunCurrent = z30.object({
8653
9039
  why: z30.string().optional(),
8654
9040
  model: z30.string().optional()
8655
9041
  });
9042
+ var ActivityKind = z30.enum([
9043
+ // The app's own jobs (ADR 0015), by their kind.
9044
+ "scan",
9045
+ "sync",
9046
+ "reconcile",
9047
+ "index",
9048
+ "intake",
9049
+ "step",
9050
+ "local",
9051
+ /** A request the page waits on, run as a job (the critic, a wiki's sync, a step run, Done). */
9052
+ "work",
9053
+ /** An unattended Copilot run the app started (ADR 0173): its lines are its tabs. */
9054
+ "copilot",
9055
+ /** A command run in a terminal, by an editor or by a Copilot session. */
9056
+ "command",
9057
+ /** A hand-off run waiting for the person's assistant, and its Done. */
9058
+ "handoff"
9059
+ ]);
9060
+ var ActivityState = z30.enum([
9061
+ "running",
9062
+ "waiting",
9063
+ "done",
9064
+ "failed",
9065
+ "cancelled",
9066
+ /** Its process is gone and it never said how it ended (a terminal closed, a crash). */
9067
+ "ended"
9068
+ ]);
9069
+ var ActivityWhere = z30.enum([
9070
+ "app",
9071
+ "terminal",
9072
+ "vscode",
9073
+ "intellij",
9074
+ "copilot",
9075
+ /** A hand-off run: the person's own assistant does the work. */
9076
+ "assistant"
9077
+ ]);
9078
+ var ActivityEntry = z30.object({
9079
+ /** A job's id (job-N), a Copilot run's (copilot-run-...), term-<runId> for a command, a hand-off run's (run-...). */
9080
+ id: z30.string().min(1),
9081
+ kind: ActivityKind,
9082
+ /** What it is, in its own words: the command (`atticus map forge-ledger`), or the app's job. Left out for a job that gave none: the page names it by its kind. */
9083
+ title: z30.string().optional(),
9084
+ where: ActivityWhere,
9085
+ state: ActivityState,
9086
+ startedAt: z30.string(),
9087
+ finishedAt: z30.string().optional(),
9088
+ /** How far it is, when it says (a job's progress). */
9089
+ progress: z30.object({ done: z30.number().int(), total: z30.number().int(), message: z30.string() }).optional(),
9090
+ exitCode: z30.number().int().optional(),
9091
+ /** How many lines it has printed: the page asks for the ones it hasn't. */
9092
+ lines: z30.number().int().min(0),
9093
+ /** The first line still kept (older ones are dropped past the cap). */
9094
+ from: z30.number().int().min(0),
9095
+ /**
9096
+ * 3.9.0 (review of beta.23): which version of its lines these are, for an entry whose lines
9097
+ * are rewritten rather than only added to (a hand-off run's say what to do, then what Done
9098
+ * did). When it changes, the page reads its lines again from the start instead of adding.
9099
+ */
9100
+ rev: z30.string().optional(),
9101
+ /** The route that stops it (POST), when the app can; a command stops in its terminal. */
9102
+ stop: z30.string().optional(),
9103
+ jobId: z30.string().optional(),
9104
+ copilotRunId: z30.string().optional(),
9105
+ /** A command's run id (its files in .atticus/logs/). */
9106
+ runId: z30.string().optional(),
9107
+ /** A hand-off run: its change, where its prompt is and where the answer goes. */
9108
+ handoff: z30.object({
9109
+ runId: z30.string(),
9110
+ change: z30.string(),
9111
+ agent: z30.string().optional(),
9112
+ promptPath: z30.string(),
9113
+ output: z30.string().optional()
9114
+ }).optional()
9115
+ });
9116
+ var ActivityList = z30.object({
9117
+ /** Newest first. */
9118
+ entries: z30.array(ActivityEntry),
9119
+ /** How many are running now. */
9120
+ running: z30.number().int().min(0)
9121
+ });
9122
+ var ActivityLines = z30.object({
9123
+ id: z30.string(),
9124
+ /** The number of the first of these lines. */
9125
+ from: z30.number().int().min(0),
9126
+ lines: z30.array(z30.string()),
9127
+ /** How many lines it has printed in all. */
9128
+ total: z30.number().int().min(0),
9129
+ state: ActivityState
9130
+ });
8656
9131
  var LiveEvent = z30.discriminatedUnion("type", [
8657
- z30.object({ type: z30.literal("file.changed"), path: z30.string() }),
9132
+ z30.object({
9133
+ type: z30.literal("file.changed"),
9134
+ path: z30.string(),
9135
+ /** 3.9.0: whether it can change the catalog, by the folders the org pack's layout names. */
9136
+ catalog: z30.boolean().optional()
9137
+ }),
8658
9138
  z30.object({
8659
9139
  type: z30.literal("job.progress"),
8660
9140
  jobId: z30.string(),
@@ -8675,8 +9155,147 @@ var LiveEvent = z30.discriminatedUnion("type", [
8675
9155
  /** The number of the first of these lines in the tab. */
8676
9156
  at: z30.number().int().min(0),
8677
9157
  lines: z30.array(z30.string())
9158
+ }),
9159
+ // ADR 0187: an activity appeared or changed, and new lines one printed.
9160
+ z30.object({ type: z30.literal("activity.changed"), entry: ActivityEntry }),
9161
+ z30.object({
9162
+ type: z30.literal("activity.lines"),
9163
+ id: z30.string(),
9164
+ /** The number of the first of these lines. */
9165
+ at: z30.number().int().min(0),
9166
+ lines: z30.array(z30.string())
8678
9167
  })
8679
9168
  ]);
9169
+ var RouteQuestionRequest = z30.strictObject({ role: QuestionRole });
9170
+ var OwnerSuggestion = z30.object({
9171
+ role: z30.string(),
9172
+ people: z30.array(z30.string()),
9173
+ from: z30.union([
9174
+ z30.object({ team: z30.string(), name: z30.string().optional(), repos: z30.array(z30.string()) }),
9175
+ z30.object({ default: z30.literal(true) })
9176
+ ])
9177
+ });
9178
+ var OwnerSuggestionList = z30.object({
9179
+ change: z30.string(),
9180
+ suggestions: z30.array(OwnerSuggestion),
9181
+ /** Why there are none, in words, when there are none. */
9182
+ note: z30.string().optional()
9183
+ });
9184
+ var WaitsOn = z30.object({
9185
+ /** The change.yaml owner key: product-owner, architect, business-analyst or team-lead. */
9186
+ role: z30.string(),
9187
+ people: z30.array(z30.string()),
9188
+ /** `handoff`: its hand-off PR waits on their review; `phase`: the phase's work is theirs. */
9189
+ because: z30.enum(["handoff", "phase"]),
9190
+ phase: z30.string()
9191
+ });
9192
+ var FindingView = z30.strictObject({ ...Finding.shape, asks: QuestionAsks });
9193
+ var WorkItemPlan = z30.object({
9194
+ change: z30.string(),
9195
+ /** none: runtime.yaml names no work tracker; manual: steps for a person; live: the tracker. */
9196
+ tracker: z30.enum(["none", "manual", "live"]),
9197
+ items: z30.array(z30.object({
9198
+ key: z30.string(),
9199
+ type: z30.string(),
9200
+ title: z30.string(),
9201
+ action: z30.enum(["create", "update", "unchanged", "orphaned"]),
9202
+ /** The tracker's id once known; `manual:<step>` until a person records it. */
9203
+ id: z30.string().optional(),
9204
+ /** The step to record it on, for a manual id. */
9205
+ step: z30.string().optional(),
9206
+ /** The story it is under, for a task; the story's own key for a story. */
9207
+ story: z30.string().optional()
9208
+ })),
9209
+ /** The command that does the same in a terminal. */
9210
+ command: z30.string()
9211
+ });
9212
+ var WorkItemSyncRequest = z30.strictObject({
9213
+ confirmation: Confirmation.optional(),
9214
+ /** 3.9.0: run the sync as a job (202 and its id; the job's result `answer` is the result). */
9215
+ job: z30.boolean().optional()
9216
+ });
9217
+ var WorkItemSyncResult = z30.object({
9218
+ plan: WorkItemPlan,
9219
+ lines: z30.array(z30.string()),
9220
+ done: z30.array(z30.object({ key: z30.string(), action: z30.string(), id: z30.string() })),
9221
+ failed: z30.array(z30.object({ key: z30.string(), reason: z30.string() }))
9222
+ });
9223
+ var SendOwnerAskRequest = z30.strictObject({ confirmation: Confirmation.optional() });
9224
+ var SentOwnerAsk = z30.object({
9225
+ /** sent: through the adapter; step: a manual step for a person; not-sent: why in `why`. */
9226
+ state: z30.enum(["sent", "step", "not-sent"]),
9227
+ to: z30.string(),
9228
+ id: z30.string().optional(),
9229
+ why: z30.string().optional()
9230
+ });
9231
+ var KnowledgePassageView = z30.object({
9232
+ source: z30.string(),
9233
+ page: z30.string(),
9234
+ /** The page's root-relative path (the snapshot copy, or the inputs/ file). */
9235
+ path: z30.string(),
9236
+ heading: z30.string(),
9237
+ line: z30.number().int(),
9238
+ text: z30.string()
9239
+ });
9240
+ var KnowledgeAnswerView = z30.object({
9241
+ items: z30.array(z30.object({
9242
+ id: z30.string(),
9243
+ kind: z30.string(),
9244
+ title: z30.string(),
9245
+ quote: z30.object({
9246
+ source: z30.string(),
9247
+ page: z30.string(),
9248
+ section: z30.string().optional(),
9249
+ text: z30.string()
9250
+ }).optional()
9251
+ })),
9252
+ passages: z30.array(KnowledgePassageView),
9253
+ /** The AI step that answers from the items in words, citing them (atticus knowledge ask). */
9254
+ command: z30.string()
9255
+ });
9256
+ var StoryShapeOp = z30.enum(["rename", "split", "merge", "add"]);
9257
+ var StoryShapeRequest = z30.strictObject({
9258
+ op: StoryShapeOp,
9259
+ /** rename, split: the story; merge: the stories, the first keeps its number. */
9260
+ story: z30.string().optional(),
9261
+ stories: z30.array(z30.string()).min(2).optional(),
9262
+ /** rename, merge, add: its name; split: the first part's. */
9263
+ name: z30.string().trim().min(1).max(200),
9264
+ /** What the story is for, in the person's words (add, a split's parts). */
9265
+ words: z30.string().trim().max(2e3).optional(),
9266
+ /** split: the other parts, each a story of its own. */
9267
+ parts: z30.array(z30.strictObject({
9268
+ name: z30.string().trim().min(1).max(200),
9269
+ words: z30.string().trim().max(2e3).optional()
9270
+ })).optional()
9271
+ });
9272
+ var StoryShapeEntryView = z30.object({
9273
+ id: z30.string(),
9274
+ op: StoryShapeOp,
9275
+ story: z30.string().optional(),
9276
+ stories: z30.array(z30.string()).optional(),
9277
+ name: z30.string(),
9278
+ words: z30.string().optional(),
9279
+ parts: z30.array(z30.object({ id: z30.string(), name: z30.string(), words: z30.string().optional() })).optional(),
9280
+ /** The story an added one is. */
9281
+ added: z30.string().optional(),
9282
+ by: z30.string(),
9283
+ at: z30.string(),
9284
+ /** waiting: no draft has read it yet; applied: the stories now have it, with the run. */
9285
+ state: z30.enum(["waiting", "applied"]),
9286
+ run: z30.string().optional()
9287
+ });
9288
+ var StoryShapeView = z30.object({
9289
+ change: z30.string(),
9290
+ file: z30.string(),
9291
+ entries: z30.array(StoryShapeEntryView),
9292
+ /** Each task's story as the last draft mapped it, by task id. */
9293
+ assigned: z30.record(z30.string(), z30.string()),
9294
+ /** What the coverage check found: a story with no task, a task with no story. */
9295
+ uncovered: z30.array(z30.string()),
9296
+ /** The step that maps the tasks to the stories again. */
9297
+ command: z30.string()
9298
+ });
8680
9299
  var str3 = { type: "string" };
8681
9300
  var ref = (name) => ({ $ref: `#/components/schemas/${name}` });
8682
9301
  var arrayOf = (name) => ({ type: "array", items: ref(name) });
@@ -8720,7 +9339,7 @@ var OPS = {
8720
9339
  "/api/me": {
8721
9340
  get: {
8722
9341
  id: "getMe",
8723
- summary: "Who is using the app: the metarepo's Git user (handle, name, email, and a warning when the OS user stood in), what AI may do and the digest settings (ADR 0073)",
9342
+ summary: "Who is using the app: the metarepo's Git user (handle, name, email, and a warning when the OS user stood in), what AI may do and the digest settings (ADR 0073); 3.1.0: notify.to, where Send it to me posts",
8724
9343
  tag: "system",
8725
9344
  ok: {
8726
9345
  status: 200,
@@ -8752,7 +9371,7 @@ var OPS = {
8752
9371
  "/api/me/digest": {
8753
9372
  post: {
8754
9373
  id: "sendDigest",
8755
- summary: "What waits on the person; with send, posted through the notify adapter as their approval. 3.0.0 (ADR 0186): send needs the person's confirmation (`digest-send`, `me`), else 403",
9374
+ summary: "What waits on the person; with send, posted through the notify adapter as their approval. 3.0.0 (ADR 0186): send needs the person's confirmation, else 403. 3.1.0 (review round 50): its target is the channel it posts to (GET /api/me's notify.to, read again at the send), not `me`",
8756
9375
  tag: "system",
8757
9376
  body: SendDigestRequest,
8758
9377
  ok: {
@@ -8900,8 +9519,11 @@ var OPS = {
8900
9519
  "/api/setup": {
8901
9520
  get: {
8902
9521
  id: "getSetup",
8903
- summary: "The setup checklist until the catalog is accepted, with a plain fix for each step",
9522
+ summary: "The setup checklist until the catalog is accepted, with a plain fix for each step; the machine step says `checking` while the machine's checks run",
8904
9523
  tag: "system",
9524
+ params: [
9525
+ q("machine", { type: "string", enum: ["wait"] }, "Wait for the machine's checks instead of answering with the machine step checking")
9526
+ ],
8905
9527
  ok: {
8906
9528
  status: 200,
8907
9529
  schema: { type: "object", required: ["steps", "baselined"] },
@@ -9094,7 +9716,7 @@ var OPS = {
9094
9716
  "/api/ask": {
9095
9717
  get: {
9096
9718
  id: "ask",
9097
- summary: "Answer a plain-language question from the catalog; the query used is always returned",
9719
+ summary: "Answer a plain-language question from the catalog; the query used is always returned. 3.6.0 (ADR 0191): `knowledge` (KnowledgeAnswerView) says what the organisation's knowledge items, wiki snapshots and inputs/ files say to it, each cited",
9098
9720
  tag: "catalog",
9099
9721
  params: [q("q", str3, "The question, e.g. who calls ledger-api?")],
9100
9722
  ok: {
@@ -9659,6 +10281,17 @@ var OPS = {
9659
10281
  ok: { status: 200, schema: "OwnerQuestionList", description: "OK" }
9660
10282
  }
9661
10283
  },
10284
+ "/api/owner-questions/{id}/send": {
10285
+ post: {
10286
+ id: "sendOwnerQuestion",
10287
+ summary: "3.6.0 (ADR 0191): send the owner question through the notify adapter to its owner, on the person's `owner-ask` confirmation; with manual notifications it is a step for a person, and with none it says to copy the text",
10288
+ tag: "questions",
10289
+ params: [p("id")],
10290
+ body: SendOwnerAskRequest,
10291
+ ok: { status: 200, schema: "SentOwnerAsk", description: "Sent, or why not" },
10292
+ errors: [400, 403, 404]
10293
+ }
10294
+ },
9662
10295
  "/api/owner-questions/{id}/answer": {
9663
10296
  post: {
9664
10297
  id: "answerOwnerQuestion",
@@ -9702,6 +10335,65 @@ var OPS = {
9702
10335
  errors: [404]
9703
10336
  }
9704
10337
  },
10338
+ "/api/changes/{changeId}/owners/suggested": {
10339
+ get: {
10340
+ id: "suggestChangeOwners",
10341
+ summary: "3.6.0 (ADR 0191): who roles.yaml suggests for each role the change doesn't name yet: the team owning its repos, else the organisation's default; a person accepts one with PUT .../owners",
10342
+ tag: "changes",
10343
+ params: [p("changeId")],
10344
+ ok: { status: 200, schema: "OwnerSuggestionList", description: "OK" },
10345
+ errors: [400, 404]
10346
+ }
10347
+ },
10348
+ "/api/changes/{changeId}/work-items": {
10349
+ get: {
10350
+ id: "planWorkItems",
10351
+ summary: "3.6.0 (ADR 0191): the feature, stories and tasks the plan puts in the work tracker, and what sync.yaml remembers of each (atticus ado sync --dry-run)",
10352
+ tag: "changes",
10353
+ params: [p("changeId")],
10354
+ ok: { status: 200, schema: "WorkItemPlan", description: "OK" },
10355
+ errors: [400, 404, 422]
10356
+ },
10357
+ post: {
10358
+ id: "syncWorkItems",
10359
+ summary: "3.6.0 (ADR 0191): put them in the work tracker as the signed-in person: with a manual tracker a step each (the fields to copy, the id to record); with a live one, on the person's `work-items` confirmation. sync.yaml keeps each id, so a later sync updates rather than duplicates. 3.9.0: with `job: true`, 202 JobAccepted at once; the job's result `answer` is the result, or `problem` when refused",
10360
+ tag: "changes",
10361
+ params: [p("changeId")],
10362
+ body: WorkItemSyncRequest,
10363
+ ok: { status: 200, schema: "WorkItemSyncResult", description: "Synced" },
10364
+ alsoOk: { status: 202, schema: "JobAccepted", description: "Started as a job (`job: true`)" },
10365
+ errors: [400, 403, 404, 422]
10366
+ }
10367
+ },
10368
+ "/api/changes/{changeId}/stories/shape": {
10369
+ get: {
10370
+ id: "getStoryShape",
10371
+ summary: "3.6.0 (ADR 0191): the business analyst's renames, splits, merges and added stories, each task's story as the last draft mapped it, and what is uncovered",
10372
+ tag: "changes",
10373
+ params: [p("changeId")],
10374
+ ok: { status: 200, schema: "StoryShapeView", description: "OK" },
10375
+ errors: [400, 404]
10376
+ },
10377
+ post: {
10378
+ id: "shapeStories",
10379
+ summary: "3.6.0 (ADR 0191): rename, split, merge or add a story in plain words, as the signed-in person; a rename and a merge keep the number, a split's new part and an added story take the next free one. The next draft of the stories maps the tasks to them",
10380
+ tag: "changes",
10381
+ params: [p("changeId")],
10382
+ body: StoryShapeRequest,
10383
+ ok: { status: 201, schema: "StoryShapeView", description: "Recorded" },
10384
+ errors: [400, 404, 422]
10385
+ }
10386
+ },
10387
+ "/api/changes/{changeId}/stories/shape/{entryId}/remove": {
10388
+ post: {
10389
+ id: "removeStoryShape",
10390
+ summary: "3.6.0 (ADR 0191): take back a shaping no draft has read yet; one a draft applied stays, and a later one changes it",
10391
+ tag: "changes",
10392
+ params: [p("changeId"), p("entryId")],
10393
+ ok: { status: 200, schema: "StoryShapeView", description: "Removed" },
10394
+ errors: [400, 404, 422]
10395
+ }
10396
+ },
9705
10397
  "/api/changes/{changeId}/owners": {
9706
10398
  put: {
9707
10399
  id: "setChangeOwners",
@@ -9814,7 +10506,7 @@ var OPS = {
9814
10506
  "/api/changes/{changeId}/tasks/run-ready": {
9815
10507
  post: {
9816
10508
  id: "runReadyTasks",
9817
- summary: "2.79.0 (ADR 0181 part 4): Run all ready tasks, one task run each in order as one job, stopping on the first that needs a person; the click is the approval for draft, never the pr level",
10509
+ summary: "2.79.0 (ADR 0181 part 4): Run all ready tasks, one task run each in order as one job, stopping on the first that needs a person; the click is the approval for draft, never the pr level. 3.1.0: in model mode 403 unless runtime.yaml sends the key where the person last confirmed",
9818
10510
  tag: "changes",
9819
10511
  params: [p("changeId")],
9820
10512
  body: RunReadyRequest,
@@ -9830,18 +10522,50 @@ var OPS = {
9830
10522
  params: [p("changeId"), p("taskId")],
9831
10523
  body: TaskDoneRequest,
9832
10524
  ok: { status: 200, schema: "Task", description: "The task as tasks.md now says it" },
9833
- errors: [400, 403, 404]
10525
+ errors: [400, 403, 404, 409]
10526
+ }
10527
+ },
10528
+ "/api/propose/upstream": {
10529
+ post: {
10530
+ id: "setUpstream",
10531
+ summary: "3.3.0 (app-only audit): set the upstream of the branch checked out to the same branch on a remote, a local setting (nothing is sent), as a local job; refused (the job's result says why) for any other branch",
10532
+ tag: "workspace",
10533
+ body: UpstreamRequest,
10534
+ ok: { status: 202, schema: "JobAccepted", description: "Job started" },
10535
+ errors: [400, 409]
10536
+ }
10537
+ },
10538
+ "/api/changes/{changeId}/handoff/push": {
10539
+ post: {
10540
+ id: "pushHandoff",
10541
+ summary: "3.3.0 (app-only audit): Push again: push the open hand-off's branch, kept here when its push failed, by name and never forced; needs the person's confirmation (`handoff`, the change), else 403; 422 with git's words when the push fails",
10542
+ tag: "changes",
10543
+ params: [p("changeId")],
10544
+ body: ConfirmedRequest,
10545
+ ok: { status: 200, schema: "ChangeDetail", description: "The change, its branch pushed" },
10546
+ errors: [403, 404, 422]
10547
+ }
10548
+ },
10549
+ "/api/changes/{changeId}/tasks/{taskId}/build": {
10550
+ post: {
10551
+ id: "buildTask",
10552
+ summary: "3.3.0 (app-only audit): Build and raise PR on a task drafted but not built (UNVERIFIED) or taken over by a person: build it with its repo's build command as it is now, and with `raise` push its branch and open its PR (needs the person's confirmation, `task-pr`, `<change>/<task>`, else 403)",
10553
+ tag: "changes",
10554
+ params: [p("changeId"), p("taskId")],
10555
+ body: TaskBuildRequest,
10556
+ ok: { status: 200, schema: "Task", description: "The task, built (201 with its PR raised)" },
10557
+ errors: [400, 403, 404, 409, 422]
9834
10558
  }
9835
10559
  },
9836
10560
  "/api/changes/{changeId}/workspace": {
9837
10561
  post: {
9838
10562
  id: "openWorkspace",
9839
- summary: "Create the change's worktrees and editor workspaces",
10563
+ summary: "Create the change's worktrees and editor workspaces; 3.1.0: 409 while a sync of one of its repos' base clones runs elsewhere",
9840
10564
  tag: "changes",
9841
10565
  params: [p("changeId")],
9842
10566
  body: OpenWorkspaceRequest,
9843
10567
  ok: { status: 200, schema: "ChangeRepos", description: "OK" },
9844
- errors: [400, 404]
10568
+ errors: [400, 404, 409]
9845
10569
  }
9846
10570
  },
9847
10571
  "/api/changes/{changeId}/handoff": {
@@ -9866,12 +10590,12 @@ var OPS = {
9866
10590
  },
9867
10591
  post: {
9868
10592
  id: "startRun",
9869
- summary: "Prepare an AI run (hand-off by default)",
10593
+ summary: "Prepare an AI run (hand-off by default); 3.1.0: in model mode 403 unless runtime.yaml sends the key where the person last confirmed (ADR 0186 addendum), and 409 while a sync of the task's repo runs elsewhere",
9870
10594
  tag: "ai",
9871
10595
  params: [p("changeId")],
9872
10596
  body: StartRunRequest,
9873
10597
  ok: { status: 201, schema: "RunView", description: "Prepared" },
9874
- errors: [400, 403, 404, 422]
10598
+ errors: [400, 403, 404, 409, 422]
9875
10599
  }
9876
10600
  },
9877
10601
  "/api/changes/{changeId}/critic": {
@@ -9909,7 +10633,7 @@ var OPS = {
9909
10633
  },
9910
10634
  post: {
9911
10635
  id: "startStep",
9912
- summary: "Start an AI step on the server with runtime.yaml's model, as a job (ADR 0106); 409 when no model is configured, or (2.68.0) while another AI step runs",
10636
+ summary: "Start an AI step on the server with runtime.yaml's model, as a job (ADR 0106); 409 when no model is configured, or (2.68.0) while another AI step runs; 3.1.0: 403 unless runtime.yaml sends the key where the person last confirmed (ADR 0186 addendum)",
9913
10637
  tag: "ai",
9914
10638
  body: StartStepRequest,
9915
10639
  ok: {
@@ -9917,7 +10641,7 @@ var OPS = {
9917
10641
  schema: { type: "object", required: ["jobId", "model"] },
9918
10642
  description: "Started"
9919
10643
  },
9920
- errors: [400, 409]
10644
+ errors: [400, 403, 409]
9921
10645
  }
9922
10646
  },
9923
10647
  "/api/runs/handoff": {
@@ -9997,6 +10721,67 @@ var OPS = {
9997
10721
  errors: [409]
9998
10722
  }
9999
10723
  },
10724
+ "/api/facts/apply-all": {
10725
+ post: {
10726
+ id: "applyAllFacts",
10727
+ summary: "3.5.0 (ADR 0188): run atticus verify --all --write as a local job, as Apply after a declaration or an owner set on the canvas",
10728
+ tag: "workspace",
10729
+ ok: {
10730
+ status: 202,
10731
+ schema: "JobAccepted",
10732
+ description: "Started: its job's result is the code and the lines verify printed"
10733
+ },
10734
+ errors: [409]
10735
+ }
10736
+ },
10737
+ "/api/estate/join": {
10738
+ post: {
10739
+ id: "joinEstate",
10740
+ summary: "3.5.0 (ADR 0188): run atticus estate join as a local job: each flow's calls to other repos followed into the flows they reach",
10741
+ tag: "workspace",
10742
+ ok: { status: 202, schema: "JobAccepted", description: "Job started" },
10743
+ errors: [409]
10744
+ }
10745
+ },
10746
+ "/api/knowledge/sources/sync": {
10747
+ post: {
10748
+ id: "syncAllKnowledgeSources",
10749
+ summary: "3.5.0 (ADR 0188): run atticus sources sync as a local job: every wiki in sources.yaml read into a dated snapshot",
10750
+ tag: "knowledge",
10751
+ ok: { status: 202, schema: "JobAccepted", description: "Job started" },
10752
+ errors: [409]
10753
+ }
10754
+ },
10755
+ "/api/workspace/prune": {
10756
+ post: {
10757
+ id: "pruneWorktrees",
10758
+ summary: "3.5.0 (ADR 0188): run atticus workspace prune as a local job, for one change or every change with worktrees; a worktree with uncommitted work is kept",
10759
+ tag: "workspace",
10760
+ body: PruneRequest,
10761
+ ok: { status: 202, schema: "JobAccepted", description: "Job started" },
10762
+ errors: [400, 409]
10763
+ }
10764
+ },
10765
+ "/api/changes/{changeId}/tasks/{taskId}/context": {
10766
+ get: {
10767
+ id: "getTaskContext",
10768
+ summary: "3.5.0 (ADR 0188): a task's context as atticus task context --markdown prints it, for the person to copy into their assistant",
10769
+ tag: "changes",
10770
+ params: [p("changeId"), p("taskId")],
10771
+ ok: { status: 200, schema: "TaskContextView", description: "OK" },
10772
+ errors: [400]
10773
+ }
10774
+ },
10775
+ "/api/history/recording": {
10776
+ put: {
10777
+ id: "setPromptHistoryRecording",
10778
+ summary: "3.5.0 (ADR 0188): atticus history on|off, this machine's recording (.atticus/me.yaml); the org pack's history.record: false still holds",
10779
+ tag: "ai",
10780
+ body: HistoryRecordingRequest,
10781
+ ok: { status: 200, schema: "HistoryRecordingView", description: "OK" },
10782
+ errors: [400]
10783
+ }
10784
+ },
10000
10785
  "/api/upgrade": {
10001
10786
  get: {
10002
10787
  id: "getUpgrade",
@@ -10012,6 +10797,131 @@ var OPS = {
10012
10797
  errors: [409]
10013
10798
  }
10014
10799
  },
10800
+ // ADR 0190: settings and setup in the app, "Edit, then Propose".
10801
+ "/api/setup/metarepo": {
10802
+ get: {
10803
+ id: "getSetupMetarepo",
10804
+ summary: "3.5.0 (ADR 0190): whether the folder the app runs in is a metarepo, and what Create the metarepo here would use (a name and platform from the folder's name, the metarepo's id on the Git host from its origin)",
10805
+ tag: "run",
10806
+ ok: { status: 200, schema: "SetupMetarepoView", description: "OK" }
10807
+ },
10808
+ post: {
10809
+ id: "createMetarepo",
10810
+ summary: "Create the metarepo in this folder with atticus init's own code (name, platform, owner; the Git host manual, with the metarepo's id when given or read from origin), brought up to date as init does. Local files only: nothing is pushed. 409 when it is a metarepo already",
10811
+ tag: "run",
10812
+ body: CreateMetarepoRequest,
10813
+ ok: { status: 201, schema: "LinesView", description: "Created" },
10814
+ errors: [400, 409, 422]
10815
+ }
10816
+ },
10817
+ "/api/setup/open": {
10818
+ post: {
10819
+ id: "openFolder",
10820
+ summary: "Open another folder: start the app for that folder (a full path on this machine) on a free port, for the same person, and give its address; a folder that isn't a metarepo offers Create there",
10821
+ tag: "run",
10822
+ body: OpenFolderRequest,
10823
+ ok: { status: 200, schema: "OpenFolderView", description: "OK" },
10824
+ errors: [400, 404]
10825
+ }
10826
+ },
10827
+ "/api/setup/repos/plan": {
10828
+ post: {
10829
+ id: "planRepos",
10830
+ summary: "The repos pasted clone URLs (one a line, up to 500) or a folder of clones (repos discover's own code, a dry run) would add: each normalised URL and the id repo add gives it, a clone URL a manifest lists already left out, a taken id given -2, and a folder's type from its files. A folder with several platforms and none given reads nothing and answers the platforms to choose from (`platforms`, no `platform`). Writes nothing",
10831
+ tag: "run",
10832
+ body: ReposPlanRequest,
10833
+ ok: { status: 200, schema: "ReposPlanView", description: "OK" },
10834
+ errors: [400, 404, 409, 422]
10835
+ }
10836
+ },
10837
+ "/api/setup/repos": {
10838
+ post: {
10839
+ id: "addRepos",
10840
+ summary: "Add the repos the person ticked to the platform's repos.manifest.yaml (core's addManifestRepos: comments, order and line endings kept, the manifest checked first); a description is the person's own (verified). With preview: the lines it would change, nothing written. Propose for review then opens the PR",
10841
+ tag: "run",
10842
+ body: AddReposRequest,
10843
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10844
+ errors: [400, 404, 409, 422]
10845
+ }
10846
+ },
10847
+ "/api/repos/{repoId}/type/detect": {
10848
+ post: {
10849
+ id: "detectRepoType",
10850
+ summary: "Detect a cloned repo's type: the org pack's repo types (atticus repo-type detect) when it has any, else the type repo add reads from the files. Writes nothing; 409 when the repo isn't cloned here",
10851
+ tag: "run",
10852
+ params: [p("repoId")],
10853
+ ok: { status: 200, schema: "RepoTypeDetectView", description: "OK" },
10854
+ errors: [404, 409, 422]
10855
+ }
10856
+ },
10857
+ "/api/repos/{repoId}/type": {
10858
+ put: {
10859
+ id: "setRepoType",
10860
+ summary: "Set a repo's type in the manifest that lists it (comments and order kept); with preview, the line it would change",
10861
+ tag: "run",
10862
+ params: [p("repoId")],
10863
+ body: RepoTypeRequest,
10864
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10865
+ errors: [400, 404, 422]
10866
+ }
10867
+ },
10868
+ "/api/setup/adapters": {
10869
+ get: {
10870
+ id: "getAdapters",
10871
+ summary: "The outside systems runtime.yaml names (Git host, work tracker, service desk, notifications, wiki, design tool): the types its schema takes for each, the settings Atticus reads, what is set now, and runtime.yaml's sha256 to send back with a write. No secret is ever in them",
10872
+ tag: "run",
10873
+ ok: { status: 200, schema: "AdaptersView", description: "OK" }
10874
+ }
10875
+ },
10876
+ "/api/setup/adapters/{kind}": {
10877
+ put: {
10878
+ id: "setAdapter",
10879
+ summary: "Set (or with null, take out) one outside system in runtime.yaml, checked with the Runtime schema first (a type it doesn't take, a setting named like a secret or a value that looks like a token is refused, 422); edited in place, so comments, value types and line endings are kept. With `baseSha256` (GET's `sha256`), a runtime.yaml changed since is 409. With preview, the lines it would change. A token is kept in the credential store from the terminal (atticus secret set), never through this API",
10880
+ tag: "run",
10881
+ params: [p("kind")],
10882
+ body: AdapterRequest,
10883
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10884
+ errors: [400, 404, 409, 422]
10885
+ }
10886
+ },
10887
+ "/api/setup/file": {
10888
+ get: {
10889
+ id: "getOrgPackFile",
10890
+ summary: "One org-pack file for the raw editor (a path inside org-pack/ ending .yaml, .md, .txt or .json): its text, its sha256 and whether it is checked with a schema",
10891
+ tag: "run",
10892
+ params: [q("path")],
10893
+ ok: { status: 200, schema: "OrgPackFileView", description: "OK" },
10894
+ errors: [404, 422]
10895
+ },
10896
+ put: {
10897
+ id: "putOrgPackFile",
10898
+ summary: "The raw editor's write, the fallback for a setting with no form: the file's whole text, checked with its schema (YAML that doesn't parse, or doesn't read, is 422), onto the file as opened (another edit meanwhile is 409). With preview, the lines it would change. A runtime.yaml edit that moves where the model's key goes needs the person's confirmation (`ai-model`, `model`), else 403; a value that looks like a key is refused",
10899
+ tag: "run",
10900
+ body: OrgPackFileRequest,
10901
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10902
+ errors: [400, 403, 409, 422]
10903
+ }
10904
+ },
10905
+ "/api/setup/patterns": {
10906
+ post: {
10907
+ id: "addPattern",
10908
+ summary: "A new integration pattern from the app's form, as its own org-pack/patterns/<code>.yaml, checked with the pattern schema; a code that is there already is 409 (edit it in the raw editor). With preview, the lines it would write",
10909
+ tag: "run",
10910
+ body: PatternRequest,
10911
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10912
+ errors: [400, 409, 422]
10913
+ }
10914
+ },
10915
+ "/api/setup/sources": {
10916
+ post: {
10917
+ id: "addSource",
10918
+ summary: "A wiki added to sources.yaml with atticus sources add's own code (its checks, its id, the path written relative to the org pack); comments and line endings kept. A location with a user name or password in it is refused (422: Git's credential helper or an environment variable gives them), and so is a sources.yaml changed meanwhile (409). With preview, the entry it would add",
10919
+ tag: "run",
10920
+ body: SourceRequest,
10921
+ ok: { status: 200, schema: "FileEditView", description: "OK" },
10922
+ errors: [400, 409, 422]
10923
+ }
10924
+ },
10015
10925
  "/api/decisions": {
10016
10926
  get: {
10017
10927
  id: "getDecisions",
@@ -10197,6 +11107,24 @@ var OPS = {
10197
11107
  errors: [404]
10198
11108
  }
10199
11109
  },
11110
+ "/api/activity": {
11111
+ get: {
11112
+ id: "listActivity",
11113
+ summary: "Everything Atticus is doing or did lately on this metarepo, newest first: the app's jobs, a Copilot run, the commands run in a terminal, an editor or a Copilot session, and the hand-off runs that wait for an assistant (ADR 0187)",
11114
+ tag: "ai",
11115
+ ok: { status: 200, schema: "ActivityList", description: "OK" }
11116
+ }
11117
+ },
11118
+ "/api/activity/{id}/lines": {
11119
+ get: {
11120
+ id: "getActivityLines",
11121
+ summary: "One activity's printed lines from a line on (from), or its last ones; a Copilot run's are its tabs (ADR 0187)",
11122
+ tag: "ai",
11123
+ params: [p("id"), q("from", str3, "The number of the first line wanted")],
11124
+ ok: { status: 200, schema: "ActivityLines", description: "OK" },
11125
+ errors: [400, 404]
11126
+ }
11127
+ },
10200
11128
  "/api/copilot-runs/{runId}/stop": {
10201
11129
  post: {
10202
11130
  id: "stopCopilotRun",
@@ -10245,10 +11173,13 @@ var OPS = {
10245
11173
  "/api/runs/{runId}/done": {
10246
11174
  post: {
10247
11175
  id: "markRunDone",
10248
- summary: "Mark done: validate the hand-off output now. 2.67.0 (fourth UX walk): a step the app prepared then resumes, writing what the answer said; `lines` says what happened and `next` names the step's next run when it offers another prompt",
11176
+ summary: "Mark done: validate the hand-off output now. 2.67.0 (fourth UX walk): a step the app prepared then resumes, writing what the answer said; `lines` says what happened and `next` names the step's next run when it offers another prompt. 3.5.0 (ADR 0188): a read of a repo's last batch is put on the map (verify --write), named in `applied`. 3.9.0: with `job: true`, 202 JobAccepted at once; the job's result `answer` is this view, or `problem` when refused",
10249
11177
  tag: "ai",
10250
11178
  params: [p("runId")],
11179
+ body: RunDoneRequest,
11180
+ bodyOptional: true,
10251
11181
  ok: { status: 200, schema: "RunDoneView", description: "OK" },
11182
+ alsoOk: { status: 202, schema: "JobAccepted", description: "Started as a job (`job: true`)" },
10252
11183
  errors: [404, 409, 422]
10253
11184
  }
10254
11185
  },
@@ -10282,9 +11213,10 @@ var OPS = {
10282
11213
  q("gate"),
10283
11214
  q("state"),
10284
11215
  q("lens", { type: "string", enum: Lens.options }),
10285
- q("severity", { type: "string", enum: Severity.options })
11216
+ q("severity", { type: "string", enum: Severity.options }),
11217
+ q("asks", { type: "string", enum: ["business", "design", "delivery"] }, "3.6.0 (ADR 0191): only findings that ask at this level")
10286
11218
  ],
10287
- ok: { status: 200, schema: arrayOf("Finding"), description: "OK" }
11219
+ ok: { status: 200, schema: arrayOf("FindingView"), description: "OK" }
10288
11220
  }
10289
11221
  },
10290
11222
  "/api/findings/{changeId}/{findingId}": {
@@ -10546,7 +11478,7 @@ var OPS = {
10546
11478
  "/api/settings/ai/test": {
10547
11479
  post: {
10548
11480
  id: "testAiProvider",
10549
- summary: "Ask the configured model provider one short question with nothing of the estate in it, and say whether it answered. 3.0.0 (ADR 0186): when runtime.yaml's model settings differ from the committed ones (HEAD), it needs the person's confirmation (`ai-test`, `model`), else 403",
11481
+ summary: "Ask the configured model provider one short question with nothing of the estate in it, and say whether it answered. 3.0.0 (ADR 0186): when runtime.yaml's model settings differ from the committed ones (HEAD), it needs the person's confirmation (`ai-test`, `model`), else 403. 3.1.0: also whenever they send the key to an address the person hasn't confirmed, committed or not; a confirmed Test makes it the confirmed address",
10550
11482
  tag: "run",
10551
11483
  body: ConfirmedRequest,
10552
11484
  ok: { status: 200, schema: { type: "object" }, description: "OK" },
@@ -10682,6 +11614,17 @@ var OPS = {
10682
11614
  errors: [404, 422]
10683
11615
  }
10684
11616
  },
11617
+ "/api/questions/{id}/route": {
11618
+ post: {
11619
+ id: "routeQuestion",
11620
+ summary: "3.6.0 (ADR 0191): move a question to another role (product, architecture, analysis, delivery), as the signed-in person; the question keeps its answer, and `routed` says from which role, by whom and when",
11621
+ tag: "questions",
11622
+ params: [p("id")],
11623
+ body: RouteQuestionRequest,
11624
+ ok: { status: 200, schema: { type: "object" }, description: "The question, routed" },
11625
+ errors: [400, 404, 422]
11626
+ }
11627
+ },
10685
11628
  "/api/questions/{id}/answer": {
10686
11629
  post: {
10687
11630
  id: "answerQuestion",
@@ -10776,6 +11719,16 @@ var OPS = {
10776
11719
  errors: [400, 404, 422]
10777
11720
  }
10778
11721
  },
11722
+ "/api/knowledge/passage": {
11723
+ get: {
11724
+ id: "knowledgePassage",
11725
+ summary: "3.6.0 (ADR 0191): one section of a wiki snapshot page or an inputs/ file, by its id (<source>/<page>#<heading>), to open it in place",
11726
+ tag: "knowledge",
11727
+ params: [q("id", str3, "The section's id, as a change's knowledge lists it")],
11728
+ ok: { status: 200, schema: "KnowledgePassageView", description: "OK" },
11729
+ errors: [400, 404]
11730
+ }
11731
+ },
10779
11732
  "/api/knowledge/search": {
10780
11733
  get: {
10781
11734
  id: "searchWikis",
@@ -10915,6 +11868,25 @@ var OPS = {
10915
11868
  errors: [400, 404, 409, 422]
10916
11869
  }
10917
11870
  },
11871
+ "/api/changes/{changeId}/stages/{stage}/thread": {
11872
+ get: {
11873
+ id: "getStageThread",
11874
+ summary: "3.5.0 (ADR 0189): a stage of the change as one conversation: the prompts, the assistant's answers and their checks, the critic's findings, the questions, the replies and corrections, and the questions that couldn't be kept, in order",
11875
+ tag: "changes",
11876
+ params: [p("changeId"), p("stage", { schema: { type: "string", enum: [...THREAD_STAGES] } })],
11877
+ ok: { status: 200, schema: "StageThreadView", description: "OK" },
11878
+ errors: [400, 404]
11879
+ },
11880
+ post: {
11881
+ id: "postToStageThread",
11882
+ summary: "3.5.0 (ADR 0189): a person's reply to the stage's assistant (read by its next round as their answer), a comment on a finding, or keeping a dropped question anyway",
11883
+ tag: "changes",
11884
+ params: [p("changeId"), p("stage", { schema: { type: "string", enum: [...THREAD_STAGES] } })],
11885
+ body: StageThreadPost,
11886
+ ok: { status: 200, schema: "StageThreadPostResult", description: "Written" },
11887
+ errors: [400, 404, 409, 422]
11888
+ }
11889
+ },
10918
11890
  "/api/changes/{changeId}/knowledge": {
10919
11891
  get: {
10920
11892
  id: "getChangeKnowledge",
@@ -11270,6 +12242,15 @@ async function walkRepo(root, visit, o = {}) {
11270
12242
  // packages/core/dist/log.js
11271
12243
  var LOG_MAX_BYTES = 5 * 1024 * 1024;
11272
12244
 
12245
+ // packages/core/dist/run-log.js
12246
+ var RUN_LOG_MAX_BYTES = 2 * 1024 * 1024;
12247
+ var RUN_SILENT_MS = 5 * 60 * 1e3;
12248
+ var DAY = 24 * 60 * 60 * 1e3;
12249
+
12250
+ // packages/core/dist/printer.js
12251
+ import { AsyncLocalStorage } from "node:async_hooks";
12252
+ var printer = new AsyncLocalStorage();
12253
+
11273
12254
  // packages/core/dist/zip-read.js
11274
12255
  var ZIP_LIMITS = {
11275
12256
  maxEntries: 1e4,
@@ -11355,19 +12336,38 @@ var QuestionProposal = z32.strictObject({
11355
12336
  at: IsoDateTime
11356
12337
  });
11357
12338
 
12339
+ // packages/core/dist/setup-edit.js
12340
+ import { isMap as isMap10, isNode, isScalar, isSeq as isSeq5, parseDocument as parseDocument10, stringify as stringify5 } from "yaml";
12341
+ var ADAPTER_KINDS = [
12342
+ "gitHost",
12343
+ "workTracker",
12344
+ "serviceDesk",
12345
+ "notify",
12346
+ "wiki",
12347
+ "design"
12348
+ ];
12349
+ function schemaTypes(kind) {
12350
+ const adapters = Runtime.shape.adapters.unwrap();
12351
+ return adapters.shape[kind]?.unwrap().options.find((o) => o.shape)?.shape?.type.options ?? [];
12352
+ }
12353
+ var ADAPTER_TYPES = Object.fromEntries(ADAPTER_KINDS.map((k) => [
12354
+ k,
12355
+ ["manual", ...schemaTypes(k).filter((t) => t !== "manual" && t !== "mock")]
12356
+ ]));
12357
+
11358
12358
  // packages/core/dist/specs.js
11359
12359
  import { parse as parse13 } from "yaml";
11360
12360
  var SPEC_CACHE_VERSION = `spec@${FLOW_SCHEMA_VERSION}.${SPEC_HEADER_SCHEMA_VERSION}`;
11361
12361
 
11362
12362
  // packages/core/dist/cancel.js
11363
- import { AsyncLocalStorage } from "node:async_hooks";
11364
- var store = new AsyncLocalStorage();
12363
+ import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
12364
+ var store = new AsyncLocalStorage2();
11365
12365
 
11366
12366
  // packages/core/dist/decision-batches.js
11367
- import { parse as parse14, stringify as stringify5 } from "yaml";
12367
+ import { parse as parse14, stringify as stringify6 } from "yaml";
11368
12368
 
11369
12369
  // packages/core/dist/declared-links.js
11370
- import { isMap as isMap10, isScalar, isSeq as isSeq5, parseDocument as parseDocument10 } from "yaml";
12370
+ import { isMap as isMap11, isScalar as isScalar2, isSeq as isSeq6, parseDocument as parseDocument11 } from "yaml";
11371
12371
 
11372
12372
  // packages/core/dist/schema/reading-rules.js
11373
12373
  import { z as z33 } from "zod";