hitloop 0.0.0-stage → 0.1.0

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 (469) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -2
  3. package/dist/agent.js +318 -0
  4. package/dist/cli.js +897 -0
  5. package/dist/client/assets/app.css +1 -0
  6. package/dist/client/assets/chunks/abap-EINPUMCJ.js +1 -0
  7. package/dist/client/assets/chunks/abnfDiagram-S7VZAUFO-W2CM2W6D.js +1 -0
  8. package/dist/client/assets/chunks/actionscript-3-O776AQUO.js +1 -0
  9. package/dist/client/assets/chunks/ada-WLOTXRTV.js +1 -0
  10. package/dist/client/assets/chunks/ahk-EF37A2DY.js +1 -0
  11. package/dist/client/assets/chunks/ahk2-FH4K3CKT.js +1 -0
  12. package/dist/client/assets/chunks/angular-html-ZALQFV2H.js +1 -0
  13. package/dist/client/assets/chunks/angular-ts-4IWMF7QO.js +1 -0
  14. package/dist/client/assets/chunks/apache-44AYOEWM.js +1 -0
  15. package/dist/client/assets/chunks/apex-XRYPID42.js +1 -0
  16. package/dist/client/assets/chunks/apl-5HBALFOI.js +1 -0
  17. package/dist/client/assets/chunks/applescript-2DZEHZEC.js +1 -0
  18. package/dist/client/assets/chunks/ara-ZGZQBLXL.js +1 -0
  19. package/dist/client/assets/chunks/architecture-WOLXFQ4H-EJGENNRL.js +1 -0
  20. package/dist/client/assets/chunks/architectureDiagram-YGSQEFNW-2VHWSKO6.js +36 -0
  21. package/dist/client/assets/chunks/asciidoc-GSQAKCPO.js +1 -0
  22. package/dist/client/assets/chunks/asm-BFURM5BK.js +1 -0
  23. package/dist/client/assets/chunks/astro-VJORWDZJ.js +1 -0
  24. package/dist/client/assets/chunks/awk-BSHTWXXX.js +1 -0
  25. package/dist/client/assets/chunks/ballerina-HAOQJ4B2.js +1 -0
  26. package/dist/client/assets/chunks/bat-OSH45EOF.js +1 -0
  27. package/dist/client/assets/chunks/beancount-RBATIHOV.js +1 -0
  28. package/dist/client/assets/chunks/berry-CZUIOUM4.js +1 -0
  29. package/dist/client/assets/chunks/bibtex-KCL2UWHE.js +1 -0
  30. package/dist/client/assets/chunks/bicep-SZJZB3SG.js +1 -0
  31. package/dist/client/assets/chunks/bird2-XBF5YQQV.js +1 -0
  32. package/dist/client/assets/chunks/blade-Q24LEVFC.js +1 -0
  33. package/dist/client/assets/chunks/blockDiagram-APKKGZFW-53LXSOOT.js +140 -0
  34. package/dist/client/assets/chunks/bpmnIcons-APHXDYXF-FMBRQNTY.js +1 -0
  35. package/dist/client/assets/chunks/bsl-TI44NWFB.js +1 -0
  36. package/dist/client/assets/chunks/c-NLHY4Y4N.js +1 -0
  37. package/dist/client/assets/chunks/c3-BUTEM6PO.js +1 -0
  38. package/dist/client/assets/chunks/c4Diagram-KJ2TOQU5-O53G4GQH.js +38 -0
  39. package/dist/client/assets/chunks/cadence-JIRTEU64.js +1 -0
  40. package/dist/client/assets/chunks/cairo-3W6NVDNW.js +1 -0
  41. package/dist/client/assets/chunks/chapel-BPBJ2E7K.js +1 -0
  42. package/dist/client/assets/chunks/chunk-25KVF5ZE.js +1 -0
  43. package/dist/client/assets/chunks/chunk-2CJKSQOI.js +1 -0
  44. package/dist/client/assets/chunks/chunk-2QIJRTWR.js +1 -0
  45. package/dist/client/assets/chunks/chunk-2ZCRJZGF.js +2 -0
  46. package/dist/client/assets/chunks/chunk-3ILNDZNY.js +213 -0
  47. package/dist/client/assets/chunks/chunk-3M2OOQ7S.js +1 -0
  48. package/dist/client/assets/chunks/chunk-3M57NTNK.js +1 -0
  49. package/dist/client/assets/chunks/chunk-3MR6DCZJ.js +1 -0
  50. package/dist/client/assets/chunks/chunk-3WGHS7F7.js +1 -0
  51. package/dist/client/assets/chunks/chunk-4JK75V33.js +1 -0
  52. package/dist/client/assets/chunks/chunk-4NXNVEWK.js +1 -0
  53. package/dist/client/assets/chunks/chunk-4RNNBDFQ.js +1 -0
  54. package/dist/client/assets/chunks/chunk-4T4NVH7V.js +1 -0
  55. package/dist/client/assets/chunks/chunk-4TFFBC35.js +1 -0
  56. package/dist/client/assets/chunks/chunk-4WYBE67P.js +1 -0
  57. package/dist/client/assets/chunks/chunk-56ITEUFA.js +1 -0
  58. package/dist/client/assets/chunks/chunk-5DXRE7IH.js +1 -0
  59. package/dist/client/assets/chunks/chunk-5IMADCNU.js +1 -0
  60. package/dist/client/assets/chunks/chunk-5XZPGKN4.js +1 -0
  61. package/dist/client/assets/chunks/chunk-6O32UKSP.js +1 -0
  62. package/dist/client/assets/chunks/chunk-7BAEB64Q.js +1 -0
  63. package/dist/client/assets/chunks/chunk-7FMWBHZO.js +1 -0
  64. package/dist/client/assets/chunks/chunk-7GFDITUT.js +1 -0
  65. package/dist/client/assets/chunks/chunk-7H4MLBHI.js +1 -0
  66. package/dist/client/assets/chunks/chunk-7OJ4MEEB.js +1 -0
  67. package/dist/client/assets/chunks/chunk-7RSEISFE.js +1 -0
  68. package/dist/client/assets/chunks/chunk-7YNZZQVT.js +1 -0
  69. package/dist/client/assets/chunks/chunk-AB7TIL2G.js +1 -0
  70. package/dist/client/assets/chunks/chunk-ADDF76FL.js +1 -0
  71. package/dist/client/assets/chunks/chunk-AF6UTCD4.js +321 -0
  72. package/dist/client/assets/chunks/chunk-AJ2K6ASU.js +1 -0
  73. package/dist/client/assets/chunks/chunk-AUBAENQZ.js +1 -0
  74. package/dist/client/assets/chunks/chunk-BJEYVZ65.js +1 -0
  75. package/dist/client/assets/chunks/chunk-BLRM6LXA.js +1 -0
  76. package/dist/client/assets/chunks/chunk-BOCTYCDZ.js +1 -0
  77. package/dist/client/assets/chunks/chunk-BU4VRYN7.js +1 -0
  78. package/dist/client/assets/chunks/chunk-CALYHV7D.js +1 -0
  79. package/dist/client/assets/chunks/chunk-CF4W3RZ4.js +1 -0
  80. package/dist/client/assets/chunks/chunk-DCZ2OBSL.js +1 -0
  81. package/dist/client/assets/chunks/chunk-DUFPBTHD.js +1 -0
  82. package/dist/client/assets/chunks/chunk-DUICIQBC.js +88 -0
  83. package/dist/client/assets/chunks/chunk-EH2N475V.js +1 -0
  84. package/dist/client/assets/chunks/chunk-EHLLNPZT.js +1 -0
  85. package/dist/client/assets/chunks/chunk-EIBFAW37.js +1 -0
  86. package/dist/client/assets/chunks/chunk-EO3ER3GN.js +1 -0
  87. package/dist/client/assets/chunks/chunk-FH24BIIA.js +1 -0
  88. package/dist/client/assets/chunks/chunk-FNOXGAL5.js +2 -0
  89. package/dist/client/assets/chunks/chunk-FTY6WLQF.js +3 -0
  90. package/dist/client/assets/chunks/chunk-FZFME6UK.js +1 -0
  91. package/dist/client/assets/chunks/chunk-FZJZZYYO.js +1 -0
  92. package/dist/client/assets/chunks/chunk-G4Z6L7OO.js +1 -0
  93. package/dist/client/assets/chunks/chunk-GNCEAN2B.js +1 -0
  94. package/dist/client/assets/chunks/chunk-GQJIKV3T.js +1 -0
  95. package/dist/client/assets/chunks/chunk-GUMNOKT2.js +1 -0
  96. package/dist/client/assets/chunks/chunk-GXRORAF3.js +1 -0
  97. package/dist/client/assets/chunks/chunk-H36ABDKY.js +1 -0
  98. package/dist/client/assets/chunks/chunk-HAR5NYVW.js +1 -0
  99. package/dist/client/assets/chunks/chunk-HIGPS4L2.js +1 -0
  100. package/dist/client/assets/chunks/chunk-HMOBGTME.js +1 -0
  101. package/dist/client/assets/chunks/chunk-HNO6SQ7M.js +1 -0
  102. package/dist/client/assets/chunks/chunk-HYVZ3GYN.js +1 -0
  103. package/dist/client/assets/chunks/chunk-I6TGFOQS.js +1 -0
  104. package/dist/client/assets/chunks/chunk-IHIOJK7I.js +1 -0
  105. package/dist/client/assets/chunks/chunk-IHJNUMSC.js +1 -0
  106. package/dist/client/assets/chunks/chunk-IP7PB2OC.js +1 -0
  107. package/dist/client/assets/chunks/chunk-ISDTMH2Y.js +1 -0
  108. package/dist/client/assets/chunks/chunk-J65M2LNT.js +1 -0
  109. package/dist/client/assets/chunks/chunk-JCWYZ7X2.js +62 -0
  110. package/dist/client/assets/chunks/chunk-JENWYTLI.js +1 -0
  111. package/dist/client/assets/chunks/chunk-JJ6YWJQS.js +1 -0
  112. package/dist/client/assets/chunks/chunk-JMUVGGX7.js +32 -0
  113. package/dist/client/assets/chunks/chunk-JNQUFMM4.js +1 -0
  114. package/dist/client/assets/chunks/chunk-JPTECOAL.js +1 -0
  115. package/dist/client/assets/chunks/chunk-JZNK4LKS.js +1 -0
  116. package/dist/client/assets/chunks/chunk-KPNXJBIW.js +1 -0
  117. package/dist/client/assets/chunks/chunk-KZO2GZL7.js +1 -0
  118. package/dist/client/assets/chunks/chunk-L2REESOQ.js +1 -0
  119. package/dist/client/assets/chunks/chunk-LJPJXR7R.js +1 -0
  120. package/dist/client/assets/chunks/chunk-LOEZMLCI.js +1 -0
  121. package/dist/client/assets/chunks/chunk-MLYC6FSE.js +1 -0
  122. package/dist/client/assets/chunks/chunk-MMDGEZYU.js +1 -0
  123. package/dist/client/assets/chunks/chunk-MYXE7CGE.js +1 -0
  124. package/dist/client/assets/chunks/chunk-NBH7YOBD.js +15 -0
  125. package/dist/client/assets/chunks/chunk-NCOVM3YF.js +1 -0
  126. package/dist/client/assets/chunks/chunk-NCWOBVU7.js +1 -0
  127. package/dist/client/assets/chunks/chunk-NLRIHHEH.js +1 -0
  128. package/dist/client/assets/chunks/chunk-NUPEOYK6.js +1 -0
  129. package/dist/client/assets/chunks/chunk-O4MVOA7X.js +1 -0
  130. package/dist/client/assets/chunks/chunk-OBHQQZ4H.js +1 -0
  131. package/dist/client/assets/chunks/chunk-OKPNJIIR.js +1 -0
  132. package/dist/client/assets/chunks/chunk-OLMPB57R.js +1 -0
  133. package/dist/client/assets/chunks/chunk-P2FYOAEV.js +1 -0
  134. package/dist/client/assets/chunks/chunk-PI3SNP4C.js +1 -0
  135. package/dist/client/assets/chunks/chunk-PRDTEROB.js +1 -0
  136. package/dist/client/assets/chunks/chunk-PZELHD2H.js +136 -0
  137. package/dist/client/assets/chunks/chunk-QR2Q34LM.js +1 -0
  138. package/dist/client/assets/chunks/chunk-R4GIXL6S.js +1 -0
  139. package/dist/client/assets/chunks/chunk-RORF4F5V.js +1 -0
  140. package/dist/client/assets/chunks/chunk-S73BYTLL.js +1 -0
  141. package/dist/client/assets/chunks/chunk-SFC5MRYR.js +1 -0
  142. package/dist/client/assets/chunks/chunk-SVM2H22K.js +2 -0
  143. package/dist/client/assets/chunks/chunk-SZ6UCGVD.js +1 -0
  144. package/dist/client/assets/chunks/chunk-SZYM6GIJ.js +127 -0
  145. package/dist/client/assets/chunks/chunk-TT5KJZKM.js +1 -0
  146. package/dist/client/assets/chunks/chunk-UFBKUYNH.js +1 -0
  147. package/dist/client/assets/chunks/chunk-UL57AD4T.js +1 -0
  148. package/dist/client/assets/chunks/chunk-UNEI7LMM.js +1 -0
  149. package/dist/client/assets/chunks/chunk-VNQBBFIY.js +1 -0
  150. package/dist/client/assets/chunks/chunk-WGVITPII.js +1 -0
  151. package/dist/client/assets/chunks/chunk-WRA6KJHX.js +10 -0
  152. package/dist/client/assets/chunks/chunk-WS5EHW43.js +1 -0
  153. package/dist/client/assets/chunks/chunk-XE6SLBBE.js +3 -0
  154. package/dist/client/assets/chunks/chunk-XF5T2P7U.js +72 -0
  155. package/dist/client/assets/chunks/chunk-XFRY5WKO.js +1 -0
  156. package/dist/client/assets/chunks/chunk-XWYV4OPA.js +1 -0
  157. package/dist/client/assets/chunks/chunk-YCE5ECKY.js +1 -0
  158. package/dist/client/assets/chunks/chunk-YIN5CSIF.js +1 -0
  159. package/dist/client/assets/chunks/chunk-YLFUX6XH.js +1 -0
  160. package/dist/client/assets/chunks/chunk-YNXJICZM.js +1 -0
  161. package/dist/client/assets/chunks/chunk-YOHF7NGD.js +1 -0
  162. package/dist/client/assets/chunks/chunk-YORIST7Z.js +1 -0
  163. package/dist/client/assets/chunks/chunk-YUL7CG4R.js +1 -0
  164. package/dist/client/assets/chunks/chunk-YUN7JSFJ.js +2 -0
  165. package/dist/client/assets/chunks/chunk-YZ7D2IT7.js +1 -0
  166. package/dist/client/assets/chunks/chunk-Z7LAPMFJ.js +1 -0
  167. package/dist/client/assets/chunks/chunk-ZE325LPC.js +1 -0
  168. package/dist/client/assets/chunks/chunk-ZN7TN6PO.js +1 -0
  169. package/dist/client/assets/chunks/chunk-ZST3EVPO.js +1 -0
  170. package/dist/client/assets/chunks/chunk-ZZHMDDZN.js +1 -0
  171. package/dist/client/assets/chunks/clarity-RKRYQ7WF.js +1 -0
  172. package/dist/client/assets/chunks/classDiagram-v2-L25IHNXF-Y67HVDZV.js +217 -0
  173. package/dist/client/assets/chunks/clojure-2X2DQECJ.js +1 -0
  174. package/dist/client/assets/chunks/cmake-LH5524XE.js +1 -0
  175. package/dist/client/assets/chunks/cobol-7DALQF3W.js +1 -0
  176. package/dist/client/assets/chunks/codeowners-52SZU5P5.js +1 -0
  177. package/dist/client/assets/chunks/codeql-EISH3KUP.js +1 -0
  178. package/dist/client/assets/chunks/coffee-VAWSGA7Y.js +1 -0
  179. package/dist/client/assets/chunks/common-lisp-4MVK2AN6.js +1 -0
  180. package/dist/client/assets/chunks/coq-4VRYZRZV.js +1 -0
  181. package/dist/client/assets/chunks/core-BRBMZSD2.js +12 -0
  182. package/dist/client/assets/chunks/cose-bilkent-JH36ORCC-BIOOHSAA.js +1 -0
  183. package/dist/client/assets/chunks/cpp-RFECMSKD.js +1 -0
  184. package/dist/client/assets/chunks/crystal-ZBGGFAOI.js +1 -0
  185. package/dist/client/assets/chunks/csharp-BZDPMKKW.js +1 -0
  186. package/dist/client/assets/chunks/css-3WWGM6UD.js +1 -0
  187. package/dist/client/assets/chunks/csv-AB4GNWSB.js +1 -0
  188. package/dist/client/assets/chunks/cue-2E46MZP2.js +1 -0
  189. package/dist/client/assets/chunks/cynefin-EF2NZ3EQ-TLFQLWUN.js +1 -0
  190. package/dist/client/assets/chunks/cynefinDiagram-L36ESFBY-FLPXCSSG.js +62 -0
  191. package/dist/client/assets/chunks/cypher-HR3ILFOL.js +1 -0
  192. package/dist/client/assets/chunks/d-TARSZPOL.js +1 -0
  193. package/dist/client/assets/chunks/dagre-SPEB5RXH-7EGEINJ2.js +4 -0
  194. package/dist/client/assets/chunks/dart-SALLJHVI.js +1 -0
  195. package/dist/client/assets/chunks/dax-WYMRGMXC.js +1 -0
  196. package/dist/client/assets/chunks/desktop-ND5CGLLJ.js +1 -0
  197. package/dist/client/assets/chunks/diagram-3B7GL73J-6USY4HZX.js +200 -0
  198. package/dist/client/assets/chunks/diagram-DNEMPZML-BNSOC4VW.js +24 -0
  199. package/dist/client/assets/chunks/diagram-L3MUGCDN-5V5FZYIG.js +41 -0
  200. package/dist/client/assets/chunks/diagram-LA4NIPWU-25VLY2CO.js +24 -0
  201. package/dist/client/assets/chunks/diagram-MHCOC4E2-G2LFP3JU.js +3 -0
  202. package/dist/client/assets/chunks/diagram-XPFHEONP-E6HBBIBV.js +30 -0
  203. package/dist/client/assets/chunks/diff-PWYGPM7B.js +1 -0
  204. package/dist/client/assets/chunks/docker-A4D7DT7W.js +1 -0
  205. package/dist/client/assets/chunks/dotenv-VWQWV2DY.js +1 -0
  206. package/dist/client/assets/chunks/dream-maker-M5YDQS35.js +1 -0
  207. package/dist/client/assets/chunks/ebnfDiagram-UZSYDL2S-BMXXZZPI.js +1 -0
  208. package/dist/client/assets/chunks/edge-3QXIDJHI.js +1 -0
  209. package/dist/client/assets/chunks/elixir-3OX2UHIZ.js +1 -0
  210. package/dist/client/assets/chunks/elk-XV6XMXQE-IPR65FON.js +27 -0
  211. package/dist/client/assets/chunks/elm-CTS65NCT.js +1 -0
  212. package/dist/client/assets/chunks/emacs-lisp-HHS2IDO7.js +1 -0
  213. package/dist/client/assets/chunks/engine-javascript-DNHSF67B.js +141 -0
  214. package/dist/client/assets/chunks/erDiagram-EYBAPDEH-3GEHFWHG.js +99 -0
  215. package/dist/client/assets/chunks/erb-ICYWK6HS.js +1 -0
  216. package/dist/client/assets/chunks/erlang-BDQPNCKX.js +1 -0
  217. package/dist/client/assets/chunks/eventmodeling-K75KTNOO-B27BJTZL.js +1 -0
  218. package/dist/client/assets/chunks/fennel-4ONBA2PH.js +1 -0
  219. package/dist/client/assets/chunks/fish-ATLPBZSD.js +1 -0
  220. package/dist/client/assets/chunks/flowDiagram-MALGAFMO-5PCLR4AE.js +1 -0
  221. package/dist/client/assets/chunks/fluent-GGMONBVW.js +1 -0
  222. package/dist/client/assets/chunks/fortran-fixed-form-5MSBDRWQ.js +1 -0
  223. package/dist/client/assets/chunks/fortran-free-form-TT3RBL75.js +1 -0
  224. package/dist/client/assets/chunks/fsharp-PAGHNW4O.js +1 -0
  225. package/dist/client/assets/chunks/ganttDiagram-23REXITY-VE5MVBTO.js +292 -0
  226. package/dist/client/assets/chunks/gdresource-5OTP326D.js +1 -0
  227. package/dist/client/assets/chunks/gdscript-VPWHSCLF.js +1 -0
  228. package/dist/client/assets/chunks/gdshader-FYLPXFE5.js +1 -0
  229. package/dist/client/assets/chunks/genie-UYMEEMA2.js +1 -0
  230. package/dist/client/assets/chunks/gherkin-SU7D5DMY.js +1 -0
  231. package/dist/client/assets/chunks/git-commit-5CF5QAG7.js +1 -0
  232. package/dist/client/assets/chunks/git-rebase-X72BAUZI.js +1 -0
  233. package/dist/client/assets/chunks/gitGraph-VSP46ZUC-J6CJ5YZF.js +1 -0
  234. package/dist/client/assets/chunks/gitGraphDiagram-STJD7YCW-7YJGT6ZP.js +106 -0
  235. package/dist/client/assets/chunks/gleam-LR42YRKO.js +1 -0
  236. package/dist/client/assets/chunks/glimmer-js-JPF67FJU.js +1 -0
  237. package/dist/client/assets/chunks/glimmer-ts-BYPAVIZT.js +1 -0
  238. package/dist/client/assets/chunks/glsl-GTGUULBN.js +1 -0
  239. package/dist/client/assets/chunks/gn-NMDQA4K3.js +1 -0
  240. package/dist/client/assets/chunks/gnuplot-UUAMYBCZ.js +1 -0
  241. package/dist/client/assets/chunks/go-4RERSTNP.js +1 -0
  242. package/dist/client/assets/chunks/graphql-5A6RK6YF.js +1 -0
  243. package/dist/client/assets/chunks/groovy-O7BJONCU.js +1 -0
  244. package/dist/client/assets/chunks/hack-7QGTNPDP.js +1 -0
  245. package/dist/client/assets/chunks/haml-ON5GAWN4.js +1 -0
  246. package/dist/client/assets/chunks/handlebars-6UOQSUBP.js +1 -0
  247. package/dist/client/assets/chunks/haskell-OIZXZ26Y.js +1 -0
  248. package/dist/client/assets/chunks/haxe-7FFVS4FO.js +1 -0
  249. package/dist/client/assets/chunks/hcl-XFUFQJHV.js +1 -0
  250. package/dist/client/assets/chunks/hjson-QDBHMTD5.js +1 -0
  251. package/dist/client/assets/chunks/hlsl-4LP25FFN.js +1 -0
  252. package/dist/client/assets/chunks/html-7RNQXAAV.js +1 -0
  253. package/dist/client/assets/chunks/html-derivative-ESOY72Q2.js +1 -0
  254. package/dist/client/assets/chunks/http-SAD4PMBD.js +1 -0
  255. package/dist/client/assets/chunks/hurl-ZSJJXPQH.js +1 -0
  256. package/dist/client/assets/chunks/hxml-HJCC37RK.js +1 -0
  257. package/dist/client/assets/chunks/hy-CLDE3P4K.js +1 -0
  258. package/dist/client/assets/chunks/imba-REB34U5V.js +1 -0
  259. package/dist/client/assets/chunks/info-OHQRW6UA-EQQKXR77.js +1 -0
  260. package/dist/client/assets/chunks/infoDiagram-KBXO4MBG-F6KGZCGS.js +2 -0
  261. package/dist/client/assets/chunks/ini-PDFEMGRA.js +1 -0
  262. package/dist/client/assets/chunks/ishikawaDiagram-M35NCXHK-5D6ZOZ34.js +70 -0
  263. package/dist/client/assets/chunks/java-KB6XENAD.js +1 -0
  264. package/dist/client/assets/chunks/javascript-3JX5T423.js +1 -0
  265. package/dist/client/assets/chunks/jinja-V4UNU6K4.js +1 -0
  266. package/dist/client/assets/chunks/jison-KH5XNLJP.js +1 -0
  267. package/dist/client/assets/chunks/journeyDiagram-OPLOXDXO-ANDOJZKW.js +139 -0
  268. package/dist/client/assets/chunks/json-HPXFRRPY.js +1 -0
  269. package/dist/client/assets/chunks/json5-LJM6TXWM.js +1 -0
  270. package/dist/client/assets/chunks/jsonc-UZWRU3JV.js +1 -0
  271. package/dist/client/assets/chunks/jsonl-RFZD5UN4.js +1 -0
  272. package/dist/client/assets/chunks/jsonnet-GFZABBL6.js +1 -0
  273. package/dist/client/assets/chunks/jssm-2YIGBISJ.js +1 -0
  274. package/dist/client/assets/chunks/jsx-KLV2ZWUT.js +1 -0
  275. package/dist/client/assets/chunks/julia-3TZDIPPO.js +1 -0
  276. package/dist/client/assets/chunks/just-UHCONBQS.js +1 -0
  277. package/dist/client/assets/chunks/kanban-definition-BZKZHSQY-GF5I5NVD.js +89 -0
  278. package/dist/client/assets/chunks/katex-PIN72PQZ.js +257 -0
  279. package/dist/client/assets/chunks/kdl-DARTFOCL.js +1 -0
  280. package/dist/client/assets/chunks/kotlin-7KT5DW6Y.js +1 -0
  281. package/dist/client/assets/chunks/kusto-EKYXZTC5.js +1 -0
  282. package/dist/client/assets/chunks/langs-GO3UQR4H.js +1 -0
  283. package/dist/client/assets/chunks/latex-T57MIHR5.js +1 -0
  284. package/dist/client/assets/chunks/lean-5QVPRMV6.js +1 -0
  285. package/dist/client/assets/chunks/less-K6QEH5TN.js +1 -0
  286. package/dist/client/assets/chunks/liquid-3LCNNEIV.js +1 -0
  287. package/dist/client/assets/chunks/llvm-O32ZIVRF.js +1 -0
  288. package/dist/client/assets/chunks/log-C4YPJ5BB.js +1 -0
  289. package/dist/client/assets/chunks/logo-JPMO43A6.js +1 -0
  290. package/dist/client/assets/chunks/lua-YKVSOG7K.js +1 -0
  291. package/dist/client/assets/chunks/luau-K4EECYSO.js +1 -0
  292. package/dist/client/assets/chunks/make-VHSYMHHW.js +1 -0
  293. package/dist/client/assets/chunks/markdown-GC5J46H4.js +1 -0
  294. package/dist/client/assets/chunks/marko-U45YFADC.js +1 -0
  295. package/dist/client/assets/chunks/matlab-AMOKC4LU.js +1 -0
  296. package/dist/client/assets/chunks/mdc-DIGA2UXP.js +1 -0
  297. package/dist/client/assets/chunks/mdx-BZUGCKQA.js +1 -0
  298. package/dist/client/assets/chunks/mermaid-WHDP6ZPA.js +1 -0
  299. package/dist/client/assets/chunks/mermaid.core-SQMPMUDN.js +10 -0
  300. package/dist/client/assets/chunks/mindmap-definition-I2QAS2VK-4NH5S56C.js +98 -0
  301. package/dist/client/assets/chunks/mipsasm-2S4CUGQV.js +1 -0
  302. package/dist/client/assets/chunks/mojo-ZOL2PNKT.js +1 -0
  303. package/dist/client/assets/chunks/moonbit-U3BDAIFE.js +1 -0
  304. package/dist/client/assets/chunks/move-YSXALBWA.js +1 -0
  305. package/dist/client/assets/chunks/narrat-DHFIAUJH.js +1 -0
  306. package/dist/client/assets/chunks/nextflow-ESAKNTI3.js +1 -0
  307. package/dist/client/assets/chunks/nextflow-groovy-FKDSPJUI.js +1 -0
  308. package/dist/client/assets/chunks/nginx-XYAYERLO.js +1 -0
  309. package/dist/client/assets/chunks/nim-XOWBVFDH.js +1 -0
  310. package/dist/client/assets/chunks/nix-RVSTQSHC.js +1 -0
  311. package/dist/client/assets/chunks/nsis-KMDUKQRL.js +1 -0
  312. package/dist/client/assets/chunks/nushell-SKJHHZ7U.js +1 -0
  313. package/dist/client/assets/chunks/objective-c-3B3KXQ7Q.js +1 -0
  314. package/dist/client/assets/chunks/objective-cpp-6JDULPJS.js +1 -0
  315. package/dist/client/assets/chunks/ocaml-TMRFXBVO.js +1 -0
  316. package/dist/client/assets/chunks/odin-IN3PLCK7.js +1 -0
  317. package/dist/client/assets/chunks/openscad-P52IKPNH.js +1 -0
  318. package/dist/client/assets/chunks/org-N3SJ2PIA.js +1 -0
  319. package/dist/client/assets/chunks/packet-JDAUHWVQ-4SWIKSKP.js +1 -0
  320. package/dist/client/assets/chunks/pascal-T7CUWCQ4.js +1 -0
  321. package/dist/client/assets/chunks/pegDiagram-FD4XPPHP-WDKZSEGN.js +1 -0
  322. package/dist/client/assets/chunks/perl-LCZ4KODH.js +1 -0
  323. package/dist/client/assets/chunks/php-4XHMBVR5.js +1 -0
  324. package/dist/client/assets/chunks/pie-XZMESJXO-PSSWOWGV.js +1 -0
  325. package/dist/client/assets/chunks/pieDiagram-J4AKIIQI-BDW5I5ON.js +39 -0
  326. package/dist/client/assets/chunks/pkl-OACG5B67.js +1 -0
  327. package/dist/client/assets/chunks/plsql-7E5C7CJX.js +1 -0
  328. package/dist/client/assets/chunks/po-ZSREFRRP.js +1 -0
  329. package/dist/client/assets/chunks/polar-4GBINVA7.js +1 -0
  330. package/dist/client/assets/chunks/postcss-B7RPVGFW.js +1 -0
  331. package/dist/client/assets/chunks/powerquery-6UFMTY4G.js +1 -0
  332. package/dist/client/assets/chunks/powershell-3STRPCNT.js +1 -0
  333. package/dist/client/assets/chunks/prisma-4TPSPIZ5.js +1 -0
  334. package/dist/client/assets/chunks/prolog-HEAYPKQW.js +1 -0
  335. package/dist/client/assets/chunks/proto-Y3Y3VKXM.js +1 -0
  336. package/dist/client/assets/chunks/pug-7PBPMG3M.js +1 -0
  337. package/dist/client/assets/chunks/puppet-FR35R4OI.js +1 -0
  338. package/dist/client/assets/chunks/purescript-OUHXQAOW.js +1 -0
  339. package/dist/client/assets/chunks/python-SNDG7FNU.js +1 -0
  340. package/dist/client/assets/chunks/qml-UVIOSWP4.js +1 -0
  341. package/dist/client/assets/chunks/qmldir-6JGUNYL5.js +1 -0
  342. package/dist/client/assets/chunks/qss-ZCC466IZ.js +1 -0
  343. package/dist/client/assets/chunks/quadrantDiagram-XTYBLID2-5VKXWVJ6.js +7 -0
  344. package/dist/client/assets/chunks/r-4XW4O3ZF.js +1 -0
  345. package/dist/client/assets/chunks/racket-YJAYXOOG.js +1 -0
  346. package/dist/client/assets/chunks/radar-ABXABTNO-3AXZCEY2.js +1 -0
  347. package/dist/client/assets/chunks/railroad-I3PHUGI6-2PLXYPOT.js +1 -0
  348. package/dist/client/assets/chunks/railroad-abnf-LNEFI6M7-M4DGICQX.js +1 -0
  349. package/dist/client/assets/chunks/railroad-ebnf-DWYD2UWJ-UEIHQMSZ.js +1 -0
  350. package/dist/client/assets/chunks/railroad-peg-JR7BVNR7-I7VLIBXM.js +1 -0
  351. package/dist/client/assets/chunks/railroadDiagram-MRQ6NCDL-Y6IYWEFL.js +1 -0
  352. package/dist/client/assets/chunks/raku-63NEL5JK.js +1 -0
  353. package/dist/client/assets/chunks/razor-J3CJP523.js +1 -0
  354. package/dist/client/assets/chunks/rbs-6GQLT7NW.js +1 -0
  355. package/dist/client/assets/chunks/reg-6Q3OEC2C.js +1 -0
  356. package/dist/client/assets/chunks/regexp-LPIMILT3.js +1 -0
  357. package/dist/client/assets/chunks/rel-TOQGUTHB.js +1 -0
  358. package/dist/client/assets/chunks/requirementDiagram-Y7LWUY3S-CIWXVVWJ.js +84 -0
  359. package/dist/client/assets/chunks/riscv-UELGBOXE.js +1 -0
  360. package/dist/client/assets/chunks/ron-FW7LCJJH.js +1 -0
  361. package/dist/client/assets/chunks/rosmsg-O63VHE3L.js +1 -0
  362. package/dist/client/assets/chunks/rst-3WJXGLA7.js +1 -0
  363. package/dist/client/assets/chunks/ruby-7S7L6JTH.js +1 -0
  364. package/dist/client/assets/chunks/rust-LIK4HRRI.js +1 -0
  365. package/dist/client/assets/chunks/sankeyDiagram-WGJFYUXA-OGNQPX5V.js +40 -0
  366. package/dist/client/assets/chunks/sas-FHDPZ2JH.js +1 -0
  367. package/dist/client/assets/chunks/sass-UI4HW2FN.js +1 -0
  368. package/dist/client/assets/chunks/scala-KN7RQSUJ.js +1 -0
  369. package/dist/client/assets/chunks/scheme-5R527YZ5.js +1 -0
  370. package/dist/client/assets/chunks/scss-KZ6DRE4A.js +1 -0
  371. package/dist/client/assets/chunks/sdbl-FHOCL5SL.js +1 -0
  372. package/dist/client/assets/chunks/sequenceDiagram-5NDRBG5M-QX2V24ZU.js +169 -0
  373. package/dist/client/assets/chunks/shaderlab-2TLHUS2H.js +1 -0
  374. package/dist/client/assets/chunks/shellscript-PIB6ZBDM.js +1 -0
  375. package/dist/client/assets/chunks/shellsession-5KL7NFNN.js +1 -0
  376. package/dist/client/assets/chunks/sizeCapture-INFHLROL-LCS2PIHM.js +1 -0
  377. package/dist/client/assets/chunks/smalltalk-JFLFU247.js +1 -0
  378. package/dist/client/assets/chunks/smithy-HONEXZAM.js +1 -0
  379. package/dist/client/assets/chunks/solidity-SJ3INJFZ.js +1 -0
  380. package/dist/client/assets/chunks/soy-ND4SWTM2.js +1 -0
  381. package/dist/client/assets/chunks/sparql-YB2JQBZD.js +1 -0
  382. package/dist/client/assets/chunks/splunk-UXIDDAWL.js +1 -0
  383. package/dist/client/assets/chunks/sql-K6OMG7SQ.js +1 -0
  384. package/dist/client/assets/chunks/ssh-config-I7KJY3KQ.js +1 -0
  385. package/dist/client/assets/chunks/stata-DNZ3DTFJ.js +1 -0
  386. package/dist/client/assets/chunks/stateDiagram-v2-FJ4FJNEA-LVAUWF3A.js +291 -0
  387. package/dist/client/assets/chunks/stylus-GWPR6IQY.js +1 -0
  388. package/dist/client/assets/chunks/surrealql-KQNHBWLC.js +1 -0
  389. package/dist/client/assets/chunks/svelte-YQKF25S4.js +1 -0
  390. package/dist/client/assets/chunks/swift-ZCIZUJXA.js +1 -0
  391. package/dist/client/assets/chunks/swimlanes-UMQ2AFYF-B3RQOARQ.js +1 -0
  392. package/dist/client/assets/chunks/swimlanesDiagram-OMPLPG4O-JOE33EOV.js +8 -0
  393. package/dist/client/assets/chunks/system-verilog-Y7E6FIO3.js +1 -0
  394. package/dist/client/assets/chunks/systemd-WHC7NBZP.js +1 -0
  395. package/dist/client/assets/chunks/talonscript-WC7SODAH.js +1 -0
  396. package/dist/client/assets/chunks/tasl-QHY2GTCB.js +1 -0
  397. package/dist/client/assets/chunks/tcl-VAMIL5PJ.js +1 -0
  398. package/dist/client/assets/chunks/temml-ISNSX3VV.js +96 -0
  399. package/dist/client/assets/chunks/templ-B3BHKWV4.js +1 -0
  400. package/dist/client/assets/chunks/terraform-Q4UEK6FK.js +1 -0
  401. package/dist/client/assets/chunks/tex-63OWCYAB.js +1 -0
  402. package/dist/client/assets/chunks/timeline-definition-SEUHKTQE-FDFTVAJG.js +120 -0
  403. package/dist/client/assets/chunks/toml-7Z4IPGES.js +1 -0
  404. package/dist/client/assets/chunks/treeView-D4JQ5SDB-ABSGRAGI.js +1 -0
  405. package/dist/client/assets/chunks/treemap-SAJKECNS-MYX2CBJN.js +1 -0
  406. package/dist/client/assets/chunks/ts-tags-DT62HE52.js +1 -0
  407. package/dist/client/assets/chunks/tsv-RTXHWADP.js +1 -0
  408. package/dist/client/assets/chunks/tsx-UANUBOC7.js +1 -0
  409. package/dist/client/assets/chunks/turtle-QVOUNUUL.js +1 -0
  410. package/dist/client/assets/chunks/twig-ZPC4BPDA.js +1 -0
  411. package/dist/client/assets/chunks/typescript-WGWKIMMW.js +1 -0
  412. package/dist/client/assets/chunks/typespec-TYCVR32J.js +1 -0
  413. package/dist/client/assets/chunks/typst-PIBFYUO6.js +1 -0
  414. package/dist/client/assets/chunks/usecaseDiagram-AFA6YXN4-KW7ADINR.js +370 -0
  415. package/dist/client/assets/chunks/v-3ERNWBSP.js +1 -0
  416. package/dist/client/assets/chunks/vala-UCBCT2GS.js +1 -0
  417. package/dist/client/assets/chunks/vb-DGI3VTPA.js +1 -0
  418. package/dist/client/assets/chunks/vennDiagram-NNMJR3RB-RDGLGOGM.js +34 -0
  419. package/dist/client/assets/chunks/verilog-G72NZROS.js +1 -0
  420. package/dist/client/assets/chunks/vhdl-PYGA77XE.js +1 -0
  421. package/dist/client/assets/chunks/viml-OOC5B5UU.js +1 -0
  422. package/dist/client/assets/chunks/vue-GTNHIOPG.js +1 -0
  423. package/dist/client/assets/chunks/vue-html-DKAMJV55.js +1 -0
  424. package/dist/client/assets/chunks/vue-vine-WTM5HREV.js +1 -0
  425. package/dist/client/assets/chunks/vyper-RHYEHOJM.js +1 -0
  426. package/dist/client/assets/chunks/wardley-7MLQ67FV-QJL2HSBT.js +1 -0
  427. package/dist/client/assets/chunks/wardleyDiagram-S7YFUSEH-A4XX3UJR.js +78 -0
  428. package/dist/client/assets/chunks/wasm-ZMM2Z5XV.js +1 -0
  429. package/dist/client/assets/chunks/wenyan-HF5UTKSJ.js +1 -0
  430. package/dist/client/assets/chunks/wgsl-O7D7OPO7.js +1 -0
  431. package/dist/client/assets/chunks/wikitext-T7BSWSKQ.js +1 -0
  432. package/dist/client/assets/chunks/wit-TKCHPPT6.js +1 -0
  433. package/dist/client/assets/chunks/wolfram-7MN66A7N.js +1 -0
  434. package/dist/client/assets/chunks/xml-NLTLAWOD.js +1 -0
  435. package/dist/client/assets/chunks/xsl-NZ4ECK3P.js +1 -0
  436. package/dist/client/assets/chunks/xychartDiagram-GGNKY7IX-OXJILWHR.js +7 -0
  437. package/dist/client/assets/chunks/yaml-HRJLEV3V.js +1 -0
  438. package/dist/client/assets/chunks/zenscript-4LLRSLPI.js +1 -0
  439. package/dist/client/assets/chunks/zig-Y7MUQFUO.js +1 -0
  440. package/dist/client/assets/icon.svg +1 -0
  441. package/dist/client/assets/main.js +254 -0
  442. package/dist/client/index.html +59 -0
  443. package/dist/diff.js +119 -0
  444. package/dist/fs/files.js +233 -0
  445. package/dist/fs/git.js +369 -0
  446. package/dist/fs/glob.js +89 -0
  447. package/dist/fs/notes.js +368 -0
  448. package/dist/fs/search.js +136 -0
  449. package/dist/fs/watch.js +69 -0
  450. package/dist/fs/zip.js +100 -0
  451. package/dist/hooks.js +65 -0
  452. package/dist/http.js +81 -0
  453. package/dist/hub/atomic.js +77 -0
  454. package/dist/hub/notify.js +239 -0
  455. package/dist/hub/registry.js +219 -0
  456. package/dist/mcp.js +500 -0
  457. package/dist/q/agent.js +215 -0
  458. package/dist/q/model.js +633 -0
  459. package/dist/q/schema.js +133 -0
  460. package/dist/q/store.js +413 -0
  461. package/dist/r/model.js +323 -0
  462. package/dist/r/schema.js +53 -0
  463. package/dist/r/store.js +489 -0
  464. package/dist/server.js +246 -0
  465. package/dist/settings.js +30 -0
  466. package/dist/workspace.js +639 -0
  467. package/package.json +73 -4
  468. package/schema/questions.schema.json +1670 -0
  469. package/schema/reviews.schema.json +151 -0
