strikethroo 3.25.0 → 4.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 (439) hide show
  1. package/README.md +14 -0
  2. package/dist/cli.js +18 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/export-profile.d.ts +6 -0
  5. package/dist/export-profile.d.ts.map +1 -1
  6. package/dist/export-profile.js +46 -4
  7. package/dist/export-profile.js.map +1 -1
  8. package/dist/metadata.d.ts +11 -1
  9. package/dist/metadata.d.ts.map +1 -1
  10. package/dist/metadata.js +75 -11
  11. package/dist/metadata.js.map +1 -1
  12. package/dist/profiles.d.ts.map +1 -1
  13. package/dist/profiles.js +52 -7
  14. package/dist/profiles.js.map +1 -1
  15. package/dist/serve/config-write.d.ts +6 -3
  16. package/dist/serve/config-write.d.ts.map +1 -1
  17. package/dist/serve/config-write.js +20 -21
  18. package/dist/serve/config-write.js.map +1 -1
  19. package/dist/serve/events.d.ts +37 -8
  20. package/dist/serve/events.d.ts.map +1 -1
  21. package/dist/serve/events.js +114 -28
  22. package/dist/serve/events.js.map +1 -1
  23. package/dist/serve/self-review.d.ts +37 -7
  24. package/dist/serve/self-review.d.ts.map +1 -1
  25. package/dist/serve/self-review.js +93 -33
  26. package/dist/serve/self-review.js.map +1 -1
  27. package/dist/serve/server.d.ts +107 -0
  28. package/dist/serve/server.d.ts.map +1 -1
  29. package/dist/serve/server.js +502 -135
  30. package/dist/serve/server.js.map +1 -1
  31. package/dist/serve/workspace-model.d.ts.map +1 -1
  32. package/dist/serve/workspace-model.js +36 -34
  33. package/dist/serve/workspace-model.js.map +1 -1
  34. package/dist/skill-scripts/shared/safe-fs.d.ts +89 -0
  35. package/dist/skill-scripts/shared/safe-fs.d.ts.map +1 -0
  36. package/dist/skill-scripts/shared/safe-fs.js +324 -0
  37. package/dist/skill-scripts/shared/safe-fs.js.map +1 -0
  38. package/dist/types.d.ts +8 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js +13 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/update.d.ts.map +1 -1
  43. package/dist/update.js +15 -1
  44. package/dist/update.js.map +1 -1
  45. package/dist-web/assets/abnfDiagram-VCTEODGH-BCoAyQ8y.js +1 -0
  46. package/dist-web/assets/apl-gfMMiTNf.js +1 -0
  47. package/dist-web/assets/arc-Pry-7G1_.js +1 -0
  48. package/dist-web/assets/architecture-7GRP2DOG-C2Oj1AcH.js +1 -0
  49. package/dist-web/assets/architectureDiagram-5GKGNRK7-BbYvyste.js +36 -0
  50. package/dist-web/assets/array-BifhSqXX.js +1 -0
  51. package/dist-web/assets/asciiarmor-C_eisQCp.js +1 -0
  52. package/dist-web/assets/asn1-DCl_8MCW.js +1 -0
  53. package/dist-web/assets/asterisk-BEn0Cwpx.js +1 -0
  54. package/dist-web/assets/blockDiagram-I7D4REHJ-CGYIKoI0.js +129 -0
  55. package/dist-web/assets/brainfuck-D5EjA2JK.js +1 -0
  56. package/dist-web/assets/c4Diagram-7LVT6UL2-Cpat9Q1R.js +38 -0
  57. package/dist-web/assets/channel-Da0Eg5hZ.js +1 -0
  58. package/dist-web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  59. package/dist-web/assets/chunk-4HAMMTFA-D1PXshWJ.js +62 -0
  60. package/dist-web/assets/{chunk-FMBD7UC4-BxPfAX5i.js → chunk-5VM5RSS4-ZNzvKenW.js} +2 -2
  61. package/dist-web/assets/chunk-75Z2AOVW-C19f30iG.js +2 -0
  62. package/dist-web/assets/chunk-DU6HZSFF-CV-KOPc1.js +125 -0
  63. package/dist-web/assets/chunk-F27PBJKO-DMfX40T1.js +1 -0
  64. package/dist-web/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
  65. package/dist-web/assets/chunk-GMAD6QVW-Nd9kACgc.js +72 -0
  66. package/dist-web/assets/chunk-GVQU2GXP-3G8ojGFe.js +1 -0
  67. package/dist-web/assets/chunk-IMKFNOWR-CmhGyHNd.js +231 -0
  68. package/dist-web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  69. package/dist-web/assets/chunk-L3NEJ4N5-Dsa1ER8Q.js +1 -0
  70. package/dist-web/assets/chunk-OSK3NFVY-ObCj9P3B.js +10 -0
  71. package/dist-web/assets/chunk-P2QGCYS3-CfNHqVGX.js +1 -0
  72. package/dist-web/assets/chunk-POPQ4Y6H-Cg5tk8by.js +1 -0
  73. package/dist-web/assets/chunk-PWAF6VOD-e6XMS-JR.js +1 -0
  74. package/dist-web/assets/chunk-SHT3W25Y-B1M0HI76.js +168 -0
  75. package/dist-web/assets/chunk-SVP7TREG-XLNHY4Z2.js +88 -0
  76. package/dist-web/assets/chunk-TICWLB2K-Bpm0S7rI.js +206 -0
  77. package/dist-web/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  78. package/dist-web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  79. package/dist-web/assets/classDiagram-ZZMXUADV-CZI086hK.js +1 -0
  80. package/dist-web/assets/classDiagram-v2-VYDZK3BY-CZI086hK.js +1 -0
  81. package/dist-web/assets/clike-D_6L3tnO.js +1 -0
  82. package/dist-web/assets/clojure-BflJGmDX.js +1 -0
  83. package/dist-web/assets/cmake-84nbDH0I.js +1 -0
  84. package/dist-web/assets/cobol-DHLQUbN7.js +1 -0
  85. package/dist-web/assets/coffeescript-De_zI4J0.js +1 -0
  86. package/dist-web/assets/commonlisp-DgAKBe0r.js +1 -0
  87. package/dist-web/assets/cose-bilkent-JH36ORCC-BEpcWcmK.js +1 -0
  88. package/dist-web/assets/crystal-Bsdphhtm.js +1 -0
  89. package/dist-web/assets/css-CnaYoQib.js +1 -0
  90. package/dist-web/assets/cynefin-OW5HDTMX-B5ohibc7.js +1 -0
  91. package/dist-web/assets/cynefinDiagram-5FMLGOSQ-C1202n-x.js +62 -0
  92. package/dist-web/assets/cypher-p9eYesGn.js +1 -0
  93. package/dist-web/assets/cytoscape.esm-Yq6u8L66.js +321 -0
  94. package/dist-web/assets/d-DWkQyNnU.js +1 -0
  95. package/dist-web/assets/dagre-C-rnJpZF.js +1 -0
  96. package/dist-web/assets/dagre-GXQ25YYZ-CQlKKJXg.js +4 -0
  97. package/dist-web/assets/defaultLocale-BFoDCU3G.js +1 -0
  98. package/dist-web/assets/diagram-S7CK7UJ4-DRf7iTH9.js +30 -0
  99. package/dist-web/assets/diagram-UQ7AKVKN-CxSX3b2_.js +41 -0
  100. package/dist-web/assets/diagram-VSXAHHWV-D9vrB5je.js +3 -0
  101. package/dist-web/assets/diagram-VX7I27RA-DTOqcpBV.js +24 -0
  102. package/dist-web/assets/diagram-Z3DM3KII-mlhRA4lR.js +24 -0
  103. package/dist-web/assets/diff-ChtP43wD.js +1 -0
  104. package/dist-web/assets/dist-B-O4eZD_.js +1 -0
  105. package/dist-web/assets/dist-B27L6oW0.js +1 -0
  106. package/dist-web/assets/dist-BKXbBuAc.js +1 -0
  107. package/dist-web/assets/dist-BPcC0hnc.js +9 -0
  108. package/dist-web/assets/dist-BgwxV8e_.js +1 -0
  109. package/dist-web/assets/dist-BlG40nRw.js +1 -0
  110. package/dist-web/assets/dist-Bqc6e86z.js +1 -0
  111. package/dist-web/assets/dist-BsvASXHG.js +1 -0
  112. package/dist-web/assets/dist-C15GN054.js +1 -0
  113. package/dist-web/assets/dist-C4QRmcTO.js +1 -0
  114. package/dist-web/assets/dist-C4lZy0XG.js +6 -0
  115. package/dist-web/assets/dist-CFLbFzpB.js +23 -0
  116. package/dist-web/assets/dist-CP6AUVtv.js +1 -0
  117. package/dist-web/assets/dist-CpYnHHz6.js +1 -0
  118. package/dist-web/assets/dist-DHnGmK79.js +1 -0
  119. package/dist-web/assets/dist-DYmIHv0n.js +13 -0
  120. package/dist-web/assets/dist-DauRO0RO.js +1 -0
  121. package/dist-web/assets/dist-Day7i26p.js +1 -0
  122. package/dist-web/assets/dist-Do_t70vA.js +1 -0
  123. package/dist-web/assets/dist-DqTG_rhR.js +2 -0
  124. package/dist-web/assets/dist-G8nWWSie.js +11 -0
  125. package/dist-web/assets/dist-QfYLz_N1.js +1 -0
  126. package/dist-web/assets/dist-TZhb2tj2.js +1 -0
  127. package/dist-web/assets/dist-Wr2Wo_KE.js +1 -0
  128. package/dist-web/assets/dist-kYRo7Db1.js +1 -0
  129. package/dist-web/assets/dist-kfqV1Lu-.js +2 -0
  130. package/dist-web/assets/dist-v5Q1xZ2K.js +1 -0
  131. package/dist-web/assets/dockerfile-DJkHQgkl.js +1 -0
  132. package/dist-web/assets/dtd-DTF72YNO.js +1 -0
  133. package/dist-web/assets/dylan-BCDoL_-p.js +1 -0
  134. package/dist-web/assets/ebnf-D4c0_ac3.js +1 -0
  135. package/dist-web/assets/ebnfDiagram-PWID7BFC-BhB_RJPM.js +1 -0
  136. package/dist-web/assets/ecl-BVIeWmwY.js +1 -0
  137. package/dist-web/assets/eiffel-BEjRio4Q.js +1 -0
  138. package/dist-web/assets/elm-Cshzl8qu.js +1 -0
  139. package/dist-web/assets/erDiagram-RLTQ6QDP-0wE1kPYz.js +99 -0
  140. package/dist-web/assets/erlang-BV0c4Hdn.js +1 -0
  141. package/dist-web/assets/esm-COEoxUhE.js +2 -0
  142. package/dist-web/assets/eventmodeling-NTZA5JFV-DzkXb9nA.js +1 -0
  143. package/dist-web/assets/factor-LKH5gN8L.js +1 -0
  144. package/dist-web/assets/fcl-ClOhbFR7.js +1 -0
  145. package/dist-web/assets/flowDiagram-HODETNUW-cgl8ipSt.js +1 -0
  146. package/dist-web/assets/forth-D6RzAl64.js +1 -0
  147. package/dist-web/assets/fortran-Bt6PBEDR.js +1 -0
  148. package/dist-web/assets/ganttDiagram-EL5Y4UJY-BsvlpHPt.js +292 -0
  149. package/dist-web/assets/gas-BHEdbvp9.js +1 -0
  150. package/dist-web/assets/gherkin-oBAE_ms0.js +1 -0
  151. package/dist-web/assets/gitGraph-4MIJSDKK-Dm82FCqy.js +1 -0
  152. package/dist-web/assets/gitGraphDiagram-WWUBYQGX-OPit_3vA.js +106 -0
  153. package/dist-web/assets/graphlib-DS17s2tU.js +1 -0
  154. package/dist-web/assets/groovy-CUpZ7dEl.js +1 -0
  155. package/dist-web/assets/haskell-BRsoo5mP.js +1 -0
  156. package/dist-web/assets/haxe-DjVOVvNP.js +1 -0
  157. package/dist-web/assets/http-CLVgA2GD.js +1 -0
  158. package/dist-web/assets/idl-BUZw3wgd.js +1 -0
  159. package/dist-web/assets/index-6XzOqB6r.js +103 -0
  160. package/dist-web/assets/index-CgIHUWsX.css +2 -0
  161. package/dist-web/assets/info-A6RAGUB7-8sl1XQWq.js +1 -0
  162. package/dist-web/assets/infoDiagram-27XIBGKW-DIpdnB7L.js +2 -0
  163. package/dist-web/assets/init-C-OQMol4.js +1 -0
  164. package/dist-web/assets/ishikawaDiagram-5VMMS53U-DpoLDWpF.js +70 -0
  165. package/dist-web/assets/javascript-Bu8mWwtz.js +1 -0
  166. package/dist-web/assets/journeyDiagram-3NMN7TZE-BAEbJ33U.js +139 -0
  167. package/dist-web/assets/julia-CQfgDRfP.js +1 -0
  168. package/dist-web/assets/kanban-definition-UXKFOSKX-CqzyUA0g.js +89 -0
  169. package/dist-web/assets/katex-ZlcWpGUi.js +257 -0
  170. package/dist-web/assets/line-CQRHrtV_.js +1 -0
  171. package/dist-web/assets/linear-SzVmGSw4.js +1 -0
  172. package/dist-web/assets/livescript-BXxG0Yva.js +1 -0
  173. package/dist-web/assets/lua-DPCEkfD_.js +1 -0
  174. package/dist-web/assets/mathematica-u8YMmbU0.js +1 -0
  175. package/dist-web/assets/mbox-BEMVcqjs.js +1 -0
  176. package/dist-web/assets/mermaid-parser.core-XlEvAPi2.js +7 -0
  177. package/dist-web/assets/mermaid.core-CvFTFi5O.js +44 -0
  178. package/dist-web/assets/mindmap-definition-YA3MSWOX-Ch0vW4Mc.js +96 -0
  179. package/dist-web/assets/{mirc-CjQqDB4T.js → mirc-C9zpzAZU.js} +1 -1
  180. package/dist-web/assets/mllike-B45xgp2S.js +1 -0
  181. package/dist-web/assets/modelica-CqHI_q-D.js +1 -0
  182. package/dist-web/assets/mscgen-qgSLujhx.js +1 -0
  183. package/dist-web/assets/mumps-BSzj6Xyz.js +1 -0
  184. package/dist-web/assets/{nginx-DdIZxoE0.js → nginx-8H7HVH4w.js} +1 -1
  185. package/dist-web/assets/nsis-CfSuhXs5.js +1 -0
  186. package/dist-web/assets/ntriples-B9h1VB_g.js +1 -0
  187. package/dist-web/assets/octave-D2Q8cUp1.js +1 -0
  188. package/dist-web/assets/ordinal-BDEzSJ7C.js +1 -0
  189. package/dist-web/assets/oz-BwTct_5T.js +1 -0
  190. package/dist-web/assets/packet-AYTQ26CC-lk-QU-qZ.js +1 -0
  191. package/dist-web/assets/pascal-Dp_KdFgX.js +1 -0
  192. package/dist-web/assets/path-fybaL0A-.js +1 -0
  193. package/dist-web/assets/pegDiagram-XKGWAZYB-Cgf4CYg-.js +1 -0
  194. package/dist-web/assets/perl-BkSkiI9m.js +1 -0
  195. package/dist-web/assets/pie-WAS4IAKB-dWyVjg9O.js +1 -0
  196. package/dist-web/assets/pieDiagram-E7YTZNPT-BDZxWO8n.js +39 -0
  197. package/dist-web/assets/pig-AF4Hwhju.js +1 -0
  198. package/dist-web/assets/powershell-BcIto6Sf.js +1 -0
  199. package/dist-web/assets/properties-C357ku5U.js +1 -0
  200. package/dist-web/assets/protobuf-D1ij_kNL.js +1 -0
  201. package/dist-web/assets/pug-3K-JMW4g.js +1 -0
  202. package/dist-web/assets/puppet-BZyAS7I4.js +1 -0
  203. package/dist-web/assets/python-B_1Jd8HM.js +1 -0
  204. package/dist-web/assets/q-B9NhS7L_.js +1 -0
  205. package/dist-web/assets/quadrantDiagram-AXDQQJYC-DCu9cx1_.js +7 -0
  206. package/dist-web/assets/r-CxDmU1I4.js +1 -0
  207. package/dist-web/assets/radar-RG4KPBEZ-CphwvESj.js +1 -0
  208. package/dist-web/assets/railroad-74A4TZTK-COTrvtXu.js +1 -0
  209. package/dist-web/assets/railroad-abnf-HS5TGJTU-CYfpugMj.js +1 -0
  210. package/dist-web/assets/railroad-ebnf-LZEXJU2U--Ui_4jm6.js +1 -0
  211. package/dist-web/assets/railroad-peg-WCYAUIDC-DzcveMan.js +1 -0
  212. package/dist-web/assets/railroadDiagram-O6MQD6OU-S9ZI1Adi.js +1 -0
  213. package/dist-web/assets/requirementDiagram-BXWQKSXE-a_3FElqS.js +84 -0
  214. package/dist-web/assets/rolldown-runtime-hePW80VL.js +1 -0
  215. package/dist-web/assets/rough.esm-Dy-Kn_BL.js +1 -0
  216. package/dist-web/assets/rpm-gpDK5sbt.js +1 -0
  217. package/dist-web/assets/ruby-BjXV7-Qa.js +1 -0
  218. package/dist-web/assets/sankeyDiagram-P5KCCOFB-D-i6r8wy.js +40 -0
  219. package/dist-web/assets/{sas-B4kiWyti.js → sas-C2OyD2Y6.js} +1 -1
  220. package/dist-web/assets/scheme-D9qYN0V5.js +1 -0
  221. package/dist-web/assets/sequenceDiagram-WJ2MYXX4-D8hA2m0U.js +162 -0
  222. package/dist-web/assets/shell-DwuoZtxw.js +1 -0
  223. package/dist-web/assets/sieve-tLWDfEkZ.js +1 -0
  224. package/dist-web/assets/simple-mode-DXiLM1-G.js +1 -0
  225. package/dist-web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  226. package/dist-web/assets/smalltalk-BLp5-jwC.js +1 -0
  227. package/dist-web/assets/solr-B78wSQJQ.js +1 -0
  228. package/dist-web/assets/sparql-Dz-mlCAC.js +1 -0
  229. package/dist-web/assets/spreadsheet-CTIncYxj.js +1 -0
  230. package/dist-web/assets/sql-DuQMFDvy.js +1 -0
  231. package/dist-web/assets/src-B6xuSHsQ.js +1 -0
  232. package/dist-web/assets/stateDiagram-D77RDMKH-C14W-8zT.js +1 -0
  233. package/dist-web/assets/stateDiagram-v2-MP3YSRHH-Dhuhsub3.js +1 -0
  234. package/dist-web/assets/stex-DNzd62Q_.js +1 -0
  235. package/dist-web/assets/stylus-BOVgKnng.js +1 -0
  236. package/dist-web/assets/swift-DKB6_1j6.js +1 -0
  237. package/dist-web/assets/swimlanes-42K2YHIH-FMv8YLkC.js +1 -0
  238. package/dist-web/assets/swimlanesDiagram-VR7AAH4N-O94a9jW3.js +8 -0
  239. package/dist-web/assets/tcl-BGfruO1u.js +1 -0
  240. package/dist-web/assets/textile-C4jVoHG1.js +1 -0
  241. package/dist-web/assets/tiddlywiki-VlUiK86J.js +1 -0
  242. package/dist-web/assets/tiki-AK6FwT8q.js +1 -0
  243. package/dist-web/assets/timeline-definition-24CTP7MA-DmBN45fY.js +120 -0
  244. package/dist-web/assets/toml-BPTmHmyx.js +1 -0
  245. package/dist-web/assets/treeView-Q6P3EWNA-C5-PUnPN.js +1 -0
  246. package/dist-web/assets/treemap-WGGIJYW6-C_veVYMi.js +1 -0
  247. package/dist-web/assets/troff-C2dAgh7P.js +1 -0
  248. package/dist-web/assets/ttcn-PPSTk1ow.js +1 -0
  249. package/dist-web/assets/ttcn-cfg-2b4Gb5sE.js +1 -0
  250. package/dist-web/assets/turtle-Cx3rYX2g.js +1 -0
  251. package/dist-web/assets/vb-BthdM_4N.js +1 -0
  252. package/dist-web/assets/vbscript-D9f6rSsU.js +1 -0
  253. package/dist-web/assets/velocity-CqftRsjg.js +1 -0
  254. package/dist-web/assets/vennDiagram-4TSXK5OY-CiWHjSVc.js +34 -0
  255. package/dist-web/assets/verilog-CjI9Y6RI.js +1 -0
  256. package/dist-web/assets/vhdl-kS471soi.js +1 -0
  257. package/dist-web/assets/wardley-WFR3VGLG-FOCO1NlU.js +1 -0
  258. package/dist-web/assets/wardleyDiagram-VM6X3IG4-Da3kkvxV.js +78 -0
  259. package/dist-web/assets/webidl-D5jiJvOU.js +1 -0
  260. package/dist-web/assets/xquery-BKJx4mf9.js +1 -0
  261. package/dist-web/assets/xychartDiagram-S5SC5T6Z-DPxie1fH.js +7 -0
  262. package/dist-web/assets/yacas-CXXgtw0p.js +1 -0
  263. package/dist-web/assets/z80-Co3PbHdE.js +1 -0
  264. package/dist-web/index.html +6 -18
  265. package/dist-web/theme-guard.js +21 -0
  266. package/package.json +29 -24
  267. package/templates/strikethroo/config/config.yaml +7 -4
  268. package/dist-web/assets/apl-B4CMkyY2.js +0 -1
  269. package/dist-web/assets/arc-D8anvcX-.js +0 -1
  270. package/dist-web/assets/architectureDiagram-3BPJPVTR-CGfqArN_.js +0 -36
  271. package/dist-web/assets/asciiarmor-Df11BRmG.js +0 -1
  272. package/dist-web/assets/asn1-EdZsLKOL.js +0 -1
  273. package/dist-web/assets/asterisk-B-8jnY81.js +0 -1
  274. package/dist-web/assets/blockDiagram-GPEHLZMM-CHzLIPZe.js +0 -132
  275. package/dist-web/assets/brainfuck-C4LP7Hcl.js +0 -1
  276. package/dist-web/assets/c4Diagram-AAUBKEIU-9rRidvsm.js +0 -10
  277. package/dist-web/assets/channel-DgcCmM1I.js +0 -1
  278. package/dist-web/assets/chunk-2J33WTMH-C39TKr_M.js +0 -1
  279. package/dist-web/assets/chunk-4BX2VUAB-C2djuG3T.js +0 -1
  280. package/dist-web/assets/chunk-55IACEB6-DWqTM520.js +0 -1
  281. package/dist-web/assets/chunk-727SXJPM-rovNVJJP.js +0 -206
  282. package/dist-web/assets/chunk-AQP2D5EJ-CHH1etIO.js +0 -231
  283. package/dist-web/assets/chunk-ND2GUHAM-C8MhIE2B.js +0 -1
  284. package/dist-web/assets/chunk-QZHKN3VN-63gK6NbV.js +0 -1
  285. package/dist-web/assets/classDiagram-4FO5ZUOK-C0z0eFyi.js +0 -1
  286. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-C0z0eFyi.js +0 -1
  287. package/dist-web/assets/clike-B9uivgTg.js +0 -1
  288. package/dist-web/assets/clojure-BMjYHr_A.js +0 -1
  289. package/dist-web/assets/cmake-BQqOBYOt.js +0 -1
  290. package/dist-web/assets/cobol-CWcv1MsR.js +0 -1
  291. package/dist-web/assets/coffeescript-S37ZYGWr.js +0 -1
  292. package/dist-web/assets/commonlisp-DBKNyK5s.js +0 -1
  293. package/dist-web/assets/cose-bilkent-S5V4N54A-COtPU2p7.js +0 -1
  294. package/dist-web/assets/crystal-SjHAIU92.js +0 -1
  295. package/dist-web/assets/css-BnMrqG3P.js +0 -1
  296. package/dist-web/assets/cypher-C_CwsFkJ.js +0 -1
  297. package/dist-web/assets/cytoscape.esm-BHYC38rz.js +0 -331
  298. package/dist-web/assets/d-pRatUO7H.js +0 -1
  299. package/dist-web/assets/dagre-BM42HDAG-Av_BDeN2.js +0 -4
  300. package/dist-web/assets/defaultLocale-CrowFXzY.js +0 -1
  301. package/dist-web/assets/diagram-2AECGRRQ-TPYX18Ua.js +0 -43
  302. package/dist-web/assets/diagram-5GNKFQAL-DtQI3PSq.js +0 -10
  303. package/dist-web/assets/diagram-KO2AKTUF-DNXbi8Vg.js +0 -3
  304. package/dist-web/assets/diagram-LMA3HP47-Bl0b9O4C.js +0 -24
  305. package/dist-web/assets/diagram-OG6HWLK6-DboL6tB3.js +0 -24
  306. package/dist-web/assets/diff-DbItnlRl.js +0 -1
  307. package/dist-web/assets/dockerfile-BKs6k2Af.js +0 -1
  308. package/dist-web/assets/dtd-DF_7sFjM.js +0 -1
  309. package/dist-web/assets/dylan-DwRh75JA.js +0 -1
  310. package/dist-web/assets/ebnf-CDyGwa7X.js +0 -1
  311. package/dist-web/assets/ecl-Cabwm37j.js +0 -1
  312. package/dist-web/assets/eiffel-CnydiIhH.js +0 -1
  313. package/dist-web/assets/elm-vLlmbW-K.js +0 -1
  314. package/dist-web/assets/erDiagram-TEJ5UH35-BbYxGrzg.js +0 -85
  315. package/dist-web/assets/erlang-BNw1qcRV.js +0 -1
  316. package/dist-web/assets/factor-kuTfRLto.js +0 -1
  317. package/dist-web/assets/fcl-Kvtd6kyn.js +0 -1
  318. package/dist-web/assets/flowDiagram-I6XJVG4X-bgw4_MAe.js +0 -162
  319. package/dist-web/assets/forth-Ffai-XNe.js +0 -1
  320. package/dist-web/assets/fortran-DYz_wnZ1.js +0 -1
  321. package/dist-web/assets/ganttDiagram-6RSMTGT7-D_LznzPz.js +0 -292
  322. package/dist-web/assets/gas-Bneqetm1.js +0 -1
  323. package/dist-web/assets/gherkin-heZmZLOM.js +0 -1
  324. package/dist-web/assets/gitGraphDiagram-PVQCEYII-DIsJhn0o.js +0 -106
  325. package/dist-web/assets/graph-Dqkl27Ch.js +0 -1
  326. package/dist-web/assets/groovy-D9Dt4D0W.js +0 -1
  327. package/dist-web/assets/haskell-BWDZoCOh.js +0 -1
  328. package/dist-web/assets/haxe-H-WmDvRZ.js +0 -1
  329. package/dist-web/assets/http-DBlCnlav.js +0 -1
  330. package/dist-web/assets/idl-BEugSyMb.js +0 -1
  331. package/dist-web/assets/index-B-KlYMEI.js +0 -1
  332. package/dist-web/assets/index-B0a4C4Lb.js +0 -1
  333. package/dist-web/assets/index-B90tvIxG.js +0 -3
  334. package/dist-web/assets/index-BLXIwDvb.js +0 -1
  335. package/dist-web/assets/index-BdEHUYQj.js +0 -169
  336. package/dist-web/assets/index-BjZYUODU.js +0 -1
  337. package/dist-web/assets/index-BmsczLPZ.js +0 -1
  338. package/dist-web/assets/index-BpU7RpGz.js +0 -1
  339. package/dist-web/assets/index-C53NKwQ5.js +0 -1
  340. package/dist-web/assets/index-C73riuQN.js +0 -1
  341. package/dist-web/assets/index-C9RcHSPW.js +0 -1
  342. package/dist-web/assets/index-CEBV-m_B.js +0 -1
  343. package/dist-web/assets/index-CG1O2Vjg.js +0 -1
  344. package/dist-web/assets/index-CQ8MJGW7.js +0 -2
  345. package/dist-web/assets/index-CddJufqj.js +0 -1
  346. package/dist-web/assets/index-CrzBaw1K.css +0 -1
  347. package/dist-web/assets/index-CuBsNWzH.js +0 -13
  348. package/dist-web/assets/index-CuCAyRTw.js +0 -7
  349. package/dist-web/assets/index-CuUh3dvS.js +0 -1
  350. package/dist-web/assets/index-CwPWc9jQ.js +0 -1
  351. package/dist-web/assets/index-DHBbud_j.js +0 -1
  352. package/dist-web/assets/index-LLaxWDbg.js +0 -1
  353. package/dist-web/assets/index-XOpAvr0E.js +0 -13
  354. package/dist-web/assets/index-lkaAPBmM.js +0 -6
  355. package/dist-web/assets/index-pUkuW0EP.js +0 -1
  356. package/dist-web/assets/index-sbfqG9cy.js +0 -1
  357. package/dist-web/assets/index-udFbjSlZ.js +0 -2
  358. package/dist-web/assets/index-uwcaE2d7.js +0 -2
  359. package/dist-web/assets/index-yjEPVwyN.js +0 -1
  360. package/dist-web/assets/infoDiagram-5YYISTIA-DUEtO7Ix.js +0 -2
  361. package/dist-web/assets/init-Gi6I4Gst.js +0 -1
  362. package/dist-web/assets/ishikawaDiagram-YF4QCWOH-Ctv84Jbw.js +0 -70
  363. package/dist-web/assets/javascript-qCveANmP.js +0 -1
  364. package/dist-web/assets/journeyDiagram-JHISSGLW-DILNkNlL.js +0 -139
  365. package/dist-web/assets/julia-DuME0IfC.js +0 -1
  366. package/dist-web/assets/kanban-definition-UN3LZRKU-BO7sq2cF.js +0 -89
  367. package/dist-web/assets/katex-C5jXJg4s.js +0 -257
  368. package/dist-web/assets/layout-DO9UvE1P.js +0 -1
  369. package/dist-web/assets/linear-DOC1-cx3.js +0 -1
  370. package/dist-web/assets/livescript-BwQOo05w.js +0 -1
  371. package/dist-web/assets/lua-VAEuO923.js +0 -1
  372. package/dist-web/assets/mathematica-DTrFuWx2.js +0 -1
  373. package/dist-web/assets/mbox-CNhZ1qSd.js +0 -1
  374. package/dist-web/assets/mermaid.core-DqgK5FaN.js +0 -307
  375. package/dist-web/assets/mindmap-definition-RKZ34NQL-BnOJs-M5.js +0 -96
  376. package/dist-web/assets/mllike-CXdrOF99.js +0 -1
  377. package/dist-web/assets/modelica-Dc1JOy9r.js +0 -1
  378. package/dist-web/assets/mscgen-BA5vi2Kp.js +0 -1
  379. package/dist-web/assets/mumps-BT43cFF4.js +0 -1
  380. package/dist-web/assets/nsis-LdVXkNf5.js +0 -1
  381. package/dist-web/assets/ntriples-BfvgReVJ.js +0 -1
  382. package/dist-web/assets/octave-Ck1zUtKM.js +0 -1
  383. package/dist-web/assets/ordinal-Cboi1Yqb.js +0 -1
  384. package/dist-web/assets/oz-BzwKVEFT.js +0 -1
  385. package/dist-web/assets/pascal--L3eBynH.js +0 -1
  386. package/dist-web/assets/perl-CdXCOZ3F.js +0 -1
  387. package/dist-web/assets/pieDiagram-4H26LBE5-CscOm59p.js +0 -30
  388. package/dist-web/assets/pig-CevX1Tat.js +0 -1
  389. package/dist-web/assets/powershell-CFHJl5sT.js +0 -1
  390. package/dist-web/assets/properties-C78fOPTZ.js +0 -1
  391. package/dist-web/assets/protobuf-ChK-085T.js +0 -1
  392. package/dist-web/assets/pug-DukmZTjD.js +0 -1
  393. package/dist-web/assets/puppet-DMA9R1ak.js +0 -1
  394. package/dist-web/assets/python-BuPzkPfP.js +0 -1
  395. package/dist-web/assets/q-pXgVlZs6.js +0 -1
  396. package/dist-web/assets/quadrantDiagram-W4KKPZXB-IVu2Npzf.js +0 -7
  397. package/dist-web/assets/r-DUYO_cvP.js +0 -1
  398. package/dist-web/assets/requirementDiagram-4Y6WPE33-BbDNPPBQ.js +0 -84
  399. package/dist-web/assets/rpm-CTu-6PCP.js +0 -1
  400. package/dist-web/assets/ruby-B2Rjki9n.js +0 -1
  401. package/dist-web/assets/sankeyDiagram-5OEKKPKP-DcjXnlMj.js +0 -40
  402. package/dist-web/assets/scheme-C41bIUwD.js +0 -1
  403. package/dist-web/assets/sequenceDiagram-3UESZ5HK-B_Jw3NhT.js +0 -162
  404. package/dist-web/assets/shell-CjFT_Tl9.js +0 -1
  405. package/dist-web/assets/sieve-C3Gn_uJK.js +0 -1
  406. package/dist-web/assets/simple-mode-GW_nhZxv.js +0 -1
  407. package/dist-web/assets/smalltalk-CnHTOXQT.js +0 -1
  408. package/dist-web/assets/solr-DehyRSwq.js +0 -1
  409. package/dist-web/assets/sparql-DkYu6x3z.js +0 -1
  410. package/dist-web/assets/spreadsheet-BCZA_wO0.js +0 -1
  411. package/dist-web/assets/sql-D0XecflT.js +0 -1
  412. package/dist-web/assets/stateDiagram-AJRCARHV-CyQirMnx.js +0 -1
  413. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-o71gojBr.js +0 -1
  414. package/dist-web/assets/stex-C3f8Ysf7.js +0 -1
  415. package/dist-web/assets/stylus-B533Al4x.js +0 -1
  416. package/dist-web/assets/swift-BzpIVaGY.js +0 -1
  417. package/dist-web/assets/tcl-DVfN8rqt.js +0 -1
  418. package/dist-web/assets/textile-CnDTJFAw.js +0 -1
  419. package/dist-web/assets/tiddlywiki-DO-Gjzrf.js +0 -1
  420. package/dist-web/assets/tiki-DGYXhP31.js +0 -1
  421. package/dist-web/assets/timeline-definition-PNZ67QCA-0X5ctUMy.js +0 -120
  422. package/dist-web/assets/toml-Bm5Em-hy.js +0 -1
  423. package/dist-web/assets/troff-wAsdV37c.js +0 -1
  424. package/dist-web/assets/ttcn-CfJYG6tj.js +0 -1
  425. package/dist-web/assets/ttcn-cfg-B9xdYoR4.js +0 -1
  426. package/dist-web/assets/turtle-B1tBg_DP.js +0 -1
  427. package/dist-web/assets/vb-CmGdzxic.js +0 -1
  428. package/dist-web/assets/vbscript-BuJXcnF6.js +0 -1
  429. package/dist-web/assets/velocity-D8B20fx6.js +0 -1
  430. package/dist-web/assets/vennDiagram-CIIHVFJN-BbO0uHQQ.js +0 -34
  431. package/dist-web/assets/verilog-C6RDOZhf.js +0 -1
  432. package/dist-web/assets/vhdl-lSbBsy5d.js +0 -1
  433. package/dist-web/assets/wardley-L42UT6IY-maQQ80J4.js +0 -173
  434. package/dist-web/assets/wardleyDiagram-YWT4CUSO-BIswUO4D.js +0 -78
  435. package/dist-web/assets/webidl-ZXfAyPTL.js +0 -1
  436. package/dist-web/assets/xquery-CQfU5ijd.js +0 -1
  437. package/dist-web/assets/xychartDiagram-2RQKCTM6-DUBe_cWp.js +0 -7
  438. package/dist-web/assets/yacas-BJ4BC0dw.js +0 -1
  439. package/dist-web/assets/z80-Hz9HOZM7.js +0 -1
