@poe-platform/safe-bash 0.1.803 → 0.1.804

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 (696) hide show
  1. package/README.md +56 -31
  2. package/dist/image-ast/ast.d.ts +1 -0
  3. package/dist/image-ast/browser/ast.d.ts +1 -0
  4. package/dist/image-ast/browser/codecs/jpeg.d.ts +2 -2
  5. package/dist/image-ast/codecs/jpeg.d.ts +2 -2
  6. package/dist/image-ast/index.browser.js +692 -8364
  7. package/dist/image-ast/index.js +692 -8364
  8. package/dist/mp4-ast/codecs.d.ts +7 -2
  9. package/dist/safe-bash/chunks/{chunk-CHYGPFVM.js → chunk-22SX3F2R.js} +1 -1
  10. package/dist/safe-bash/chunks/{chunk-FBUCWVTE.js → chunk-2IVBJTBD.js} +1 -1
  11. package/dist/safe-bash/chunks/chunk-2POETUMB.js +190 -0
  12. package/dist/safe-bash/chunks/{chunk-XVOSKJE2.js → chunk-47D7WBJK.js} +1 -1
  13. package/dist/safe-bash/chunks/{chunk-VKNVHEX3.js → chunk-4ESI236Y.js} +1 -1
  14. package/dist/safe-bash/chunks/{chunk-74GHTNJA.js → chunk-4KTMKD5W.js} +1 -1
  15. package/dist/safe-bash/chunks/{chunk-55YJASTN.js → chunk-4T53AERN.js} +1 -1
  16. package/dist/safe-bash/chunks/{chunk-DQP3VHSB.js → chunk-5XIFJVOO.js} +1 -1
  17. package/dist/safe-bash/chunks/{chunk-5OHX7C2V.js → chunk-62BOHHJT.js} +1 -1
  18. package/dist/safe-bash/chunks/{chunk-HZAMGT5I.js → chunk-67WIFM3N.js} +17 -6
  19. package/dist/safe-bash/chunks/{chunk-4D4N7IU2.js → chunk-6LNFRPW5.js} +2 -2
  20. package/dist/safe-bash/chunks/{chunk-6O77NL2S.js → chunk-6SMICPI3.js} +1 -1
  21. package/dist/safe-bash/chunks/{chunk-4BSJLKNM.js → chunk-7O76UFQD.js} +1 -1
  22. package/dist/safe-bash/chunks/{chunk-PNBBUWSM.js → chunk-AW5KIT6V.js} +3488 -39
  23. package/dist/safe-bash/chunks/{chunk-JMMEIDPF.js → chunk-B2Z73HTZ.js} +52 -28
  24. package/dist/safe-bash/chunks/chunk-B3ZMOJVM.js +319 -0
  25. package/dist/safe-bash/chunks/{chunk-7ZBU7KYV.js → chunk-CFAWS3O4.js} +1 -1
  26. package/dist/safe-bash/chunks/{chunk-I5HZ4FGE.js → chunk-CL2FCTTO.js} +1 -1
  27. package/dist/safe-bash/chunks/{chunk-2LSAMQER.js → chunk-CTXNARJH.js} +1 -1
  28. package/dist/safe-bash/chunks/{chunk-TFIBK2GI.js → chunk-D5Q7NFWI.js} +1 -1
  29. package/dist/safe-bash/chunks/{chunk-OQRVVGR6.js → chunk-DSOOVZ6Q.js} +1 -1
  30. package/dist/safe-bash/chunks/{chunk-VTH3MLDU.js → chunk-DUTAG6ZD.js} +1 -1
  31. package/dist/safe-bash/chunks/{chunk-XAQMU6OY.js → chunk-EE5YGFIZ.js} +1 -1
  32. package/dist/safe-bash/chunks/{chunk-FZE4HW6G.js → chunk-EJOYT2ME.js} +1 -1
  33. package/dist/safe-bash/chunks/chunk-FAAIR6EJ.js +887 -0
  34. package/dist/safe-bash/chunks/{chunk-OV6IHKO6.js → chunk-FOB2FZR4.js} +2 -2
  35. package/dist/safe-bash/chunks/chunk-G6V4RRSQ.js +14 -0
  36. package/dist/safe-bash/chunks/{chunk-UTBUUFDM.js → chunk-GGQAGQXQ.js} +1 -1
  37. package/dist/safe-bash/chunks/{chunk-K6VCD7IY.js → chunk-HIIYIJ5G.js} +2 -4
  38. package/dist/safe-bash/chunks/{chunk-VBTDHOWC.js → chunk-IOHH2GTI.js} +4 -3
  39. package/dist/safe-bash/chunks/{chunk-CTVWDACF.js → chunk-IQW34XQT.js} +1 -1
  40. package/dist/safe-bash/chunks/{chunk-HZ7BWKQ3.js → chunk-IS572AAT.js} +1 -1
  41. package/dist/safe-bash/chunks/{chunk-AUSNDQTJ.js → chunk-JPSUHHOA.js} +1 -1
  42. package/dist/safe-bash/chunks/{chunk-ZVD5IS4V.js → chunk-KBZ4UB2O.js} +2 -2
  43. package/dist/safe-bash/chunks/{chunk-AM5ESLPH.js → chunk-KU5CVWKA.js} +1 -1
  44. package/dist/safe-bash/chunks/{chunk-RYFQ3LZG.js → chunk-LPOVNKNB.js} +173 -153
  45. package/dist/safe-bash/chunks/{chunk-46Z5E5EV.js → chunk-MBOC3LZ4.js} +1 -1
  46. package/dist/safe-bash/chunks/{chunk-6PAVEFT3.js → chunk-N4BQFD3P.js} +1 -1
  47. package/dist/safe-bash/chunks/{chunk-CS4MNM6I.js → chunk-NGKCVNWS.js} +1 -1
  48. package/dist/safe-bash/chunks/{chunk-7R5BDCG7.js → chunk-OHML2BEU.js} +1 -1
  49. package/dist/safe-bash/chunks/{chunk-C5OWC2TL.js → chunk-OQ3AGYCZ.js} +1 -1
  50. package/dist/safe-bash/chunks/{chunk-B7TAL7S5.js → chunk-PTAEWLSE.js} +0 -2
  51. package/dist/safe-bash/chunks/{chunk-LVOBFF4D.js → chunk-Q4FNLOTI.js} +1 -1
  52. package/dist/safe-bash/chunks/chunk-Q5XO3NAS.js +1036 -0
  53. package/dist/safe-bash/chunks/{chunk-GEG3BWGE.js → chunk-RHFRJIWQ.js} +1 -1
  54. package/dist/safe-bash/chunks/chunk-RUR6J33T.js +11 -0
  55. package/dist/safe-bash/chunks/{chunk-EEEWOYEG.js → chunk-S4RFUUXO.js} +839 -24
  56. package/dist/safe-bash/chunks/{chunk-RRR7AQ24.js → chunk-SD2ISU5L.js} +1 -1
  57. package/dist/safe-bash/chunks/{chunk-3NDIFSNM.js → chunk-SUJ3NTMH.js} +3 -3
  58. package/dist/safe-bash/chunks/{chunk-R3NAKOED.js → chunk-SZRUU5HS.js} +2 -2
  59. package/dist/safe-bash/chunks/{chunk-PH63PLPZ.js → chunk-TC3F4UFF.js} +1 -1
  60. package/dist/safe-bash/chunks/{chunk-3R3AANOR.js → chunk-TCKYOLUE.js} +1 -1
  61. package/dist/safe-bash/chunks/{chunk-D3ANYGMC.js → chunk-UV4X32QU.js} +1 -1
  62. package/dist/safe-bash/chunks/{chunk-E7OYNDGL.js → chunk-V7QT2RWC.js} +1 -1
  63. package/dist/safe-bash/chunks/{chunk-B7PIL77G.js → chunk-W2IYOVHK.js} +804 -1195
  64. package/dist/safe-bash/chunks/{chunk-3HQU4OJO.js → chunk-XNGVOSGI.js} +1 -1
  65. package/dist/safe-bash/chunks/{chunk-J42RIHHJ.js → chunk-XQWCQSRN.js} +1 -1
  66. package/dist/safe-bash/chunks/{chunk-A7XEHALN.js → chunk-Y7FW6GLT.js} +6 -6
  67. package/dist/safe-bash/chunks/{chunk-QGUV42T5.js → chunk-YL3GBUG4.js} +1 -1
  68. package/dist/safe-bash/chunks/chunk-YOXUCJER.js +389 -0
  69. package/dist/safe-bash/chunks/{chunk-HBCN24ZA.js → chunk-Z2AAYYJN.js} +2 -2
  70. package/dist/safe-bash/chunks/chunk-ZKYKJCZZ.js +30 -0
  71. package/dist/safe-bash/chunks/core-IE3AFIDX.js +85806 -0
  72. package/dist/safe-bash/chunks/{ffmpeg-WTC3TEFI.js → ffmpeg-YANDK6HU.js} +2 -2
  73. package/dist/safe-bash/chunks/{gh-6WU6PXL4.js → gh-4MBJ2S5V.js} +2 -2
  74. package/dist/safe-bash/chunks/{git-EFZIGJW4.js → git-2QONJNRQ.js} +2 -2
  75. package/dist/safe-bash/chunks/{imagemagick-EIEYGWPF.js → imagemagick-JLEHGYSN.js} +2 -2
  76. package/dist/safe-bash/chunks/{mmdc-ROQJT5HQ.js → mmdc-6LD7A6ND.js} +2 -2
  77. package/dist/safe-bash/chunks/{pdfimages-DW7LWXFI.js → pdfimages-RSHL7LOP.js} +2 -2
  78. package/dist/safe-bash/chunks/{pdfinfo-TIP6XLUQ.js → pdfinfo-L3SGWPNG.js} +2 -2
  79. package/dist/safe-bash/chunks/{pdftk-DMG22ITZ.js → pdftk-LFBJNU5A.js} +2 -2
  80. package/dist/safe-bash/chunks/{pdftoppm-WNDYR72T.js → pdftoppm-NXXFUIHG.js} +2 -2
  81. package/dist/safe-bash/chunks/{pdftotext-5IPZ4NI7.js → pdftotext-4IHNWT6F.js} +2 -2
  82. package/dist/safe-bash/chunks/{qpdf-TTX2DIUA.js → qpdf-ZEIREV63.js} +2 -2
  83. package/dist/safe-bash/chunks/read-builtin-A4QKAT45.js +9 -0
  84. package/dist/safe-bash/chunks/{sips-XYS46JPJ.js → sips-D5YBG2V3.js} +2 -2
  85. package/dist/safe-bash/chunks/{soffice-TU73E5KL.js → soffice-RAJU3JUT.js} +2 -2
  86. package/dist/safe-bash/chunks/source-files-3XWRRHFA.js +7 -0
  87. package/dist/safe-bash/chunks/{wkhtmltopdf-FSZ2CHGE.js → wkhtmltopdf-7UE4FORZ.js} +2 -2
  88. package/dist/safe-bash/command-chunks/{chunk-7KWZXKY6.js → chunk-26RTBV2I.js} +1 -0
  89. package/dist/safe-bash/command-chunks/{chunk-AQJ2ROJO.js → chunk-2WYNMZR2.js} +10 -8
  90. package/dist/safe-bash/command-chunks/{chunk-BDSMROQZ.js → chunk-36GFRF2N.js} +2 -1
  91. package/dist/safe-bash/command-chunks/{chunk-GC5TJZOF.js → chunk-3VIA2IA7.js} +114 -31
  92. package/dist/safe-bash/command-chunks/{chunk-NKFYQSES.js → chunk-4CTI3ZTX.js} +1 -0
  93. package/dist/safe-bash/command-chunks/{chunk-WH627NJL.js → chunk-4MYP2FX4.js} +2 -1
  94. package/dist/safe-bash/command-chunks/{chunk-ZDN7MJE6.js → chunk-4R5ADJM5.js} +11 -1
  95. package/dist/safe-bash/command-chunks/{chunk-P2N33UMN.js → chunk-5MIKM54M.js} +4 -4
  96. package/dist/safe-bash/command-chunks/{chunk-DB453IE6.js → chunk-6FZQUOSJ.js} +1 -1
  97. package/dist/safe-bash/command-chunks/{chunk-PICVQ6B5.js → chunk-6GKYHPJG.js} +1 -1
  98. package/dist/safe-bash/command-chunks/{chunk-7K6JYKPJ.js → chunk-6M2ELGEN.js} +17 -15
  99. package/dist/safe-bash/command-chunks/{chunk-PXEIT2O4.js → chunk-6UR7V3ET.js} +8 -1
  100. package/dist/safe-bash/command-chunks/{chunk-6KJ3LPI2.js → chunk-6XBS5B46.js} +26 -3
  101. package/dist/safe-bash/command-chunks/{chunk-5PWJG2UK.js → chunk-6YXLZX7L.js} +2 -2
  102. package/dist/safe-bash/command-chunks/{chunk-EK6YNAXT.js → chunk-753YOR54.js} +31 -5
  103. package/dist/safe-bash/command-chunks/{chunk-RMWQAAO5.js → chunk-7IR4NRNE.js} +2 -2
  104. package/dist/safe-bash/command-chunks/{chunk-FZTK4MFI.js → chunk-7NM73SVK.js} +8 -8
  105. package/dist/safe-bash/command-chunks/{chunk-NXEQ3ESQ.js → chunk-7QD5YY4F.js} +6 -11
  106. package/dist/safe-bash/command-chunks/{chunk-EMPU65ZK.js → chunk-A5LBSJGH.js} +1 -0
  107. package/dist/safe-bash/command-chunks/{chunk-4FEVBOL5.js → chunk-ARZMP2L2.js} +2 -2
  108. package/dist/safe-bash/command-chunks/{chunk-NKIELG7Y.js → chunk-BAKFZ477.js} +40 -19
  109. package/dist/safe-bash/command-chunks/{chunk-QRRYN2KO.js → chunk-BC7BK6R6.js} +0 -2424
  110. package/dist/safe-bash/command-chunks/{chunk-CQHP3I66.js → chunk-BOEOJS2Q.js} +1 -1
  111. package/dist/safe-bash/command-chunks/{chunk-XS72HTMA.js → chunk-BWGGLYEB.js} +5 -22
  112. package/dist/safe-bash/command-chunks/{chunk-PMBFZXTK.js → chunk-C5ZZKP7V.js} +1 -1
  113. package/dist/safe-bash/command-chunks/{chunk-LHIOAFWW.js → chunk-C7SEB6WU.js} +1 -1
  114. package/dist/safe-bash/command-chunks/{chunk-XPT2UGBF.js → chunk-CHJKFRT7.js} +1 -1
  115. package/dist/safe-bash/command-chunks/{chunk-TIOCQVUQ.js → chunk-CON26Q2O.js} +1 -1
  116. package/dist/safe-bash/command-chunks/{chunk-E55UKBIE.js → chunk-DBAT3IK2.js} +1 -1
  117. package/dist/safe-bash/command-chunks/{chunk-Z45N42QC.js → chunk-DPAYAVMS.js} +15 -1
  118. package/dist/safe-bash/command-chunks/chunk-DS3NXVUM.js +368 -0
  119. package/dist/safe-bash/command-chunks/{chunk-5ZMZ573Q.js → chunk-DSJ3VRL3.js} +16 -4
  120. package/dist/safe-bash/command-chunks/{chunk-K2GDEMEU.js → chunk-EFRCFWVR.js} +4 -4
  121. package/dist/safe-bash/command-chunks/{chunk-DZCY63VJ.js → chunk-EV6HIJ5H.js} +6 -5
  122. package/dist/safe-bash/command-chunks/{chunk-JDYXY44P.js → chunk-FJURV46Y.js} +3 -3
  123. package/dist/safe-bash/command-chunks/{chunk-TZZ4WUKH.js → chunk-FZAWGKSE.js} +6 -4
  124. package/dist/safe-bash/command-chunks/{chunk-YHFXOX6U.js → chunk-GOCFQ6XV.js} +4 -4
  125. package/dist/safe-bash/command-chunks/{chunk-QVOS4YXL.js → chunk-HH5O7DJI.js} +1 -1
  126. package/dist/safe-bash/command-chunks/{chunk-3HHCU5YU.js → chunk-HK7F5SDC.js} +13 -0
  127. package/dist/safe-bash/command-chunks/{chunk-JNZ3CVAE.js → chunk-HQBXIZC7.js} +8 -3
  128. package/dist/safe-bash/command-chunks/{chunk-V4K2JDYU.js → chunk-I63DBZXZ.js} +2 -2
  129. package/dist/safe-bash/command-chunks/{chunk-WNE7FPVR.js → chunk-I64TLTIW.js} +24 -16
  130. package/dist/safe-bash/command-chunks/{chunk-GFC2NTDG.js → chunk-ICANWOXH.js} +5 -29
  131. package/dist/safe-bash/command-chunks/{chunk-SQRQW3CT.js → chunk-IJ6LGLXM.js} +1 -1
  132. package/dist/safe-bash/command-chunks/{chunk-TGSNCQSR.js → chunk-JT4RYCA6.js} +1771 -1663
  133. package/dist/safe-bash/command-chunks/{chunk-II77KPZN.js → chunk-JWW6FYBN.js} +2 -2
  134. package/dist/safe-bash/command-chunks/{chunk-ZYXH3B66.js → chunk-LCJWKTCJ.js} +250 -203
  135. package/dist/safe-bash/command-chunks/chunk-LU4HBPP2.js +97 -0
  136. package/dist/safe-bash/command-chunks/{chunk-XJXU3VVH.js → chunk-LWOE65OE.js} +20 -5
  137. package/dist/safe-bash/command-chunks/{chunk-GMIHJYDG.js → chunk-M32HFSX7.js} +22 -6
  138. package/dist/safe-bash/command-chunks/{chunk-YG4EPFWC.js → chunk-M3NINRDU.js} +2880 -172
  139. package/dist/safe-bash/command-chunks/chunk-MQREDAL6.js +164 -0
  140. package/dist/safe-bash/command-chunks/{chunk-LWS62ISU.js → chunk-N6DIASO2.js} +1 -1
  141. package/dist/safe-bash/command-chunks/chunk-NGL7YK7O.js +188 -0
  142. package/dist/safe-bash/command-chunks/{chunk-EARHPPPJ.js → chunk-NJYHWKIL.js} +39 -9
  143. package/dist/safe-bash/command-chunks/{chunk-6JSIFWYT.js → chunk-OJQRSCBP.js} +1 -1
  144. package/dist/safe-bash/command-chunks/{chunk-OQU6UT6X.js → chunk-OV3XREFN.js} +11 -0
  145. package/dist/safe-bash/command-chunks/{chunk-MIXBO6U7.js → chunk-PTZLF456.js} +2 -2
  146. package/dist/safe-bash/command-chunks/{chunk-ALDC4XP4.js → chunk-QILLRNES.js} +34 -10
  147. package/dist/safe-bash/command-chunks/{chunk-L22T3H7L.js → chunk-QR25JLKO.js} +1 -1
  148. package/dist/safe-bash/command-chunks/{chunk-NASVPT6F.js → chunk-R7C4MGZ5.js} +17 -224
  149. package/dist/safe-bash/command-chunks/{chunk-LCF3OB7P.js → chunk-RBME3JEH.js} +1 -1
  150. package/dist/safe-bash/command-chunks/{chunk-2KG2QLJE.js → chunk-RFWGYT7G.js} +3 -0
  151. package/dist/safe-bash/command-chunks/{chunk-5TBUOBDE.js → chunk-RZMVRT26.js} +27 -13
  152. package/dist/safe-bash/command-chunks/chunk-TFR6B3WB.js +44 -0
  153. package/dist/safe-bash/command-chunks/chunk-TOH3OF3O.js +179 -0
  154. package/dist/safe-bash/command-chunks/chunk-TT4DAFBT.js +13621 -0
  155. package/dist/safe-bash/command-chunks/{chunk-LWSBAWLT.js → chunk-TXI64OAG.js} +1 -1
  156. package/dist/safe-bash/command-chunks/{chunk-GIRNFXP3.js → chunk-TZRI7BJZ.js} +45 -15
  157. package/dist/safe-bash/command-chunks/{chunk-QOKBZFFD.js → chunk-U3MMODA5.js} +2 -7
  158. package/dist/safe-bash/command-chunks/{chunk-ZYHTWNAE.js → chunk-UAW423ZL.js} +11 -11
  159. package/dist/safe-bash/command-chunks/{chunk-C5YYCQHW.js → chunk-UXEEUGOV.js} +222 -12
  160. package/dist/safe-bash/command-chunks/{chunk-GY3BWK7K.js → chunk-VOZPMJRX.js} +87 -80
  161. package/dist/safe-bash/command-chunks/{chunk-ILX2NOLF.js → chunk-WPANOB4A.js} +20 -20
  162. package/dist/safe-bash/command-chunks/{chunk-Y2WBSJG6.js → chunk-X4QZQI5Q.js} +65 -64
  163. package/dist/safe-bash/command-chunks/{chunk-HDCNKOIX.js → chunk-XGI57GCN.js} +1 -1
  164. package/dist/safe-bash/command-chunks/{chunk-5UBXNSFZ.js → chunk-XUCU7QQT.js} +1281 -1278
  165. package/dist/safe-bash/command-chunks/chunk-Y22VXJBD.js +296 -0
  166. package/dist/safe-bash/command-chunks/{chunk-WVHONVZ4.js → chunk-YMFUUPDX.js} +5 -3
  167. package/dist/safe-bash/command-chunks/{chunk-IR2BY7EL.js → chunk-YYGIBXFZ.js} +2 -2
  168. package/dist/safe-bash/command-chunks/{chunk-MSFXC3OC.js → chunk-Z4FO6OHE.js} +2 -2
  169. package/dist/safe-bash/command-chunks/{chunk-WWIBP2ET.js → chunk-Z5ZZVDUD.js} +143 -22
  170. package/dist/safe-bash/command-chunks/{chunk-LOICUCHG.js → chunk-ZHN3QDCI.js} +1 -1
  171. package/dist/safe-bash/commands/alias/index.d.ts +2 -0
  172. package/dist/safe-bash/commands/alias/index.js +2 -0
  173. package/dist/safe-bash/commands/apply-patch/index.browser.js +2 -3
  174. package/dist/safe-bash/commands/apply-patch/index.d.ts +0 -1
  175. package/dist/safe-bash/commands/apply-patch/index.js +0 -1
  176. package/dist/safe-bash/commands/archive/index.browser.js +2 -3
  177. package/dist/safe-bash/commands/archive/index.d.ts +0 -1
  178. package/dist/safe-bash/commands/archive/index.js +0 -1
  179. package/dist/safe-bash/commands/bytes/index.js +2 -1
  180. package/dist/safe-bash/commands/chmod/index.browser.js +1 -1
  181. package/dist/safe-bash/commands/column/index.browser.js +2 -3
  182. package/dist/safe-bash/commands/column/index.d.ts +0 -1
  183. package/dist/safe-bash/commands/column/index.js +0 -1
  184. package/dist/safe-bash/commands/copy-source.js +1 -0
  185. package/dist/safe-bash/commands/csplit/index.browser.js +2 -2
  186. package/dist/safe-bash/commands/csvkit/index.browser.js +72 -0
  187. package/dist/safe-bash/commands/csvkit/index.d.ts +0 -5
  188. package/dist/safe-bash/commands/csvkit/index.js +0 -50
  189. package/dist/safe-bash/commands/docx/index.browser.js +5 -7
  190. package/dist/safe-bash/commands/du/index.browser.js +2 -3
  191. package/dist/safe-bash/commands/du/index.d.ts +0 -1
  192. package/dist/safe-bash/commands/du/index.js +0 -1
  193. package/dist/safe-bash/commands/expr/index.browser.js +2 -3
  194. package/dist/safe-bash/commands/expr/index.d.ts +0 -1
  195. package/dist/safe-bash/commands/expr/index.js +0 -1
  196. package/dist/safe-bash/commands/factor/index.browser.js +2 -2
  197. package/dist/safe-bash/commands/file/index.browser.js +2 -3
  198. package/dist/safe-bash/commands/file/index.d.ts +0 -1
  199. package/dist/safe-bash/commands/file/index.js +0 -1
  200. package/dist/safe-bash/commands/filesystem.js +1 -1
  201. package/dist/safe-bash/commands/getopt/index.browser.js +2 -2
  202. package/dist/safe-bash/commands/grep-aliases/index.browser.js +3 -3
  203. package/dist/safe-bash/commands/hexdump/index.browser.js +2 -2
  204. package/dist/safe-bash/commands/html-to-markdown/index.browser.js +2 -3
  205. package/dist/safe-bash/commands/html-to-markdown/index.d.ts +0 -1
  206. package/dist/safe-bash/commands/html-to-markdown/index.js +0 -1
  207. package/dist/safe-bash/commands/htmlq/index.d.ts +1 -5
  208. package/dist/safe-bash/commands/htmlq/index.js +1 -143
  209. package/dist/safe-bash/commands/iconv/index.browser.js +2 -2
  210. package/dist/safe-bash/commands/line-endings/index.browser.js +2 -2
  211. package/dist/safe-bash/commands/llm/index.browser.js +2 -2
  212. package/dist/safe-bash/commands/llm/providers/index.browser.js +1 -1
  213. package/dist/safe-bash/commands/mdq/index.browser.js +3 -3
  214. package/dist/safe-bash/commands/media/index.browser.js +4 -16314
  215. package/dist/safe-bash/commands/media/index.d.ts +1 -5
  216. package/dist/safe-bash/commands/media/index.js +1 -3
  217. package/dist/safe-bash/commands/media/plugin.d.ts +1 -18
  218. package/dist/safe-bash/commands/media/plugin.js +1 -90
  219. package/dist/safe-bash/commands/media/remote.d.ts +1 -63
  220. package/dist/safe-bash/commands/media/remote.js +1 -405
  221. package/dist/safe-bash/commands/media/settings.d.ts +1 -4
  222. package/dist/safe-bash/commands/media/settings.js +1 -26
  223. package/dist/safe-bash/commands/metadata/index.browser.js +3 -4
  224. package/dist/safe-bash/commands/metadata/index.d.ts +0 -1
  225. package/dist/safe-bash/commands/metadata/index.js +2 -2
  226. package/dist/safe-bash/commands/mktemp/index.browser.js +1 -1
  227. package/dist/safe-bash/commands/network/curl.js +1 -3
  228. package/dist/safe-bash/commands/network/index.browser.js +3 -4
  229. package/dist/safe-bash/commands/network/public.d.ts +0 -1
  230. package/dist/safe-bash/commands/network/public.js +0 -1
  231. package/dist/safe-bash/commands/network/transport.js +2 -1
  232. package/dist/safe-bash/commands/network/wget.js +1 -3
  233. package/dist/safe-bash/commands/node/browser.d.ts +0 -1
  234. package/dist/safe-bash/commands/node/browser.js +0 -1
  235. package/dist/safe-bash/commands/node/default-runtime.d.ts +3 -0
  236. package/dist/safe-bash/commands/node/default-runtime.js +15 -0
  237. package/dist/safe-bash/commands/node/index.browser.js +7 -8
  238. package/dist/safe-bash/commands/node/index.js +3 -3
  239. package/dist/safe-bash/commands/node/path.js +1 -1
  240. package/dist/safe-bash/commands/node/preload.d.ts +1 -1
  241. package/dist/safe-bash/commands/node/preload.js +4 -1
  242. package/dist/safe-bash/commands/node/quickjs.d.ts +2 -0
  243. package/dist/safe-bash/commands/node/quickjs.js +2 -0
  244. package/dist/safe-bash/commands/node/safejs.js +26 -12
  245. package/dist/safe-bash/commands/op/index.browser.js +2 -3
  246. package/dist/safe-bash/commands/op/index.d.ts +0 -11
  247. package/dist/safe-bash/commands/op/index.js +0 -84
  248. package/dist/safe-bash/commands/pandoc/index.browser.js +44 -0
  249. package/dist/safe-bash/commands/pandoc/index.d.ts +0 -1
  250. package/dist/safe-bash/commands/pandoc/index.js +0 -1
  251. package/dist/safe-bash/commands/pr/index.browser.js +2 -2
  252. package/dist/safe-bash/commands/python/docker-runner.js +4 -3
  253. package/dist/safe-bash/commands/python/docker.d.ts +1 -0
  254. package/dist/safe-bash/commands/python/docker.js +5 -2
  255. package/dist/safe-bash/commands/python/index.browser.js +17 -13
  256. package/dist/safe-bash/commands/python/index.d.ts +2 -1
  257. package/dist/safe-bash/commands/python/index.js +10 -8
  258. package/dist/safe-bash/commands/python/llm-capability.js +65 -2
  259. package/dist/safe-bash/commands/python/llm-dependencies.d.ts +27 -0
  260. package/dist/safe-bash/commands/python/llm-dependencies.js +66 -0
  261. package/dist/safe-bash/commands/python/llm-module.js +6 -4
  262. package/dist/safe-bash/commands/python/llm-reference-module.d.ts +3 -0
  263. package/dist/safe-bash/commands/python/llm-reference-module.js +690 -0
  264. package/dist/safe-bash/commands/python/worker.browser.js +2 -3
  265. package/dist/safe-bash/commands/python/worker.d.ts +0 -1
  266. package/dist/safe-bash/commands/python/worker.js +0 -1
  267. package/dist/safe-bash/commands/regex-execution/ere/transport/wire-engine.d.ts +1 -1
  268. package/dist/safe-bash/commands/regex-execution/ere/transport/wire-engine.js +3 -3
  269. package/dist/safe-bash/commands/regex-execution/public.browser.js +7 -7
  270. package/dist/safe-bash/commands/safejs/options.js +5 -1
  271. package/dist/safe-bash/commands/safejs/runtime.d.ts +1 -0
  272. package/dist/safe-bash/commands/safejs/runtime.js +1 -1
  273. package/dist/safe-bash/commands/split/index.browser.js +2 -3
  274. package/dist/safe-bash/commands/split/index.d.ts +0 -1
  275. package/dist/safe-bash/commands/split/index.js +0 -1
  276. package/dist/safe-bash/commands/ssconvert/index.browser.js +98 -0
  277. package/dist/safe-bash/commands/stat/index.browser.js +1 -1
  278. package/dist/safe-bash/commands/stream-format/index.browser.js +3 -4
  279. package/dist/safe-bash/commands/stream-format/index.d.ts +0 -1
  280. package/dist/safe-bash/commands/stream-format/index.js +0 -1
  281. package/dist/safe-bash/commands/stream-inspection/index.browser.js +3 -4
  282. package/dist/safe-bash/commands/stream-inspection/index.d.ts +0 -1
  283. package/dist/safe-bash/commands/stream-inspection/index.js +0 -1
  284. package/dist/safe-bash/commands/streams.js +2 -1
  285. package/dist/safe-bash/commands/table-text/index.browser.js +3 -4
  286. package/dist/safe-bash/commands/table-text/index.d.ts +0 -1
  287. package/dist/safe-bash/commands/table-text/index.js +0 -1
  288. package/dist/safe-bash/commands/text.js +28 -24
  289. package/dist/safe-bash/commands/time-env/index.browser.js +3 -4
  290. package/dist/safe-bash/commands/time-env/index.d.ts +0 -1
  291. package/dist/safe-bash/commands/time-env/index.js +0 -1
  292. package/dist/safe-bash/commands/tree/index.browser.js +2 -3
  293. package/dist/safe-bash/commands/tree/index.d.ts +0 -1
  294. package/dist/safe-bash/commands/tree/index.js +0 -1
  295. package/dist/safe-bash/commands/tsort/index.browser.js +2 -2
  296. package/dist/safe-bash/commands/unalias/index.d.ts +2 -0
  297. package/dist/safe-bash/commands/unalias/index.js +2 -0
  298. package/dist/safe-bash/commands/xml/index.browser.js +2 -2
  299. package/dist/safe-bash/commands/yq/index.browser.js +2 -2
  300. package/dist/safe-bash/core.browser.js +2 -2
  301. package/dist/safe-bash/core.d.ts +7 -1
  302. package/dist/safe-bash/core.js +7 -1
  303. package/dist/safe-bash/execution-runtime.js +2 -1
  304. package/dist/safe-bash/fs/s3/http/index.d.ts +2 -2
  305. package/dist/safe-bash/fs/s3/http/index.js +1 -1
  306. package/dist/safe-bash/full-core.browser.js +283 -945
  307. package/dist/safe-bash/internal/op/types.d.ts +1 -0
  308. package/dist/safe-bash/jobs.browser.js +5 -5
  309. package/dist/safe-bash/lazy-optional.d.ts +3 -3
  310. package/dist/safe-bash/lazy-optional.js +1 -1
  311. package/dist/safe-bash/opt-in/commands/cmp/index.js +7 -6
  312. package/dist/safe-bash/opt-in/commands/dd/index.js +1 -1
  313. package/dist/safe-bash/opt-in/commands/dd/io.js +51 -5
  314. package/dist/safe-bash/opt-in/commands/truncate/index.js +2 -2
  315. package/dist/safe-bash/opt-in/commands/yq/native-work.js +2 -0
  316. package/dist/safe-bash/opt-in/optional/commands/shuf/input.js +2 -1
  317. package/dist/safe-bash/opt-in/optional/commands/shuf/shuf.js +4 -2
  318. package/dist/safe-bash/opt-in/optional.d.ts +1 -1
  319. package/dist/safe-bash/opt-in/optional.js +1 -1
  320. package/dist/safe-bash/opt-in/shell/extensions/read/index.js +2 -344
  321. package/dist/safe-bash/optional-host.browser.js +23 -18
  322. package/dist/safe-bash/optional-host.d.ts +1 -0
  323. package/dist/safe-bash/optional-host.js +1 -0
  324. package/dist/safe-bash/playwright/controller.js +41 -3
  325. package/dist/safe-bash/playwright/native-storage-targets.js +4 -2
  326. package/dist/safe-bash/plugins/base.d.ts +1 -1
  327. package/dist/safe-bash/plugins/base.js +3 -3
  328. package/dist/safe-bash/plugins/composition.d.ts +5 -2
  329. package/dist/safe-bash/plugins/composition.js +10 -7
  330. package/dist/safe-bash/plugins/index.browser.js +44 -41
  331. package/dist/safe-bash/plugins/index.js +3 -2
  332. package/dist/safe-bash/plugins/portable-commands.d.ts +3 -0
  333. package/dist/safe-bash/plugins/portable-commands.js +31 -0
  334. package/dist/safe-bash/registry-entry.browser.js +41 -42
  335. package/dist/safe-bash/search.browser.js +32 -33
  336. package/dist/safe-bash/shell/arithmetic.js +19 -6
  337. package/dist/safe-bash/shell/arrays/state.js +1 -1
  338. package/dist/safe-bash/shell/arrays/syntax.js +4 -3
  339. package/dist/safe-bash/shell/index.d.ts +0 -1
  340. package/dist/safe-bash/shell/index.js +0 -1
  341. package/dist/safe-bash/shell/parser.d.ts +2 -2
  342. package/dist/safe-bash/shell/parser.js +268 -64
  343. package/dist/safe-bash/shell/read-builtin.d.ts +3 -0
  344. package/dist/safe-bash/shell/read-builtin.js +344 -0
  345. package/dist/safe-bash/shell/runtime.d.ts +21 -4
  346. package/dist/safe-bash/shell/runtime.js +373 -412
  347. package/dist/safe-bash/shell/session-state.js +25 -0
  348. package/dist/safe-bash/shell/shell.js +76 -154
  349. package/dist/safe-bash/shell/tilde-expansion.d.ts +1 -1
  350. package/dist/safe-bash/shell/tilde-expansion.js +2 -2
  351. package/dist/safe-bash/shell/types.d.ts +5 -0
  352. package/dist/safe-bash/shell/value-state.js +1 -1
  353. package/dist/safe-bash/shell-entry.browser.js +32 -33
  354. package/dist/safe-bash/trap.browser.js +4 -4
  355. package/dist/safe-bash/yq-browser/index.js +1 -1
  356. package/dist/safe-bash-calendar-engine/time-env/calendar.d.ts +1 -1
  357. package/dist/safe-bash-calendar-engine/time-env/calendar.js +1 -1
  358. package/dist/safe-bash-calendar-engine/time-env/format.js +1 -1
  359. package/dist/safe-bash-command-alias/index.d.ts +13 -0
  360. package/dist/safe-bash-command-alias/index.js +88 -0
  361. package/dist/safe-bash-command-apply-patch/apply.js +3 -3
  362. package/dist/safe-bash-command-apply-patch/index.js +3 -3
  363. package/dist/safe-bash-command-apply-patch/matcher.js +1 -1
  364. package/dist/safe-bash-command-apply-patch/parser.js +1 -1
  365. package/dist/safe-bash-command-awk/awk-pipes.js +2 -2
  366. package/dist/safe-bash-command-awk/awk-reader.js +1 -1
  367. package/dist/safe-bash-command-awk/awk-runtime.js +3 -3
  368. package/dist/safe-bash-command-awk/awk.js +5 -5
  369. package/dist/safe-bash-command-awk/index.js +5 -5
  370. package/dist/safe-bash-command-bc/index.js +206 -60
  371. package/dist/safe-bash-command-cmp/index.js +7 -6
  372. package/dist/safe-bash-command-column/column.js +3 -3
  373. package/dist/safe-bash-command-column/index.js +3 -3
  374. package/dist/safe-bash-command-column/layout.js +2 -2
  375. package/dist/safe-bash-command-csvkit/index.d.ts +1 -0
  376. package/dist/safe-bash-command-csvkit/index.js +1505 -7
  377. package/dist/safe-bash-command-csvkit/sync-support.js +2 -7
  378. package/dist/safe-bash-command-curl/curl.js +1 -1
  379. package/dist/safe-bash-command-curl/index.js +1 -1
  380. package/dist/safe-bash-command-date/date.js +1 -1
  381. package/dist/safe-bash-command-date/index.js +1 -1
  382. package/dist/safe-bash-command-dd/index.js +1 -1
  383. package/dist/safe-bash-command-dd/io.js +51 -5
  384. package/dist/safe-bash-command-diff/diff.js +1 -1
  385. package/dist/safe-bash-command-diff/index.js +1 -1
  386. package/dist/safe-bash-command-diff3/index.js +10 -13
  387. package/dist/safe-bash-command-exiftool/index.js +278 -50
  388. package/dist/safe-bash-command-exiftool/registry.d.ts +4 -2
  389. package/dist/safe-bash-command-factor/command.js +2 -2
  390. package/dist/safe-bash-command-factor/index.js +2 -2
  391. package/dist/safe-bash-command-fd/arguments.d.ts +2 -0
  392. package/dist/safe-bash-command-fd/index.js +42 -12
  393. package/dist/safe-bash-command-ffmpeg/index.js +356 -66
  394. package/dist/safe-bash-command-find/find-format.d.ts +3 -0
  395. package/dist/safe-bash-command-find/find-format.js +1 -1
  396. package/dist/safe-bash-command-find/find.js +2 -2
  397. package/dist/safe-bash-command-find/index.js +2 -2
  398. package/dist/safe-bash-command-fmt/index.js +1 -4
  399. package/dist/safe-bash-command-fold/engine.d.ts +1 -1
  400. package/dist/safe-bash-command-fold/family.js +2 -2
  401. package/dist/safe-bash-command-fold/index.js +1 -1
  402. package/dist/safe-bash-command-hexdump/command.js +2 -2
  403. package/dist/safe-bash-command-hexdump/index.js +2 -2
  404. package/dist/safe-bash-command-html-to-markdown/entities.js +1 -1
  405. package/dist/safe-bash-command-html-to-markdown/index.js +4 -4
  406. package/dist/safe-bash-command-html-to-markdown/input.js +3 -3
  407. package/dist/safe-bash-command-html-to-markdown/parser.js +2 -2
  408. package/dist/safe-bash-command-html-to-markdown/render.js +3 -3
  409. package/dist/safe-bash-command-htmlq/contracts.d.ts +5 -2
  410. package/dist/safe-bash-command-htmlq/index.d.ts +2 -1
  411. package/dist/safe-bash-command-htmlq/index.js +175 -49
  412. package/dist/safe-bash-command-htmlq/sync.d.ts +1 -0
  413. package/dist/safe-bash-command-imagemagick/index.js +56 -6
  414. package/dist/safe-bash-command-install/arguments.d.ts +27 -0
  415. package/dist/safe-bash-command-install/arguments.js +224 -0
  416. package/dist/safe-bash-command-install/index.d.ts +7 -0
  417. package/dist/safe-bash-command-install/index.js +942 -0
  418. package/dist/safe-bash-command-install/mode.d.ts +6 -0
  419. package/dist/safe-bash-command-install/mode.js +71 -0
  420. package/dist/safe-bash-command-install/options.d.ts +40 -0
  421. package/dist/safe-bash-command-install/options.js +27 -0
  422. package/dist/safe-bash-command-jq/index.js +1 -1
  423. package/dist/safe-bash-command-jq/jq.js +1 -1
  424. package/dist/safe-bash-command-less/index.js +37 -61
  425. package/dist/safe-bash-command-llm/command.js +1 -1
  426. package/dist/safe-bash-command-llm/elevenlabs.js +2 -2
  427. package/dist/safe-bash-command-llm/index.js +4 -4
  428. package/dist/safe-bash-command-llm/openai.js +2 -2
  429. package/dist/safe-bash-command-llm/providers/elevenlabs.js +2 -2
  430. package/dist/safe-bash-command-llm/providers/index.js +3 -3
  431. package/dist/safe-bash-command-llm/providers/openai.js +2 -2
  432. package/dist/safe-bash-command-llm/providers/shared.js +1 -1
  433. package/dist/{safe-bash-mcp → safe-bash-command-mcp}/index.browser.d.ts +463 -46
  434. package/dist/safe-bash-command-mcp/index.browser.js +19308 -0
  435. package/dist/{safe-bash-mcp → safe-bash-command-mcp}/index.d.ts +15 -6
  436. package/dist/{safe-bash-mcp → safe-bash-command-mcp}/index.js +2804 -2771
  437. package/dist/safe-bash-command-media/LICENSE +21 -0
  438. package/dist/safe-bash-command-media/index.d.ts +6 -0
  439. package/dist/safe-bash-command-media/index.js +30 -0
  440. package/dist/safe-bash-command-media/plugin.d.ts +18 -0
  441. package/dist/safe-bash-command-media/plugin.js +11 -0
  442. package/dist/safe-bash-command-media/remote.d.ts +63 -0
  443. package/dist/safe-bash-command-media/remote.js +11 -0
  444. package/dist/safe-bash-command-media/settings.d.ts +4 -0
  445. package/dist/safe-bash-command-media/settings.js +41 -0
  446. package/dist/safe-bash-command-mktemp/command.js +1 -1
  447. package/dist/safe-bash-command-mktemp/index.js +1 -1
  448. package/dist/safe-bash-command-mmdc/arguments.d.ts +1 -0
  449. package/dist/safe-bash-command-mmdc/command.d.ts +2 -0
  450. package/dist/safe-bash-command-mmdc/contracts.d.ts +8 -1
  451. package/dist/safe-bash-command-mmdc/index.js +359 -7
  452. package/dist/safe-bash-command-nl/index.js +1 -1
  453. package/dist/safe-bash-command-nl/nl.js +1 -1
  454. package/dist/safe-bash-command-node/LICENSE +21 -0
  455. package/dist/safe-bash-command-node/index.d.ts +17 -0
  456. package/dist/safe-bash-command-node/index.js +328 -0
  457. package/dist/safe-bash-command-numfmt/index.js +1 -0
  458. package/dist/safe-bash-command-od/index.js +10 -6
  459. package/dist/safe-bash-command-op/index.js +39 -32
  460. package/dist/safe-bash-command-op/types.d.ts +1 -0
  461. package/dist/safe-bash-command-pandoc/command.js +3 -3
  462. package/dist/safe-bash-command-pandoc/index.d.ts +1 -0
  463. package/dist/safe-bash-command-pandoc/index.js +5 -3
  464. package/dist/safe-bash-command-pandoc/sync.d.ts +1 -0
  465. package/dist/safe-bash-command-patch/index.js +4 -4
  466. package/dist/safe-bash-command-patch/patch.js +4 -4
  467. package/dist/safe-bash-command-pdfimages/index.js +1 -1
  468. package/dist/safe-bash-command-pdfinfo/index.js +30 -5
  469. package/dist/safe-bash-command-pdftk/index.js +21 -23
  470. package/dist/safe-bash-command-pdftoppm/index.js +17 -4
  471. package/dist/safe-bash-command-pdftotext/index.js +11 -14
  472. package/dist/safe-bash-command-qpdf/index.d.ts +1 -0
  473. package/dist/safe-bash-command-qpdf/index.js +9 -6
  474. package/dist/safe-bash-command-rg/index.js +1 -1
  475. package/dist/safe-bash-command-rg/rg-command.js +1 -1
  476. package/dist/safe-bash-command-sed/index.js +1 -1
  477. package/dist/safe-bash-command-sed/sed.js +1 -1
  478. package/dist/safe-bash-command-shuf/input.d.ts +2 -2
  479. package/dist/safe-bash-command-shuf/input.js +2 -1
  480. package/dist/safe-bash-command-shuf/shuf.js +4 -2
  481. package/dist/safe-bash-command-sips/index.js +2 -2
  482. package/dist/safe-bash-command-soffice/index.js +97 -12
  483. package/dist/safe-bash-command-sponge/index.js +4 -1
  484. package/dist/safe-bash-command-sqlite3/engine.d.ts +1 -0
  485. package/dist/safe-bash-command-sqlite3/index.js +510 -70
  486. package/dist/safe-bash-command-ssconvert/formats/xlsx.js +2 -2
  487. package/dist/safe-bash-command-ssconvert/index.js +44 -22
  488. package/dist/safe-bash-command-stat/command.js +1 -1
  489. package/dist/safe-bash-command-stat/index.js +1 -1
  490. package/dist/safe-bash-command-tar/create.d.ts +1 -0
  491. package/dist/safe-bash-command-tar/create.js +2 -2
  492. package/dist/safe-bash-command-tar/extract.js +2 -2
  493. package/dist/safe-bash-command-tar/index.js +4 -4
  494. package/dist/safe-bash-command-tar/modes.js +4 -4
  495. package/dist/safe-bash-command-tar/options.js +1 -1
  496. package/dist/safe-bash-command-truncate/index.js +2 -2
  497. package/dist/safe-bash-command-tsort/command.js +2 -2
  498. package/dist/safe-bash-command-tsort/index.js +2 -2
  499. package/dist/safe-bash-command-unalias/index.d.ts +12 -0
  500. package/dist/safe-bash-command-unalias/index.js +67 -0
  501. package/dist/safe-bash-command-unrtf/index.js +26 -4
  502. package/dist/safe-bash-command-xan/argv.d.ts +1 -1
  503. package/dist/safe-bash-command-xan/argv.js +2 -2
  504. package/dist/safe-bash-command-xan/budget.d.ts +0 -1
  505. package/dist/safe-bash-command-xan/budget.js +1 -1
  506. package/dist/safe-bash-command-xan/commands.js +6 -6
  507. package/dist/safe-bash-command-xan/csv.js +2 -2
  508. package/dist/safe-bash-command-xan/index.js +8 -9
  509. package/dist/safe-bash-command-xan/io.js +4 -4
  510. package/dist/safe-bash-command-xan/options.js +1 -1
  511. package/dist/safe-bash-command-xan/selector.js +2 -2
  512. package/dist/safe-bash-command-xmllint/index.js +45 -23
  513. package/dist/safe-bash-command-xxd/index.js +41 -10
  514. package/dist/safe-bash-command-yq/accounting.js +1 -1
  515. package/dist/safe-bash-command-yq/index.js +3 -2
  516. package/dist/safe-bash-command-yq/native-work.js +2 -0
  517. package/dist/safe-bash-command-yq/parser.js +2 -2
  518. package/dist/safe-bash-command-yq/query.js +5 -5
  519. package/dist/safe-bash-command-yq/toml.js +2 -2
  520. package/dist/safe-bash-command-zip/index.js +3 -3
  521. package/dist/safe-bash-compression-engine/bounded-codec.js +2 -2
  522. package/dist/safe-bash-compression-engine/codec-loader.js +1 -1
  523. package/dist/safe-bash-compression-engine/files.js +5 -5
  524. package/dist/safe-bash-compression-engine/index.js +4 -4
  525. package/dist/safe-bash-compression-engine/operand.js +5 -5
  526. package/dist/safe-bash-compression-engine/stream.js +4 -4
  527. package/dist/safe-bash-compression-engine/zstd-decode.js +3 -3
  528. package/dist/safe-bash-contracts/command.js +3 -3
  529. package/dist/safe-bash-contracts/default-executor.js +2 -2
  530. package/dist/safe-bash-contracts/diagnostics.js +3 -3
  531. package/dist/safe-bash-contracts/escaping.js +6 -6
  532. package/dist/safe-bash-contracts/filesystem-descriptor.js +3 -3
  533. package/dist/safe-bash-contracts/filesystem-output.js +5 -5
  534. package/dist/safe-bash-contracts/http.d.ts +7 -0
  535. package/dist/safe-bash-contracts/index.js +8 -8
  536. package/dist/safe-bash-contracts/io.js +2 -2
  537. package/dist/safe-bash-contracts/output.js +3 -3
  538. package/dist/safe-bash-contracts/runtime-control.d.ts +2 -2
  539. package/dist/safe-bash-contracts/runtime-control.js +4 -2
  540. package/dist/safe-bash-contracts/signals.d.ts +2 -0
  541. package/dist/safe-bash-contracts/signals.js +3 -1
  542. package/dist/safe-bash-contracts/yield.js +1 -1
  543. package/dist/safe-bash-csv-engine/index.d.ts +2 -1
  544. package/dist/safe-bash-csv-engine/index.js +21 -15
  545. package/dist/safe-bash-io-engine/commands/search/requirements.js +2 -2
  546. package/dist/safe-bash-io-engine/commands/text-programs/shared.js +6 -6
  547. package/dist/safe-bash-io-engine/internal.js +1 -1
  548. package/dist/safe-bash-io-engine/shell/pattern.js +38 -18
  549. package/dist/safe-bash-line-ending-engine/convert.js +9 -204
  550. package/dist/safe-bash-line-ending-engine/encoding.js +9 -42
  551. package/dist/safe-bash-line-ending-engine/index.js +48 -0
  552. package/dist/safe-bash-line-ending-engine/info.js +9 -90
  553. package/dist/safe-bash-line-ending-engine/internal.js +15 -160
  554. package/dist/safe-bash-line-ending-engine/io.js +12 -289
  555. package/dist/safe-bash-line-ending-engine/stage.js +10 -160
  556. package/dist/safe-bash-markdown-engine/index.js +3 -3
  557. package/dist/safe-bash-network-engine/args.d.ts +6 -0
  558. package/dist/safe-bash-network-engine/args.js +4 -2
  559. package/dist/safe-bash-network-engine/body.js +1 -1
  560. package/dist/safe-bash-network-engine/fetch-transport.js +3 -1
  561. package/dist/safe-bash-network-engine/index.js +3 -1
  562. package/dist/safe-bash-network-engine/input.js +2 -2
  563. package/dist/safe-bash-network-engine/platform-portable.js +3 -1
  564. package/dist/safe-bash-query-engine/dates.d.ts +1 -1
  565. package/dist/safe-bash-query-engine/dates.js +1 -1
  566. package/dist/safe-bash-query-engine/index.js +6 -6
  567. package/dist/safe-bash-query-engine/interpreter.js +4 -4
  568. package/dist/safe-bash-query-engine/parser.js +1 -1
  569. package/dist/safe-bash-query-engine/query-core.js +6 -6
  570. package/dist/safe-bash-regex-engine/execution/bounded-provider.js +10 -0
  571. package/dist/safe-bash-regex-engine/index.js +1 -1
  572. package/dist/safe-bash-regex-engine/text/regex.d.ts +1 -1
  573. package/dist/safe-bash-regex-engine/text/regex.js +1 -1
  574. package/dist/safe-bash-search-engine/ergonomic-regex.d.ts +1 -0
  575. package/dist/safe-bash-search-engine/ergonomic-regex.js +1 -1
  576. package/dist/safe-bash-search-engine/grep.js +16 -9
  577. package/dist/safe-bash-search-engine/matcher.d.ts +2 -2
  578. package/dist/safe-bash-search-engine/matcher.js +12 -8
  579. package/dist/safe-bash-search-engine/shared.js +1 -1
  580. package/dist/safe-bash-search-engine/walk.js +13 -1
  581. package/dist/safe-bash-text-stream-engine/stream-format/shared.d.ts +1 -1
  582. package/dist/safe-bash-text-stream-engine/stream-format/shared.js +2 -1
  583. package/dist/safe-bash-xml-engine/document.js +3 -3
  584. package/dist/safe-bash-xml-engine/evaluate.js +2 -2
  585. package/dist/safe-bash-xml-engine/index.js +4 -4
  586. package/dist/safe-bash-xml-engine/io.js +7 -2
  587. package/dist/safe-bash-xml-engine/limits.d.ts +0 -2
  588. package/dist/safe-bash-xml-engine/limits.js +1 -1
  589. package/dist/safe-bash-xml-engine/query.js +3 -3
  590. package/dist/safe-bash-zip-engine/index.js +3 -3
  591. package/dist/safe-bash-zip-engine/zip/repair.js +3 -3
  592. package/dist/safe-bash-zip-engine/zip/safety.js +1 -1
  593. package/dist/safe-bash-zip-engine/zip/sfx.js +3 -3
  594. package/dist/safe-bash-zip-engine/zip/volumes.js +1 -1
  595. package/dist/safe-bash-zip-engine/zip-format.js +3 -3
  596. package/dist/safe-playwright-cloudflare/browser-socket-closure.js +18 -3
  597. package/dist/safe-playwright-cloudflare/shell-browser-resource.js +1 -1
  598. package/dist/xlsx-ast/xlsx.js +6 -5
  599. package/package.json +86 -98
  600. package/dist/media-cli/bytes.d.ts +0 -8
  601. package/dist/media-cli/bytes.js +0 -40
  602. package/dist/media-cli/concat.d.ts +0 -30
  603. package/dist/media-cli/concat.js +0 -197
  604. package/dist/media-cli/content.js +0 -66
  605. package/dist/media-cli/dependency-grammars.d.ts +0 -12
  606. package/dist/media-cli/dependency-grammars.js +0 -557
  607. package/dist/media-cli/discover.js +0 -286
  608. package/dist/media-cli/engine.js +0 -190
  609. package/dist/media-cli/filename-expression.js +0 -147
  610. package/dist/media-cli/filesystem.js +0 -35
  611. package/dist/media-cli/frontend-contract.js +0 -8
  612. package/dist/media-cli/frontend-issues.d.ts +0 -6
  613. package/dist/media-cli/frontend-issues.js +0 -9
  614. package/dist/media-cli/imagemagick-operand.d.ts +0 -42
  615. package/dist/media-cli/imagemagick-operand.js +0 -229
  616. package/dist/media-cli/imagemagick-references.d.ts +0 -7
  617. package/dist/media-cli/imagemagick-references.js +0 -42
  618. package/dist/media-cli/imagemagick.generated.js +0 -3254
  619. package/dist/media-cli/imagemagick.js +0 -615
  620. package/dist/media-cli/index.js +0 -12
  621. package/dist/media-cli/mvg.d.ts +0 -10
  622. package/dist/media-cli/mvg.js +0 -102
  623. package/dist/media-cli/network.js +0 -78
  624. package/dist/media-cli/options.generated.js +0 -3312
  625. package/dist/media-cli/preset.d.ts +0 -11
  626. package/dist/media-cli/preset.js +0 -57
  627. package/dist/media-cli/resolution-path.d.ts +0 -23
  628. package/dist/media-cli/resolution-path.js +0 -217
  629. package/dist/media-cli/resolver.js +0 -494
  630. package/dist/media-cli/resources.d.ts +0 -16
  631. package/dist/media-cli/resources.js +0 -187
  632. package/dist/media-cli/shim.js +0 -52
  633. package/dist/media-cli/tee.d.ts +0 -6
  634. package/dist/media-cli/tee.js +0 -38
  635. package/dist/office-package/zip-sync.js +0 -111
  636. package/dist/remote-execution/binary.js +0 -178
  637. package/dist/remote-execution/callback-result.js +0 -26
  638. package/dist/remote-execution/canonical-capabilities.d.ts +0 -5
  639. package/dist/remote-execution/canonical-capabilities.js +0 -45
  640. package/dist/remote-execution/canonical-metadata.d.ts +0 -4
  641. package/dist/remote-execution/canonical-metadata.js +0 -32
  642. package/dist/remote-execution/client.js +0 -824
  643. package/dist/remote-execution/deployment.js +0 -131
  644. package/dist/remote-execution/descriptors.js +0 -267
  645. package/dist/remote-execution/effects.js +0 -357
  646. package/dist/remote-execution/endpoint.js +0 -224
  647. package/dist/remote-execution/files.js +0 -291
  648. package/dist/remote-execution/hosting-operation.js +0 -26
  649. package/dist/remote-execution/hosting-request.d.ts +0 -4
  650. package/dist/remote-execution/hosting-request.js +0 -12
  651. package/dist/remote-execution/hosting-stream.d.ts +0 -8
  652. package/dist/remote-execution/hosting-stream.js +0 -64
  653. package/dist/remote-execution/index.js +0 -18
  654. package/dist/remote-execution/invocation-admission.d.ts +0 -3
  655. package/dist/remote-execution/invocation-admission.js +0 -17
  656. package/dist/remote-execution/job-binding.js +0 -1269
  657. package/dist/remote-execution/materializations.js +0 -284
  658. package/dist/remote-execution/modal-driver.js +0 -90
  659. package/dist/remote-execution/native-result.d.ts +0 -3
  660. package/dist/remote-execution/native-result.js +0 -16
  661. package/dist/remote-execution/output-freshness.d.ts +0 -4
  662. package/dist/remote-execution/output-freshness.js +0 -19
  663. package/dist/remote-execution/output-retrieval.js +0 -474
  664. package/dist/remote-execution/process-http.js +0 -607
  665. package/dist/remote-execution/process.js +0 -577
  666. package/dist/remote-execution/protocol.js +0 -208
  667. package/dist/remote-execution/relay.js +0 -91
  668. package/dist/remote-execution/rest-driver.js +0 -93
  669. package/dist/remote-execution/upload-descriptor.js +0 -201
  670. package/dist/remote-execution/upload-protocol.js +0 -62
  671. package/dist/remote-execution/uploads.js +0 -324
  672. package/dist/remote-execution/wire-json.d.ts +0 -4
  673. package/dist/remote-execution/wire-json.js +0 -44
  674. package/dist/remote-execution/wire-validation.js +0 -131
  675. package/dist/remote-execution/wire.generated.js +0 -4224
  676. package/dist/safe-bash/chunks/chunk-GDYNCWRV.js +0 -161
  677. package/dist/safe-bash/chunks/chunk-IWDICZVK.js +0 -20
  678. package/dist/safe-bash/chunks/chunk-MHMMRCYC.js +0 -3464
  679. package/dist/safe-bash/chunks/chunk-UE5KZDEK.js +0 -77
  680. package/dist/safe-bash/chunks/csvkit-TACDU7FC.js +0 -1618
  681. package/dist/safe-bash/chunks/implementation-MLFHUQ5M.js +0 -133
  682. package/dist/safe-bash/commands/csvkit/sync.js +0 -1639
  683. package/dist/safe-bash/commands/node/unconfigured.d.ts +0 -3
  684. package/dist/safe-bash/commands/node/unconfigured.js +0 -10
  685. package/dist/safe-bash/commands/pandoc/implementation.d.ts +0 -8
  686. package/dist/safe-bash/commands/pandoc/implementation.js +0 -94
  687. package/dist/safe-bash-mcp/index.browser.js +0 -9167
  688. package/dist/safe-bash/command-chunks/{chunk-ZRRBXU3M.js → chunk-GIN5GUDP.js} +4 -4
  689. package/dist/safe-bash/command-chunks/{chunk-LAOM65EE.js → chunk-IEO4XVN6.js} +3 -3
  690. package/dist/safe-bash/command-chunks/{chunk-BXCXRYVU.js → chunk-JNANXVJV.js} +0 -0
  691. package/dist/safe-bash/command-chunks/{chunk-364TMWBT.js → chunk-MWREVL44.js} +6 -6
  692. package/dist/safe-bash/command-chunks/{chunk-464RVBGB.js → chunk-Q5TDKFHK.js} +3 -3
  693. package/dist/safe-bash/command-chunks/{chunk-AJR3AQYA.js → chunk-UKX3LZHR.js} +0 -0
  694. package/dist/safe-bash/command-chunks/{chunk-XIIBTGC5.js → chunk-XPXEQKRW.js} +9 -9
  695. package/dist/safe-bash/command-chunks/{chunk-FDBUV4HJ.js → chunk-Y4HGTG3E.js} +3 -3
  696. /package/dist/{safe-bash/commands/csvkit → safe-bash-command-csvkit}/sync.d.ts +0 -0
