strikethroo 4.0.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.
- package/README.md +14 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -1
- package/dist/export-profile.d.ts +6 -0
- package/dist/export-profile.d.ts.map +1 -1
- package/dist/export-profile.js +46 -4
- package/dist/export-profile.js.map +1 -1
- package/dist/metadata.d.ts +11 -1
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +75 -11
- package/dist/metadata.js.map +1 -1
- package/dist/profiles.d.ts.map +1 -1
- package/dist/profiles.js +52 -7
- package/dist/profiles.js.map +1 -1
- package/dist/serve/config-write.d.ts +6 -3
- package/dist/serve/config-write.d.ts.map +1 -1
- package/dist/serve/config-write.js +20 -21
- package/dist/serve/config-write.js.map +1 -1
- package/dist/serve/events.d.ts +37 -8
- package/dist/serve/events.d.ts.map +1 -1
- package/dist/serve/events.js +114 -28
- package/dist/serve/events.js.map +1 -1
- package/dist/serve/self-review.d.ts +37 -7
- package/dist/serve/self-review.d.ts.map +1 -1
- package/dist/serve/self-review.js +93 -33
- package/dist/serve/self-review.js.map +1 -1
- package/dist/serve/server.d.ts +107 -0
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +502 -135
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/workspace-model.d.ts.map +1 -1
- package/dist/serve/workspace-model.js +36 -34
- package/dist/serve/workspace-model.js.map +1 -1
- package/dist/skill-scripts/shared/safe-fs.d.ts +89 -0
- package/dist/skill-scripts/shared/safe-fs.d.ts.map +1 -0
- package/dist/skill-scripts/shared/safe-fs.js +324 -0
- package/dist/skill-scripts/shared/safe-fs.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -1
- package/dist/types.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +15 -1
- package/dist/update.js.map +1 -1
- package/dist-web/assets/abnfDiagram-VCTEODGH-BCoAyQ8y.js +1 -0
- package/dist-web/assets/apl-gfMMiTNf.js +1 -0
- package/dist-web/assets/arc-Pry-7G1_.js +1 -0
- package/dist-web/assets/architecture-7GRP2DOG-C2Oj1AcH.js +1 -0
- package/dist-web/assets/architectureDiagram-5GKGNRK7-BbYvyste.js +36 -0
- package/dist-web/assets/array-BifhSqXX.js +1 -0
- package/dist-web/assets/asciiarmor-C_eisQCp.js +1 -0
- package/dist-web/assets/asn1-DCl_8MCW.js +1 -0
- package/dist-web/assets/asterisk-BEn0Cwpx.js +1 -0
- package/dist-web/assets/blockDiagram-I7D4REHJ-CGYIKoI0.js +129 -0
- package/dist-web/assets/brainfuck-D5EjA2JK.js +1 -0
- package/dist-web/assets/c4Diagram-7LVT6UL2-Cpat9Q1R.js +38 -0
- package/dist-web/assets/channel-Da0Eg5hZ.js +1 -0
- package/dist-web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist-web/assets/chunk-4HAMMTFA-D1PXshWJ.js +62 -0
- package/dist-web/assets/{chunk-FMBD7UC4-zW3dYoIJ.js → chunk-5VM5RSS4-ZNzvKenW.js} +2 -2
- package/dist-web/assets/chunk-75Z2AOVW-C19f30iG.js +2 -0
- package/dist-web/assets/chunk-DU6HZSFF-CV-KOPc1.js +125 -0
- package/dist-web/assets/chunk-F27PBJKO-DMfX40T1.js +1 -0
- package/dist-web/assets/chunk-FOHPRMQF-DzxwRta7.js +161 -0
- package/dist-web/assets/chunk-GMAD6QVW-Nd9kACgc.js +72 -0
- package/dist-web/assets/chunk-GVQU2GXP-3G8ojGFe.js +1 -0
- package/dist-web/assets/chunk-IMKFNOWR-CmhGyHNd.js +231 -0
- package/dist-web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist-web/assets/chunk-L3NEJ4N5-Dsa1ER8Q.js +1 -0
- package/dist-web/assets/chunk-OSK3NFVY-ObCj9P3B.js +10 -0
- package/dist-web/assets/chunk-P2QGCYS3-CfNHqVGX.js +1 -0
- package/dist-web/assets/chunk-POPQ4Y6H-Cg5tk8by.js +1 -0
- package/dist-web/assets/chunk-PWAF6VOD-e6XMS-JR.js +1 -0
- package/dist-web/assets/chunk-SHT3W25Y-B1M0HI76.js +168 -0
- package/dist-web/assets/chunk-SVP7TREG-XLNHY4Z2.js +88 -0
- package/dist-web/assets/chunk-TICWLB2K-Bpm0S7rI.js +206 -0
- package/dist-web/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist-web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist-web/assets/classDiagram-ZZMXUADV-CZI086hK.js +1 -0
- package/dist-web/assets/classDiagram-v2-VYDZK3BY-CZI086hK.js +1 -0
- package/dist-web/assets/clike-D_6L3tnO.js +1 -0
- package/dist-web/assets/clojure-BflJGmDX.js +1 -0
- package/dist-web/assets/cmake-84nbDH0I.js +1 -0
- package/dist-web/assets/cobol-DHLQUbN7.js +1 -0
- package/dist-web/assets/coffeescript-De_zI4J0.js +1 -0
- package/dist-web/assets/commonlisp-DgAKBe0r.js +1 -0
- package/dist-web/assets/cose-bilkent-JH36ORCC-BEpcWcmK.js +1 -0
- package/dist-web/assets/crystal-Bsdphhtm.js +1 -0
- package/dist-web/assets/css-CnaYoQib.js +1 -0
- package/dist-web/assets/cynefin-OW5HDTMX-B5ohibc7.js +1 -0
- package/dist-web/assets/cynefinDiagram-5FMLGOSQ-C1202n-x.js +62 -0
- package/dist-web/assets/cypher-p9eYesGn.js +1 -0
- package/dist-web/assets/cytoscape.esm-Yq6u8L66.js +321 -0
- package/dist-web/assets/d-DWkQyNnU.js +1 -0
- package/dist-web/assets/dagre-C-rnJpZF.js +1 -0
- package/dist-web/assets/dagre-GXQ25YYZ-CQlKKJXg.js +4 -0
- package/dist-web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist-web/assets/diagram-S7CK7UJ4-DRf7iTH9.js +30 -0
- package/dist-web/assets/diagram-UQ7AKVKN-CxSX3b2_.js +41 -0
- package/dist-web/assets/diagram-VSXAHHWV-D9vrB5je.js +3 -0
- package/dist-web/assets/diagram-VX7I27RA-DTOqcpBV.js +24 -0
- package/dist-web/assets/diagram-Z3DM3KII-mlhRA4lR.js +24 -0
- package/dist-web/assets/diff-ChtP43wD.js +1 -0
- package/dist-web/assets/dist-B-O4eZD_.js +1 -0
- package/dist-web/assets/dist-B27L6oW0.js +1 -0
- package/dist-web/assets/dist-BKXbBuAc.js +1 -0
- package/dist-web/assets/dist-BPcC0hnc.js +9 -0
- package/dist-web/assets/dist-BgwxV8e_.js +1 -0
- package/dist-web/assets/dist-BlG40nRw.js +1 -0
- package/dist-web/assets/dist-Bqc6e86z.js +1 -0
- package/dist-web/assets/dist-BsvASXHG.js +1 -0
- package/dist-web/assets/dist-C15GN054.js +1 -0
- package/dist-web/assets/dist-C4QRmcTO.js +1 -0
- package/dist-web/assets/dist-C4lZy0XG.js +6 -0
- package/dist-web/assets/dist-CFLbFzpB.js +23 -0
- package/dist-web/assets/dist-CP6AUVtv.js +1 -0
- package/dist-web/assets/dist-CpYnHHz6.js +1 -0
- package/dist-web/assets/dist-DHnGmK79.js +1 -0
- package/dist-web/assets/dist-DYmIHv0n.js +13 -0
- package/dist-web/assets/dist-DauRO0RO.js +1 -0
- package/dist-web/assets/dist-Day7i26p.js +1 -0
- package/dist-web/assets/dist-Do_t70vA.js +1 -0
- package/dist-web/assets/dist-DqTG_rhR.js +2 -0
- package/dist-web/assets/dist-G8nWWSie.js +11 -0
- package/dist-web/assets/dist-QfYLz_N1.js +1 -0
- package/dist-web/assets/dist-TZhb2tj2.js +1 -0
- package/dist-web/assets/dist-Wr2Wo_KE.js +1 -0
- package/dist-web/assets/dist-kYRo7Db1.js +1 -0
- package/dist-web/assets/dist-kfqV1Lu-.js +2 -0
- package/dist-web/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist-web/assets/dockerfile-DJkHQgkl.js +1 -0
- package/dist-web/assets/dtd-DTF72YNO.js +1 -0
- package/dist-web/assets/dylan-BCDoL_-p.js +1 -0
- package/dist-web/assets/ebnf-D4c0_ac3.js +1 -0
- package/dist-web/assets/ebnfDiagram-PWID7BFC-BhB_RJPM.js +1 -0
- package/dist-web/assets/ecl-BVIeWmwY.js +1 -0
- package/dist-web/assets/eiffel-BEjRio4Q.js +1 -0
- package/dist-web/assets/elm-Cshzl8qu.js +1 -0
- package/dist-web/assets/erDiagram-RLTQ6QDP-0wE1kPYz.js +99 -0
- package/dist-web/assets/erlang-BV0c4Hdn.js +1 -0
- package/dist-web/assets/esm-COEoxUhE.js +2 -0
- package/dist-web/assets/eventmodeling-NTZA5JFV-DzkXb9nA.js +1 -0
- package/dist-web/assets/factor-LKH5gN8L.js +1 -0
- package/dist-web/assets/fcl-ClOhbFR7.js +1 -0
- package/dist-web/assets/flowDiagram-HODETNUW-cgl8ipSt.js +1 -0
- package/dist-web/assets/forth-D6RzAl64.js +1 -0
- package/dist-web/assets/fortran-Bt6PBEDR.js +1 -0
- package/dist-web/assets/ganttDiagram-EL5Y4UJY-BsvlpHPt.js +292 -0
- package/dist-web/assets/gas-BHEdbvp9.js +1 -0
- package/dist-web/assets/gherkin-oBAE_ms0.js +1 -0
- package/dist-web/assets/gitGraph-4MIJSDKK-Dm82FCqy.js +1 -0
- package/dist-web/assets/gitGraphDiagram-WWUBYQGX-OPit_3vA.js +106 -0
- package/dist-web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist-web/assets/groovy-CUpZ7dEl.js +1 -0
- package/dist-web/assets/haskell-BRsoo5mP.js +1 -0
- package/dist-web/assets/haxe-DjVOVvNP.js +1 -0
- package/dist-web/assets/http-CLVgA2GD.js +1 -0
- package/dist-web/assets/idl-BUZw3wgd.js +1 -0
- package/dist-web/assets/index-6XzOqB6r.js +103 -0
- package/dist-web/assets/index-CgIHUWsX.css +2 -0
- package/dist-web/assets/info-A6RAGUB7-8sl1XQWq.js +1 -0
- package/dist-web/assets/infoDiagram-27XIBGKW-DIpdnB7L.js +2 -0
- package/dist-web/assets/init-C-OQMol4.js +1 -0
- package/dist-web/assets/ishikawaDiagram-5VMMS53U-DpoLDWpF.js +70 -0
- package/dist-web/assets/javascript-Bu8mWwtz.js +1 -0
- package/dist-web/assets/journeyDiagram-3NMN7TZE-BAEbJ33U.js +139 -0
- package/dist-web/assets/julia-CQfgDRfP.js +1 -0
- package/dist-web/assets/kanban-definition-UXKFOSKX-CqzyUA0g.js +89 -0
- package/dist-web/assets/katex-ZlcWpGUi.js +257 -0
- package/dist-web/assets/line-CQRHrtV_.js +1 -0
- package/dist-web/assets/linear-SzVmGSw4.js +1 -0
- package/dist-web/assets/livescript-BXxG0Yva.js +1 -0
- package/dist-web/assets/lua-DPCEkfD_.js +1 -0
- package/dist-web/assets/mathematica-u8YMmbU0.js +1 -0
- package/dist-web/assets/mbox-BEMVcqjs.js +1 -0
- package/dist-web/assets/mermaid-parser.core-XlEvAPi2.js +7 -0
- package/dist-web/assets/mermaid.core-CvFTFi5O.js +44 -0
- package/dist-web/assets/mindmap-definition-YA3MSWOX-Ch0vW4Mc.js +96 -0
- package/dist-web/assets/{mirc-CjQqDB4T.js → mirc-C9zpzAZU.js} +1 -1
- package/dist-web/assets/mllike-B45xgp2S.js +1 -0
- package/dist-web/assets/modelica-CqHI_q-D.js +1 -0
- package/dist-web/assets/mscgen-qgSLujhx.js +1 -0
- package/dist-web/assets/mumps-BSzj6Xyz.js +1 -0
- package/dist-web/assets/{nginx-DdIZxoE0.js → nginx-8H7HVH4w.js} +1 -1
- package/dist-web/assets/nsis-CfSuhXs5.js +1 -0
- package/dist-web/assets/ntriples-B9h1VB_g.js +1 -0
- package/dist-web/assets/octave-D2Q8cUp1.js +1 -0
- package/dist-web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist-web/assets/oz-BwTct_5T.js +1 -0
- package/dist-web/assets/packet-AYTQ26CC-lk-QU-qZ.js +1 -0
- package/dist-web/assets/pascal-Dp_KdFgX.js +1 -0
- package/dist-web/assets/path-fybaL0A-.js +1 -0
- package/dist-web/assets/pegDiagram-XKGWAZYB-Cgf4CYg-.js +1 -0
- package/dist-web/assets/perl-BkSkiI9m.js +1 -0
- package/dist-web/assets/pie-WAS4IAKB-dWyVjg9O.js +1 -0
- package/dist-web/assets/pieDiagram-E7YTZNPT-BDZxWO8n.js +39 -0
- package/dist-web/assets/pig-AF4Hwhju.js +1 -0
- package/dist-web/assets/powershell-BcIto6Sf.js +1 -0
- package/dist-web/assets/properties-C357ku5U.js +1 -0
- package/dist-web/assets/protobuf-D1ij_kNL.js +1 -0
- package/dist-web/assets/pug-3K-JMW4g.js +1 -0
- package/dist-web/assets/puppet-BZyAS7I4.js +1 -0
- package/dist-web/assets/python-B_1Jd8HM.js +1 -0
- package/dist-web/assets/q-B9NhS7L_.js +1 -0
- package/dist-web/assets/quadrantDiagram-AXDQQJYC-DCu9cx1_.js +7 -0
- package/dist-web/assets/r-CxDmU1I4.js +1 -0
- package/dist-web/assets/radar-RG4KPBEZ-CphwvESj.js +1 -0
- package/dist-web/assets/railroad-74A4TZTK-COTrvtXu.js +1 -0
- package/dist-web/assets/railroad-abnf-HS5TGJTU-CYfpugMj.js +1 -0
- package/dist-web/assets/railroad-ebnf-LZEXJU2U--Ui_4jm6.js +1 -0
- package/dist-web/assets/railroad-peg-WCYAUIDC-DzcveMan.js +1 -0
- package/dist-web/assets/railroadDiagram-O6MQD6OU-S9ZI1Adi.js +1 -0
- package/dist-web/assets/requirementDiagram-BXWQKSXE-a_3FElqS.js +84 -0
- package/dist-web/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist-web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist-web/assets/rpm-gpDK5sbt.js +1 -0
- package/dist-web/assets/ruby-BjXV7-Qa.js +1 -0
- package/dist-web/assets/sankeyDiagram-P5KCCOFB-D-i6r8wy.js +40 -0
- package/dist-web/assets/{sas-B4kiWyti.js → sas-C2OyD2Y6.js} +1 -1
- package/dist-web/assets/scheme-D9qYN0V5.js +1 -0
- package/dist-web/assets/sequenceDiagram-WJ2MYXX4-D8hA2m0U.js +162 -0
- package/dist-web/assets/shell-DwuoZtxw.js +1 -0
- package/dist-web/assets/sieve-tLWDfEkZ.js +1 -0
- package/dist-web/assets/simple-mode-DXiLM1-G.js +1 -0
- package/dist-web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist-web/assets/smalltalk-BLp5-jwC.js +1 -0
- package/dist-web/assets/solr-B78wSQJQ.js +1 -0
- package/dist-web/assets/sparql-Dz-mlCAC.js +1 -0
- package/dist-web/assets/spreadsheet-CTIncYxj.js +1 -0
- package/dist-web/assets/sql-DuQMFDvy.js +1 -0
- package/dist-web/assets/src-B6xuSHsQ.js +1 -0
- package/dist-web/assets/stateDiagram-D77RDMKH-C14W-8zT.js +1 -0
- package/dist-web/assets/stateDiagram-v2-MP3YSRHH-Dhuhsub3.js +1 -0
- package/dist-web/assets/stex-DNzd62Q_.js +1 -0
- package/dist-web/assets/stylus-BOVgKnng.js +1 -0
- package/dist-web/assets/swift-DKB6_1j6.js +1 -0
- package/dist-web/assets/swimlanes-42K2YHIH-FMv8YLkC.js +1 -0
- package/dist-web/assets/swimlanesDiagram-VR7AAH4N-O94a9jW3.js +8 -0
- package/dist-web/assets/tcl-BGfruO1u.js +1 -0
- package/dist-web/assets/textile-C4jVoHG1.js +1 -0
- package/dist-web/assets/tiddlywiki-VlUiK86J.js +1 -0
- package/dist-web/assets/tiki-AK6FwT8q.js +1 -0
- package/dist-web/assets/timeline-definition-24CTP7MA-DmBN45fY.js +120 -0
- package/dist-web/assets/toml-BPTmHmyx.js +1 -0
- package/dist-web/assets/treeView-Q6P3EWNA-C5-PUnPN.js +1 -0
- package/dist-web/assets/treemap-WGGIJYW6-C_veVYMi.js +1 -0
- package/dist-web/assets/troff-C2dAgh7P.js +1 -0
- package/dist-web/assets/ttcn-PPSTk1ow.js +1 -0
- package/dist-web/assets/ttcn-cfg-2b4Gb5sE.js +1 -0
- package/dist-web/assets/turtle-Cx3rYX2g.js +1 -0
- package/dist-web/assets/vb-BthdM_4N.js +1 -0
- package/dist-web/assets/vbscript-D9f6rSsU.js +1 -0
- package/dist-web/assets/velocity-CqftRsjg.js +1 -0
- package/dist-web/assets/vennDiagram-4TSXK5OY-CiWHjSVc.js +34 -0
- package/dist-web/assets/verilog-CjI9Y6RI.js +1 -0
- package/dist-web/assets/vhdl-kS471soi.js +1 -0
- package/dist-web/assets/wardley-WFR3VGLG-FOCO1NlU.js +1 -0
- package/dist-web/assets/wardleyDiagram-VM6X3IG4-Da3kkvxV.js +78 -0
- package/dist-web/assets/webidl-D5jiJvOU.js +1 -0
- package/dist-web/assets/xquery-BKJx4mf9.js +1 -0
- package/dist-web/assets/xychartDiagram-S5SC5T6Z-DPxie1fH.js +7 -0
- package/dist-web/assets/yacas-CXXgtw0p.js +1 -0
- package/dist-web/assets/z80-Co3PbHdE.js +1 -0
- package/dist-web/index.html +6 -18
- package/dist-web/theme-guard.js +21 -0
- package/package.json +29 -24
- package/templates/strikethroo/config/config.yaml +2 -2
- package/dist-web/assets/apl-B4CMkyY2.js +0 -1
- package/dist-web/assets/arc-DA6tr0lU.js +0 -1
- package/dist-web/assets/architectureDiagram-3BPJPVTR-BEH2YihV.js +0 -36
- package/dist-web/assets/asciiarmor-Df11BRmG.js +0 -1
- package/dist-web/assets/asn1-EdZsLKOL.js +0 -1
- package/dist-web/assets/asterisk-B-8jnY81.js +0 -1
- package/dist-web/assets/blockDiagram-GPEHLZMM-jgUyFGxx.js +0 -132
- package/dist-web/assets/brainfuck-C4LP7Hcl.js +0 -1
- package/dist-web/assets/c4Diagram-AAUBKEIU-Do-n7I5O.js +0 -10
- package/dist-web/assets/channel-DJ33z8Wx.js +0 -1
- package/dist-web/assets/chunk-2J33WTMH-CgMvCn22.js +0 -1
- package/dist-web/assets/chunk-4BX2VUAB-FO8RQkkL.js +0 -1
- package/dist-web/assets/chunk-55IACEB6-DL_6pZjw.js +0 -1
- package/dist-web/assets/chunk-727SXJPM-DW7J3hiD.js +0 -206
- package/dist-web/assets/chunk-AQP2D5EJ-TPWnvFSC.js +0 -231
- package/dist-web/assets/chunk-ND2GUHAM-D0Nmkz3P.js +0 -1
- package/dist-web/assets/chunk-QZHKN3VN-BxgxRNWB.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK--tqQjy0s.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2--tqQjy0s.js +0 -1
- package/dist-web/assets/clike-B9uivgTg.js +0 -1
- package/dist-web/assets/clojure-BMjYHr_A.js +0 -1
- package/dist-web/assets/cmake-BQqOBYOt.js +0 -1
- package/dist-web/assets/cobol-CWcv1MsR.js +0 -1
- package/dist-web/assets/coffeescript-S37ZYGWr.js +0 -1
- package/dist-web/assets/commonlisp-DBKNyK5s.js +0 -1
- package/dist-web/assets/cose-bilkent-S5V4N54A-ysHXC5GT.js +0 -1
- package/dist-web/assets/crystal-SjHAIU92.js +0 -1
- package/dist-web/assets/css-BnMrqG3P.js +0 -1
- package/dist-web/assets/cypher-C_CwsFkJ.js +0 -1
- package/dist-web/assets/cytoscape.esm-BHYC38rz.js +0 -331
- package/dist-web/assets/d-pRatUO7H.js +0 -1
- package/dist-web/assets/dagre-BM42HDAG-G_XIk8Dj.js +0 -4
- package/dist-web/assets/defaultLocale-CrowFXzY.js +0 -1
- package/dist-web/assets/diagram-2AECGRRQ-7HG2PLhr.js +0 -43
- package/dist-web/assets/diagram-5GNKFQAL-BdS1bF_R.js +0 -10
- package/dist-web/assets/diagram-KO2AKTUF-AFaiXGZQ.js +0 -3
- package/dist-web/assets/diagram-LMA3HP47-CTWrauj7.js +0 -24
- package/dist-web/assets/diagram-OG6HWLK6-BmBckGLa.js +0 -24
- package/dist-web/assets/diff-DbItnlRl.js +0 -1
- package/dist-web/assets/dockerfile-BKs6k2Af.js +0 -1
- package/dist-web/assets/dtd-DF_7sFjM.js +0 -1
- package/dist-web/assets/dylan-DwRh75JA.js +0 -1
- package/dist-web/assets/ebnf-CDyGwa7X.js +0 -1
- package/dist-web/assets/ecl-Cabwm37j.js +0 -1
- package/dist-web/assets/eiffel-CnydiIhH.js +0 -1
- package/dist-web/assets/elm-vLlmbW-K.js +0 -1
- package/dist-web/assets/erDiagram-TEJ5UH35-C0B2cXE-.js +0 -85
- package/dist-web/assets/erlang-BNw1qcRV.js +0 -1
- package/dist-web/assets/factor-kuTfRLto.js +0 -1
- package/dist-web/assets/fcl-Kvtd6kyn.js +0 -1
- package/dist-web/assets/flowDiagram-I6XJVG4X-CZ70tn_Q.js +0 -162
- package/dist-web/assets/forth-Ffai-XNe.js +0 -1
- package/dist-web/assets/fortran-DYz_wnZ1.js +0 -1
- package/dist-web/assets/ganttDiagram-6RSMTGT7-h7O-Xh-D.js +0 -292
- package/dist-web/assets/gas-Bneqetm1.js +0 -1
- package/dist-web/assets/gherkin-heZmZLOM.js +0 -1
- package/dist-web/assets/gitGraphDiagram-PVQCEYII-BDZixURw.js +0 -106
- package/dist-web/assets/graph-Dqkl27Ch.js +0 -1
- package/dist-web/assets/groovy-D9Dt4D0W.js +0 -1
- package/dist-web/assets/haskell-BWDZoCOh.js +0 -1
- package/dist-web/assets/haxe-H-WmDvRZ.js +0 -1
- package/dist-web/assets/http-DBlCnlav.js +0 -1
- package/dist-web/assets/idl-BEugSyMb.js +0 -1
- package/dist-web/assets/index-B-KlYMEI.js +0 -1
- package/dist-web/assets/index-B0a4C4Lb.js +0 -1
- package/dist-web/assets/index-B90tvIxG.js +0 -3
- package/dist-web/assets/index-BLXIwDvb.js +0 -1
- package/dist-web/assets/index-BjZYUODU.js +0 -1
- package/dist-web/assets/index-BmsczLPZ.js +0 -1
- package/dist-web/assets/index-BpU7RpGz.js +0 -1
- package/dist-web/assets/index-BwFIiA6J.js +0 -2
- package/dist-web/assets/index-C53NKwQ5.js +0 -1
- package/dist-web/assets/index-C73riuQN.js +0 -1
- package/dist-web/assets/index-C9RcHSPW.js +0 -1
- package/dist-web/assets/index-CEBV-m_B.js +0 -1
- package/dist-web/assets/index-CG1O2Vjg.js +0 -1
- package/dist-web/assets/index-CRL66wiY.js +0 -169
- package/dist-web/assets/index-CddJufqj.js +0 -1
- package/dist-web/assets/index-CrzBaw1K.css +0 -1
- package/dist-web/assets/index-CuBsNWzH.js +0 -13
- package/dist-web/assets/index-CuCAyRTw.js +0 -7
- package/dist-web/assets/index-CuUh3dvS.js +0 -1
- package/dist-web/assets/index-CwPWc9jQ.js +0 -1
- package/dist-web/assets/index-DHBbud_j.js +0 -1
- package/dist-web/assets/index-LLaxWDbg.js +0 -1
- package/dist-web/assets/index-XOpAvr0E.js +0 -13
- package/dist-web/assets/index-aX67gnlS.js +0 -2
- package/dist-web/assets/index-lkaAPBmM.js +0 -6
- package/dist-web/assets/index-pUkuW0EP.js +0 -1
- package/dist-web/assets/index-sbfqG9cy.js +0 -1
- package/dist-web/assets/index-udFbjSlZ.js +0 -2
- package/dist-web/assets/index-yjEPVwyN.js +0 -1
- package/dist-web/assets/infoDiagram-5YYISTIA-CKXHxMh_.js +0 -2
- package/dist-web/assets/init-Gi6I4Gst.js +0 -1
- package/dist-web/assets/ishikawaDiagram-YF4QCWOH-DGancylI.js +0 -70
- package/dist-web/assets/javascript-qCveANmP.js +0 -1
- package/dist-web/assets/journeyDiagram-JHISSGLW-DifvKy-w.js +0 -139
- package/dist-web/assets/julia-DuME0IfC.js +0 -1
- package/dist-web/assets/kanban-definition-UN3LZRKU-ByC-4YyY.js +0 -89
- package/dist-web/assets/katex-C5jXJg4s.js +0 -257
- package/dist-web/assets/layout-DO9UvE1P.js +0 -1
- package/dist-web/assets/linear-Cm0Y2OWD.js +0 -1
- package/dist-web/assets/livescript-BwQOo05w.js +0 -1
- package/dist-web/assets/lua-VAEuO923.js +0 -1
- package/dist-web/assets/mathematica-DTrFuWx2.js +0 -1
- package/dist-web/assets/mbox-CNhZ1qSd.js +0 -1
- package/dist-web/assets/mermaid.core-DBlLt9sa.js +0 -307
- package/dist-web/assets/mindmap-definition-RKZ34NQL-tkThiQWd.js +0 -96
- package/dist-web/assets/mllike-CXdrOF99.js +0 -1
- package/dist-web/assets/modelica-Dc1JOy9r.js +0 -1
- package/dist-web/assets/mscgen-BA5vi2Kp.js +0 -1
- package/dist-web/assets/mumps-BT43cFF4.js +0 -1
- package/dist-web/assets/nsis-LdVXkNf5.js +0 -1
- package/dist-web/assets/ntriples-BfvgReVJ.js +0 -1
- package/dist-web/assets/octave-Ck1zUtKM.js +0 -1
- package/dist-web/assets/ordinal-Cboi1Yqb.js +0 -1
- package/dist-web/assets/oz-BzwKVEFT.js +0 -1
- package/dist-web/assets/pascal--L3eBynH.js +0 -1
- package/dist-web/assets/perl-CdXCOZ3F.js +0 -1
- package/dist-web/assets/pieDiagram-4H26LBE5-BXGBVjcj.js +0 -30
- package/dist-web/assets/pig-CevX1Tat.js +0 -1
- package/dist-web/assets/powershell-CFHJl5sT.js +0 -1
- package/dist-web/assets/properties-C78fOPTZ.js +0 -1
- package/dist-web/assets/protobuf-ChK-085T.js +0 -1
- package/dist-web/assets/pug-DukmZTjD.js +0 -1
- package/dist-web/assets/puppet-DMA9R1ak.js +0 -1
- package/dist-web/assets/python-BuPzkPfP.js +0 -1
- package/dist-web/assets/q-pXgVlZs6.js +0 -1
- package/dist-web/assets/quadrantDiagram-W4KKPZXB-DnF0iEBo.js +0 -7
- package/dist-web/assets/r-DUYO_cvP.js +0 -1
- package/dist-web/assets/requirementDiagram-4Y6WPE33-BooGjmPb.js +0 -84
- package/dist-web/assets/rpm-CTu-6PCP.js +0 -1
- package/dist-web/assets/ruby-B2Rjki9n.js +0 -1
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-7le5uaC7.js +0 -40
- package/dist-web/assets/scheme-C41bIUwD.js +0 -1
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-B9GCKMDd.js +0 -162
- package/dist-web/assets/shell-CjFT_Tl9.js +0 -1
- package/dist-web/assets/sieve-C3Gn_uJK.js +0 -1
- package/dist-web/assets/simple-mode-GW_nhZxv.js +0 -1
- package/dist-web/assets/smalltalk-CnHTOXQT.js +0 -1
- package/dist-web/assets/solr-DehyRSwq.js +0 -1
- package/dist-web/assets/sparql-DkYu6x3z.js +0 -1
- package/dist-web/assets/spreadsheet-BCZA_wO0.js +0 -1
- package/dist-web/assets/sql-D0XecflT.js +0 -1
- package/dist-web/assets/stateDiagram-AJRCARHV-CO2qL8R6.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-DUkgqBTd.js +0 -1
- package/dist-web/assets/stex-C3f8Ysf7.js +0 -1
- package/dist-web/assets/stylus-B533Al4x.js +0 -1
- package/dist-web/assets/swift-BzpIVaGY.js +0 -1
- package/dist-web/assets/tcl-DVfN8rqt.js +0 -1
- package/dist-web/assets/textile-CnDTJFAw.js +0 -1
- package/dist-web/assets/tiddlywiki-DO-Gjzrf.js +0 -1
- package/dist-web/assets/tiki-DGYXhP31.js +0 -1
- package/dist-web/assets/timeline-definition-PNZ67QCA-FLzWM85F.js +0 -120
- package/dist-web/assets/toml-Bm5Em-hy.js +0 -1
- package/dist-web/assets/troff-wAsdV37c.js +0 -1
- package/dist-web/assets/ttcn-CfJYG6tj.js +0 -1
- package/dist-web/assets/ttcn-cfg-B9xdYoR4.js +0 -1
- package/dist-web/assets/turtle-B1tBg_DP.js +0 -1
- package/dist-web/assets/vb-CmGdzxic.js +0 -1
- package/dist-web/assets/vbscript-BuJXcnF6.js +0 -1
- package/dist-web/assets/velocity-D8B20fx6.js +0 -1
- package/dist-web/assets/vennDiagram-CIIHVFJN-Dt6p6Ib1.js +0 -34
- package/dist-web/assets/verilog-C6RDOZhf.js +0 -1
- package/dist-web/assets/vhdl-lSbBsy5d.js +0 -1
- package/dist-web/assets/wardley-L42UT6IY-D6k_B5It.js +0 -173
- package/dist-web/assets/wardleyDiagram-YWT4CUSO-jT3ItNLi.js +0 -78
- package/dist-web/assets/webidl-ZXfAyPTL.js +0 -1
- package/dist-web/assets/xquery-CQfU5ijd.js +0 -1
- package/dist-web/assets/xychartDiagram-2RQKCTM6-CpM6UhUO.js +0 -7
- package/dist-web/assets/yacas-BJ4BC0dw.js +0 -1
- 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
|
-
/**
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
|
151
|
+
const absRoot = path.resolve(root);
|
|
152
|
+
const projectRoot = path.resolve(absRoot, '..', '..');
|
|
130
153
|
const resolved = path.resolve(projectRoot, clientPath);
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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,
|
|
153
|
-
* `self-review <absolutePath>` detached.
|
|
154
|
-
*
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
211
|
+
if (registry.size >= exports.MAX_CONCURRENT_SELF_REVIEWS) {
|
|
172
212
|
return {
|
|
173
|
-
status:
|
|
174
|
-
body: {
|
|
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":";AAAA
|
|
1
|
+
{"version":3,"file":"self-review.js","sourceRoot":"","sources":["../../src/serve/self-review.ts"],"names":[],"mappings":"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"}
|
package/dist/serve/server.d.ts
CHANGED
|
@@ -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
|
|
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"}
|