@@ -15,6 +15,12 @@
15
15
  * Untrusted input (the path string) is never passed to the shell: `spawn` is
16
16
  * invoked with an argv array, and the path is rejected before spawning unless it
17
17
  * resolves to an existing file under `plans/` or `archive/`. Node built-ins only.
18
+ *
19
+ * Launches are bounded: a {@link LaunchRegistry} tracks the plans whose child is
20
+ * still running, refusing a duplicate for the same plan and anything past
21
+ * {@link MAX_CONCURRENT_SELF_REVIEWS}. The registry is in-memory and per server
22
+ * instance: a restart resets the accounting, and the detached children — which
23
+ * the viewer never waits on — can outlive it. It is not a job manager.
18
24
  */
19
25
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
26
  if (k2 === undefined) k2 = k;
@@ -50,12 +56,17 @@ var __importStar = (this && this.__importStar) || (function () {
50
56
  };
51
57
  })();
52
58
  Object.defineProperty(exports, "__esModule", { value: true });
53
- exports.launchSelfReview = exports.resolveReviewPath = exports.isSelfReviewAvailable = exports.SELF_REVIEW_URL = exports.SELF_REVIEW_BINARY = void 0;
59
+ exports.launchSelfReview = exports.resolveReviewPath = exports.createLaunchRegistry = exports.isSelfReviewAvailable = exports.SELF_REVIEW_URL = exports.MAX_CONCURRENT_SELF_REVIEWS = exports.SELF_REVIEW_BINARY = void 0;
54
60
  const fs = __importStar(require("fs"));