@@ -0,0 +1,133 @@
1
+ // The question-set format as JSON Schema: published as schema/questions.schema.json, printed by `hitl schema questions`, and
2
+ // given to agents in the MCP tools' input schemas.
3
+ const strs = { oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }] };
4
+ export const blockSchema = {
5
+ description: 'Rich content. A markdown string, or one block: {md}, {file: "path/in/project", lines?: "10-40"} (rendered by type: code highlighted, markdown, images, mermaid, html preview, csv, pdf, audio/video), {code, lang?} (e.g. proposed code), {diff} (a unified diff of proposed work), {mermaid}, {image: "path or https URL", alt?}, {html, height?} (a sandboxed mockup, no scripts), {link: "https://…", label?}. Any block may have title and collapsed: true.',
6
+ oneOf: [
7
+ { type: 'string' },
8
+ {
9
+ type: 'object',
10
+ properties: {
11
+ md: { type: 'string' },
12
+ file: { type: 'string', description: 'A path relative to the project folder' },
13
+ lines: { oneOf: [{ type: 'string', pattern: '^\\d+(-\\d+)?$' }, { type: 'integer' }] },
14
+ code: { type: 'string' },
15
+ lang: { type: 'string' },
16
+ diff: { type: 'string' },
17
+ mermaid: { type: 'string' },
18
+ image: { type: 'string' },
19
+ alt: { type: 'string' },
20
+ html: { type: 'string' },
21
+ height: { type: 'number' },
22
+ link: { type: 'string' },
23
+ label: { type: 'string' },
24
+ title: { type: 'string' },
25
+ collapsed: { type: 'boolean' },
26
+ },
27
+ additionalProperties: false,
28
+ },
29
+ ],
30
+ };
31
+ const content = { oneOf: [blockSchema, { type: 'array', items: blockSchema }] };
32
+ const conditionOne = {
33
+ type: 'object',
34
+ required: ['question'],
35
+ properties: {
36
+ question: { type: 'string' },
37
+ any: { ...strs, description: 'any of these options is picked' },
38
+ all: { ...strs, description: 'all of these options are picked' },
39
+ none: { ...strs, description: 'answered, and none of these is picked' },
40
+ answered: { type: 'boolean' },
41
+ gte: { type: 'number' },
42
+ lte: { type: 'number' },
43
+ },
44
+ additionalProperties: false,
45
+ };
46
+ export const conditionSchema = {
47
+ description: 'Shown only when this holds (an array: all must hold). Names a question by id and the option ids that count.',
48
+ oneOf: [conditionOne, { type: 'array', items: conditionOne }],
49
+ };
50
+ export const optionSchema = {
51
+ oneOf: [
52
+ { type: 'string', description: 'Just the label (its id is made from it)' },
53
+ {
54
+ type: 'object',
55
+ properties: {
56
+ id: { type: 'string', description: 'Stable id (default: made from the label)' },
57
+ label: { type: 'string' },
58
+ description: { type: 'string', description: 'Markdown: what picking this means' },
59
+ recommended: { type: 'boolean' },
60
+ content: { ...content, description: 'A preview of this option: a mockup, code, a diagram, a picture' },
61
+ shows: { ...strs, description: 'Picking this shows these questions or sections (ids), even if hidden by default' },
62
+ hides: { ...strs, description: 'Picking this hides these questions or sections (ids)' },
63
+ },
64
+ required: ['label'],
65
+ additionalProperties: false,
66
+ },
67
+ ],
68
+ };
69
+ export const questionSchema = {
70
+ type: 'object',
71
+ required: ['id', 'question'],
72
+ properties: {
73
+ id: { type: 'string', pattern: '^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$', description: 'Stable id, unique in the set (questions and sections share ids)' },
74
+ question: { type: 'string', description: 'Markdown: the question itself, short' },
75
+ type: {
76
+ enum: ['single', 'multi', 'yesno', 'text', 'number', 'scale', 'rank'],
77
+ description: 'Default: single when it has options, else text. scale is min..max (default 1..5); rank orders the options.',
78
+ },
79
+ header: { type: 'string', description: 'A short label above the question' },
80
+ why: { type: 'string', description: 'Markdown: what the answer changes' },
81
+ content: { ...content, description: 'Context: findings, files, proposed code or diffs, diagrams, pictures' },
82
+ options: { type: 'array', items: optionSchema },
83
+ recommended: { oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }, { type: 'number' }], description: 'Recommended option id(s), or a value for number/scale/text' },
84
+ priority: { enum: ['blocking', 'high', 'normal', 'low'] },
85
+ blocking: { type: 'boolean', description: 'Same as priority: "blocking": you cannot go on without it' },
86
+ hidden: { type: 'boolean', description: 'Hidden until an option `shows` it or `showIf` holds (default visible)' },
87
+ showIf: conditionSchema,
88
+ allowOther: { type: 'boolean', description: 'Offer "Other…" on single/multi (default true)' },
89
+ allowNote: { type: 'boolean', description: 'Offer a free note (default true)' },
90
+ min: { type: 'number' },
91
+ max: { type: 'number' },
92
+ step: { type: 'number' },
93
+ unit: { type: 'string' },
94
+ minLabel: { type: 'string' },
95
+ maxLabel: { type: 'string' },
96
+ placeholder: { type: 'string' },
97
+ multiline: { type: 'boolean' },
98
+ tags: { type: 'array', items: { type: 'string' } },
99
+ },
100
+ additionalProperties: false,
101
+ };
102
+ export const sectionSchema = {
103
+ type: 'object',
104
+ properties: {
105
+ id: { type: 'string', description: 'Stable id (questions and sections share ids)' },
106
+ title: { type: 'string' },
107
+ intro: { type: 'string', description: 'Markdown shown above the questions: what you found, what this section decides' },
108
+ content,
109
+ hidden: { type: 'boolean' },
110
+ showIf: conditionSchema,
111
+ questions: { type: 'array', items: questionSchema },
112
+ },
113
+ additionalProperties: false,
114
+ };
115
+ export const setSchema = {
116
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
117
+ $id: 'https://unpkg.com/hitloop/schema/questions.schema.json',
118
+ title: 'hitl question set',
119
+ description: 'Questions for a person to answer on their phone. Save as .hitl/questions/<set-id>.json in the project.',
120
+ type: 'object',
121
+ properties: {
122
+ $schema: { type: 'string' },
123
+ title: { type: 'string' },
124
+ intro: { type: 'string', description: 'Markdown at the top of the set' },
125
+ content,
126
+ status: { enum: ['open', 'closed'] },
127
+ created: { type: 'string' },
128
+ updated: { type: 'string' },
129
+ sections: { type: 'array', items: sectionSchema },
130
+ questions: { type: 'array', items: questionSchema, description: 'Questions outside any section' },
131
+ },
132
+ additionalProperties: false,
133
+ };
@@ -0,0 +1,413 @@
1
+ // A project's question sets on disk:
2
+ // <folder>/.hitl/questions/<set>.json the questions (the agent writes these)
3
+ // <folder>/.hitl/answers/<set>.json the answers, replies and read marks (hitl writes these)
4
+ // <folder>/.hitl/answers/<set>.md the same answers, readable
5
+ // Every write is a locked read-modify-write with an atomic rename, so the page, the MCP server and the CLI can all
6
+ // write at once from different processes.
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { StoreError, ensureReadme, stripBom, withLock, writeAtomic } from '../hub/atomic.js';
10
+ export { StoreError };
11
+ import { SET_ID, answersMarkdown, checkAnswer, emptyAnswers, normalise, questionById, recommendedAnswer, summarise, } from './model.js';
12
+ export const DIR = '.hitl';
13
+ export const SCHEMA_URL = 'https://unpkg.com/hitloop/schema/questions.schema.json';
14
+ export class Questions {
15
+ root;
16
+ dir;
17
+ setsDir;
18
+ answersDir;
19
+ cache = new Map();
20
+ constructor(root, dirName = DIR) {
21
+ this.root = root;
22
+ this.root = path.resolve(root);
23
+ this.dir = path.resolve(this.root, dirName);
24
+ this.setsDir = path.join(this.dir, 'questions');
25
+ this.answersDir = path.join(this.dir, 'answers');
26
+ }
27
+ get exists() {
28
+ return fs.existsSync(this.setsDir);
29
+ }
30
+ ensure() {
31
+ fs.mkdirSync(this.setsDir, { recursive: true });
32
+ fs.mkdirSync(this.answersDir, { recursive: true });
33
+ ensureReadme(this.dir);
34
+ }
35
+ setPath(id) {
36
+ checkId(id);
37
+ return path.join(this.setsDir, id + '.json');
38
+ }
39
+ answersPath(id) {
40
+ checkId(id);
41
+ return path.join(this.answersDir, id + '.json');
42
+ }
43
+ markdownPath(id) {
44
+ checkId(id);
45
+ return path.join(this.answersDir, id + '.md');
46
+ }
47
+ /** set ids, from the files in sets/ */
48
+ ids() {
49
+ try {
50
+ return fs
51
+ .readdirSync(this.setsDir)
52
+ .filter((f) => f.endsWith('.json') && SET_ID.test(f.slice(0, -5)))
53
+ .map((f) => f.slice(0, -5))
54
+ .sort();
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ has(id) {
61
+ return SET_ID.test(id) && fs.existsSync(this.setPath(id));
62
+ }
63
+ /** the set, normalised (cached until the file changes), or undefined when there's no such set */
64
+ load(id) {
65
+ if (!SET_ID.test(id))
66
+ return undefined;
67
+ const file = this.setPath(id);
68
+ let st;
69
+ try {
70
+ st = fs.statSync(file);
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ const hit = this.cache.get(id);
76
+ if (hit && hit.mtime === st.mtimeMs && hit.size === st.size)
77
+ return hit.loaded;
78
+ let raw;
79
+ let parseError = '';
80
+ try {
81
+ raw = JSON.parse(stripBom(fs.readFileSync(file, 'utf8')));
82
+ }
83
+ catch (e) {
84
+ parseError = `${path.basename(file)} isn't valid JSON: ${e instanceof Error ? e.message : String(e)}`;
85
+ raw = {};
86
+ }
87
+ const n = normalise(id, raw);
88
+ if (parseError)
89
+ n.errors.unshift(parseError);
90
+ const loaded = { ...n, raw: raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {}, mtime: st.mtimeMs };
91
+ this.cache.set(id, { mtime: st.mtimeMs, size: st.size, loaded });
92
+ return loaded;
93
+ }
94
+ answers(id) {
95
+ try {
96
+ const data = JSON.parse(stripBom(fs.readFileSync(this.answersPath(id), 'utf8')));
97
+ if (!data || typeof data !== 'object')
98
+ return emptyAnswers();
99
+ const d = data;
100
+ return {
101
+ version: 1,
102
+ seq: typeof d.seq === 'number' ? d.seq : 0,
103
+ readSeq: typeof d.readSeq === 'number' ? d.readSeq : 0,
104
+ answers: d.answers && typeof d.answers === 'object' ? d.answers : {},
105
+ threads: d.threads && typeof d.threads === 'object' ? d.threads : {},
106
+ };
107
+ }
108
+ catch {
109
+ return emptyAnswers();
110
+ }
111
+ }
112
+ summary(id) {
113
+ const l = this.load(id);
114
+ if (!l)
115
+ return undefined;
116
+ return summarise(l.set, this.answers(id), l.errors.length);
117
+ }
118
+ summaries() {
119
+ return this.ids()
120
+ .map((id) => this.summary(id))
121
+ .filter((s) => !!s);
122
+ }
123
+ // ── writing answers ──
124
+ /** Change the answers file under its lock; the markdown copy is rewritten too. */
125
+ mutateAnswers(id, fn) {
126
+ if (!this.has(id))
127
+ throw new StoreError(`No set "${id}"`);
128
+ fs.mkdirSync(this.answersDir, { recursive: true });
129
+ return withLock(this.answersPath(id), () => {
130
+ const af = this.answers(id);
131
+ const result = fn(af);
132
+ writeAtomic(this.answersPath(id), JSON.stringify(af, null, 2) + '\n');
133
+ const l = this.load(id);
134
+ if (l)
135
+ writeAtomic(this.markdownPath(id), answersMarkdown(l.set, af));
136
+ return result;
137
+ });
138
+ }
139
+ /** Answer a question (from the page or the CLI). Returns the stored answer. */
140
+ answer(id, qid, input) {
141
+ const l = this.mustLoad(id);
142
+ const q = questionById(l.set, qid);
143
+ if (!q)
144
+ throw new StoreError(`No question "${qid}" in "${id}"`);
145
+ const checked = checkAnswer(q, input);
146
+ if (!checked.ok)
147
+ throw new StoreError(checked.error);
148
+ return this.mutateAnswers(id, (af) => {
149
+ const prev = af.answers[qid];
150
+ const a = { ...checked.answer, rev: q.rev, at: new Date().toISOString(), seq: ++af.seq };
151
+ // the agent's "applied" note stays only while the answer says the same thing
152
+ if (prev?.ack && same(prev, a))
153
+ a.ack = prev.ack;
154
+ af.answers[qid] = a;
155
+ return a;
156
+ });
157
+ }
158
+ clear(id, qid) {
159
+ this.mutateAnswers(id, (af) => {
160
+ if (af.answers[qid]) {
161
+ delete af.answers[qid];
162
+ af.seq++;
163
+ }
164
+ });
165
+ }
166
+ /** Take the recommendation for each of these questions that has one and isn't answered. Returns the ids taken. */
167
+ acceptRecommended(id, qids) {
168
+ const l = this.mustLoad(id);
169
+ return this.mutateAnswers(id, (af) => {
170
+ const taken = [];
171
+ for (const qid of qids) {
172
+ const q = questionById(l.set, qid);
173
+ if (!q || (af.answers[qid] && af.answers[qid]?.status !== 'later'))
174
+ continue;
175
+ const rec = recommendedAnswer(q);
176
+ if (!rec)
177
+ continue;
178
+ const checked = checkAnswer(q, rec);
179
+ if (!checked.ok)
180
+ continue;
181
+ af.answers[qid] = { ...checked.answer, rev: q.rev, at: new Date().toISOString(), seq: ++af.seq };
182
+ taken.push(qid);
183
+ }
184
+ return taken;
185
+ });
186
+ }
187
+ /** A message on a question's thread, from the owner (the page) or the agent. */
188
+ message(id, qid, from, body) {
189
+ const l = this.mustLoad(id);
190
+ if (!questionById(l.set, qid))
191
+ throw new StoreError(`No question "${qid}" in "${id}"`);
192
+ if (!body.trim())
193
+ throw new StoreError('The message is empty');
194
+ return this.mutateAnswers(id, (af) => {
195
+ const m = { from, body: body.slice(0, 20000), at: new Date().toISOString(), seq: ++af.seq };
196
+ (af.threads[qid] ??= []).push(m);
197
+ return m;
198
+ });
199
+ }
200
+ /** The agent applied these answers: mark them, with a note the owner sees. Returns the ids marked. */
201
+ ack(id, qids, note) {
202
+ return this.mutateAnswers(id, (af) => {
203
+ const done = [];
204
+ for (const qid of qids) {
205
+ const a = af.answers[qid];
206
+ if (!a)
207
+ continue;
208
+ a.ack = { at: new Date().toISOString(), note: note.slice(0, 2000) };
209
+ done.push(qid);
210
+ }
211
+ if (done.length)
212
+ af.seq++;
213
+ return done;
214
+ });
215
+ }
216
+ /** The agent has read everything so far. */
217
+ markRead(id, upTo) {
218
+ this.mutateAnswers(id, (af) => {
219
+ af.readSeq = Math.max(af.readSeq, Math.min(upTo ?? af.seq, af.seq));
220
+ });
221
+ }
222
+ // ── writing sets ──
223
+ /** Change the set file (as written, not normalised) under its lock. Rejects the change if it leaves errors. */
224
+ mutateSet(id, fn, opts = {}) {
225
+ checkId(id);
226
+ this.ensure();
227
+ const file = this.setPath(id);
228
+ return withLock(file, () => {
229
+ let raw;
230
+ if (fs.existsSync(file)) {
231
+ try {
232
+ raw = JSON.parse(stripBom(fs.readFileSync(file, 'utf8')));
233
+ }
234
+ catch (e) {
235
+ throw new StoreError(`${path.basename(file)} isn't valid JSON (${e instanceof Error ? e.message : String(e)}); fix it by hand first`);
236
+ }
237
+ }
238
+ else if (opts.create)
239
+ raw = { $schema: SCHEMA_URL, title: id, created: new Date().toISOString(), sections: [] };
240
+ else
241
+ throw new StoreError(`No set "${id}"`);
242
+ const before = normalise(id, raw).errors.length;
243
+ const result = fn(raw);
244
+ raw.updated = new Date().toISOString();
245
+ const n = normalise(id, raw);
246
+ if (n.errors.length > before && !opts.force)
247
+ throw new StoreError('That would make the set invalid:\n' + n.errors.map((e) => ' ' + e).join('\n'));
248
+ writeAtomic(file, JSON.stringify(raw, null, 2) + '\n');
249
+ this.cache.delete(id);
250
+ return { result, normalised: n };
251
+ });
252
+ }
253
+ /** Add questions to a section (made if needed). Questions without ids get one from their text. */
254
+ addQuestions(id, questions, section, opts = {}) {
255
+ const { result, normalised } = this.mutateSet(id, (raw) => {
256
+ if (opts.title && (!raw.title || raw.title === id))
257
+ raw.title = opts.title;
258
+ if (opts.from && !raw.from)
259
+ raw.from = opts.from;
260
+ raw.sections ??= [];
261
+ const sec = typeof section === 'string' ? { id: section } : section;
262
+ let target;
263
+ if (sec?.id || sec?.title) {
264
+ const sid = sec.id ?? undefined;
265
+ target = raw.sections.find((s) => (sid ? s.id === sid : s.title === sec.title));
266
+ if (!target) {
267
+ target = { ...sec, questions: [] };
268
+ raw.sections.push(target);
269
+ }
270
+ else {
271
+ for (const k of ['title', 'intro', 'content', 'hidden', 'showIf'])
272
+ if (sec[k] !== undefined && target[k] === undefined)
273
+ Object.assign(target, { [k]: sec[k] });
274
+ }
275
+ }
276
+ else if (raw.questions || !raw.sections.length) {
277
+ raw.questions ??= [];
278
+ target = { questions: raw.questions };
279
+ }
280
+ else {
281
+ target = raw.sections[raw.sections.length - 1];
282
+ }
283
+ if (!target)
284
+ throw new StoreError('No section to add to');
285
+ target.questions ??= [];
286
+ const taken = new Set(existingIds(raw));
287
+ const ids = [];
288
+ for (const q of questions) {
289
+ const copy = { ...q };
290
+ if (!copy.id) {
291
+ const base = slugOf(copy.question ?? copy.q ?? 'q');
292
+ let qid = base, n = 2;
293
+ while (taken.has(qid))
294
+ qid = `${base}-${n++}`;
295
+ copy.id = qid;
296
+ }
297
+ if (taken.has(copy.id))
298
+ throw new StoreError(`The id "${copy.id}" is already in the set (use update_question to change it)`);
299
+ taken.add(copy.id);
300
+ ids.push(copy.id);
301
+ const at = opts.before ? target.questions.findIndex((x) => x.id === opts.before) : -1;
302
+ if (at >= 0)
303
+ target.questions.splice(at, 0, copy);
304
+ else
305
+ target.questions.push(copy);
306
+ }
307
+ return ids;
308
+ }, { create: true });
309
+ return { ids: result, normalised };
310
+ }
311
+ /** Change one question: the patch's fields replace the question's (null removes one). */
312
+ updateQuestion(id, qid, patch) {
313
+ return this.mutateSet(id, (raw) => {
314
+ const q = findRaw(raw, qid);
315
+ if (!q)
316
+ throw new StoreError(`No question "${qid}" in "${id}"`);
317
+ for (const [k, v] of Object.entries(patch)) {
318
+ if (k === 'id')
319
+ continue;
320
+ if (v === null)
321
+ delete q[k];
322
+ else
323
+ q[k] = v;
324
+ }
325
+ }).normalised;
326
+ }
327
+ removeQuestions(id, qids) {
328
+ return this.mutateSet(id, (raw) => {
329
+ const removed = [];
330
+ const lists = [raw.questions ?? [], ...(raw.sections ?? []).map((s) => s.questions ?? [])];
331
+ for (const list of lists)
332
+ for (let i = list.length - 1; i >= 0; i--) {
333
+ const q = list[i];
334
+ if (q?.id && qids.includes(q.id)) {
335
+ list.splice(i, 1);
336
+ removed.push(q.id);
337
+ }
338
+ }
339
+ return removed;
340
+ }, { force: true }).result;
341
+ }
342
+ /** Set-level fields: title, intro, content, status. */
343
+ updateSet(id, patch, create = false) {
344
+ return this.mutateSet(id, (raw) => {
345
+ for (const [k, v] of Object.entries(patch))
346
+ if (v !== undefined)
347
+ raw[k] = v;
348
+ }, { create }).normalised;
349
+ }
350
+ /** Change or add a section's own fields (not its questions). */
351
+ updateSection(id, sid, patch) {
352
+ return this.mutateSet(id, (raw) => {
353
+ raw.sections ??= [];
354
+ let s = raw.sections.find((x) => x.id === sid);
355
+ if (!s) {
356
+ s = { id: sid, questions: [] };
357
+ raw.sections.push(s);
358
+ }
359
+ for (const [k, v] of Object.entries(patch)) {
360
+ if (v === null)
361
+ delete s[k];
362
+ else if (v !== undefined)
363
+ s[k] = v;
364
+ }
365
+ }).normalised;
366
+ }
367
+ mustLoad(id) {
368
+ const l = this.load(id);
369
+ if (!l)
370
+ throw new StoreError(`No set "${id}"`);
371
+ return l;
372
+ }
373
+ }
374
+ function checkId(id) {
375
+ if (!SET_ID.test(id))
376
+ throw new StoreError(`Bad set id "${id}": letters, digits, . _ - (up to 80)`);
377
+ }
378
+ function existingIds(raw) {
379
+ const out = [];
380
+ for (const q of raw.questions ?? [])
381
+ if (q.id)
382
+ out.push(q.id);
383
+ for (const s of raw.sections ?? []) {
384
+ if (s.id)
385
+ out.push(s.id);
386
+ for (const q of s.questions ?? [])
387
+ if (q.id)
388
+ out.push(q.id);
389
+ }
390
+ return out;
391
+ }
392
+ function findRaw(raw, qid) {
393
+ for (const q of raw.questions ?? [])
394
+ if (q.id === qid)
395
+ return q;
396
+ for (const s of raw.sections ?? [])
397
+ for (const q of s.questions ?? [])
398
+ if (q.id === qid)
399
+ return q;
400
+ return undefined;
401
+ }
402
+ function slugOf(s) {
403
+ return (s
404
+ .toLowerCase()
405
+ .replace(/[^a-z0-9]+/g, '-')
406
+ .replace(/^-+|-+$/g, '')
407
+ .slice(0, 40)
408
+ .replace(/-+$/, '') || 'q');
409
+ }
410
+ function same(a, b) {
411
+ const pick = (x) => JSON.stringify([x.status, x.picked ?? [], x.other ?? '', x.text ?? '', x.number ?? null, x.order ?? [], x.note ?? '']);
412
+ return pick(a) === pick(b);
413
+ }