@@ -1,824 +0,0 @@
1
- import { parseWireJson } from './wire-json.js';
2
- import { validateDependencyManifest, validateDependencyMaterialization, validateManifestInvocation } from './protocol.js';
3
- import { retrieveOutputs } from './output-retrieval.js';
4
- import { binaryContentType, decodeFrames, encodeFrame } from './binary.js';
5
- import { validateWire } from './wire-validation.js';
6
- import { uploadRouteId, uploadByteLength, validateUploadState } from './upload-protocol.js';
7
- // Replacement clients retain receipt evidence through the caller-owned session.
8
- // Origins scope opaque job identities; weak ownership releases disposed sessions.
9
- const jobReceipts = new WeakMap();
10
- // Cursor delivery evidence remains bound even when a new client reconnects.
11
- // Weak ownership does not retain completed streams or caller sinks.
12
- const streamDeliveries = new WeakMap();
13
- export class RemoteExecutionError extends Error {
14
- phase;
15
- recovery;
16
- status;
17
- get category() { return this.status === 401 || this.status === 403 ? 'authorization' : this.status !== undefined && this.status >= 400 && this.status < 500 && this.status !== 410 ? 'protocol' : 'transport'; }
18
- constructor(message, phase, recovery, status, options) {
19
- super(message, options);
20
- this.phase = phase;
21
- this.recovery = recovery;
22
- this.status = status;
23
- this.name = 'RemoteExecutionError';
24
- }
25
- }
26
- /** Validated service diagnostics, kept separate from caller recovery authority. */
27
- export class RemoteServiceError extends RemoteExecutionError {
28
- failure;
29
- constructor(failure, recovery, status) { super(failure.message, failure.phase, recovery, status); this.name = 'RemoteServiceError'; this.failure = Object.freeze(structuredClone(failure)); }
30
- get category() { return this.status === 401 || this.status === 403 ? 'authorization' : this.failure.category; }
31
- get code() { return this.failure.code; }
32
- get path() { return this.failure.path; }
33
- get syscall() { return this.failure.syscall; }
34
- get acknowledgedBytes() { return this.failure.acknowledgedBytes; }
35
- }
36
- export class UnrecoverableTransportError extends RemoteExecutionError {
37
- code = 'unrecoverable';
38
- recoveryActions = ['inspect', 'recover-partial-outputs', 'reauthorize', 'start-new-invocation'];
39
- constructor(recovery, options) { super('Retained transport state is unavailable; explicit recovery is required', 'unknown', recovery, 410, options); this.name = 'UnrecoverableTransportError'; }
40
- }
41
- /** Portable authenticated v1 SDK. Mutations are never automatically retried. A
42
- * dropped response carries recovery identity; inspect its key before resubmission. */
43
- export function createClient(options) {
44
- const base = new URL(options.baseUrl);
45
- if (base.protocol !== 'https:' || base.username || base.password || base.search || base.hash || base.pathname !== '/')
46
- throw new TypeError('An authenticated HTTPS origin is required');
47
- const transport = options.fetch ?? globalThis.fetch;
48
- const max = options.maxResponseBytes ?? 1048576;
49
- const batch = options.maxInputBatchBytes ?? 1048576;
50
- const concurrency = options.maxConcurrentUploads ?? 1;
51
- let activeUploads = 0;
52
- let authenticating = 0;
53
- let activeUploadControls = 0;
54
- let activeUploadRetirements = 0;
55
- for (const n of [max, batch, concurrency])
56
- if (!Number.isSafeInteger(n) || n < 1)
57
- throw new TypeError('Invalid SDK bound');
58
- function ownerPath(s, id, owner) { return path(s, `${owner}/${encodeURIComponent(id)}`); }
59
- function path(s, suffix = '') { return `sessions/${uploadRouteId(s.sessionId)}${suffix ? '/' + suffix : ''}`; }
60
- async function response(requestPath, method, body, s, key, contentType, signal, recovery, extra) {
61
- signal?.throwIfAborted();
62
- if (authenticating >= concurrency)
63
- throw new RemoteExecutionError('SDK credential concurrency bound', 'notAccepted', recovery, 429);
64
- // Credential renewal must not move an admitted request to another session
65
- // epoch or change the scope against which its receipt is checked.
66
- s = s ? { ...s } : undefined;
67
- const headers = new Headers(extra);
68
- let token;
69
- let abort;
70
- const canceled = new Promise((_, reject) => {
71
- abort = () => reject(signal.reason);
72
- signal?.addEventListener('abort', abort, { once: true });
73
- });
74
- try {
75
- // Cancellation releases the caller, but uncooperative credential work
76
- // retains its separate admission slot until settlement.
77
- authenticating++;
78
- const credentials = (async () => { try {
79
- return await options.token();
80
- }
81
- finally {
82
- authenticating--;
83
- } })();
84
- token = await Promise.race([credentials, canceled]);
85
- }
86
- catch (cause) {
87
- if (signal?.aborted)
88
- throw signal.reason;
89
- throw new RemoteExecutionError('Remote credentials unavailable', 'notAccepted', recovery, 401, { cause });
90
- }
91
- finally {
92
- signal?.removeEventListener('abort', abort);
93
- }
94
- signal?.throwIfAborted();
95
- headers.set('Authorization', 'Bearer ' + token);
96
- headers.set('Execution-Protocol', '1');
97
- if (s)
98
- headers.set('Execution-Epoch', s.epoch);
99
- if (key)
100
- headers.set('Idempotency-Key', key);
101
- if (contentType)
102
- headers.set('Content-Type', contentType);
103
- let result;
104
- try {
105
- result = await transport(new URL('/v1/' + requestPath, base), { method, body, headers, signal, redirect: 'error' });
106
- }
107
- catch (cause) {
108
- if (signal?.aborted)
109
- throw signal.reason;
110
- throw new RemoteExecutionError('Transport interrupted; inspect the retained operation before retrying', 'unknown', recovery, undefined, { cause });
111
- }
112
- if (signal?.aborted) {
113
- await result.body?.cancel().catch(() => { });
114
- throw signal.reason;
115
- }
116
- if (!result.ok || s && result.headers.get('Execution-Epoch') !== s.epoch) {
117
- if (!result.ok && result.status !== 410 && (!s || result.headers?.get('Execution-Epoch') === s.epoch) && result.headers?.get('Content-Type')?.split(';')[0].trim() === 'application/json') {
118
- let failure;
119
- try {
120
- failure = await document(result, 'Failure', recovery, signal);
121
- }
122
- catch (cause) {
123
- if (signal?.aborted)
124
- throw signal.reason;
125
- throw new RemoteExecutionError('Remote failure receipt is invalid; inspect the retained operation', result.status >= 500 ? 'unknown' : 'notAccepted', recovery, result.status, { cause });
126
- }
127
- // Native observations belong to job metadata, never to a failed HTTP
128
- // operation. A provider diagnostic cannot establish tool termination.
129
- if (failure.category === 'native' && result.status !== 401 && result.status !== 403)
130
- throw new RemoteExecutionError('HTTP failure cannot establish a native outcome; inspect the retained invocation', 'unknown', recovery, 502);
131
- throw new RemoteServiceError(failure, recovery, result.status);
132
- }
133
- // Disposal cannot erase an observed authorization failure or replay gap.
134
- // Preserve its cause within the classified result and recovery identity.
135
- let disposal;
136
- try {
137
- await result.body?.cancel();
138
- }
139
- catch (cause) {
140
- disposal = { cause };
141
- }
142
- if (result.status === 410 || result.ok)
143
- throw new UnrecoverableTransportError(recovery, disposal);
144
- throw new RemoteExecutionError('Remote request failed', result.status >= 500 ? 'unknown' : 'notAccepted', recovery, result.status, disposal);
145
- }
146
- return result;
147
- }
148
- async function document(result, schema, recovery = {}, signal) {
149
- const reader = result.body?.getReader();
150
- if (!reader)
151
- throw new RemoteExecutionError('Missing remote control document; inspect retained operation', 'unknown', recovery, 502);
152
- const chunks = [];
153
- let length = 0;
154
- const abort = () => { void reader.cancel(signal?.reason).catch(() => { }); };
155
- signal?.addEventListener('abort', abort, { once: true });
156
- try {
157
- signal?.throwIfAborted();
158
- for (;;) {
159
- let part;
160
- try {
161
- part = await reader.read();
162
- }
163
- catch (cause) {
164
- if (signal?.aborted)
165
- throw signal.reason;
166
- throw new RemoteExecutionError('Remote control delivery interrupted; inspect retained operation', 'unknown', recovery, undefined, { cause });
167
- }
168
- signal?.throwIfAborted();
169
- if (part.done)
170
- break;
171
- if (!(part.value instanceof Uint8Array))
172
- throw new RemoteExecutionError('Remote control response requires binary bytes; inspect retained operation', 'unknown', recovery, 502);
173
- // Admit native storage before copying; producer-owned length properties
174
- // cannot bypass the allocation bound. Empty fragments retain no buffers.
175
- const span = uploadByteLength(part.value);
176
- if (span > max - length)
177
- throw new RemoteExecutionError('Control response exceeds bound; inspect retained operation', 'unknown', recovery, 502);
178
- if (span) {
179
- chunks.push(new Uint8Array(part.value));
180
- length += span;
181
- }
182
- }
183
- const bytes = new Uint8Array(length);
184
- let offset = 0;
185
- for (const chunk of chunks) {
186
- bytes.set(chunk, offset);
187
- offset += chunk.length;
188
- }
189
- let value;
190
- try {
191
- value = parseWireJson(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
192
- validateWire(schema, value);
193
- if (schema === 'Blob')
194
- uploadRouteId(value.blobId);
195
- }
196
- catch (cause) {
197
- throw new RemoteExecutionError('Remote control receipt is invalid; inspect retained operation before retrying', 'unknown', recovery, 502, { cause });
198
- }
199
- if (schema === 'Upload') {
200
- try {
201
- validateUploadState(value);
202
- }
203
- catch (cause) {
204
- throw new RemoteExecutionError('Upload status is inconsistent; inspect before recovery', 'unknown', recovery, 502, { cause });
205
- }
206
- }
207
- if (schema === 'DependencyMaterialization') {
208
- try {
209
- validateDependencyMaterialization(value);
210
- }
211
- catch (cause) {
212
- throw new RemoteExecutionError('Dependency readiness receipt is inconsistent; inspect before recovery', 'unknown', recovery, 502, { cause });
213
- }
214
- }
215
- return value;
216
- }
217
- finally {
218
- signal?.removeEventListener('abort', abort);
219
- await reader.cancel().catch(() => { });
220
- reader.releaseLock();
221
- }
222
- }
223
- async function control(requestPath, responseSchema, method = 'GET', body, s, key, signal, recovery = {}, profile) {
224
- const identity = { ...s, ...recovery, ...(key ? { operationKey: key } : {}) };
225
- signal?.throwIfAborted();
226
- const uploadControl = responseSchema === 'Upload' || responseSchema === 'Blob';
227
- const retirement = uploadControl && method === 'DELETE';
228
- if (uploadControl && (retirement ? activeUploadRetirements : activeUploadControls) >= concurrency)
229
- throw new RemoteExecutionError('Upload client metadata concurrency bound', 'notAccepted', identity, 429);
230
- if (retirement)
231
- activeUploadRetirements++;
232
- else if (uploadControl)
233
- activeUploadControls++;
234
- try {
235
- // Pin the submitted binding before credential acquisition yields. A valid
236
- // document for a different invocation is not evidence of our acceptance.
237
- const submitted = responseSchema === 'Job' && body && typeof body === 'object' && 'buildDigest' in body
238
- ? { buildDigest: body.buildDigest, invocationId: key } : undefined;
239
- const result = await response(requestPath, method, body === undefined ? undefined : JSON.stringify(body), s, key, body === undefined ? undefined : 'application/json', signal, identity, profile ? { 'Execution-Profile': profile } : undefined);
240
- if (profile && result.headers.get('Execution-Profile') !== profile) {
241
- await result.body?.cancel().catch(() => { });
242
- throw new RemoteExecutionError('Dependency profile response mismatch', 'unknown', identity, 502);
243
- }
244
- const value = await document(result, responseSchema, identity, signal);
245
- if (responseSchema === 'EffectManifest' && value.jobId !== identity.jobId) {
246
- throw new RemoteExecutionError('Effect manifest job binding mismatch; inspect the requested invocation', 'unknown', identity, 502);
247
- }
248
- if (responseSchema === 'Upload' && method === 'POST') {
249
- try {
250
- const replay = result.headers.get('Upload-Replayed');
251
- if (replay !== 'true' && replay !== 'false')
252
- throw new TypeError('Missing or invalid upload creation replay receipt');
253
- validateUploadState(value, replay === 'true');
254
- }
255
- catch (cause) {
256
- throw new RemoteExecutionError('Upload creation receipt is inconsistent; inspect before recovery', 'unknown', identity, 502, { cause });
257
- }
258
- }
259
- if (responseSchema === 'Job') {
260
- const job = value;
261
- if (job.sessionId !== identity.sessionId || job.epoch !== identity.epoch
262
- || identity.jobId !== undefined && job.jobId !== identity.jobId
263
- || submitted && (job.buildDigest !== submitted.buildDigest || job.invocationId !== submitted.invocationId)) {
264
- throw new RemoteExecutionError('Job receipt binding mismatch; inspect the original invocation before recovery', 'unknown', identity, 502);
265
- }
266
- if (job.outputComplete && (job.state !== 'terminal' || job.cleanup !== 'complete'
267
- || !job.jobState || job.jobState.stage !== 'io-settled' || job.jobState.outputComplete !== true || job.jobState.cleanup !== 'complete')) {
268
- throw new RemoteExecutionError('Job receipt does not establish I/O settlement; inspect the retained invocation', 'unknown', identity, 502);
269
- }
270
- if (job.jobState) {
271
- const durable = job.jobState;
272
- // Admit the durable barrier independently of the live output flag.
273
- // A malformed settlement must never become retained reconnect evidence.
274
- if (durable.stage === 'io-settled' && (durable.outputComplete !== true || durable.cleanup !== 'complete')) {
275
- throw new RemoteExecutionError('Durable I/O settlement requires complete output and cleanup; inspect the retained invocation', 'unknown', identity, 502);
276
- }
277
- const observed = durable.processOutcome;
278
- const confirmed = observed && (observed.kind === 'exited' || observed.kind === 'signaled'
279
- || observed.kind === 'canceled' && observed.terminationConfirmed);
280
- if (durable.cancelActed && !durable.cancelRequested) {
281
- throw new RemoteExecutionError('Cancellation action receipt requires a request; inspect the retained invocation', 'unknown', identity, 502);
282
- }
283
- // Live observations may lead durable publication, but cannot retract
284
- // progress already established by that invocation's durable receipt.
285
- if (BigInt(job.effectBarrier) < BigInt(durable.effectBarrier)
286
- || durable.cancelRequested === true && !job.cancelRequested
287
- || durable.outputComplete === true && !job.outputComplete
288
- || durable.cleanup === 'complete' && job.cleanup !== 'complete') {
289
- throw new RemoteExecutionError('Job receipt retracts durable settlement progress; inspect the retained invocation', 'unknown', identity, 502);
290
- }
291
- // In-flight effects and cancellation requests can lead persistence.
292
- // Immutable retention and confirmed native observations cannot disagree,
293
- // even while output remains incomplete and reconnect is still possible.
294
- if (Date.parse(job.retainedUntil) !== durable.retainedUntil
295
- || (durable.stage === 'accepted' || durable.stage === 'running') && observed
296
- || (durable.stage === 'process-exited' || durable.stage === 'io-settled') && !confirmed
297
- || observed && !confirmed
298
- || confirmed && job.processOutcome && (Object.keys(job.processOutcome).length !== Object.keys(observed).length
299
- || Object.entries(observed).some(([field, entry]) => Reflect.get(job.processOutcome, field) !== entry))) {
300
- throw new RemoteExecutionError('Job receipt contradicts durable native evidence; inspect the retained invocation', 'unknown', identity, 502);
301
- }
302
- }
303
- if (job.outputComplete && job.jobState) {
304
- const durable = job.jobState;
305
- const observed = durable.processOutcome;
306
- // A settled native observation has only scalar fields. Compare those
307
- // fields independently of JSON key order; transport/provider outcomes
308
- // cannot qualify this barrier. Incomplete inspection may still expose
309
- // a known process exit alongside an unknown lifecycle outcome.
310
- const confirmed = observed && (observed.kind === 'exited' || observed.kind === 'signaled'
311
- || observed.kind === 'canceled' && observed.terminationConfirmed);
312
- const outcomes = [job.outcome, ...(job.processOutcome ? [job.processOutcome] : [])];
313
- if (!confirmed || outcomes.some(outcome => !outcome
314
- || Object.keys(outcome).length !== Object.keys(observed).length
315
- || Object.entries(observed).some(([field, entry]) => Reflect.get(outcome, field) !== entry))
316
- || job.effectBarrier !== durable.effectBarrier
317
- || Date.parse(job.retainedUntil) !== durable.retainedUntil
318
- || job.cancelRequested !== (durable.cancelRequested === true)) {
319
- throw new RemoteExecutionError('Final job receipt contradicts durable settlement; inspect the retained invocation', 'unknown', identity, 502);
320
- }
321
- }
322
- if (s) {
323
- const origins = jobReceipts.get(s) ?? new Map();
324
- const receipts = origins.get(base.origin) ?? new Map();
325
- const prior = receipts.get(job.jobId)
326
- ?? [...receipts.values()].find(receipt => receipt.sessionId === job.sessionId
327
- && receipt.epoch === job.epoch && receipt.invocationId !== undefined && receipt.invocationId === job.invocationId);
328
- if (prior && prior.sessionId === job.sessionId && prior.epoch === job.epoch) {
329
- const before = prior.jobState;
330
- const after = job.jobState;
331
- // JSON object field order is irrelevant to immutable wire evidence.
332
- const equal = (left, right) => {
333
- if (left === right)
334
- return true;
335
- if (!left || !right || typeof left !== 'object' || typeof right !== 'object')
336
- return false;
337
- const fields = Object.keys(left);
338
- return fields.length === Object.keys(right).length
339
- && fields.every(field => Object.hasOwn(right, field) && equal(Reflect.get(left, field), Reflect.get(right, field)));
340
- };
341
- const stages = ['accepted', 'running', 'process-exited', 'io-settled', 'unknown-outcome', 'sandbox-lost'];
342
- if (prior.jobId !== job.jobId || prior.invocationId !== job.invocationId || prior.buildDigest !== job.buildDigest
343
- || Date.parse(prior.retainedUntil) !== Date.parse(job.retainedUntil)
344
- // A live receipt can precede its journal write. Once delivered,
345
- // those observations remain evidence during reconnect as well.
346
- || BigInt(job.effectBarrier) < BigInt(prior.effectBarrier)
347
- || prior.outputComplete && job.effectBarrier !== prior.effectBarrier
348
- || prior.processOutcome && !equal(prior.processOutcome, job.processOutcome)
349
- || prior.cancelRequested && !job.cancelRequested
350
- || prior.outputComplete && !job.outputComplete
351
- || prior.cleanup === 'complete' && job.cleanup !== 'complete'
352
- || before && (!after || BigInt(after.sequence) < BigInt(before.sequence)
353
- || after.sequence === before.sequence && !equal(before, after)
354
- || stages.indexOf(after.stage) < stages.indexOf(before.stage)
355
- || BigInt(after.effectBarrier) < BigInt(before.effectBarrier)
356
- || before.outputComplete && before.cleanup === 'complete' && after.effectBarrier !== before.effectBarrier
357
- || before.processOutcome && !equal(before.processOutcome, after.processOutcome)
358
- // Loss preserves earlier exit evidence but closes observation
359
- // authority. Credential renewal cannot invent a later native exit.
360
- || (before.stage === 'unknown-outcome' || before.stage === 'sandbox-lost')
361
- && (!before.processOutcome && after.processOutcome || !prior.processOutcome && job.processOutcome)
362
- // Exit and loss close cancellation action authority. A later
363
- // request remains observable, but cannot manufacture a signal
364
- // receipt after that durable boundary across reconnects.
365
- || !before.cancelActed && after.cancelActed
366
- && (before.processOutcome || before.stage === 'unknown-outcome' || before.stage === 'sandbox-lost')
367
- || before.cancelRequested && !after.cancelRequested || before.cancelActed && !after.cancelActed
368
- || before.outputComplete && !after.outputComplete
369
- || before.cleanup === 'complete' && after.cleanup !== 'complete')) {
370
- throw new UnrecoverableTransportError({ ...identity, jobId: prior.jobId });
371
- }
372
- }
373
- receipts.set(job.jobId, structuredClone(job));
374
- origins.set(base.origin, receipts);
375
- jobReceipts.set(s, origins);
376
- }
377
- }
378
- return value;
379
- }
380
- finally {
381
- if (retirement)
382
- activeUploadRetirements--;
383
- else if (uploadControl)
384
- activeUploadControls--;
385
- }
386
- }
387
- const client = {
388
- capabilities(signal) { return control('capabilities', 'Capabilities', 'GET', undefined, undefined, undefined, signal); },
389
- openSession(input, key, signal) { validateWire('SessionRequest', input); return control('sessions', 'Session', 'POST', input, undefined, key, signal); },
390
- inspectSession(s, signal) { return control(path(s), 'Session', 'GET', undefined, s, undefined, signal); },
391
- renewSession(s, leaseMs, key, signal) { return control(path(s, 'lease'), 'Session', 'POST', { leaseMs }, s, key, signal); },
392
- closeSession(s, key, signal) { return control(path(s), 'Session', 'DELETE', undefined, s, key, signal); },
393
- inspectOperation(key, s, signal) { return control(s ? path(s, 'operations/' + encodeURIComponent(key)) : 'operations/' + encodeURIComponent(key), 'OperationLookup', 'GET', undefined, s, undefined, signal, { operationKey: key }); },
394
- async putDependencyManifest(s, input, key, signal) {
395
- validateDependencyManifest(input, { maxEntries: max, maxPathBytes: max });
396
- if (input.sessionId !== s.sessionId || input.epoch !== s.epoch)
397
- throw new TypeError('Dependency manifest session mismatch');
398
- const revision = input.revision;
399
- const receipt = await control(path(s, 'manifests'), 'StoredManifest', 'POST', input, s, key, signal, {}, 'dependency-manifest-v1');
400
- if (receipt.revision !== revision)
401
- throw new RemoteExecutionError('Dependency manifest receipt mismatch', 'unknown', { ...s, operationKey: key }, 502);
402
- return receipt;
403
- },
404
- async getDependencyManifest(s, id, signal) {
405
- const manifest = await control(path(s, 'manifests/' + encodeURIComponent(id)), 'DependencyManifest', 'GET', undefined, s, undefined, signal, { operationId: id }, 'dependency-manifest-v1');
406
- validateDependencyManifest(manifest, { maxEntries: max, maxPathBytes: max });
407
- if (manifest.sessionId !== s.sessionId || manifest.epoch !== s.epoch)
408
- throw new RemoteExecutionError('Dependency manifest authority mismatch', 'unknown', { ...s, operationId: id }, 502);
409
- return manifest;
410
- },
411
- async prepareDependencies(s, input, key, signal) {
412
- validateWire('DependencyMaterializeRequest', input);
413
- if (input.sessionId !== s.sessionId || input.epoch !== s.epoch || input.operationKey !== key)
414
- throw new TypeError('Dependency preparation session/key mismatch');
415
- const expected = { manifestId: input.manifestId, manifestRevision: input.manifestRevision };
416
- const receipt = await control(path(s, 'materializations'), 'DependencyMaterialization', 'POST', input, s, key, signal, {}, 'dependency-manifest-v1');
417
- if (receipt.manifestId !== expected.manifestId || receipt.manifestRevision !== expected.manifestRevision)
418
- throw new RemoteExecutionError('Dependency preparation receipt mismatch', 'unknown', { ...s, operationKey: key }, 502);
419
- return receipt;
420
- },
421
- async inspectDependencies(s, id, signal) {
422
- const receipt = await control(path(s, 'materializations/' + encodeURIComponent(id)), 'DependencyMaterialization', 'GET', undefined, s, undefined, signal, { operationId: id }, 'dependency-manifest-v1');
423
- if (receipt.operationId !== id)
424
- throw new RemoteExecutionError('Dependency preparation identity mismatch', 'unknown', { ...s, operationId: id }, 502);
425
- return receipt;
426
- },
427
- async submitDependencyJob(s, input, key, signal) {
428
- validateWire('DependencyJobRequest', input);
429
- validateManifestInvocation(input.dependencyBinding.invocation, { maxArguments: input.limits.maxArgvBytes, maxArgvBytes: input.limits.maxArgvBytes, maxPathBytes: max });
430
- return control(path(s, 'jobs'), 'Job', 'POST', input, s, key, signal, {}, 'dependency-manifest-v1');
431
- },
432
- async beginUpload(s, input, key, signal) {
433
- signal?.throwIfAborted();
434
- if (!input || typeof input !== 'object' || Array.isArray(input))
435
- throw new TypeError('Invalid upload request');
436
- // Validate the owned declaration sent to the server, observing caller
437
- // getters once so admission cannot bind a different size or digest.
438
- const declaration = { ...input };
439
- validateWire('UploadRequest', declaration);
440
- const recovery = { ...s, operationKey: key };
441
- const receipt = await control(path(s, 'uploads'), 'Upload', 'POST', declaration, s, key, signal, recovery);
442
- if (receipt.size !== declaration.size || receipt.digest !== declaration.digest)
443
- throw new RemoteExecutionError('Upload receipt declaration mismatch; inspect before retrying', 'unknown', recovery, 502);
444
- return receipt;
445
- },
446
- async inspectUpload(s, id, signal) {
447
- const recovery = { ...s, operationId: id };
448
- const receipt = await control(path(s, 'uploads/' + uploadRouteId(id)), 'Upload', 'GET', undefined, s, undefined, signal, recovery);
449
- if (receipt.uploadId !== id)
450
- throw new RemoteExecutionError('Upload receipt identity mismatch', 'unknown', recovery, 502);
451
- return receipt;
452
- },
453
- async uploadChunk(s, id, offset, bytes, digestHeader, key, signal) {
454
- signal?.throwIfAborted();
455
- if (typeof offset !== 'bigint')
456
- throw new TypeError('Upload chunk offset must be bigint');
457
- if (!(bytes instanceof Uint8Array))
458
- throw new TypeError('Binary upload chunk required');
459
- validateWire('Uint64', String(offset));
460
- if (uploadByteLength(bytes) > batch)
461
- throw new TypeError('Upload chunk exceeds SDK bound');
462
- if (!uploadByteLength(bytes))
463
- throw new TypeError('Empty chunk; commit zero-length uploads directly');
464
- const end = offset + BigInt(uploadByteLength(bytes));
465
- validateWire('Uint64', String(end));
466
- const recovery = { ...s, operationId: id, operationKey: key };
467
- if (activeUploads >= concurrency)
468
- throw new RemoteExecutionError('Upload client concurrency bound', 'notAccepted', recovery, 429);
469
- activeUploads++;
470
- try {
471
- const result = await response(path(s, `uploads/${uploadRouteId(id)}/bytes`), 'PUT', new Uint8Array(bytes), s, key, 'application/octet-stream', signal, recovery, { 'Upload-Offset': String(offset), 'Content-Length': String(uploadByteLength(bytes)), 'Content-Digest': digestHeader });
472
- const receipt = await document(result, 'Upload', recovery, signal);
473
- const replay = result.headers.get('Upload-Replayed');
474
- const acknowledged = BigInt(receipt.committedOffset);
475
- if (receipt.uploadId !== id || receipt.state !== 'open' || acknowledged > BigInt(receipt.size)
476
- || (replay !== 'true' && replay !== 'false') || acknowledged < end || (replay === 'false' && acknowledged !== end)) {
477
- throw new RemoteExecutionError('Upload chunk acknowledgement mismatch; inspect before retrying', 'unknown', recovery, 502);
478
- }
479
- return { ...receipt, replayed: replay === 'true' };
480
- }
481
- finally {
482
- activeUploads--;
483
- }
484
- },
485
- commitUpload(s, id, key, signal) { return control(path(s, `uploads/${uploadRouteId(id)}/commit`), 'Blob', 'POST', undefined, s, key, signal, { operationId: id }); },
486
- async abortUpload(s, id, key, signal) {
487
- const recovery = { ...s, operationId: id, operationKey: key };
488
- const receipt = await control(path(s, 'uploads/' + uploadRouteId(id)), 'Upload', 'DELETE', undefined, s, key, signal, recovery);
489
- if (receipt.uploadId !== id || receipt.state !== 'aborted')
490
- throw new RemoteExecutionError('Upload abort acknowledgement mismatch; inspect before retrying', 'unknown', recovery, 502);
491
- return receipt;
492
- },
493
- async inspectBlob(s, id, signal) {
494
- const recovery = { ...s, operationId: id };
495
- const receipt = await control(path(s, 'blobs/' + uploadRouteId(id)), 'Blob', 'GET', undefined, s, undefined, signal, recovery);
496
- if (receipt.blobId !== id)
497
- throw new RemoteExecutionError('Blob receipt identity mismatch', 'unknown', recovery, 502);
498
- return receipt;
499
- },
500
- async readBlobRange(s, id, start, endInclusive, signal) {
501
- if (typeof start !== 'bigint' || (endInclusive !== undefined && typeof endInclusive !== 'bigint'))
502
- throw new TypeError('Blob range offsets must be bigint');
503
- validateWire('Uint64', String(start));
504
- if (endInclusive !== undefined) {
505
- validateWire('Uint64', String(endInclusive));
506
- if (endInclusive < start)
507
- throw new TypeError('Invalid range');
508
- }
509
- return response(path(s, `blobs/${uploadRouteId(id)}/bytes`), 'GET', undefined, s, undefined, undefined, signal, { ...s, operationId: id }, { Range: `bytes=${start}-${endInclusive ?? ''}` });
510
- },
511
- async putManifest(s, exactJson, key, signal) {
512
- if (exactJson.length > max)
513
- throw new TypeError('Manifest document exceeds bound');
514
- validateWire('Manifest', parseWireJson(new TextDecoder('utf-8', { fatal: true }).decode(exactJson)));
515
- const result = await response(path(s, 'manifests'), 'POST', new Uint8Array(exactJson), s, key, 'application/json', signal, { ...s, operationKey: key });
516
- return document(result, 'ManifestReceipt', { ...s, operationKey: key }, signal);
517
- },
518
- getManifest(s, id, signal) { return control(path(s, 'manifests/' + encodeURIComponent(id)), 'Manifest', 'GET', undefined, s, undefined, signal); },
519
- openFile(s, input, key, signal) { validateWire('FileOpenRequest', input); return control(path(s, 'file-handles'), 'FileHandle', 'POST', input, s, key, signal); },
520
- fileMetadata(s, id, signal) { return control(path(s, 'file-handles/' + encodeURIComponent(id)), 'FileMetadata', 'GET', undefined, s, undefined, signal); },
521
- closeFile(s, id, key, signal) { return control(path(s, 'file-handles/' + encodeURIComponent(id)), 'Released', 'DELETE', undefined, s, key, signal); },
522
- listFiles(s, input, key, signal) { validateWire('FileListRequest', input); return control(path(s, 'file-listings'), 'FileListing', 'POST', input, s, key, signal); },
523
- async readFileRange(s, id, start, endInclusive, signal) { validateWire('Uint64', String(start)); if (endInclusive !== undefined) {
524
- validateWire('Uint64', String(endInclusive));
525
- if (endInclusive < start)
526
- throw new TypeError('Invalid file range');
527
- } return response(path(s, `file-handles/${encodeURIComponent(id)}/bytes`), 'GET', undefined, s, undefined, undefined, signal, { ...s, operationId: id }, { Range: `bytes=${start}-${endInclusive ?? ''}` }); },
528
- materialize(s, input, key, signal) { validateWire('MaterializeRequest', input); return control(path(s, 'materializations'), 'Materialization', 'POST', input, s, key, signal); },
529
- inspectMaterialization(s, id, signal) { return control(path(s, 'materializations/' + encodeURIComponent(id)), 'Materialization', 'GET', undefined, s, undefined, signal); },
530
- submitJob(s, input, key, signal) { validateWire('JobRequest', input); return control(path(s, 'jobs'), 'Job', 'POST', input, s, key, signal); },
531
- async listJobs(s, signal) { const result = await response(path(s, 'jobs'), 'GET', undefined, s, undefined, undefined, signal, s); return document(result, 'JobList', s, signal); },
532
- inspectJob(s, id, signal) { return control(path(s, 'jobs/' + encodeURIComponent(id)), 'Job', 'GET', undefined, s, undefined, signal, { jobId: id }); },
533
- inspectEffects(s, id, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/effects`), 'EffectManifest', 'GET', undefined, s, undefined, signal, { jobId: id }); },
534
- outputMetadata(s, id, identityId, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/outputs/${encodeURIComponent(identityId)}`), 'FileMetadata', 'GET', undefined, s, undefined, signal, { jobId: id }); },
535
- async readOutputRange(s, id, identityId, start, endInclusive, signal, version) {
536
- s = { ...s };
537
- validateWire('Uint64', String(start));
538
- if (endInclusive !== undefined) {
539
- validateWire('Uint64', String(endInclusive));
540
- if (endInclusive < start)
541
- throw new TypeError('Invalid output range');
542
- }
543
- const result = await response(path(s, `jobs/${encodeURIComponent(id)}/outputs/${encodeURIComponent(identityId)}/bytes`), 'GET', undefined, s, undefined, undefined, signal, { jobId: id }, { Range: `bytes=${start}-${endInclusive ?? ''}`, ...(version ? { 'If-Match': version } : {}) });
544
- let expectedBytes;
545
- try {
546
- const range = result.headers.get('Content-Range')?.split(' ');
547
- if (version && result.headers.get('ETag') !== version)
548
- throw new TypeError('Output source identity or version changed');
549
- const extent = range?.[1]?.split('/');
550
- const bounds = extent?.[0]?.split('-');
551
- if (result.status !== 206 || result.headers.get('Content-Type') !== 'application/octet-stream' || range?.length !== 2 || range[0] !== 'bytes' || extent?.length !== 2 || bounds?.length !== 2)
552
- throw new TypeError('Invalid output range response');
553
- for (const value of [...bounds, extent[1]])
554
- validateWire('Uint64', value);
555
- const first = BigInt(bounds[0]);
556
- const last = BigInt(bounds[1]);
557
- const size = BigInt(extent[1]);
558
- const expectedLast = endInclusive === undefined || endInclusive >= size ? size - 1n : endInclusive;
559
- if (first !== start || last < first || last >= size || last !== expectedLast)
560
- throw new TypeError('Invalid output range response');
561
- expectedBytes = last - first + 1n;
562
- const length = result.headers.get('Content-Length');
563
- if (length !== null) {
564
- validateWire('Uint64', length);
565
- if (BigInt(length) !== last - first + 1n)
566
- throw new TypeError('Invalid output range response');
567
- }
568
- }
569
- catch (cause) {
570
- const error = new TypeError('Invalid output range response', { cause });
571
- try {
572
- await result.body?.cancel();
573
- }
574
- catch (cleanup) {
575
- throw new AggregateError([error, cleanup], 'Output range response cleanup failed', { cause: error });
576
- }
577
- throw error;
578
- }
579
- if (!result.body)
580
- throw new TypeError('Missing output range body');
581
- const recovery = { ...s, jobId: id };
582
- const reader = result.body.getReader();
583
- const source = new ReadableStream({
584
- async pull(controller) {
585
- try {
586
- const part = await reader.read();
587
- if (part.done) {
588
- reader.releaseLock();
589
- controller.close();
590
- }
591
- else
592
- controller.enqueue(part.value);
593
- }
594
- catch (cause) {
595
- reader.releaseLock();
596
- const status = cause instanceof Error ? cause.status : undefined;
597
- controller.error(signal?.aborted ? signal.reason : status === 410 ? new UnrecoverableTransportError(recovery, { cause }) : new RemoteExecutionError('Output range delivery interrupted; inspect retained output before retrying', 'unknown', recovery, status === 401 || status === 403 ? status : undefined, { cause }));
598
- }
599
- },
600
- async cancel(reason) { try {
601
- await reader.cancel(reason);
602
- }
603
- finally {
604
- reader.releaseLock();
605
- } },
606
- }, { highWaterMark: 0 });
607
- let received = 0n;
608
- const body = source.pipeThrough(new TransformStream({
609
- transform(bytes, controller) {
610
- if (!(bytes instanceof Uint8Array))
611
- throw new TypeError('Output range contains invalid bytes');
612
- received += BigInt(uploadByteLength(bytes));
613
- if (received > expectedBytes)
614
- throw new TypeError('Output range exceeds its receipt');
615
- controller.enqueue(bytes);
616
- },
617
- flush() { if (received !== expectedBytes)
618
- throw new RemoteExecutionError('Output range interrupted; inspect retained output before retrying', 'unknown', recovery); },
619
- }), { signal });
620
- return new Response(body, { status: result.status, statusText: result.statusText, headers: result.headers });
621
- },
622
- async retrieveJobOutputs(s, id, logicalRoot, destination, cursor, signal) {
623
- s = { ...s };
624
- const manifest = await client.inspectEffects(s, id, signal);
625
- const bindings = new Map();
626
- const identities = new Map([...cursor?.sources?.values() ?? []].map(value => [value.identityId, value.identity]));
627
- async function metadata(identity, signal, version) {
628
- const result = await response(path(s, `jobs/${encodeURIComponent(id)}/outputs/${encodeURIComponent(identity)}`), 'GET', undefined, s, undefined, undefined, signal, { jobId: id }, version ? { 'If-Match': version } : undefined);
629
- const etag = result.headers.get('ETag');
630
- const value = await document(result, 'FileMetadata', { ...s, jobId: id }, signal);
631
- if (version && etag !== version)
632
- throw new Error('Output source identity or version changed');
633
- return { value, etag };
634
- }
635
- return retrieveOutputs(manifest, logicalRoot, {
636
- scope: JSON.stringify([base.href, s.sessionId, s.epoch, id]),
637
- async freshness(identity, signal) {
638
- const { etag } = await metadata(identity, signal);
639
- // Only strong, server-qualified representation validators authorize
640
- // preservation of an acknowledged prefix across requests.
641
- if (!etag || !etag.startsWith('"') || !etag.endsWith('"') || etag.length < 3 || etag.length > 256)
642
- return undefined;
643
- const guard = { identity: identities.get(identity) ?? {}, version: etag, async assertCurrent(signal) { await metadata(identity, signal, etag); } };
644
- bindings.set(identity, guard);
645
- return guard;
646
- },
647
- async metadata(identity, signal) { return (await metadata(identity, signal, bindings.get(identity)?.version)).value; },
648
- async range(identity, start, signal) { const result = await client.readOutputRange(s, id, identity, start, undefined, signal, bindings.get(identity)?.version); if (!result.body)
649
- throw new Error('Missing output body'); return result.body; },
650
- }, destination, cursor, signal);
651
- },
652
- waitJob(s, id, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/wait`), 'Job', 'GET', undefined, s, undefined, signal, { jobId: id }); },
653
- cancelJob(s, id, input, key, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/cancel`), 'Job', 'POST', input, s, key, signal, { jobId: id }); },
654
- signalJob(s, id, nativeSignal, key, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/signal`), 'Job', 'POST', { signal: nativeSignal }, s, key, signal, { jobId: id }); },
655
- attach(s, id, input, key, signal, owner = 'jobs') { return control(ownerPath(s, id, owner) + '/lanes', 'Lane', 'POST', input, s, key, signal, { jobId: id }); },
656
- async *readFrames(s, id, laneId, sequence, limits, signal, owner = 'jobs') {
657
- // Credential acquisition and delivery can yield while the caller reuses
658
- // its session carrier. Recovery must still identify the admitted stream.
659
- s = { ...s };
660
- validateWire('Uint64', String(sequence));
661
- const result = await response(ownerPath(s, id, owner) + `/lanes/${encodeURIComponent(laneId)}/frames`, 'GET', undefined, s, undefined, undefined, signal, { ...s, jobId: id, laneId, sequence: String(sequence) }, { 'Execution-Cursor': String(sequence) });
662
- if (result.headers.get('Content-Type') !== binaryContentType || !result.body) {
663
- let disposal;
664
- try {
665
- await result.body?.cancel();
666
- }
667
- catch (cause) {
668
- disposal = { cause };
669
- }
670
- if (signal?.aborted)
671
- throw signal.reason;
672
- throw new RemoteExecutionError('Invalid binary lane receipt; inspect retained cursors before retrying', 'unknown', { ...s, jobId: id, laneId, sequence: String(sequence) }, 502, disposal);
673
- }
674
- try {
675
- for await (const frame of decodeFrames(result.body, { ...limits, firstSequence: sequence, channelOpenDirection: 'write', requireEnd: limits.requireEnd ?? true, validateControl: v => validateWire('Control', v) }, signal)) {
676
- sequence = frame.sequence + 1n;
677
- yield frame;
678
- }
679
- }
680
- catch (cause) {
681
- if (signal?.aborted)
682
- throw signal.reason;
683
- const recovery = { ...s, jobId: id, laneId, sequence: String(sequence) };
684
- // In-process/provider transports can retain a classified failure after
685
- // headers were delivered. Ordinary network disconnects remain unknown;
686
- // do not infer expiry or authorization failure from their message.
687
- const status = cause instanceof Error ? cause.status : undefined;
688
- if (status === 410)
689
- throw new UnrecoverableTransportError(recovery, { cause });
690
- throw new RemoteExecutionError('Binary delivery interrupted; inspect retained cursors before retrying', 'unknown', recovery, status === 401 || status === 403 ? status : undefined, { cause });
691
- }
692
- },
693
- async sendFrames(s, id, laneId, frames, limits, key, signal, owner = 'jobs') {
694
- s = { ...s };
695
- let size = 0;
696
- for (const frame of frames) {
697
- size += 40 + frame.payload.length;
698
- if (size > batch)
699
- throw new TypeError('Input batch exceeds SDK bound');
700
- }
701
- const body = new Uint8Array(size);
702
- let offset = 0;
703
- for (const frame of frames) {
704
- const bytes = encodeFrame(frame, { ...limits, validateControl: v => validateWire('Control', v) });
705
- body.set(bytes, offset);
706
- offset += bytes.length;
707
- }
708
- // Pin delivery boundaries before credential acquisition yields. Replays
709
- // may return a later accepted boundary, but never a contradictory receipt
710
- // for the submitted boundary or an offset behind its completed writes.
711
- const lastSequence = frames.at(-1)?.sequence;
712
- const submittedOffsets = new Map(frames.filter(frame => frame.kind !== 'control').map(frame => [frame.channelId, frame.offset + BigInt(frame.payload.length)]));
713
- const endedChannels = new Set(frames.filter(frame => frame.kind === 'end').map(frame => frame.channelId));
714
- const recovery = { ...s, jobId: id, laneId, operationKey: key };
715
- const receipt = await document(await response(ownerPath(s, id, owner) + `/lanes/${encodeURIComponent(laneId)}/frames`, 'POST', body, s, key, binaryContentType, signal, recovery, { 'Execution-Cursor': String(frames[0]?.sequence ?? 1n) }), 'Ack', recovery, signal);
716
- const sequence = BigInt(receipt.sequence);
717
- const offsets = new Map(receipt.offsets.map(value => [value.channelId, BigInt(value.offset)]));
718
- if (receipt.laneId !== laneId || offsets.size !== receipt.offsets.length
719
- || lastSequence !== undefined && (sequence < lastSequence || [...submittedOffsets].some(([channelId, end]) => {
720
- const delivered = offsets.get(channelId);
721
- return delivered === undefined || delivered < end || (sequence === lastSequence || endedChannels.has(channelId)) && delivered !== end;
722
- })))
723
- throw new RemoteExecutionError('Input acknowledgement mismatch; inspect retained input before retrying', 'unknown', recovery, 502);
724
- return receipt;
725
- },
726
- ackFrames(s, id, laneId, ack, key, signal, owner = 'jobs') { return control(ownerPath(s, id, owner) + `/lanes/${encodeURIComponent(laneId)}/ack`, 'Ack', 'POST', ack, s, key, signal, { jobId: id, laneId }); },
727
- answerCallback(s, id, result, key, signal, owner = 'jobs') { return control(ownerPath(s, id, owner) + `/callbacks/${encodeURIComponent(result.callbackId)}/result`, 'CallbackResult', 'POST', result, s, key, signal, { jobId: id, operationId: result.operationId }); },
728
- releaseResources(s, id, input, key, signal) { return control(path(s, `jobs/${encodeURIComponent(id)}/resources/release`), 'Job', 'POST', input, s, key, signal, { jobId: id }); },
729
- /** Cursor belongs to the same canonical sinks and host bindings across reconnects.
730
- * Completed writes advance before HTTP acknowledgment. A rejected sink may
731
- * have partially written: require explicit recovery rather than replay it. */
732
- async resumeStream(cursor, limits, consume, signal) {
733
- if (cursor.busy || streamDeliveries.get(cursor)?.busy)
734
- throw new TypeError('Stream cursor already has a consumer');
735
- const submitted = { sessionId: cursor.sessionId, epoch: cursor.epoch, jobId: cursor.jobId, laneId: cursor.laneId };
736
- const retained = streamDeliveries.get(cursor);
737
- const identity = retained?.identity ?? submitted;
738
- const recovery = { ...identity, sequence: String(retained?.nextSequence ?? cursor.nextSequence) };
739
- // Opaque invocation and lane IDs only identify resources at their issuing
740
- // service. Delivery credit must never be transferred to another origin.
741
- if (retained && retained.origin !== base.origin)
742
- throw new UnrecoverableTransportError(recovery);
743
- if (identity.sessionId !== submitted.sessionId || identity.epoch !== submitted.epoch || identity.jobId !== submitted.jobId || identity.laneId !== submitted.laneId)
744
- throw new UnrecoverableTransportError(recovery);
745
- if (retained?.deliveryUnknown)
746
- throw new UnrecoverableTransportError(recovery, { cause: retained.deliveryCause });
747
- // Delivery belongs to the sink that accepted the prefix, including END.
748
- // A new sink cannot recover that prefix from acknowledged transport bytes.
749
- if (retained?.consumer && retained.consumer !== consume)
750
- throw new UnrecoverableTransportError(recovery);
751
- if (retained && (cursor.nextSequence !== retained.nextSequence
752
- || cursor.offsets.size !== retained.offsets.size || [...retained.offsets].some(([channel, offset]) => cursor.offsets.get(channel) !== offset)
753
- || cursor.endedChannels.size !== retained.endedChannels.size || [...retained.endedChannels].some(channel => !cursor.endedChannels.has(channel))))
754
- throw new UnrecoverableTransportError(recovery);
755
- const delivery = retained ?? { origin: base.origin, identity, nextSequence: cursor.nextSequence, offsets: new Map(cursor.offsets), endedChannels: new Set(cursor.endedChannels) };
756
- streamDeliveries.set(cursor, delivery);
757
- if (cursor.deliveryUnknown)
758
- throw new UnrecoverableTransportError(recovery, { cause: cursor.deliveryCause });
759
- cursor.busy = true;
760
- delivery.busy = true;
761
- async function acknowledge(ackSignal) {
762
- if (delivery.nextSequence === 1n)
763
- return;
764
- const ack = { type: 'Ack', laneId: identity.laneId, sequence: String(delivery.nextSequence - 1n), offsets: [...delivery.offsets].map(([channelId, offset]) => ({ channelId, offset: String(offset) })) };
765
- const receipt = await client.ackFrames(identity, identity.jobId, identity.laneId, ack, 'stream-ack:' + identity.laneId + ':' + ack.sequence, ackSignal);
766
- const offsets = new Map(receipt.offsets.map(value => [value.channelId, value.offset]));
767
- if (receipt.laneId !== ack.laneId || receipt.sequence !== ack.sequence || offsets.size !== receipt.offsets.length
768
- || offsets.size !== ack.offsets.length || ack.offsets.some(value => offsets.get(value.channelId) !== value.offset)) {
769
- throw new RemoteExecutionError('Stream acknowledgement mismatch; inspect retained delivery before retrying', 'unknown', {
770
- ...recovery, sequence: String(delivery.nextSequence),
771
- }, 502);
772
- }
773
- }
774
- try {
775
- await acknowledge(signal);
776
- for await (const frame of client.readFrames(identity, identity.jobId, identity.laneId, delivery.nextSequence, { ...limits, channels: [...delivery.offsets.keys()], offsets: new Map(delivery.offsets), endedChannels: [...delivery.endedChannels] }, signal)) {
777
- // Consumers own the delivered frame and may reuse or replace its bytes.
778
- // Retain validated transport identity before any canonical write runs.
779
- const { kind, channelId, sequence, offset } = frame;
780
- const endOffset = offset + BigInt(frame.payload.length);
781
- const control = kind === 'control' ? parseWireJson(new TextDecoder('utf-8', { fatal: true }).decode(frame.payload)) : undefined;
782
- delivery.consumer = consume;
783
- try {
784
- await consume(frame);
785
- }
786
- catch (cause) {
787
- cursor.deliveryUnknown = true;
788
- cursor.deliveryCause = cause;
789
- delivery.deliveryUnknown = true;
790
- delivery.deliveryCause = cause;
791
- // A destination can fail after applying a prefix. The first failure
792
- // needs the same explicit recovery result as a subsequent reconnect;
793
- // neither the retained frame nor its write may be replayed blindly.
794
- throw new UnrecoverableTransportError({ ...recovery, sequence: String(sequence) }, { cause });
795
- }
796
- if (kind === 'control') {
797
- if (control?.type === 'ChannelOpen' && control.direction === 'write')
798
- delivery.offsets.set(control.channelId, 0n);
799
- }
800
- else
801
- delivery.offsets.set(channelId, endOffset);
802
- if (kind === 'end')
803
- delivery.endedChannels.add(channelId);
804
- delivery.nextSequence = sequence + 1n;
805
- // Retain completed delivery independently of caller-owned fields. A
806
- // reused cursor cannot retract a sink write or clear its uncertainty
807
- // when a replacement client retries a lost acknowledgment.
808
- cursor.nextSequence = delivery.nextSequence;
809
- cursor.offsets = new Map(delivery.offsets);
810
- cursor.endedChannels = new Set(delivery.endedChannels);
811
- // The destination has accepted this effect. Returning its credit is
812
- // owned settlement, even when invocation cancellation raced the write.
813
- // Admission of the next frame still uses the caller's signal.
814
- await acknowledge(undefined);
815
- }
816
- }
817
- finally {
818
- cursor.busy = false;
819
- delivery.busy = false;
820
- }
821
- },
822
- };
823
- return client;
824
- }