@poe-platform/safe-bash 0.1.789 → 0.1.790

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 (207) hide show
  1. package/dist/image-ast/index.browser.js +147 -80
  2. package/dist/image-ast/index.js +147 -80
  3. package/dist/mp4-ast/mp4.d.ts +2 -0
  4. package/dist/pdf-ast/cos/parser.d.ts +1 -0
  5. package/dist/pdf-ast/cos/security.d.ts +2 -0
  6. package/dist/pdf-ast/cos/writer.d.ts +1 -0
  7. package/dist/pdf-ast/document.d.ts +3 -0
  8. package/dist/pdf-ast/edit/forms.d.ts +1 -0
  9. package/dist/pdf-ast/index.js +171 -82
  10. package/dist/safe-bash/chunks/{chunk-L5QQLNTO.js → chunk-22PI65AH.js} +2 -2
  11. package/dist/safe-bash/chunks/{chunk-KHJGUF2W.js → chunk-2TAGYMPK.js} +43 -42
  12. package/dist/safe-bash/chunks/{chunk-D4PHJK4T.js → chunk-2W4HTMEK.js} +52 -48
  13. package/dist/safe-bash/chunks/{chunk-FFZXP6ZC.js → chunk-3M7L7XU2.js} +2 -2
  14. package/dist/safe-bash/chunks/{chunk-XNODZRVD.js → chunk-3QAO6UYS.js} +2 -2
  15. package/dist/safe-bash/chunks/{chunk-YPETOVQU.js → chunk-3VKFK3NF.js} +2 -2
  16. package/dist/safe-bash/chunks/chunk-5OST7NOX.js +42 -0
  17. package/dist/safe-bash/chunks/{chunk-KEBSX2AX.js → chunk-6HLURHVU.js} +2 -2
  18. package/dist/safe-bash/chunks/chunk-DYEUZE6Z.js +19 -0
  19. package/dist/safe-bash/chunks/{chunk-T2TGCHKE.js → chunk-FM3WBSZT.js} +2 -2
  20. package/dist/safe-bash/chunks/chunk-GAYRKQM6.js +22 -0
  21. package/dist/safe-bash/chunks/{chunk-Q45QCA4J.js → chunk-I3KSESCR.js} +0 -7
  22. package/dist/safe-bash/chunks/{chunk-OSKDIBQS.js → chunk-JLIMK5TD.js} +1 -1
  23. package/dist/safe-bash/chunks/{chunk-2AYZCT5X.js → chunk-JQ2FAJJT.js} +27 -23
  24. package/dist/safe-bash/chunks/{chunk-QA3NVP43.js → chunk-JRE6Z3T7.js} +2 -2
  25. package/dist/safe-bash/chunks/{chunk-DC5EHLKS.js → chunk-NDIL6T7Y.js} +5 -5
  26. package/dist/safe-bash/chunks/{chunk-747G42FY.js → chunk-OPR4UAIT.js} +2 -2
  27. package/dist/safe-bash/chunks/chunk-OSMQCYSP.js +19 -0
  28. package/dist/safe-bash/chunks/chunk-OYB332PQ.js +17 -0
  29. package/dist/safe-bash/chunks/{chunk-X5ZCECM6.js → chunk-QTIH2AFE.js} +77 -69
  30. package/dist/safe-bash/chunks/{chunk-CTUHLNJM.js → chunk-SBESXWT2.js} +43 -44
  31. package/dist/safe-bash/chunks/{chunk-4FDQJUFW.js → chunk-SDEPGTOF.js} +1 -1
  32. package/dist/safe-bash/chunks/chunk-UZU5BIJI.js +32 -0
  33. package/dist/safe-bash/chunks/{chunk-BI6JV62X.js → chunk-VCCMROTL.js} +7 -10
  34. package/dist/safe-bash/chunks/chunk-W47GHRRF.js +13 -0
  35. package/dist/safe-bash/chunks/{chunk-NPMQWZUZ.js → chunk-WS7KZIUM.js} +2 -2
  36. package/dist/safe-bash/chunks/{chunk-3PZYHMGM.js → chunk-YYAERCWS.js} +7 -7
  37. package/dist/safe-bash/chunks/{chunk-5U7JECDB.js → chunk-ZPGVEUKF.js} +8 -7
  38. package/dist/safe-bash/chunks/{csvkit-K55OYAQC.js → csvkit-USUJG62I.js} +65 -11
  39. package/dist/safe-bash/chunks/{ffmpeg-BEFTQ6DZ.js → ffmpeg-KRGG5DLH.js} +21 -10
  40. package/dist/safe-bash/chunks/{gh-HQWOWLWE.js → gh-UCFDUZCX.js} +16 -8
  41. package/dist/safe-bash/chunks/{git-HO7WDPHZ.js → git-LPAF6KDG.js} +7 -9
  42. package/dist/safe-bash/chunks/{imagemagick-53BMHH6D.js → imagemagick-KGREKK4G.js} +38 -7
  43. package/dist/safe-bash/chunks/{implementation-QUTAAYMT.js → implementation-FXDRYS5A.js} +34 -8
  44. package/dist/safe-bash/chunks/{pdfimages-4OYI6FLG.js → pdfimages-UADCF4G4.js} +12 -8
  45. package/dist/safe-bash/chunks/{pdfinfo-I7U6TQPP.js → pdfinfo-O7UWPF4W.js} +38 -13
  46. package/dist/safe-bash/chunks/{pdftk-SUA6FMHI.js → pdftk-AERXIJTN.js} +13 -8
  47. package/dist/safe-bash/chunks/{pdftoppm-4C5DGEWX.js → pdftoppm-L466JQKI.js} +17 -10
  48. package/dist/safe-bash/chunks/{pdftotext-Y4WI225Y.js → pdftotext-SUSI4WXS.js} +19 -9
  49. package/dist/safe-bash/chunks/{qpdf-IORB4RV5.js → qpdf-YL24KVRH.js} +14 -8
  50. package/dist/safe-bash/chunks/{sips-WHAMJFEU.js → sips-QXEQZERX.js} +14 -7
  51. package/dist/safe-bash/chunks/{soffice-SYEK6WJS.js → soffice-TBITRML3.js} +16 -8
  52. package/dist/safe-bash/chunks/{wkhtmltopdf-ZIICWJLF.js → wkhtmltopdf-NJA2THRC.js} +27 -7
  53. package/dist/safe-bash/command-chunks/chunk-2C5BEBPY.js +1388 -0
  54. package/dist/safe-bash/command-chunks/{chunk-2VTMZTV3.js → chunk-2EXV2ZLV.js} +2 -2
  55. package/dist/safe-bash/command-chunks/{chunk-UJOO6DKY.js → chunk-6EASC5EC.js} +1 -1
  56. package/dist/safe-bash/command-chunks/{chunk-ZF3ZVGQC.js → chunk-7JRITHKW.js} +150 -80
  57. package/dist/safe-bash/{chunks/chunk-LD76P7AG.js → command-chunks/chunk-AKDMCNX4.js} +74 -39
  58. package/dist/safe-bash/command-chunks/{chunk-6F7QJMJ3.js → chunk-CBDVLMJB.js} +1 -1
  59. package/dist/safe-bash/command-chunks/chunk-H4LWTITX.js +169 -0
  60. package/dist/safe-bash/command-chunks/chunk-I2MQNBGR.js +145 -0
  61. package/dist/safe-bash/command-chunks/{chunk-5GRLAARV.js → chunk-IOXI5ZAJ.js} +1 -1
  62. package/dist/safe-bash/command-chunks/{chunk-XNHSCU6I.js → chunk-MDPIOQUD.js} +6 -6
  63. package/dist/safe-bash/command-chunks/chunk-QI4MGIN6.js +6 -0
  64. package/dist/safe-bash/command-chunks/chunk-QTYZAWSB.js +91 -0
  65. package/dist/safe-bash/command-chunks/chunk-SNK7K3XW.js +90 -0
  66. package/dist/safe-bash/command-chunks/chunk-T5OLGM43.js +314 -0
  67. package/dist/safe-bash/command-chunks/chunk-TB7IFMUZ.js +802 -0
  68. package/dist/safe-bash/command-chunks/{chunk-AT6ZSOE6.js → chunk-TPPBPIWL.js} +1 -1
  69. package/dist/safe-bash/command-chunks/chunk-VMK4XVKO.js +82 -0
  70. package/dist/safe-bash/command-chunks/chunk-VNSJKXDU.js +130 -0
  71. package/dist/safe-bash/command-chunks/chunk-YFNTMH6Z.js +6 -0
  72. package/dist/safe-bash/commands/csplit/index.browser.js +2 -2
  73. package/dist/safe-bash/commands/docx/index.browser.js +2 -2
  74. package/dist/safe-bash/commands/factor/index.browser.js +2 -2
  75. package/dist/safe-bash/commands/getopt/index.browser.js +2 -2
  76. package/dist/safe-bash/commands/hexdump/index.browser.js +2 -2
  77. package/dist/safe-bash/commands/iconv/index.browser.js +2 -2
  78. package/dist/safe-bash/commands/line-endings/index.browser.js +2 -2
  79. package/dist/safe-bash/commands/llm/command.d.ts +1 -4
  80. package/dist/safe-bash/commands/llm/command.js +1 -248
  81. package/dist/safe-bash/commands/llm/elevenlabs-stream.d.ts +1 -2
  82. package/dist/safe-bash/commands/llm/elevenlabs-stream.js +1 -117
  83. package/dist/safe-bash/commands/llm/elevenlabs.d.ts +1 -15
  84. package/dist/safe-bash/commands/llm/elevenlabs.js +1 -123
  85. package/dist/safe-bash/commands/llm/index.browser.js +20 -15
  86. package/dist/safe-bash/commands/llm/index.d.ts +1 -6
  87. package/dist/safe-bash/commands/llm/index.js +1 -4
  88. package/dist/safe-bash/commands/llm/mime.d.ts +1 -2
  89. package/dist/safe-bash/commands/llm/mime.js +1 -136
  90. package/dist/safe-bash/commands/llm/openai-http.d.ts +1 -8
  91. package/dist/safe-bash/commands/llm/openai-http.js +1 -143
  92. package/dist/safe-bash/commands/llm/openai-sse.d.ts +1 -3
  93. package/dist/safe-bash/commands/llm/openai-sse.js +1 -78
  94. package/dist/safe-bash/commands/llm/openai.d.ts +1 -14
  95. package/dist/safe-bash/commands/llm/openai.js +1 -288
  96. package/dist/safe-bash/commands/llm/providers/elevenlabs.d.ts +1 -1
  97. package/dist/safe-bash/commands/llm/providers/elevenlabs.js +1 -1
  98. package/dist/safe-bash/commands/llm/providers/index.browser.js +6 -6
  99. package/dist/safe-bash/commands/llm/providers/index.d.ts +1 -3
  100. package/dist/safe-bash/commands/llm/providers/index.js +1 -2
  101. package/dist/safe-bash/commands/llm/providers/openai.d.ts +1 -1
  102. package/dist/safe-bash/commands/llm/providers/openai.js +1 -1
  103. package/dist/safe-bash/commands/llm/providers/shared.d.ts +1 -23
  104. package/dist/safe-bash/commands/llm/providers/shared.js +1 -65
  105. package/dist/safe-bash/commands/llm/service.d.ts +1 -37
  106. package/dist/safe-bash/commands/llm/service.js +1 -151
  107. package/dist/safe-bash/commands/llm/types.d.ts +1 -52
  108. package/dist/safe-bash/commands/llm/types.js +1 -1
  109. package/dist/safe-bash/commands/mdq/index.browser.js +3 -3
  110. package/dist/safe-bash/commands/media/index.browser.js +1 -1
  111. package/dist/safe-bash/commands/network/index.browser.js +9 -9
  112. package/dist/safe-bash/commands/network/types.d.ts +2 -40
  113. package/dist/safe-bash/commands/node/index.browser.js +6 -8
  114. package/dist/safe-bash/commands/op/index.browser.js +3 -3
  115. package/dist/safe-bash/commands/op/index.js +12 -28
  116. package/dist/safe-bash/commands/pr/index.browser.js +2 -2
  117. package/dist/safe-bash/commands/python/index.browser.js +8 -8
  118. package/dist/safe-bash/commands/python/worker.browser.js +2 -2
  119. package/dist/safe-bash/commands/tsort/index.browser.js +2 -2
  120. package/dist/safe-bash/commands/xml/index.browser.js +2 -2
  121. package/dist/safe-bash/commands/yq/index.browser.js +3 -3
  122. package/dist/safe-bash/core.browser.js +9775 -10975
  123. package/dist/safe-bash/core.d.ts +0 -1
  124. package/dist/safe-bash/core.js +0 -1
  125. package/dist/safe-bash/jobs.browser.js +5 -4
  126. package/dist/safe-bash/optional-host.browser.js +61 -88
  127. package/dist/safe-bash/shell/runtime.js +34 -12
  128. package/dist/safe-bash/yq-browser/index.js +1 -1
  129. package/dist/safe-bash-command-ffmpeg/index.js +8130 -8011
  130. package/dist/safe-bash-command-git/git_rust.wasm +0 -0
  131. package/dist/safe-bash-command-git/wasm.generated.js +1 -1
  132. package/dist/safe-bash-command-imagemagick/index.js +2 -2
  133. package/dist/safe-bash-command-llm/LICENSE +21 -0
  134. package/dist/safe-bash-command-llm/command.d.ts +5 -0
  135. package/dist/safe-bash-command-llm/command.js +14 -0
  136. package/dist/safe-bash-command-llm/configuration.d.ts +18 -0
  137. package/dist/safe-bash-command-llm/elevenlabs-stream.d.ts +2 -0
  138. package/dist/safe-bash-command-llm/elevenlabs-stream.js +7 -0
  139. package/dist/safe-bash-command-llm/elevenlabs.d.ts +15 -0
  140. package/dist/safe-bash-command-llm/elevenlabs.js +10 -0
  141. package/dist/safe-bash-command-llm/index.d.ts +10 -0
  142. package/dist/safe-bash-command-llm/index.js +46 -0
  143. package/dist/safe-bash-command-llm/mime.d.ts +2 -0
  144. package/dist/safe-bash-command-llm/mime.js +9 -0
  145. package/dist/safe-bash-command-llm/model-options.d.ts +3 -0
  146. package/dist/safe-bash-command-llm/openai-http.d.ts +8 -0
  147. package/dist/safe-bash-command-llm/openai-http.js +17 -0
  148. package/dist/safe-bash-command-llm/openai-sse.d.ts +3 -0
  149. package/dist/safe-bash-command-llm/openai-sse.js +8 -0
  150. package/dist/safe-bash-command-llm/openai.d.ts +14 -0
  151. package/dist/safe-bash-command-llm/openai.js +12 -0
  152. package/dist/safe-bash-command-llm/providers/elevenlabs.d.ts +1 -0
  153. package/dist/safe-bash-command-llm/providers/elevenlabs.js +11 -0
  154. package/dist/safe-bash-command-llm/providers/index.d.ts +3 -0
  155. package/dist/safe-bash-command-llm/providers/index.js +24 -0
  156. package/dist/safe-bash-command-llm/providers/openai.d.ts +1 -0
  157. package/dist/safe-bash-command-llm/providers/openai.js +13 -0
  158. package/dist/safe-bash-command-llm/providers/shared.d.ts +23 -0
  159. package/dist/safe-bash-command-llm/providers/shared.js +13 -0
  160. package/dist/safe-bash-command-llm/schemas.d.ts +2 -0
  161. package/dist/safe-bash-command-llm/service.d.ts +42 -0
  162. package/dist/safe-bash-command-llm/service.js +9 -0
  163. package/dist/safe-bash-command-llm/templates.d.ts +27 -0
  164. package/dist/safe-bash-command-llm/types.d.ts +87 -0
  165. package/dist/safe-bash-command-llm/types.js +6 -0
  166. package/dist/safe-bash-command-mmdc/command.d.ts +4 -0
  167. package/dist/safe-bash-command-mmdc/index.d.ts +1 -1
  168. package/dist/safe-bash-command-mmdc/index.js +7084 -6687
  169. package/dist/safe-bash-command-mmdc/layout.d.ts +1 -0
  170. package/dist/safe-bash-command-mmdc/parser.d.ts +1 -0
  171. package/dist/safe-bash-command-mmdc/png.d.ts +3 -0
  172. package/dist/safe-bash-command-mmdc/raster.d.ts +1 -0
  173. package/dist/safe-bash-command-pandoc/command.js +3 -3
  174. package/dist/safe-bash-command-pandoc/index.js +3 -3
  175. package/dist/safe-bash-command-pdfimages/index.js +147 -80
  176. package/dist/safe-bash-command-pdfinfo/index.js +147 -80
  177. package/dist/safe-bash-command-pdftk/index.js +147 -80
  178. package/dist/safe-bash-command-pdftoppm/index.js +147 -80
  179. package/dist/safe-bash-command-pdftotext/index.js +147 -80
  180. package/dist/safe-bash-command-qpdf/index.js +174 -101
  181. package/dist/safe-bash-command-sips/index.js +2 -2
  182. package/dist/safe-bash-command-soffice/index.js +1 -1
  183. package/dist/safe-bash-command-ssconvert/index.js +147 -80
  184. package/dist/safe-bash-command-wkhtmltopdf/index.js +147 -80
  185. package/dist/safe-bash-contracts/default-executor.d.ts +5 -0
  186. package/dist/safe-bash-contracts/default-executor.js +37 -0
  187. package/dist/safe-bash-contracts/http.d.ts +41 -0
  188. package/dist/safe-bash-contracts/http.js +6 -0
  189. package/dist/safe-bash-io-engine/commands/search/requirements.js +3 -3
  190. package/dist/safe-bash-io-engine/commands/text-programs/shared.js +3 -3
  191. package/dist/safe-bash-io-engine/gnu-information.d.ts +1 -1
  192. package/dist/safe-bash-io-engine/gnu-information.js +1 -1
  193. package/dist/safe-bash-io-engine/internal.js +2 -2
  194. package/dist/safe-bash-query-engine/index.js +3 -3
  195. package/dist/safe-bash-query-engine/interpreter.js +2 -2
  196. package/dist/safe-bash-query-engine/query-core.js +3 -3
  197. package/package.json +2 -2
  198. package/dist/safe-bash/chunks/chunk-2G2T5MEM.js +0 -14
  199. package/dist/safe-bash/chunks/chunk-2MUJ7RLZ.js +0 -409
  200. package/dist/safe-bash/chunks/chunk-GJWUEOT6.js +0 -14
  201. package/dist/safe-bash/chunks/chunk-H7MMJS26.js +0 -37
  202. package/dist/safe-bash/chunks/chunk-LAPF2XE6.js +0 -14
  203. package/dist/safe-bash/chunks/chunk-S2LSZFZ6.js +0 -758
  204. package/dist/safe-bash/chunks/chunk-T3VDYWKZ.js +0 -21
  205. package/dist/safe-bash/chunks/chunk-VUVKC6HV.js +0 -81
  206. package/dist/safe-bash/chunks/chunk-VYW4Q6KF.js +0 -12
  207. package/dist/safe-bash/command-chunks/{chunk-BJ6DGYJA.js → chunk-KNI4GRXF.js} +3 -3