55
61
  const path = __importStar(require("path"));
56
62
  const child_process_1 = require("child_process");
63
+ const safe_fs_1 = require("../skill-scripts/shared/safe-fs");
57
64
  /** The binary name looked up on PATH and spawned. */
58
65
  exports.SELF_REVIEW_BINARY = 'self-review';
66
+ /** Upper bound on self-review children running at once per server instance. */
67
+ exports.MAX_CONCURRENT_SELF_REVIEWS = 2;
68
+ /** Seconds a client should wait before retrying a `429` launch. */
69
+ const BUSY_RETRY_AFTER_SECONDS = 30;
59
70
  /** Where to obtain self-review; surfaced by the SPA when it is not installed. */
60
71
  exports.SELF_REVIEW_URL = 'https://github.com/e0ipso/self-review';
61
72
  /** Cache key derived from the environment inputs that affect the PATH scan. */
@@ -104,13 +115,21 @@ const isSelfReviewAvailable = (env = process.env) => {
104
115
  return result;
105
116
  };
106
117
  exports.isSelfReviewAvailable = isSelfReviewAvailable;
107
- /** Spawns the binary detached and unref'd so it outlives the request. */
108
- const spawnDetached = (command, args) => {
109
- const child = (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
110
- child.on('error', () => {
111
- /* a failed launch must not crash the server */
112
- });
113
- child.unref();
118
+ /** Creates an empty {@link LaunchRegistry}. */
119
+ const createLaunchRegistry = () => new Set();
120
+ exports.createLaunchRegistry = createLaunchRegistry;
121
+ /** Fallback registry for callers that do not own one (tests pass their own). */
122
+ const defaultRegistry = (0, exports.createLaunchRegistry)();
123
+ /** Spawns the binary detached with no stdio so it can outlive the request. */
124
+ const spawnDetached = (command, args) => (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
125
+ /** Resolves once the child reports `spawn`; rejects on a launch `error`. */
126
+ const awaitSpawn = (child) => new Promise((resolve, reject) => {
127
+ child.once('spawn', () => resolve());
128
+ child.once('error', (err) => reject(err));
129
+ });
130
+ const LAUNCH_FAILED = {
131
+ status: 500,
132
+ body: { ok: false, error: 'Failed to launch self-review.' },
114
133
  };
115
134
  /**
116
135
  * Resolves a client-supplied plan path to an absolute path, requiring it to be
@@ -120,40 +139,56 @@ const spawnDetached = (command, args) => {
120
139
  * `root` is the absolute `.ai/strikethroo` directory; client paths are the
121
140
  * workspace-relative form the SPA shows (e.g. `.ai/strikethroo/plans/NN--s/…`),
122
141
  * so they are resolved against the project root (`root/../..`). Absolute client
123
- * paths are accepted too — the containment check is what enforces safety.
142
+ * paths are accepted too — the containment check is what enforces safety: the
143
+ * lexical check below picks the subtree, and the shared helper walks the real
144
+ * components so a symlinked plan file or directory is refused rather than
145
+ * followed out of the workspace.
124
146
  */
125
147
  const resolveReviewPath = (root, clientPath) => {
126
148
  if (typeof clientPath !== 'string' || clientPath.trim() === '') {
127
149
  return { error: 'A plan path is required.', status: 400 };
128
150
  }
129
- const projectRoot = path.resolve(root, '..', '..');
151
+ const absRoot = path.resolve(root);
152
+ const projectRoot = path.resolve(absRoot, '..', '..');
130
153
  const resolved = path.resolve(projectRoot, clientPath);
131
- const plansDir = path.join(root, 'plans');
132
- const archiveDir = path.join(root, 'archive');
133
- const within = (dir) => resolved === dir || resolved.startsWith(dir + path.sep);
134
- if (!within(plansDir) && !within(archiveDir)) {
135
- return {
136
- error: 'Plan path must be inside the workspace plans/ or archive/ directory.',
137
- status: 400,
138
- };
154
+ const rel = path.relative(absRoot, resolved);
155
+ const first = rel.split(path.sep)[0];
156
+ const outside = {
157
+ error: 'Plan path must be inside the workspace plans/ or archive/ directory.',
158
+ status: 400,
159
+ };
160
+ if (path.isAbsolute(rel) || first === '..' || (first !== 'plans' && first !== 'archive')) {
161
+ return outside;
139
162
  }
140
- try {
141
- if (!fs.statSync(resolved).isFile()) {
142
- return { error: 'Plan path does not point to a file.', status: 404 };
163
+ const contained = (0, safe_fs_1.resolveContained)(absRoot, rel);
164
+ if ('error' in contained) {
165
+ switch (contained.error) {
166
+ case 'not-found':
167
+ return { error: 'Plan file not found.', status: 404 };
168
+ case 'not-a-file':
169
+ case 'not-a-directory':
170
+ return { error: 'Plan path does not point to a file.', status: 404 };
171
+ case 'fs-error':
172
+ return { error: 'Plan path could not be inspected.', status: 500 };
173
+ default:
174
+ // invalid-path, outside-root, symlink: the path does not denote a plain
175
+ // file inside the workspace.
176
+ return outside;
143
177
  }
144
178
  }
145
- catch {
146
- return { error: 'Plan file not found.', status: 404 };
147
- }
148
179
  return { absPath: resolved };
149
180
  };
150
181
  exports.resolveReviewPath = resolveReviewPath;
151
182
  /**
152
- * Validates `clientPath` and, if the binary is available, launches
153
- * `self-review <absolutePath>` detached. Pure of HTTP concerns: returns the
154
- * status/body the endpoint should send so it stays unit-testable.
183
+ * Validates `clientPath` and, if the binary is available and a slot is free,
184
+ * launches `self-review <absolutePath>` detached. Resolves `200` only after the
185
+ * child's `spawn` event; a launch `error` (e.g. `ENOENT`) is a fixed `500`. The
186
+ * plan's slot is taken synchronously before the spawn, so two simultaneous
187
+ * requests for one plan cannot both launch, and is released — idempotently —
188
+ * when the child exits, errors, or fails to launch. Pure of HTTP concerns:
189
+ * returns the status/body the endpoint should send so it stays unit-testable.
155
190
  */
156
- const launchSelfReview = (root, clientPath, deps = {}) => {
191
+ const launchSelfReview = async (root, clientPath, deps = {}) => {
157
192
  const available = deps.available ?? exports.isSelfReviewAvailable;
158
193
  if (!available()) {
159
194
  return {
@@ -165,15 +200,40 @@ const launchSelfReview = (root, clientPath, deps = {}) => {
165
200
  if ('error' in resolved) {
166
201
  return { status: resolved.status, body: { ok: false, error: resolved.error } };
167
202
  }
168
- try {
169
- (deps.spawnDetached ?? spawnDetached)(exports.SELF_REVIEW_BINARY, [resolved.absPath]);
203
+ const registry = deps.registry ?? defaultRegistry;
204
+ const key = resolved.absPath;
205
+ if (registry.has(key)) {
206
+ return {
207
+ status: 409,
208
+ body: { ok: false, error: 'A self-review is already running for this plan.' },
209
+ };
170
210
  }
171
- catch (err) {
211
+ if (registry.size >= exports.MAX_CONCURRENT_SELF_REVIEWS) {
172
212
  return {
173
- status: 500,
174
- body: { ok: false, error: `Failed to launch self-review: ${err.message}` },
213
+ status: 429,
214
+ body: {
215
+ ok: false,
216
+ error: `Too many self-reviews are running (limit ${exports.MAX_CONCURRENT_SELF_REVIEWS}). Try again when one finishes.`,
217
+ },
218
+ headers: { 'Retry-After': String(BUSY_RETRY_AFTER_SECONDS) },
175
219
  };
176
220
  }
221
+ registry.add(key);
222
+ const release = () => {
223
+ registry.delete(key);
224
+ };
225
+ let child;
226
+ try {
227
+ child = (deps.spawn ?? spawnDetached)(exports.SELF_REVIEW_BINARY, [key]);
228
+ await awaitSpawn(child);
229
+ }
230
+ catch {
231
+ release();
232
+ return LAUNCH_FAILED;
233
+ }
234
+ child.once('exit', release);
235
+ child.once('error', release);
236
+ child.unref();
177
237
  return { status: 200, body: { ok: true } };
178
238
  };
179
239
  exports.launchSelfReview = launchSelfReview;
@@ -1 +1 @@
1
- {"version":3,"file":"self-review.js","sourceRoot":"","sources":["../../src/serve/self-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-review.js","sourceRoot":"","sources":["../../src/serve/self-review.ts"],"names":[],"mappings":"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"}
@@ -13,13 +13,32 @@
13
13
  * external self-review binary for a validated in-workspace plan path;
14
14
  * - platform-aware browser auto-open on startup.
15
15
  *
16
+ * The server binds loopback unless the caller passes another IP address in
17
+ * `host`, and every request — static, API, and the `apiHandlers` extension
18
+ * point — passes through {@link guardRequest} (Host authority, request-target
19
+ * parsing) and a single
20
+ * exception boundary before any route runs. Routes are matched by path first
21
+ * and method second, so a wrong method answers `405` and a mutation path never
22
+ * reaches a read handler. Body-bearing mutations require `application/json`.
23
+ *
24
+ * Mutations are additionally gated on a per-start capability: a random token
25
+ * minted in {@link startServer}, handed out only by `GET /api/session` to a
26
+ * same-origin request, and required in {@link CAPABILITY_HEADER}. Together with
27
+ * the Origin/fetch-metadata check this closes CSRF and DNS-rebinding paths from
28
+ * a browser. It is a browser/request safeguard only: it does not isolate the
29
+ * server from another local process that can already read the user's files
30
+ * (and so the token). No cookies, no accounts, no CORS — the token lives in
31
+ * the page's memory and is never persisted, logged, or placed in a URL.
32
+ *
16
33
  * The SSE change stream (`GET /api/events`) is added by a separate module that
17
34
  * hooks into the `apiHandlers` extension point below, so this module stays free
18
35
  * of file-watching concerns. Node built-ins only — no runtime dependency, no
19
36
  * Vite/React/Tailwind imports.
20
37
  */
21
38
  import * as http from 'http';
39
+ import * as os from 'os';
22
40
  import { EventsHub } from './events';
41
+ import { LaunchDeps } from './self-review';
23
42
  /** Options for {@link startServer}. */
24
43
  export interface ServeOptions {
25
44
  /** Absolute path of the `.ai/strikethroo` workspace directory to serve. */
@@ -41,6 +60,17 @@ export interface ServeOptions {
41
60
  * module's default; exposed mainly so tests can tighten it.
42
61
  */
43
62
  debounceMs?: number;
63
+ /**
64
+ * IP address to bind. Defaults to `127.0.0.1`, falling back to `::1` when the
65
+ * platform has no IPv4 loopback. A non-loopback address exposes the viewer to
66
+ * every peer that can reach it; see {@link ServeHandle.exposed}.
67
+ */
68
+ host?: string;
69
+ /**
70
+ * Seams for the self-review launcher (availability probe and spawn).
71
+ * Test-only: lets a suite prove a rejected request launched nothing.
72
+ */
73
+ selfReviewDeps?: LaunchDeps;
44
74
  }
45
75
  /** A pluggable `/api/*` handler. Returns `true` if it handled the request. */
46
76
  export type ApiHandler = (req: http.IncomingMessage, res: http.ServerResponse, ctx: {
@@ -52,9 +82,25 @@ export interface ServeHandle {
52
82
  url: string;
53
83
  server: http.Server;
54
84
  port: number;
85
+ /**
86
+ * True when the bound address is not loopback. The capability guards against
87
+ * other web origins, not network peers: any peer that reaches the port can
88
+ * bootstrap it, so the caller must warn.
89
+ */
90
+ exposed: boolean;
91
+ /** URLs a browser can use, one per accepted IP authority. */
92
+ reachableUrls: string[];
55
93
  /** The SSE change-stream hub backing `GET /api/events`. */
56
94
  events: EventsHub;
95
+ /**
96
+ * This instance's mutation capability. Test-only: production callers (the
97
+ * CLI) must never print, log, or persist it; the SPA obtains it from
98
+ * `GET /api/session`.
99
+ */
100
+ capability?: string;
57
101
  }
102
+ /** Request header carrying the mutation capability. */
103
+ export declare const CAPABILITY_HEADER = "X-Strikethroo-Capability";
58
104
  /**
59
105
  * Resolves the default prebuilt SPA assets directory relative to the installed
60
106
  * package. The compiled server lives at `<pkg>/dist/serve/server.js`, so the
@@ -62,6 +108,67 @@ export interface ServeHandle {
62
108
  * Plan 94 finalizes the shipped asset path; this is the local-dev default.
63
109
  */
64
110
  export declare const defaultAssetsDir: () => string;
111
+ /** What the request handler knows about the running server; fixed after `listen`. */
112
+ export interface GuardContext {
113
+ /** Lower-case `host[:port]` authorities this server answers for. */
114
+ allowedHosts: ReadonlySet<string>;
115
+ /** The per-start mutation capability (see the module comment). */
116
+ capability: string;
117
+ }
118
+ /**
119
+ * Outcome of {@link guardRequest} and the per-route guards: the parsed path to
120
+ * route, or a complete rejection the caller writes verbatim.
121
+ */
122
+ export type GuardResult = {
123
+ ok: true;
124
+ pathname: string;
125
+ } | {
126
+ ok: false;
127
+ status: number;
128
+ body: unknown;
129
+ headers?: Record<string, string>;
130
+ };
131
+ /**
132
+ * Runs before routing, for every request. Refuses any `Host` that is not one
133
+ * of the server's own loopback authorities (DNS-rebinding defense), then parses
134
+ * the request target: origin-form (`/path`) or absolute-form naming an allowed
135
+ * authority; anything else, including a target whose path does not
136
+ * percent-decode, is a `400`. The returned `pathname` is the only thing routing
137
+ * consumes.
138
+ */
139
+ export declare const guardRequest: (req: http.IncomingMessage, ctx: GuardContext) => GuardResult;
140
+ /**
141
+ * The Content Security Policy for the SPA, sent on every static response (the
142
+ * HTML document and its assets; a non-HTML asset ignores it, which is harmless).
143
+ * Everything the page loads is self-hosted from `dist-web/`, so the baseline is
144
+ * `'self'`. The exceptions, and why:
145
+ *
146
+ * - `style-src 'unsafe-inline'`: CodeMirror 6 injects its `<style>` elements at
147
+ * runtime and Mermaid's rendered SVG embeds a `<style>` block, neither of
148
+ * which can be hashed ahead of time. Scripts have no such exception: the
149
+ * pre-paint theme guard is the self-hosted `/theme-guard.js`, not an inline
150
+ * block, so `script-src` stays `'self'` with no hash and no `unsafe-eval`.
151
+ * - `img-src data:`: the markdown sanitizer admits bounded `data:image/*`
152
+ * images; remote image sources are already stripped there.
153
+ * - `connect-src 'self'`: the `/api/*` fetches and the `/api/events`
154
+ * EventSource are same-origin.
155
+ * - `object-src`, `base-uri`, `form-action`: `'none'` — the page embeds no
156
+ * plugins, sets no base URL, and submits no forms (the sanitizer removes
157
+ * authored `<form>`s; this makes a surviving one unable to post anywhere).
158
+ * - `frame-ancestors 'none'`: the viewer is never embedded. This directive only
159
+ * works in the header form, which is why the policy is a header and not a
160
+ * `<meta http-equiv>`.
161
+ */
162
+ export declare const CONTENT_SECURITY_POLICY: string;
163
+ export declare const isLoopbackAddress: (address: string) => boolean;
164
+ /**
165
+ * IP addresses a browser may name in `Host` for a server bound to `bound`. A
166
+ * wildcard bind accepts the machine's interface addresses as read at startup
167
+ * (IPv4 only for `0.0.0.0`). Link-local IPv6 is skipped: a browser cannot put a
168
+ * zone id in `Host`. Only IP literals are accepted because they cannot be
169
+ * DNS-rebound; `localhost` is added by the caller.
170
+ */
171
+ export declare const hostAddressesFor: (bound: string, interfaces?: ReturnType<typeof os.networkInterfaces>) => string[];
65
172
  /**
66
173
  * Creates and starts the HTTP server, resolving with the bound URL once it is
67
174
  * listening. Rejects only on a genuine listen/bind error.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/serve/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAM7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,CACvB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,KACpC,OAAO,CAAC;AAEb,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,SAAS,CAAC;CACnB;AA0CD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAO,MAAyD,CAAC;AA0U9F;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,YAAY,KAAG,OAAO,CAAC,WAAW,CAgDnE,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/serve/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAIzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAIL,UAAU,EACX,MAAM,eAAe,CAAC;AAIvB,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,CACvB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,KACpC,OAAO,CAAC;AAEb,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2DAA2D;IAC3D,MAAM,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AA0C5D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAO,MAAyD,CAAC;AAiC9F,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAYnF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,IAAI,CAAC,eAAe,EAAE,KAAK,YAAY,KAAG,WAsB3E,CAAC;AA4bF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,uBAAuB,QAG2B,CAAC;AAkGhE,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,KAAG,OAC0C,CAAC;AAE/F;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,EACb,aAAY,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAA0B,KAC3E,MAAM,EAYR,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,MAAM,YAAY,KAAG,OAAO,CAAC,WAAW,CAwHzE,CAAC"}