@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,79 +1,2 @@
1
- import { openAiBytes, openAiError, openAiRecord } from "./openai-http.js";
2
- async function* events(source, signal, limit, responseLimit) {
3
- const decoder = new TextDecoder("utf-8", { fatal: true });
4
- let line = "", data = [], size = 0, afterCarriageReturn = false;
5
- for await (const chunk of openAiBytes(source, signal, responseLimit)) {
6
- const text = decoder.decode(chunk, { stream: true });
7
- for (const character of text) {
8
- if (afterCarriageReturn && character === "\n") {
9
- afterCarriageReturn = false;
10
- continue;
11
- }
12
- afterCarriageReturn = character === "\r";
13
- const codePoint = character.codePointAt(0);
14
- size += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4;
15
- if (size > limit)
16
- throw new Error("OpenAI SSE event exceeds buffer limit: event byte limit exceeded");
17
- if (character !== "\n" && character !== "\r") {
18
- line += character;
19
- continue;
20
- }
21
- if (line === "") {
22
- if (data.length > 0)
23
- yield data.join("\n");
24
- data = [];
25
- size = 0;
26
- }
27
- else if (line === "data" || line.startsWith("data:")) {
28
- const value = line.slice(5);
29
- data.push(value.startsWith(" ") ? value.slice(1) : value);
30
- }
31
- line = "";
32
- }
33
- }
34
- decoder.decode();
35
- throw new Error("OpenAI chat stream ended before [DONE]");
36
- }
37
- export async function* openAiChat(source, signal, limit = Infinity, responseLimit = Infinity) {
38
- let usage;
39
- const metadata = {};
40
- for await (const data of events(source, signal, limit, responseLimit)) {
41
- signal.throwIfAborted();
42
- if (data.trim() === "[DONE]")
43
- return { ...(usage ? { usage } : {}), ...(Object.keys(metadata).length ? { metadata } : {}) };
44
- let parsed;
45
- try {
46
- parsed = JSON.parse(data);
47
- }
48
- catch {
49
- throw new Error("OpenAI returned malformed SSE JSON");
50
- }
51
- if (!openAiRecord(parsed))
52
- throw new Error("OpenAI returned a non-object SSE event");
53
- if (parsed.error != null)
54
- throw new Error(`OpenAI: ${openAiError(parsed.error) ?? "stream failed"}`);
55
- if (parsed.usage !== undefined && parsed.usage !== null) {
56
- if (!openAiRecord(parsed.usage))
57
- throw new Error("OpenAI SSE event has invalid usage");
58
- usage = parsed.usage;
59
- }
60
- for (const key of ["id", "model", "created", "system_fingerprint"]) {
61
- if (parsed[key] !== undefined)
62
- metadata[key] = parsed[key];
63
- }
64
- if (!Array.isArray(parsed.choices))
65
- throw new Error("OpenAI SSE event has no choices");
66
- for (const choice of parsed.choices) {
67
- signal.throwIfAborted();
68
- if (!openAiRecord(choice) || !openAiRecord(choice.delta))
69
- throw new Error("OpenAI SSE event has a malformed delta");
70
- const content = choice.delta.content;
71
- if (content != null && typeof content !== "string")
72
- throw new Error("OpenAI SSE delta.content is not text");
73
- if (typeof content === "string" && content.length > 0)
74
- yield content;
75
- }
76
- }
77
- throw new Error("OpenAI chat stream ended before [DONE]");
78
- }
1
+ export * from "../../../safe-bash-command-llm/openai-sse.js";
79
2
  //# sourceMappingURL=openai-sse.js.map
@@ -1,15 +1,2 @@
1
- import type { HttpTransport } from "../network/types.js";
2
- import type { LlmModel, LlmProvider } from "./types.js";
3
- import { type LlmProviderLimits } from "./providers/shared.js";
4
- export interface OpenAiModel extends LlmModel {
5
- readonly endpoint: "chat" | "images" | "videos" | "embeddings";
6
- }
7
- export interface OpenAiProviderOptions {
8
- readonly transport: HttpTransport;
9
- readonly apiKey: string;
10
- readonly baseUrl?: string;
11
- readonly models: readonly OpenAiModel[];
12
- readonly limits?: Partial<LlmProviderLimits>;
13
- }
14
- export declare function createOpenAiProvider(options: OpenAiProviderOptions): LlmProvider;
1
+ export * from "../../../safe-bash-command-llm/openai.js";
15
2
  //# sourceMappingURL=openai.d.ts.map