@@ -1,9 +1,9 @@
1
1
  import {
2
- init_platform
3
- } from "./chunk-Q45QCA4J.js";
2
+ init_buffer
3
+ } from "./chunk-HX3SHTCE.js";
4
4
 
5
- // packages/safe-bash/src/commands/llm/mime.ts
6
- init_platform();
5
+ // packages/safe-bash-command-llm/dist/mime.js
6
+ init_buffer();
7
7
  import { classify } from "../../safe-bash-command-file/classify.js";
8
8
  var extensions = {
9
9
  png: "image/png",
@@ -48,35 +48,45 @@ var extensions = {
48
48
  };
49
49
  function ebmlInteger(bytes, offset, retainMarker = false) {
50
50
  const first = bytes[offset];
51
- if (!first) return void 0;
51
+ if (!first)
52
+ return void 0;
52
53
  let marker = 128, width = 1;
53
54
  while (!(first & marker)) {
54
55
  marker >>= 1;
55
56
  width++;
56
57
  }
57
- if (offset + width > bytes.length) return void 0;
58
+ if (offset + width > bytes.length)
59
+ return void 0;
58
60
  let value = retainMarker ? first : first & marker - 1;
59
- for (let index = 1; index < width; index++) value = value * 256 + bytes[offset + index];
60
- if (!Number.isSafeInteger(value) || !retainMarker && value === 2 ** (7 * width) - 1) return void 0;
61
+ for (let index = 1; index < width; index++)
62
+ value = value * 256 + bytes[offset + index];
63
+ if (!Number.isSafeInteger(value) || !retainMarker && value === 2 ** (7 * width) - 1)
64
+ return void 0;
61
65
  return { value, width };
62
66
  }
63
67
  function ebmlMimeType(bytes) {
64
68
  const header = ebmlInteger(bytes, 4);
65
- if (!header) return void 0;
69
+ if (!header)
70
+ return void 0;
66
71
  let offset = 4 + header.width;
67
72
  const end = Math.min(bytes.length, offset + header.value, 4096);
68
73
  while (offset < end) {
69
74
  const identifier = ebmlInteger(bytes, offset, true);
70
- if (!identifier) return void 0;
75
+ if (!identifier)
76
+ return void 0;
71
77
  offset += identifier.width;
72
78
  const size = ebmlInteger(bytes, offset);
73
- if (!size) return void 0;
79
+ if (!size)
80
+ return void 0;
74
81
  offset += size.width;
75
- if (size.value > end - offset) return void 0;
82
+ if (size.value > end - offset)
83
+ return void 0;
76
84
  if (identifier.value === 17026) {
77
85
  const docType = new TextDecoder().decode(bytes.subarray(offset, offset + size.value)).split("\0", 1)[0];
78
- if (docType === "webm") return "video/webm";
79
- if (docType === "matroska") return "video/x-matroska";
86
+ if (docType === "webm")
87
+ return "video/webm";
88
+ if (docType === "matroska")
89
+ return "video/x-matroska";
80
90
  return void 0;
81
91
  }
82
92
  offset += size.value;
@@ -86,53 +96,78 @@ function ebmlMimeType(bytes) {
86
96
  function sniffMimeType(path, bytes) {
87
97
  const matches = (signature, offset = 0) => bytes.length >= offset + signature.length && signature.every((byte, index) => bytes[offset + index] === byte);
88
98
  const ascii = (offset, text) => bytes.length >= offset + text.length && [...text].every((character, index) => bytes[offset + index] === character.charCodeAt(0));
89
- if (matches([137, 80, 78, 71, 13, 10, 26, 10])) return "image/png";
90
- if (matches([255, 216, 255])) return "image/jpeg";
91
- if (ascii(0, "GIF87a") || ascii(0, "GIF89a")) return "image/gif";
99
+ if (matches([137, 80, 78, 71, 13, 10, 26, 10]))
100
+ return "image/png";
101
+ if (matches([255, 216, 255]))
102
+ return "image/jpeg";
103
+ if (ascii(0, "GIF87a") || ascii(0, "GIF89a"))
104
+ return "image/gif";
92
105
  if (ascii(0, "RIFF")) {
93
- if (ascii(8, "WEBP")) return "image/webp";
94
- if (ascii(8, "WAVE")) return "audio/wav";
95
- if (ascii(8, "AVI ")) return "video/x-msvideo";
106
+ if (ascii(8, "WEBP"))
107
+ return "image/webp";
108
+ if (ascii(8, "WAVE"))
109
+ return "audio/wav";
110
+ if (ascii(8, "AVI "))
111
+ return "video/x-msvideo";
96
112
  }
97
- if (ascii(0, "fLaC")) return "audio/flac";
113
+ if (ascii(0, "fLaC"))
114
+ return "audio/flac";
98
115
  if (ascii(0, "OggS")) {
99
116
  const packet = 27 + (bytes[26] ?? 0);
100
- if (bytes[26] && bytes[packet] === 128 && ascii(packet + 1, "theora")) return "video/ogg";
117
+ if (bytes[26] && bytes[packet] === 128 && ascii(packet + 1, "theora"))
118
+ return "video/ogg";
101
119
  return "audio/ogg";
102
120
  }
103
- if (ascii(0, "ID3") || bytes.length >= 2 && bytes[0] === 255 && (bytes[1] & 224) === 224 && (bytes[1] & 6) !== 0) return "audio/mpeg";
104
- if (bytes.length >= 2 && bytes[0] === 255 && (bytes[1] & 246) === 240) return "audio/aac";
105
- if (ascii(0, "FORM") && (ascii(8, "AIFF") || ascii(8, "AIFC"))) return "audio/aiff";
121
+ if (ascii(0, "ID3") || bytes.length >= 2 && bytes[0] === 255 && (bytes[1] & 224) === 224 && (bytes[1] & 6) !== 0)
122
+ return "audio/mpeg";
123
+ if (bytes.length >= 2 && bytes[0] === 255 && (bytes[1] & 246) === 240)
124
+ return "audio/aac";
125
+ if (ascii(0, "FORM") && (ascii(8, "AIFF") || ascii(8, "AIFC")))
126
+ return "audio/aiff";
106
127
  if (ascii(4, "ftyp")) {
107
- if (ascii(8, "avif") || ascii(8, "avis")) return "image/avif";
108
- if (ascii(8, "heic") || ascii(8, "heix")) return "image/heic";
109
- if (ascii(8, "mif1") || ascii(8, "msf1")) return "image/heif";
110
- if (ascii(8, "M4A ") || ascii(8, "M4B ")) return "audio/mp4";
111
- if (ascii(8, "qt ")) return "video/quicktime";
128
+ if (ascii(8, "avif") || ascii(8, "avis"))
129
+ return "image/avif";
130
+ if (ascii(8, "heic") || ascii(8, "heix"))
131
+ return "image/heic";
132
+ if (ascii(8, "mif1") || ascii(8, "msf1"))
133
+ return "image/heif";
134
+ if (ascii(8, "M4A ") || ascii(8, "M4B "))
135
+ return "audio/mp4";
136
+ if (ascii(8, "qt "))
137
+ return "video/quicktime";
112
138
  return "video/mp4";
113
139
  }
114
140
  if (matches([26, 69, 223, 163])) {
115
141
  const mimeType = ebmlMimeType(bytes);
116
- if (mimeType) return mimeType;
142
+ if (mimeType)
143
+ return mimeType;
117
144
  }
118
- if (ascii(0, "%PDF-")) return "application/pdf";
119
- if (matches([80, 75, 3, 4]) || matches([80, 75, 5, 6])) return "application/zip";
120
- if (matches([31, 139])) return "application/gzip";
121
- if (matches([73, 73, 42, 0]) || matches([77, 77, 0, 42])) return "image/tiff";
122
- if (ascii(0, "BM")) return "image/bmp";
145
+ if (ascii(0, "%PDF-"))
146
+ return "application/pdf";
147
+ if (matches([80, 75, 3, 4]) || matches([80, 75, 5, 6]))
148
+ return "application/zip";
149
+ if (matches([31, 139]))
150
+ return "application/gzip";
151
+ if (matches([73, 73, 42, 0]) || matches([77, 77, 0, 42]))
152
+ return "image/tiff";
153
+ if (ascii(0, "BM"))
154
+ return "image/bmp";
123
155
  const prefix = bytes.subarray(0, 512);
124
156
  const classified = classify(prefix, bytes.length <= prefix.length).mime;
125
- if (!["application/octet-stream", "text/plain", "inode/x-empty"].includes(classified)) return classified;
157
+ if (!["application/octet-stream", "text/plain", "inode/x-empty"].includes(classified))
158
+ return classified;
126
159
  const filename = path.slice(path.lastIndexOf("/") + 1);
127
160
  const dot = filename.lastIndexOf(".");
128
161
  const extension = dot < 0 ? "" : filename.slice(dot + 1).toLowerCase();
129
162
  return Object.hasOwn(extensions, extension) ? extensions[extension] : classified === "inode/x-empty" ? "application/octet-stream" : classified;
130
163
  }
131
164
  function acceptsMimeType(types, mimeType) {
132
- if ([...mimeType].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127)) return false;
165
+ if ([...mimeType].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127))
166
+ return false;
133
167
  const mime = mimeType.split(";", 1)[0].trim().toLowerCase();
134
168
  const parts = mime.split("/");
135
- if (parts.length !== 2 || parts.some((part) => !part || [...part].some((character) => !(character >= "a" && character <= "z" || character >= "0" && character <= "9" || "!#$%&'+-.^_`|~".includes(character))))) return false;
169
+ if (parts.length !== 2 || parts.some((part) => !part || [...part].some((character) => !(character >= "a" && character <= "z" || character >= "0" && character <= "9" || "!#$%&'+-.^_`|~".includes(character)))))
170
+ return false;
136
171
  return types.some((type) => {
137
172
  const accepted = type.toLowerCase();
138
173
  return accepted === mime || accepted.endsWith("/*") && accepted.slice(0, -2) === parts[0];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pathOf
3
- } from "./chunk-UJOO6DKY.js";
3
+ } from "./chunk-6EASC5EC.js";
4
4
  import {
5
5
  inputRequirements
6
6
  } from "./chunk-YAFQG4SC.js";
@@ -0,0 +1,169 @@
1
+ import {
2
+ init_buffer
3
+ } from "./chunk-HX3SHTCE.js";
4
+
5
+ // packages/safe-bash-command-llm/dist/openai-http.js
6
+ init_buffer();
7
+ import { yieldTurn } from "../../safe-bash-contracts/yield.js";
8
+ function openAiAbortable(pending, signal) {
9
+ return new Promise((resolve, reject) => {
10
+ const abort = () => {
11
+ signal.removeEventListener("abort", abort);
12
+ reject(signal.reason);
13
+ };
14
+ signal.addEventListener("abort", abort, { once: true });
15
+ Promise.resolve(pending).then((value) => {
16
+ signal.removeEventListener("abort", abort);
17
+ if (signal.aborted)
18
+ reject(signal.reason);
19
+ else
20
+ resolve(value);
21
+ }, (error) => {
22
+ signal.removeEventListener("abort", abort);
23
+ reject(signal.aborted ? signal.reason : error);
24
+ });
25
+ if (signal.aborted)
26
+ abort();
27
+ });
28
+ }
29
+ async function* openAiBytes(source, signal, limit = Infinity) {
30
+ signal.throwIfAborted();
31
+ const iterator = source[Symbol.asyncIterator]();
32
+ let failed = false, finished = false;
33
+ let size = 0, windows = 0;
34
+ try {
35
+ while (true) {
36
+ signal.throwIfAborted();
37
+ const next = await openAiAbortable(iterator.next(), signal);
38
+ if (next.done) {
39
+ finished = true;
40
+ return;
41
+ }
42
+ if (!(next.value instanceof Uint8Array))
43
+ throw new Error("OpenAI returned a non-byte response chunk");
44
+ size += next.value.byteLength;
45
+ if (size > limit)
46
+ throw new RangeError("Provider response byte limit exceeded");
47
+ if (!next.value.byteLength)
48
+ yield new Uint8Array(0);
49
+ for (let offset = 0; offset < next.value.byteLength; offset += 16384) {
50
+ if (++windows % 64 === 0)
51
+ await yieldTurn(signal);
52
+ signal.throwIfAborted();
53
+ yield Uint8Array.from(next.value.subarray(offset, offset + 16384));
54
+ }
55
+ }
56
+ } catch (error) {
57
+ failed = true;
58
+ throw signal.aborted ? signal.reason : error;
59
+ } finally {
60
+ if (!finished) {
61
+ const returned = Promise.resolve().then(() => iterator.return?.());
62
+ if (signal.aborted)
63
+ void returned.catch(() => void 0);
64
+ else
65
+ await openAiAbortable(returned, signal).catch((error) => {
66
+ if (!failed)
67
+ throw error;
68
+ });
69
+ }
70
+ }
71
+ }
72
+ async function openAiJson(response, signal, maxBytes = Infinity) {
73
+ const decoder = new TextDecoder("utf-8", { fatal: true });
74
+ let text = "", length = 0;
75
+ for await (const chunk of openAiBytes(response.body, signal, maxBytes)) {
76
+ length += chunk.byteLength;
77
+ if (length > maxBytes)
78
+ throw new Error("OpenAI JSON response exceeds buffer limit");
79
+ text += decoder.decode(chunk, { stream: true });
80
+ }
81
+ text += decoder.decode();
82
+ let value;
83
+ try {
84
+ value = JSON.parse(text);
85
+ } catch {
86
+ throw new Error("OpenAI returned malformed JSON");
87
+ }
88
+ if (!openAiRecord(value))
89
+ throw new Error("OpenAI returned a non-object JSON response");
90
+ return value;
91
+ }
92
+ function openAiRecord(value) {
93
+ return value !== null && typeof value === "object" && !Array.isArray(value);
94
+ }
95
+ function openAiError(value) {
96
+ if (typeof value === "string" && value)
97
+ return value.slice(0, 1024);
98
+ if (openAiRecord(value) && typeof value.message === "string")
99
+ return value.message.slice(0, 1024);
100
+ return void 0;
101
+ }
102
+ async function* openAiResponse(transport, input, maxResponseBytes) {
103
+ input.signal.throwIfAborted();
104
+ const cleanups = /* @__PURE__ */ new Map();
105
+ let closed = false, failed = false;
106
+ const run = (cleanup) => {
107
+ cleanup.pending ??= Promise.resolve().then(cleanup.run);
108
+ return cleanup.pending;
109
+ };
110
+ const register = (cleanup, receiver) => {
111
+ if (cleanups.has(cleanup))
112
+ return;
113
+ const entry = { run: () => cleanup.call(receiver) };
114
+ cleanups.set(cleanup, entry);
115
+ if (closed)
116
+ void run(entry).catch(() => void 0);
117
+ };
118
+ const close = async () => {
119
+ closed = true;
120
+ const results = await Promise.allSettled([...cleanups.values()].map(run));
121
+ const rejected = results.find((result) => result.status === "rejected");
122
+ if (rejected?.status === "rejected")
123
+ throw rejected.reason;
124
+ };
125
+ const abort = () => {
126
+ void close().catch(() => void 0);
127
+ };
128
+ input.signal.addEventListener("abort", abort, { once: true });
129
+ try {
130
+ const pending = Promise.resolve().then(() => {
131
+ input.signal.throwIfAborted();
132
+ return transport({ ...input, registerCleanup: register });
133
+ }).then((response2) => {
134
+ register(response2.dispose, response2);
135
+ return response2;
136
+ });
137
+ const response = await openAiAbortable(pending, input.signal);
138
+ if (!Number.isInteger(response.status) || response.status < 200 || response.status >= 300) {
139
+ let detail;
140
+ try {
141
+ detail = openAiError((await openAiJson(response, input.signal, maxResponseBytes)).error);
142
+ } catch {
143
+ input.signal.throwIfAborted();
144
+ }
145
+ throw new Error(`OpenAI HTTP ${response.status}${detail ? `: ${detail}` : ""}`);
146
+ }
147
+ yield response;
148
+ } catch (error) {
149
+ failed = true;
150
+ throw input.signal.aborted ? input.signal.reason : error;
151
+ } finally {
152
+ input.signal.removeEventListener("abort", abort);
153
+ await close().catch((error) => {
154
+ if (!failed && !input.signal.aborted)
155
+ throw error;
156
+ });
157
+ if (!failed)
158
+ input.signal.throwIfAborted();
159
+ }
160
+ }
161
+
162
+ export {
163
+ openAiAbortable,
164
+ openAiBytes,
165
+ openAiJson,
166
+ openAiRecord,
167
+ openAiError,
168
+ openAiResponse
169
+ };
@@ -0,0 +1,145 @@
1
+ import {
2
+ streamElevenLabs
3
+ } from "./chunk-VNSJKXDU.js";
4
+ import {
5
+ credential,
6
+ jsonBody,
7
+ providerLimits
8
+ } from "./chunk-QTYZAWSB.js";
9
+ import {
10
+ acceptsMimeType
11
+ } from "./chunk-AKDMCNX4.js";
12
+ import {
13
+ init_buffer
14
+ } from "./chunk-HX3SHTCE.js";
15
+
16
+ // packages/safe-bash-command-llm/dist/elevenlabs.js
17
+ init_buffer();
18
+ var outputFormats = /* @__PURE__ */ new Map([
19
+ ["audio/mpeg", "mp3_44100_128"],
20
+ ["audio/wav", "wav_44100"],
21
+ ["audio/x-wav", "wav_44100"],
22
+ ["audio/pcm", "pcm_44100"],
23
+ ["audio/basic", "ulaw_8000"],
24
+ ["audio/opus", "opus_48000_128"],
25
+ ["audio/ogg", "opus_48000_128"]
26
+ ]);
27
+ var optionTypes = {
28
+ tts: /* @__PURE__ */ new Map([
29
+ ["stability", "number"],
30
+ ["similarity_boost", "number"],
31
+ ["style", "number"],
32
+ ["speed", "number"],
33
+ ["use_speaker_boost", "boolean"]
34
+ ]),
35
+ music: /* @__PURE__ */ new Map([
36
+ ["music_length_ms", "integer"],
37
+ ["seed", "integer"],
38
+ ["force_instrumental", "boolean"],
39
+ ["respect_sections_durations", "boolean"],
40
+ ["store_for_inpainting", "boolean"],
41
+ ["sign_with_c2pa", "boolean"]
42
+ ])
43
+ };
44
+ function parseOptions(options, endpoint) {
45
+ return Object.fromEntries(Object.entries(options).map(([key, value]) => {
46
+ const type = optionTypes[endpoint].get(key);
47
+ if (!type)
48
+ return [key, value];
49
+ if (type === "boolean") {
50
+ if (typeof value === "boolean")
51
+ return [key, value];
52
+ if (value === "true" || value === "false")
53
+ return [key, value === "true"];
54
+ } else {
55
+ const number = typeof value === "number" ? value : typeof value === "string" && value.trim() ? Number(value) : NaN;
56
+ if (Number.isFinite(number) && (type !== "integer" || Number.isSafeInteger(number)))
57
+ return [key, number];
58
+ }
59
+ throw new Error(`Invalid ElevenLabs option ${key}: expected ${type}`);
60
+ }));
61
+ }
62
+ function createElevenLabsProvider(options) {
63
+ const transport = options.transport;
64
+ if (typeof transport !== "function")
65
+ throw new TypeError("Provider transport is required");
66
+ const apiKey = credential(options.apiKey);
67
+ const limits = providerLimits(options.limits);
68
+ const baseUrl = new URL(options.baseUrl ?? "https://api.elevenlabs.io");
69
+ if (!["https:", "http:"].includes(baseUrl.protocol) || baseUrl.username || baseUrl.password || baseUrl.search || baseUrl.hash) {
70
+ throw new Error("Invalid ElevenLabs baseUrl: expected an HTTP(S) URL without credentials, query, or fragment");
71
+ }
72
+ if (!baseUrl.pathname.endsWith("/"))
73
+ baseUrl.pathname += "/";
74
+ const models = options.models.map((model) => Object.freeze({
75
+ ...model,
76
+ ...model.aliases === void 0 ? {} : { aliases: Object.freeze([...model.aliases]) },
77
+ ...model.attachmentTypes === void 0 ? {} : { attachmentTypes: Object.freeze([...model.attachmentTypes]) }
78
+ }));
79
+ const byId = /* @__PURE__ */ new Map();
80
+ for (const model of models) {
81
+ if (model.endpoint !== "tts" && model.endpoint !== "music")
82
+ throw new Error(`Invalid ElevenLabs endpoint: ${model.endpoint}`);
83
+ if (!model.outputType)
84
+ throw new TypeError("ElevenLabs models require an audio outputType");
85
+ const mimeType = model.outputType.split(";", 1)[0].trim().toLowerCase();
86
+ const format = outputFormats.get(mimeType);
87
+ if (!format || !acceptsMimeType([mimeType], model.outputType) || model.endpoint === "music" && format.startsWith("wav_")) {
88
+ throw new Error(`Unsupported ElevenLabs outputType for ${model.endpoint}: ${model.outputType}`);
89
+ }
90
+ if (model.attachmentTypes?.length)
91
+ throw new Error(`ElevenLabs model ${model.id} does not accept attachments`);
92
+ if (!model.id || byId.has(model.id))
93
+ throw new Error(`Duplicate or empty ElevenLabs model: ${model.id}`);
94
+ byId.set(model.id, { model, format });
95
+ }
96
+ return {
97
+ name: "elevenlabs",
98
+ models: Object.freeze(models),
99
+ async *complete(request) {
100
+ request.signal.throwIfAborted();
101
+ const entry = byId.get(request.model);
102
+ if (!entry)
103
+ throw new Error(`Unknown model: ${request.model}`);
104
+ const { model, format } = entry;
105
+ if (request.attachments.length)
106
+ throw new Error(`Model ${model.id} does not accept ${request.attachments[0].mimeType} attachments`);
107
+ if (request.messages?.length || request.schema !== void 0)
108
+ throw new TypeError("ElevenLabs reference endpoints do not accept messages or schemas");
109
+ if (request.system !== void 0)
110
+ throw new TypeError("ElevenLabs reference endpoints do not accept system prompts");
111
+ const { output_format: requestedFormat, ...requestOptions } = request.options;
112
+ if (requestedFormat !== void 0 && requestedFormat !== format)
113
+ throw new TypeError("output_format conflicts with model outputType");
114
+ let path;
115
+ let body;
116
+ if (model.endpoint === "tts") {
117
+ const { voice_id: suppliedVoice, ...settings } = requestOptions;
118
+ const voice = suppliedVoice ?? model.defaultVoiceId;
119
+ if (typeof voice !== "string" || !voice.trim())
120
+ throw new Error(`ElevenLabs model ${model.id} requires voice_id or a configured defaultVoiceId`);
121
+ if (voice === "." || voice === "..")
122
+ throw new Error("Invalid ElevenLabs voice_id: dot segments are not allowed");
123
+ path = `v1/text-to-speech/${encodeURIComponent(voice)}`;
124
+ body = { text: request.prompt, model_id: model.id, voice_settings: parseOptions(settings, model.endpoint) };
125
+ } else {
126
+ path = "v1/music";
127
+ body = { ...parseOptions(requestOptions, model.endpoint), prompt: request.prompt, model_id: model.id };
128
+ }
129
+ const url = new URL(path, baseUrl);
130
+ url.searchParams.set("output_format", format);
131
+ const payload = jsonBody(body, limits.maxRequestBytes);
132
+ yield* streamElevenLabs(transport, {
133
+ url: url.href,
134
+ method: "POST",
135
+ headers: [["xi-api-key", apiKey], ...payload.headers, ["accept", model.outputType]],
136
+ body: payload.body,
137
+ signal: request.signal
138
+ }, limits.maxResponseBytes);
139
+ }
140
+ };
141
+ }
142
+
143
+ export {
144
+ createElevenLabsProvider
145
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PdfDocument,
3
3
  renderPdfPageToPng
4
- } from "./chunk-ZF3ZVGQC.js";
4
+ } from "./chunk-7JRITHKW.js";
5
5
  import {
6
6
  init_buffer
7
7
  } from "./chunk-HX3SHTCE.js";
@@ -10,8 +10,8 @@ var information = {
10
10
  du: { usage: "[OPTION]... [FILE]...", description: "Report virtual file allocation.", options: ["-a, --all", "-s, --summarize", "-c, --total", "-h, --human-readable", "-B, --block-size=SIZE", "-b, --bytes", "--apparent-size", "-d, --max-depth=NUM", "-X, --exclude-from=FILE", "--exclude=PATTERN", "-t, --threshold=SIZE"], versionOnly: true },
11
11
  base32: { usage: "[OPTION]... [FILE]", description: "Encode or decode Base32 data.", options: ["-d, --decode", "-i, --ignore-garbage", "-w, --wrap=COLS"] },
12
12
  base64: { usage: "[OPTION]... [FILE]", description: "Encode or decode Base64 data.", options: ["-d, --decode", "-i, --ignore-garbage", "-w, --wrap=COLS"] },
13
- basename: { usage: "[OPTION]... NAME... [SUFFIX]", description: "Remove directory components and an optional suffix from names.", options: ["-a, --multiple", "-s, --suffix=SUFFIX", "-z, --zero"] },
14
- dirname: { usage: "[OPTION]... NAME...", description: "Print the directory component of each name.", options: ["-z, --zero"] },
13
+ basename: { usage: "[OPTION]... NAME... [SUFFIX]", description: "Remove directory components and an optional suffix from names.", options: ["-a, --multiple", "-s, --suffix=SUFFIX", "-z, --zero"], stopAtOperand: true },
14
+ dirname: { usage: "[OPTION]... NAME...", description: "Print the directory component of each name.", options: ["-z, --zero"], stopAtOperandInPosix: true },
15
15
  chmod: { usage: "[OPTION]... MODE FILE...", description: "Change virtual file permissions, subject to filesystem capabilities.", options: ["-R, --recursive", "-v, --verbose", "-c, --changes", "-f, --silent, --quiet", "--reference=FILE"] },
16
16
  cksum: { usage: "[OPTION]... [FILE]...", description: "Compute checksums of files or standard input.", options: ["-a, --algorithm=TYPE", "-b, --binary", "-z, --zero", "--tag", "--untagged", "--raw", "--base64"] },
17
17
  comm: { usage: "[OPTION]... FILE1 FILE2", description: "Compare sorted files in the C/POSIX byte locale.", options: ["-1", "-2", "-3", "--output-delimiter=STR", "--check-order", "--nocheck-order"] },
@@ -46,7 +46,7 @@ var information = {
46
46
  unexpand: { usage: "[OPTION]... [FILE]...", description: "Convert spaces to tabs.", options: ["-a, --all", "-t, --tabs=LIST", "--first-only"] },
47
47
  uniq: { usage: "[OPTION]... [INPUT [OUTPUT]]", description: "Filter adjacent repeated input records.", options: ["-c, --count", "-d, --repeated", "-u, --unique", "-i, --ignore-case", "-f, --skip-fields=NUM", "-s, --skip-chars=NUM", "-w, --check-chars=NUM", "-z, --zero-terminated"] },
48
48
  wc: { usage: "[OPTION]... [FILE]...", description: "Count input lines, words, bytes, characters or display width.", options: ["-l, --lines", "-w, --words", "-c, --bytes", "-m, --chars", "-L, --max-line-length"] },
49
- pwd: { usage: "[OPTION]...", description: "Print the full filename of the current working directory.", options: ["-L, --logical", "-P, --physical"] },
49
+ pwd: { usage: "[OPTION]...", description: "Print the full filename of the current working directory.", options: ["-L, --logical", "-P, --physical"], stopAtOperandInPosix: true },
50
50
  true: { usage: "[ignored command line arguments]", description: "Exit with a status code indicating success.", options: [] },
51
51
  false: { usage: "[ignored command line arguments]", description: "Exit with a status code indicating failure.", options: [], exitCode: 1 },
52
52
  echo: { usage: "[SHORT-OPTION]... [STRING]...", description: "Echo the STRING(s) to standard output.", options: ["-n", "-e", "-E"] },
@@ -57,7 +57,7 @@ var checksumInformation = {
57
57
  description: "Compute or verify file digests.",
58
58
  options: ["-b, --binary", "-c, --check", "-t, --text", "-z, --zero", "--tag", "--quiet", "--status", "--strict", "--warn", "--ignore-missing"]
59
59
  };
60
- function gnuInformationSync(name, args, externalInvocation = false) {
60
+ function gnuInformationSync(name, args, externalInvocation = false, posixlyCorrect = false) {
61
61
  if (!args.includes("--help") && !args.includes("--version"))
62
62
  return void 0;
63
63
  if ((name === "true" || name === "false" || name === "echo" || name === "[" || name === "pwd") && (args.length !== 1 || !externalInvocation))
@@ -91,7 +91,7 @@ This is the safe-bash virtual implementation; filesystem operations require back
91
91
  `;
92
92
  }
93
93
  if (!arg.startsWith("-") || arg === "-") {
94
- if (info.stopAtOperand)
94
+ if (info.stopAtOperand || info.stopAtOperandInPosix && posixlyCorrect)
95
95
  break;
96
96
  continue;
97
97
  }
@@ -162,7 +162,7 @@ This is the safe-bash virtual implementation; filesystem operations require back
162
162
  return { exitCode: info.exitCode ?? 0 };
163
163
  }
164
164
  if (!arg.startsWith("-") || arg === "-") {
165
- if (info.stopAtOperand || name === "pwd" && context.env.POSIXLY_CORRECT !== void 0)
165
+ if (info.stopAtOperand || info.stopAtOperandInPosix && context.env.POSIXLY_CORRECT !== void 0)
166
166
  break;
167
167
  continue;
168
168
  }
@@ -0,0 +1,6 @@
1
+ import {
2
+ init_buffer
3
+ } from "./chunk-HX3SHTCE.js";
4
+
5
+ // packages/safe-bash-command-llm/dist/providers/elevenlabs.js
6
+ init_buffer();
@@ -0,0 +1,91 @@
1
+ import {
2
+ init_buffer
3
+ } from "./chunk-HX3SHTCE.js";
4
+
5
+ // packages/safe-bash-command-llm/dist/providers/shared.js
6
+ init_buffer();
7
+ function providerLimits(input = {}) {
8
+ const limits = { maxRequestBytes: Infinity, maxResponseBytes: Infinity, maxEventBytes: Infinity, maxPolls: Infinity, pollIntervalMs: 1e3, ...input };
9
+ for (const [name, value] of Object.entries(limits)) {
10
+ if (name !== "pollIntervalMs" && value === Infinity)
11
+ continue;
12
+ if (!Number.isSafeInteger(value) || value < (name === "maxPolls" || name === "pollIntervalMs" ? 0 : 1))
13
+ throw new RangeError(`Invalid provider limit: ${name}`);
14
+ }
15
+ return Object.freeze(limits);
16
+ }
17
+ function credential(value) {
18
+ if (typeof value !== "string" || value.length === 0 || [...value].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127))
19
+ throw new TypeError("Invalid provider apiKey");
20
+ return value;
21
+ }
22
+ function jsonBody(value, limit) {
23
+ const text = JSON.stringify(value);
24
+ if (text.length > limit)
25
+ throw new RangeError("Provider request byte limit exceeded");
26
+ const bytes = new TextEncoder().encode(text);
27
+ if (bytes.length > limit)
28
+ throw new RangeError("Provider request byte limit exceeded");
29
+ return { body: (async function* () {
30
+ yield bytes;
31
+ })(), headers: [["content-type", "application/json"]] };
32
+ }
33
+ function multipart(options, files, limit) {
34
+ const encoder = new TextEncoder();
35
+ const parts = [];
36
+ const entries = Object.entries(options).map(([name, value]) => {
37
+ if (![...name].every((char) => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".includes(char)))
38
+ throw new TypeError("Invalid multipart option name");
39
+ return [name, String(value)];
40
+ });
41
+ let size = files.reduce((sum, file) => sum + file.bytes.length, 0);
42
+ for (const [, value] of entries) {
43
+ if (value.length > limit)
44
+ throw new RangeError("Provider request byte limit exceeded");
45
+ size += encoder.encode(value).length;
46
+ }
47
+ if (size > limit)
48
+ throw new RangeError("Provider request byte limit exceeded");
49
+ let boundary = "safe-bash-llm-boundary";
50
+ const contains = (bytes, needle) => {
51
+ outer: for (let start = 0; start <= bytes.length - needle.length; start++) {
52
+ for (let index = 0; index < needle.length; index++)
53
+ if (bytes[start + index] !== needle[index])
54
+ continue outer;
55
+ return true;
56
+ }
57
+ return false;
58
+ };
59
+ while (entries.some(([, value]) => value.includes(boundary)) || files.some((file) => contains(file.bytes, encoder.encode(boundary)))) {
60
+ boundary += "x";
61
+ }
62
+ for (const [name, value] of entries)
63
+ parts.push(encoder.encode(`--${boundary}\r
64
+ Content-Disposition: form-data; name="${name}"\r
65
+ \r
66
+ ${value}\r
67
+ `));
68
+ for (const [index, file] of files.entries()) {
69
+ if ([...file.mimeType].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126))
70
+ throw new TypeError("Invalid attachment MIME type");
71
+ parts.push(encoder.encode(`--${boundary}\r
72
+ Content-Disposition: form-data; name="${file.field}"; filename="attachment-${index}"\r
73
+ Content-Type: ${file.mimeType}\r
74
+ \r
75
+ `), Uint8Array.from(file.bytes), encoder.encode("\r\n"));
76
+ }
77
+ parts.push(encoder.encode(`--${boundary}--\r
78
+ `));
79
+ if (parts.reduce((sum, part) => sum + part.length, 0) > limit)
80
+ throw new RangeError("Provider request byte limit exceeded");
81
+ return { body: (async function* () {
82
+ yield* parts;
83
+ })(), headers: [["content-type", `multipart/form-data; boundary=${boundary}`]] };
84
+ }
85
+
86
+ export {
87
+ providerLimits,
88
+ credential,
89
+ jsonBody,
90
+ multipart
91
+ };