@@ -1,289 +1,2 @@
1
- import { openAiBytes, openAiError, openAiJson, openAiRecord, openAiResponse } from "./openai-http.js";
2
- import { openAiChat } from "./openai-sse.js";
3
- import { acceptsMimeType } from "./mime.js";
4
- import { credential, providerLimits, jsonBody, multipart } from "./providers/shared.js";
5
- const numericOptions = {
6
- chat: new Map([
7
- ["temperature", ["number", 0, 2]], ["top_p", ["number", 0, 1]],
8
- ["frequency_penalty", ["number", -2, 2]], ["presence_penalty", ["number", -2, 2]],
9
- ["max_tokens", ["integer", 1, Number.MAX_SAFE_INTEGER]], ["max_completion_tokens", ["integer", 1, Number.MAX_SAFE_INTEGER]],
10
- ["n", ["integer", 1, Number.MAX_SAFE_INTEGER]], ["seed", ["integer", Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]], ["top_logprobs", ["integer", 0, 20]],
11
- ]),
12
- images: new Map([
13
- ["n", ["integer", 1, 10]], ["output_compression", ["integer", 0, 100]], ["partial_images", ["integer", 0, 3]],
14
- ]),
15
- };
16
- function jsonOptions(options, endpoint) {
17
- return Object.fromEntries(Object.entries(options).map(([key, value]) => {
18
- if ((endpoint === "chat" ? ["store", "parallel_tool_calls", "logprobs"] : ["stream"]).includes(key)) {
19
- if (value !== "true" && value !== "false" && typeof value !== "boolean")
20
- throw new Error(`Invalid OpenAI option ${key}: expected boolean`);
21
- return [key, value === true || value === "true"];
22
- }
23
- const numeric = numericOptions[endpoint].get(key);
24
- if (!numeric)
25
- return [key, value];
26
- const [type, minimum, maximum] = numeric;
27
- const number = typeof value === "number" ? value : typeof value === "string" && value.trim() ? Number(value) : NaN;
28
- if (!Number.isFinite(number) || type === "integer" && !Number.isSafeInteger(number)) {
29
- throw new Error(`Invalid OpenAI option ${key}: expected a finite ${type === "integer" ? "safe integer" : "number"}`);
30
- }
31
- if (number < minimum || number > maximum)
32
- throw new RangeError(`Invalid OpenAI option ${key}: expected ${minimum}..${maximum}`);
33
- return [key, number];
34
- }));
35
- }
36
- function base64(bytes) {
37
- let binary = "";
38
- for (let offset = 0; offset < bytes.length; offset += 8192) {
39
- binary += String.fromCharCode(...bytes.subarray(offset, offset + 8192));
40
- }
41
- return btoa(binary);
42
- }
43
- // Keep image JSON and decoded output within a Worker-sized budget even when
44
- // the general provider response allowance is larger (e.g. video downloads).
45
- function imageSize(value) {
46
- if (typeof value !== "string" || value.length === 0)
47
- throw new Error("OpenAI image response has no b64_json");
48
- if (value.length % 4 !== 0)
49
- throw new Error("OpenAI image response contains non-canonical base64");
50
- return value.length / 4 * 3 - (value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0);
51
- }
52
- function imageSlab(value) {
53
- let decoded;
54
- try {
55
- decoded = atob(value);
56
- }
57
- catch {
58
- throw new Error("OpenAI image response contains invalid base64");
59
- }
60
- if (btoa(decoded) !== value)
61
- throw new Error("OpenAI image response contains non-canonical base64");
62
- return decoded;
63
- }
64
- function* imageBytes(value, signal) {
65
- for (let offset = 0; offset < value.length; offset += 8192) {
66
- signal.throwIfAborted();
67
- const decoded = imageSlab(value.slice(offset, offset + 8192));
68
- const bytes = new Uint8Array(decoded.length);
69
- for (let index = 0; index < decoded.length; index++)
70
- bytes[index] = decoded.charCodeAt(index);
71
- yield bytes;
72
- }
73
- }
74
- function waitForPoll(signal, interval) {
75
- signal.throwIfAborted();
76
- return new Promise((resolve, reject) => {
77
- const abort = () => { clearTimeout(timer); signal.removeEventListener("abort", abort); reject(signal.reason); };
78
- const timer = setTimeout(() => { signal.removeEventListener("abort", abort); resolve(); }, interval);
79
- signal.addEventListener("abort", abort, { once: true });
80
- if (signal.aborted)
81
- abort();
82
- });
83
- }
84
- function job(value, expectedId) {
85
- if (value.error != null)
86
- throw new Error(`OpenAI video failed: ${openAiError(value.error) ?? "unknown error"}`);
87
- if (typeof value.id !== "string" || value.id.length === 0 || value.id === "." || value.id === ".." || (expectedId !== undefined && value.id !== expectedId)) {
88
- throw new Error("OpenAI video response has an invalid job id");
89
- }
90
- if (value.status !== "queued" && value.status !== "in_progress" && value.status !== "completed") {
91
- throw new Error(`OpenAI video failed: ${typeof value.status === "string" ? value.status : "invalid status"}`);
92
- }
93
- return { id: value.id, status: value.status };
94
- }
95
- export function createOpenAiProvider(options) {
96
- const { transport, apiKey } = options;
97
- const limits = providerLimits(options.limits);
98
- if (typeof transport !== "function")
99
- throw new TypeError("OpenAI requires an injected HTTP transport");
100
- if (typeof apiKey !== "string" || !apiKey.trim() || apiKey.includes("\r") || apiKey.includes("\n"))
101
- throw new TypeError("OpenAI requires a valid API key");
102
- credential(apiKey);
103
- const base = new URL(options.baseUrl ?? "https://api.openai.com/v1");
104
- if ((base.protocol !== "https:" && base.protocol !== "http:") || base.username || base.password || base.search || base.hash) {
105
- throw new TypeError("OpenAI baseUrl must be an HTTP(S) URL without credentials, query or fragment");
106
- }
107
- const baseUrl = base.href.endsWith("/") ? base.href.slice(0, -1) : base.href;
108
- const configured = options.models.map(model => Object.freeze({
109
- ...model,
110
- capabilities: Object.freeze(model.capabilities ?? (model.endpoint === "chat" ? ["messages"] : model.endpoint === "embeddings" ? ["embed"] : [])),
111
- ...(model.aliases === undefined ? {} : { aliases: Object.freeze([...model.aliases]) }),
112
- ...(model.attachmentTypes === undefined ? {} : { attachmentTypes: Object.freeze([...model.attachmentTypes]) }),
113
- }));
114
- const byId = new Map();
115
- for (const model of configured) {
116
- if (!model.id || byId.has(model.id))
117
- throw new TypeError(`OpenAI duplicate or empty model id: ${model.id}`);
118
- if (!["chat", "images", "videos", "embeddings"].includes(model.endpoint))
119
- throw new TypeError(`OpenAI invalid endpoint for model: ${model.id}`);
120
- if (model.endpoint === "images" && !acceptsMimeType(["image/png", "image/jpeg", "image/webp"], model.outputType ?? ""))
121
- throw new TypeError("Image models require outputType image/png, image/jpeg or image/webp");
122
- if (model.endpoint === "videos" && !acceptsMimeType(["video/mp4"], model.outputType ?? ""))
123
- throw new TypeError("Video models require outputType video/mp4");
124
- if (model.endpoint === "chat" && model.outputType !== undefined && !acceptsMimeType(["text/*"], model.outputType))
125
- throw new TypeError("Chat models require a text outputType");
126
- byId.set(model.id, model);
127
- }
128
- return {
129
- name: "openai", models: Object.freeze(configured),
130
- async embed(request) {
131
- request.signal.throwIfAborted();
132
- const model = byId.get(request.model);
133
- if (!model || model.endpoint !== "embeddings")
134
- throw new Error(`Model ${request.model} does not support embeddings`);
135
- const values = {};
136
- for (const [key, value] of Object.entries(request.options)) {
137
- if (key === "dimensions") {
138
- const number = typeof value === "number" ? value : typeof value === "string" && value.trim() ? Number(value) : NaN;
139
- if (!Number.isSafeInteger(number) || number < 1)
140
- throw new TypeError("Invalid OpenAI dimensions: expected a positive integer");
141
- values[key] = number;
142
- }
143
- else if (key === "user" && typeof value === "string")
144
- values[key] = value;
145
- else
146
- throw new TypeError(`Unsupported OpenAI embedding option: ${key}`);
147
- }
148
- for await (const response of openAiResponse(transport, {
149
- url: `${baseUrl}/embeddings`, method: "POST", signal: request.signal,
150
- ...jsonBody({ ...values, model: request.model, input: request.inputs }, limits.maxRequestBytes),
151
- headers: [["authorization", `Bearer ${apiKey}`], ["content-type", "application/json"]],
152
- }, limits.maxResponseBytes)) {
153
- const body = await openAiJson(response, request.signal, limits.maxResponseBytes);
154
- if (!Array.isArray(body.data) || body.data.length !== request.inputs.length)
155
- throw new TypeError("Invalid OpenAI embedding response");
156
- const vectors = new Array(request.inputs.length);
157
- for (const item of body.data) {
158
- if (!openAiRecord(item) || !Number.isSafeInteger(item.index) || item.index < 0 || item.index >= vectors.length || vectors[item.index] !== undefined || !Array.isArray(item.embedding) || !item.embedding.length || item.embedding.some(value => typeof value !== "number" || !Number.isFinite(value)))
159
- throw new TypeError("Invalid OpenAI embedding response");
160
- vectors[item.index] = item.embedding;
161
- }
162
- if (vectors.some(vector => vector.length !== vectors[0]?.length))
163
- throw new TypeError("Invalid OpenAI embedding dimensions");
164
- return { model: request.model, vectors, ...(openAiRecord(body.usage) ? { usage: body.usage } : {}) };
165
- }
166
- throw new Error("OpenAI returned no embedding response");
167
- },
168
- async *complete(request) {
169
- request.signal.throwIfAborted();
170
- const model = byId.get(request.model);
171
- if (!model)
172
- throw new Error(`Unknown model: ${request.model}`);
173
- if (model.endpoint === "embeddings")
174
- throw new TypeError("Embedding models require embed()");
175
- if (model.endpoint !== "chat" && (request.messages?.length || request.schema !== undefined))
176
- throw new TypeError("Messages and schemas require a chat model");
177
- if (request.attachments.some(attachment => !acceptsMimeType(["image/*"], attachment.mimeType))) {
178
- throw new Error(`OpenAI ${model.endpoint} endpoint only supports image attachments`);
179
- }
180
- if (model.endpoint === "videos" && request.attachments.length > 1)
181
- throw new Error("OpenAI videos accepts only one input_reference image");
182
- if (request.attachments.reduce((size, file) => size + file.bytes.byteLength, 0) > limits.maxRequestBytes)
183
- throw new RangeError("Provider request byte limit exceeded");
184
- if (model.endpoint !== "chat" && request.system !== undefined)
185
- throw new TypeError("System prompts are supported only by chat models");
186
- if (request.schema !== undefined && request.options.response_format !== undefined)
187
- throw new TypeError("OpenAI option response_format conflicts with request schema");
188
- const reserved = model.endpoint === "chat" ? ["model", "messages", "stream"]
189
- : model.endpoint === "images" ? ["model", "prompt", "image", "image[]"] : ["model", "prompt", "input_reference"];
190
- for (const key of Object.keys(request.options)) {
191
- if (reserved.includes(key))
192
- throw new Error(`OpenAI option ${key} is controlled by the provider`);
193
- }
194
- const send = (path, method, body) => openAiResponse(transport, {
195
- url: `${baseUrl}${path}`, method, signal: request.signal,
196
- ...body, headers: [["authorization", `Bearer ${apiKey}`], ...(body?.headers ?? [])],
197
- }, limits.maxResponseBytes);
198
- if (model.endpoint === "chat") {
199
- const messages = [];
200
- if (request.system !== undefined)
201
- messages.push({ role: "system", content: request.system });
202
- messages.push(...request.messages ?? []);
203
- messages.push({ role: "user", content: request.attachments.length === 0 ? request.prompt : [
204
- { type: "text", text: request.prompt },
205
- ...request.attachments.map(attachment => ({ type: "image_url", image_url: { url: `data:${attachment.mimeType};base64,${base64(attachment.bytes)}` } })),
206
- ] });
207
- let details;
208
- for await (const response of send("/chat/completions", "POST", jsonBody({ ...jsonOptions(request.options, "chat"), ...(request.schema === undefined ? {} : { response_format: { type: "json_schema", json_schema: { name: "response", schema: request.schema } } }), model: request.model, messages, stream: true }, limits.maxRequestBytes))) {
209
- details = yield* openAiChat(response.body, request.signal, limits.maxEventBytes, limits.maxResponseBytes);
210
- }
211
- return details;
212
- }
213
- else if (model.endpoint === "images") {
214
- const editing = request.attachments.length > 0;
215
- const outputFormat = model.outputType.split(";", 1)[0].trim().toLowerCase().slice("image/".length);
216
- if (request.options.output_format !== undefined && request.options.output_format !== outputFormat)
217
- throw new TypeError("output_format conflicts with model outputType");
218
- const values = { ...jsonOptions(request.options, "images"), output_format: outputFormat, model: request.model, prompt: request.prompt };
219
- if (values.stream === true)
220
- throw new TypeError("Image event streaming is not supported by this reference provider");
221
- const body = editing ? multipart({ ...values, ...request.options }, request.attachments.map(file => ({ ...file, field: "image[]" })), limits.maxRequestBytes) : jsonBody(values, limits.maxRequestBytes);
222
- for await (const response of send(editing ? "/images/edits" : "/images/generations", "POST", body)) {
223
- const value = await openAiJson(response, request.signal, limits.maxResponseBytes);
224
- if (value.error != null)
225
- throw new Error(`OpenAI: ${openAiError(value.error) ?? "image generation failed"}`);
226
- if (!Array.isArray(value.data) || value.data.length === 0)
227
- throw new Error("OpenAI image response has no images");
228
- let size = 0;
229
- const images = [];
230
- for (const item of value.data) {
231
- request.signal.throwIfAborted();
232
- if (!openAiRecord(item))
233
- throw new Error("OpenAI image response contains a malformed image");
234
- size += imageSize(item.b64_json);
235
- if (size > limits.maxResponseBytes)
236
- throw new RangeError("Provider image byte limit exceeded");
237
- images.push(item.b64_json);
238
- }
239
- // Validate every slab before publishing any output, including padding
240
- // in the middle of an image or a malformed later image.
241
- for (const image of images) {
242
- for (let offset = 0; offset < image.length; offset += 8192) {
243
- request.signal.throwIfAborted();
244
- const slab = image.slice(offset, offset + 8192);
245
- if (offset + 8192 < image.length && slab.includes("="))
246
- throw new Error("OpenAI image response contains non-canonical base64");
247
- imageSlab(slab);
248
- }
249
- }
250
- for (const image of images)
251
- yield* imageBytes(image, request.signal);
252
- }
253
- }
254
- else {
255
- let current;
256
- for await (const response of send("/videos", "POST", multipart({ ...request.options, model: request.model, prompt: request.prompt }, request.attachments.map(file => ({ ...file, field: "input_reference" })), limits.maxRequestBytes))) {
257
- current = job(await openAiJson(response, request.signal, limits.maxResponseBytes));
258
- }
259
- if (!current)
260
- throw new Error("OpenAI video creation returned no job");
261
- const path = `/videos/${encodeURIComponent(current.id)}`;
262
- let polls = 0;
263
- while (current.status !== "completed") {
264
- if (polls++ >= limits.maxPolls)
265
- throw new RangeError("Provider video polling limit exceeded");
266
- await waitForPoll(request.signal, limits.pollIntervalMs);
267
- for await (const response of send(path, "GET"))
268
- current = job(await openAiJson(response, request.signal, limits.maxResponseBytes), current.id);
269
- }
270
- for await (const response of send(`${path}/content`, "GET")) {
271
- const contentType = response.headers.find(([name]) => name.toLowerCase() === "content-type")?.[1].split(";")[0]?.trim().toLowerCase();
272
- if (contentType && contentType !== "application/octet-stream" && !contentType.startsWith("video/")) {
273
- throw new Error(`OpenAI video download has unexpected content type: ${contentType}`);
274
- }
275
- let received = false;
276
- for await (const chunk of openAiBytes(response.body, request.signal, limits.maxResponseBytes)) {
277
- if (chunk.byteLength === 0)
278
- continue;
279
- received = true;
280
- yield chunk;
281
- }
282
- if (!received)
283
- throw new Error("OpenAI video download is empty");
284
- }
285
- }
286
- },
287
- };
288
- }
1
+ export * from "../../../safe-bash-command-llm/openai.js";
289
2
  //# sourceMappingURL=openai.js.map
@@ -1,2 +1,2 @@
1
- export { createElevenLabsProvider, type ElevenLabsProviderOptions, type ElevenLabsModel } from "../elevenlabs.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/elevenlabs.js";
2
2
  //# sourceMappingURL=elevenlabs.d.ts.map
@@ -1,2 +1,2 @@
1
- export { createElevenLabsProvider } from "../elevenlabs.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/elevenlabs.js";
2
2
  //# sourceMappingURL=elevenlabs.js.map
@@ -1,10 +1,10 @@
1
- import "../../../chunks/chunk-VYW4Q6KF.js";
2
1
  import {
3
- createElevenLabsProvider,
4
- createOpenAiProvider
5
- } from "../../../chunks/chunk-S2LSZFZ6.js";
6
- import "../../../chunks/chunk-LD76P7AG.js";
7
- import "../../../chunks/chunk-Q45QCA4J.js";
2
+ init_platform
3
+ } from "../../../chunks/chunk-I3KSESCR.js";
4
+
5
+ // packages/safe-bash/src/commands/llm/providers/index.ts
6
+ init_platform();
7
+ import { createElevenLabsProvider, createOpenAiProvider } from "../../../../safe-bash-command-llm/providers/index.js";
8
8
  export {
9
9
  createElevenLabsProvider,
10
10
  createOpenAiProvider
@@ -1,4 +1,2 @@
1
- export { createOpenAiProvider, type OpenAiProviderOptions, type OpenAiModel } from "./openai.js";
2
- export { createElevenLabsProvider, type ElevenLabsProviderOptions, type ElevenLabsModel } from "./elevenlabs.js";
3
- export type { LlmProviderLimits } from "./shared.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/index.js";
4
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,2 @@
1
- export { createOpenAiProvider } from "./openai.js";
2
- export { createElevenLabsProvider } from "./elevenlabs.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/index.js";
3
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- export { createOpenAiProvider, type OpenAiProviderOptions, type OpenAiModel } from "../openai.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/openai.js";
2
2
  //# sourceMappingURL=openai.d.ts.map
@@ -1,2 +1,2 @@
1
- export { createOpenAiProvider } from "../openai.js";
1
+ export * from "../../../../safe-bash-command-llm/providers/openai.js";
2
2
  //# sourceMappingURL=openai.js.map
@@ -1,24 +1,2 @@
1
- import type { ByteSource } from "../../../contracts/io.js";
2
- import type { HttpHeaders } from "../../network/types.js";
3
- export interface LlmProviderLimits {
4
- readonly maxRequestBytes: number;
5
- readonly maxResponseBytes: number;
6
- readonly maxEventBytes: number;
7
- readonly maxPolls: number;
8
- readonly pollIntervalMs: number;
9
- }
10
- export declare function providerLimits(input?: Partial<LlmProviderLimits>): LlmProviderLimits;
11
- export declare function credential(value: string): string;
12
- export declare function jsonBody(value: unknown, limit: number): {
13
- body: ByteSource;
14
- headers: HttpHeaders;
15
- };
16
- export declare function multipart(options: Record<string, unknown>, files: readonly {
17
- field: string;
18
- mimeType: string;
19
- bytes: Uint8Array;
20
- }[], limit: number): {
21
- body: ByteSource;
22
- headers: HttpHeaders;
23
- };
1
+ export * from "../../../../safe-bash-command-llm/providers/shared.js";
24
2
  //# sourceMappingURL=shared.d.ts.map
@@ -1,66 +1,2 @@
1
- export function providerLimits(input = {}) {
2
- const limits = { maxRequestBytes: Infinity, maxResponseBytes: Infinity, maxEventBytes: Infinity, maxPolls: Infinity, pollIntervalMs: 1000, ...input };
3
- for (const [name, value] of Object.entries(limits)) {
4
- if (name !== "pollIntervalMs" && value === Infinity)
5
- continue;
6
- if (!Number.isSafeInteger(value) || value < (name === "maxPolls" || name === "pollIntervalMs" ? 0 : 1))
7
- throw new RangeError(`Invalid provider limit: ${name}`);
8
- }
9
- return Object.freeze(limits);
10
- }
11
- export function credential(value) {
12
- if (typeof value !== "string" || value.length === 0 || [...value].some(char => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127))
13
- throw new TypeError("Invalid provider apiKey");
14
- return value;
15
- }
16
- export function jsonBody(value, limit) {
17
- const text = JSON.stringify(value);
18
- if (text.length > limit)
19
- throw new RangeError("Provider request byte limit exceeded");
20
- const bytes = new TextEncoder().encode(text);
21
- if (bytes.length > limit)
22
- throw new RangeError("Provider request byte limit exceeded");
23
- return { body: (async function* () { yield bytes; })(), headers: [["content-type", "application/json"]] };
24
- }
25
- export function multipart(options, files, limit) {
26
- const encoder = new TextEncoder();
27
- const parts = [];
28
- const entries = Object.entries(options).map(([name, value]) => {
29
- if (![...name].every(char => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".includes(char)))
30
- throw new TypeError("Invalid multipart option name");
31
- return [name, String(value)];
32
- });
33
- let size = files.reduce((sum, file) => sum + file.bytes.length, 0);
34
- for (const [, value] of entries) {
35
- if (value.length > limit)
36
- throw new RangeError("Provider request byte limit exceeded");
37
- size += encoder.encode(value).length;
38
- }
39
- if (size > limit)
40
- throw new RangeError("Provider request byte limit exceeded");
41
- let boundary = "safe-bash-llm-boundary";
42
- const contains = (bytes, needle) => {
43
- outer: for (let start = 0; start <= bytes.length - needle.length; start++) {
44
- for (let index = 0; index < needle.length; index++)
45
- if (bytes[start + index] !== needle[index])
46
- continue outer;
47
- return true;
48
- }
49
- return false;
50
- };
51
- while (entries.some(([, value]) => value.includes(boundary)) || files.some(file => contains(file.bytes, encoder.encode(boundary)))) {
52
- boundary += "x";
53
- }
54
- for (const [name, value] of entries)
55
- parts.push(encoder.encode(`--${boundary}\r\nContent-Disposition: form-data; name="${name}"\r\n\r\n${value}\r\n`));
56
- for (const [index, file] of files.entries()) {
57
- if ([...file.mimeType].some(char => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126))
58
- throw new TypeError("Invalid attachment MIME type");
59
- parts.push(encoder.encode(`--${boundary}\r\nContent-Disposition: form-data; name="${file.field}"; filename="attachment-${index}"\r\nContent-Type: ${file.mimeType}\r\n\r\n`), Uint8Array.from(file.bytes), encoder.encode("\r\n"));
60
- }
61
- parts.push(encoder.encode(`--${boundary}--\r\n`));
62
- if (parts.reduce((sum, part) => sum + part.length, 0) > limit)
63
- throw new RangeError("Provider request byte limit exceeded");
64
- return { body: (async function* () { yield* parts; })(), headers: [["content-type", `multipart/form-data; boundary=${boundary}`]] };
65
- }
1
+ export * from "../../../../safe-bash-command-llm/providers/shared.js";
66
2
  //# sourceMappingURL=shared.js.map
@@ -1,38 +1,2 @@
1
- import type { LlmModel, LlmProvider, LlmRequest, LlmEmbeddingRequest, LlmEmbeddingResponse, LlmResponseMetadata } from "./types.js";
2
- export interface LlmServiceOptions {
3
- readonly providers: readonly LlmProvider[];
4
- readonly defaultModel?: string;
5
- }
6
- export interface LlmServiceModel {
7
- readonly provider: LlmProvider;
8
- readonly model: LlmModel;
9
- }
10
- export interface LlmServiceRequest extends Omit<LlmRequest, "model"> {
11
- readonly model?: string;
12
- readonly maxOutputBytes?: number;
13
- }
14
- export type LlmStreamEvent = {
15
- readonly type: "text";
16
- readonly text: string;
17
- } | {
18
- readonly type: "bytes";
19
- readonly data: Uint8Array;
20
- } | {
21
- readonly type: "response";
22
- readonly response: LlmResponseMetadata & {
23
- readonly model: string;
24
- };
25
- };
26
- /** Structured host API shared by shell and other language front ends. */
27
- export interface LlmService {
28
- readonly version: 1;
29
- readonly models: readonly LlmServiceModel[];
30
- resolve(model?: string): LlmServiceModel;
31
- complete(request: LlmServiceRequest): AsyncIterable<string | Uint8Array, LlmResponseMetadata | void>;
32
- stream(request: LlmServiceRequest): AsyncIterable<LlmStreamEvent>;
33
- embed(request: Omit<LlmEmbeddingRequest, "model"> & {
34
- readonly model?: string;
35
- }): Promise<LlmEmbeddingResponse>;
36
- }
37
- export declare function createLlmService(options: LlmServiceOptions): LlmService;
1
+ export * from "../../../safe-bash-command-llm/service.js";
38
2
  //# sourceMappingURL=service.d.ts.map