@poe-platform/safe-bash 0.1.544 → 0.1.546

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 (112) hide show
  1. package/README.md +1 -0
  2. package/dist/safe-bash/chunks/{chunk-66VSWIUC.js → chunk-4V3NGZAG.js} +10 -6
  3. package/dist/safe-bash/chunks/{chunk-66VSWIUC.js.map → chunk-4V3NGZAG.js.map} +1 -1
  4. package/dist/safe-bash/chunks/{chunk-ZYS7YCMY.js → chunk-AWP6Z3RR.js} +13 -9
  5. package/dist/safe-bash/chunks/{chunk-ZYS7YCMY.js.map → chunk-AWP6Z3RR.js.map} +1 -1
  6. package/dist/safe-bash/chunks/chunk-BZUQJTOZ.js +322 -0
  7. package/dist/safe-bash/chunks/chunk-BZUQJTOZ.js.map +7 -0
  8. package/dist/safe-bash/chunks/{chunk-EZLQA6ON.js → chunk-DKT746UJ.js} +9 -5
  9. package/dist/safe-bash/chunks/{chunk-EZLQA6ON.js.map → chunk-DKT746UJ.js.map} +1 -1
  10. package/dist/safe-bash/chunks/{chunk-PZMJ4EC3.js → chunk-EUNOVYVT.js} +17 -4
  11. package/dist/safe-bash/chunks/chunk-EUNOVYVT.js.map +7 -0
  12. package/dist/safe-bash/chunks/chunk-EUTSYRNM.js +111 -0
  13. package/dist/safe-bash/chunks/chunk-EUTSYRNM.js.map +7 -0
  14. package/dist/safe-bash/chunks/chunk-F5AOPLRZ.js +355 -0
  15. package/dist/safe-bash/chunks/chunk-F5AOPLRZ.js.map +7 -0
  16. package/dist/safe-bash/chunks/chunk-FDGESHPB.js +224 -0
  17. package/dist/safe-bash/chunks/chunk-FDGESHPB.js.map +7 -0
  18. package/dist/safe-bash/chunks/{chunk-YEJBZLE5.js → chunk-FIY2BMTU.js} +12 -8
  19. package/dist/safe-bash/chunks/{chunk-YEJBZLE5.js.map → chunk-FIY2BMTU.js.map} +1 -1
  20. package/dist/safe-bash/chunks/{chunk-R3QJL5HH.js → chunk-IDJQT32M.js} +12 -8
  21. package/dist/safe-bash/chunks/{chunk-R3QJL5HH.js.map → chunk-IDJQT32M.js.map} +1 -1
  22. package/dist/safe-bash/chunks/chunk-KYU6MXVK.js +58 -0
  23. package/dist/safe-bash/chunks/chunk-KYU6MXVK.js.map +7 -0
  24. package/dist/safe-bash/chunks/{chunk-T5BV7HPD.js → chunk-O7BRWSKX.js} +17 -60
  25. package/dist/safe-bash/chunks/chunk-O7BRWSKX.js.map +7 -0
  26. package/dist/safe-bash/chunks/{chunk-6PSMEBVP.js → chunk-PPFWG34Y.js} +2 -2
  27. package/dist/safe-bash/chunks/{chunk-VNDFKT6F.js → chunk-QX2X5EC5.js} +13 -9
  28. package/dist/safe-bash/chunks/{chunk-VNDFKT6F.js.map → chunk-QX2X5EC5.js.map} +1 -1
  29. package/dist/safe-bash/chunks/chunk-TTTOMUAY.js +33 -0
  30. package/dist/safe-bash/chunks/chunk-TTTOMUAY.js.map +7 -0
  31. package/dist/safe-bash/chunks/{chunk-5VBLSPNM.js → chunk-UO33SQJU.js} +2 -239
  32. package/dist/safe-bash/chunks/chunk-UO33SQJU.js.map +7 -0
  33. package/dist/safe-bash/chunks/{chunk-TPD45VUZ.js → chunk-VY5N6O6I.js} +22 -109
  34. package/dist/safe-bash/chunks/chunk-VY5N6O6I.js.map +7 -0
  35. package/dist/safe-bash/chunks/{chunk-HFEU5SBQ.js → chunk-WISNTI7E.js} +11 -7
  36. package/dist/safe-bash/chunks/{chunk-HFEU5SBQ.js.map → chunk-WISNTI7E.js.map} +1 -1
  37. package/dist/safe-bash/chunks/{chunk-A4UXQKWZ.js → chunk-WJWYJDQE.js} +12 -8
  38. package/dist/safe-bash/chunks/{chunk-A4UXQKWZ.js.map → chunk-WJWYJDQE.js.map} +1 -1
  39. package/dist/safe-bash/chunks/{chunk-AZNI263O.js → chunk-WXUZXY35.js} +3 -3
  40. package/dist/safe-bash/chunks/{chunk-WODV2DVM.js → chunk-X7C3PN2T.js} +11 -7
  41. package/dist/safe-bash/chunks/{chunk-WODV2DVM.js.map → chunk-X7C3PN2T.js.map} +1 -1
  42. package/dist/safe-bash/chunks/{chunk-WF4P7XKI.js → chunk-YFFFBLBC.js} +12 -8
  43. package/dist/safe-bash/chunks/{chunk-WF4P7XKI.js.map → chunk-YFFFBLBC.js.map} +1 -1
  44. package/dist/safe-bash/commands/csplit/index.browser.js +6 -4
  45. package/dist/safe-bash/commands/factor/index.browser.js +5 -3
  46. package/dist/safe-bash/commands/getopt/index.browser.js +5 -3
  47. package/dist/safe-bash/commands/hexdump/index.browser.js +5 -3
  48. package/dist/safe-bash/commands/iconv/index.browser.js +5 -3
  49. package/dist/safe-bash/commands/line-endings/index.browser.js +6 -4
  50. package/dist/safe-bash/commands/llm/command.d.ts +4 -0
  51. package/dist/safe-bash/commands/llm/command.d.ts.map +1 -0
  52. package/dist/safe-bash/commands/llm/command.js +194 -0
  53. package/dist/safe-bash/commands/llm/command.js.map +1 -0
  54. package/dist/safe-bash/commands/llm/index.browser.js +14 -0
  55. package/dist/safe-bash/commands/llm/index.browser.js.map +7 -0
  56. package/dist/safe-bash/commands/llm/index.d.ts +6 -0
  57. package/dist/safe-bash/commands/llm/index.d.ts.map +1 -0
  58. package/dist/safe-bash/commands/llm/index.js +12 -0
  59. package/dist/safe-bash/commands/llm/index.js.map +1 -0
  60. package/dist/safe-bash/commands/llm/mime.d.ts +2 -0
  61. package/dist/safe-bash/commands/llm/mime.d.ts.map +1 -0
  62. package/dist/safe-bash/commands/llm/mime.js +33 -0
  63. package/dist/safe-bash/commands/llm/mime.js.map +1 -0
  64. package/dist/safe-bash/commands/llm/providers/elevenlabs.d.ts +16 -0
  65. package/dist/safe-bash/commands/llm/providers/elevenlabs.d.ts.map +1 -0
  66. package/dist/safe-bash/commands/llm/providers/elevenlabs.js +51 -0
  67. package/dist/safe-bash/commands/llm/providers/elevenlabs.js.map +1 -0
  68. package/dist/safe-bash/commands/llm/providers/index.browser.js +13 -0
  69. package/dist/safe-bash/commands/llm/providers/index.browser.js.map +7 -0
  70. package/dist/safe-bash/commands/llm/providers/index.d.ts +4 -0
  71. package/dist/safe-bash/commands/llm/providers/index.d.ts.map +1 -0
  72. package/dist/safe-bash/commands/llm/providers/index.js +3 -0
  73. package/dist/safe-bash/commands/llm/providers/index.js.map +1 -0
  74. package/dist/safe-bash/commands/llm/providers/openai.d.ts +15 -0
  75. package/dist/safe-bash/commands/llm/providers/openai.d.ts.map +1 -0
  76. package/dist/safe-bash/commands/llm/providers/openai.js +78 -0
  77. package/dist/safe-bash/commands/llm/providers/openai.js.map +1 -0
  78. package/dist/safe-bash/commands/llm/providers/shared.d.ts +34 -0
  79. package/dist/safe-bash/commands/llm/providers/shared.d.ts.map +1 -0
  80. package/dist/safe-bash/commands/llm/providers/shared.js +220 -0
  81. package/dist/safe-bash/commands/llm/providers/shared.js.map +1 -0
  82. package/dist/safe-bash/commands/llm/types.d.ts +28 -0
  83. package/dist/safe-bash/commands/llm/types.d.ts.map +1 -0
  84. package/dist/safe-bash/commands/llm/types.js +2 -0
  85. package/dist/safe-bash/commands/llm/types.js.map +1 -0
  86. package/dist/safe-bash/commands/network/index.browser.js +13 -8
  87. package/dist/safe-bash/commands/pr/index.browser.js +5 -3
  88. package/dist/safe-bash/commands/tsort/index.browser.js +5 -3
  89. package/dist/safe-bash/commands/xml/index.browser.js +7 -4
  90. package/dist/safe-bash/commands/yq/index.browser.js +8 -5
  91. package/dist/safe-bash/contracts/command.d.ts +4 -0
  92. package/dist/safe-bash/contracts/command.d.ts.map +1 -1
  93. package/dist/safe-bash/contracts/command.js.map +1 -1
  94. package/dist/safe-bash/contracts/output.d.ts.map +1 -1
  95. package/dist/safe-bash/contracts/output.js +12 -2
  96. package/dist/safe-bash/contracts/output.js.map +1 -1
  97. package/dist/safe-bash/core.browser.js +1093 -1160
  98. package/dist/safe-bash/core.browser.js.map +4 -4
  99. package/dist/safe-bash/core.d.ts +2 -0
  100. package/dist/safe-bash/core.d.ts.map +1 -1
  101. package/dist/safe-bash/core.js +2 -0
  102. package/dist/safe-bash/core.js.map +1 -1
  103. package/dist/safe-bash/shell/runtime.d.ts.map +1 -1
  104. package/dist/safe-bash/shell/runtime.js +10 -0
  105. package/dist/safe-bash/shell/runtime.js.map +1 -1
  106. package/package.json +14 -2
  107. package/dist/safe-bash/chunks/chunk-5VBLSPNM.js.map +0 -7
  108. package/dist/safe-bash/chunks/chunk-PZMJ4EC3.js.map +0 -7
  109. package/dist/safe-bash/chunks/chunk-T5BV7HPD.js.map +0 -7
  110. package/dist/safe-bash/chunks/chunk-TPD45VUZ.js.map +0 -7
  111. /package/dist/safe-bash/chunks/{chunk-6PSMEBVP.js.map → chunk-PPFWG34Y.js.map} +0 -0
  112. /package/dist/safe-bash/chunks/{chunk-AZNI263O.js.map → chunk-WXUZXY35.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/contracts/output.ts"],
4
+ "sourcesContent": ["import type { CommandContext, InvocationCleanup } from \"./command.js\";\nimport { outputFailure, writeBytes, type ByteSink } from \"./io.js\";\n\nexport interface OutputOperation {\n readonly signal: AbortSignal;\n readonly output: ByteSink;\n child(destination: ByteSink): OutputOperation;\n registerCleanup(cleanup: InvocationCleanup): void;\n acquire<Value>(start: (signal: AbortSignal) => Value | Promise<Value>, release: (resource: Value) => void | Promise<void>): Promise<Value>;\n close(): Promise<void>;\n abort(reason: unknown): Promise<void>;\n}\n\nexport function createOutputOperation(context: Pick<CommandContext, \"signal\" | \"registerCleanup\">, destination: ByteSink): OutputOperation {\n const controller = new AbortController();\n const signal = controller.signal;\n const capability = destination.ownedOutput;\n const callbacks: InvocationCleanup[] = [];\n const children: OutputOperation[] = [];\n const writes = new Set<Promise<void>>();\n const closedReason = new Error(\"Output operation is closed\");\n let accepting = true;\n let drain: Promise<void> | undefined;\n const assertOpen = (): void => {\n context.signal.throwIfAborted();\n signal.throwIfAborted();\n if (!accepting) throw closedReason;\n };\n const close = (): Promise<void> => {\n if (drain) return drain;\n accepting = false;\n drain = Promise.resolve().then(async () => {\n try {\n const results = await Promise.allSettled([...writes, ...callbacks.map(async cleanup => cleanup())]);\n const failures = results.filter(result => result.status === \"rejected\").map(result => result.reason);\n if (failures.length === 1) throw failures[0];\n if (failures.length) throw new AggregateError(failures, \"Output operation cleanup failed\");\n } finally {\n context.signal.removeEventListener(\"abort\", callerAbort);\n capability?.consumerClosed.removeEventListener(\"abort\", outputAbort);\n }\n });\n void drain.catch(() => {});\n for (const child of children) void child.close().catch(() => {});\n return drain;\n };\n const abort = (reason: unknown): void => {\n controller.abort(reason);\n void close().catch(() => {});\n };\n const callerAbort = (): void => abort(context.signal.reason);\n const outputAbort = (): void => abort(capability?.consumerClosed.reason);\n const registerCleanup = (cleanup: InvocationCleanup): void => {\n assertOpen();\n if (typeof cleanup !== \"function\") throw new TypeError(\"Cleanup must be callable\");\n callbacks.push(cleanup);\n };\n const wait = <Value>(pending: Promise<Value>): Promise<Value> => new Promise((resolve, reject) => {\n const aborted = (): void => reject(signal.reason);\n if (signal.aborted) aborted();\n else signal.addEventListener(\"abort\", aborted, { once: true });\n pending.then(value => {\n signal.removeEventListener(\"abort\", aborted);\n resolve(value);\n }, error => {\n signal.removeEventListener(\"abort\", aborted);\n reject(error);\n });\n });\n context.registerCleanup?.(close);\n if (context.signal.aborted) callerAbort();\n else if (capability?.consumerClosed.aborted) outputAbort();\n else {\n context.signal.addEventListener(\"abort\", callerAbort, { once: true });\n capability?.consumerClosed.addEventListener(\"abort\", outputAbort, { once: true });\n }\n return {\n signal,\n output: {\n ...(destination[outputFailure] ? { [outputFailure]: destination[outputFailure] } : {}),\n async write(chunk) {\n assertOpen();\n if (!capability) return writeBytes(destination, chunk, signal);\n let settled!: () => void;\n const admitted = new Promise<void>(resolve => { settled = resolve; });\n writes.add(admitted);\n // Cancellation can settle the caller while the owned destination is still writing.\n const pending = writeBytes(capability, chunk);\n const finish = (): void => { writes.delete(admitted); settled(); };\n void pending.then(finish, finish);\n await wait(pending);\n },\n },\n registerCleanup,\n child(destination) {\n assertOpen();\n const child = createOutputOperation({ signal, registerCleanup }, destination);\n children.push(child);\n return child;\n },\n async acquire<Value>(start: (signal: AbortSignal) => Value | Promise<Value>, release: (resource: Value) => void | Promise<void>) {\n assertOpen();\n let resource: { value: Value } | undefined;\n let settled!: () => void;\n const admitted = new Promise<void>(resolve => { settled = resolve; });\n let released: Promise<void> | undefined;\n const dispose = (): Promise<void> => {\n released ??= admitted.then(async () => { if (resource) await release(resource.value); });\n return released;\n };\n registerCleanup(dispose);\n let acquisition: Promise<Value>;\n try { acquisition = Promise.resolve(start(signal)); }\n catch (error) { acquisition = Promise.reject(error); }\n const pending = acquisition.then(async value => {\n resource = { value };\n settled();\n if (!accepting) {\n await dispose();\n throw signal.aborted ? signal.reason : closedReason;\n }\n return value;\n }, error => {\n settled();\n throw error;\n });\n return wait(pending);\n },\n close,\n abort(reason) {\n abort(reason);\n return close();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["destination"]
7
+ }
@@ -0,0 +1,111 @@
1
+ import {
2
+ writeDiagnostic
3
+ } from "./chunk-KYU6MXVK.js";
4
+ import {
5
+ init_platform
6
+ } from "./chunk-2KL6W6NB.js";
7
+
8
+ // packages/safe-bash/src/commands/network/types.ts
9
+ init_platform();
10
+ var defaultNetworkLimits = Object.freeze({
11
+ maxUploadBytes: 64 * 1024 * 1024,
12
+ maxDownloadBytes: 64 * 1024 * 1024,
13
+ maxBufferBytes: 8 * 1024 * 1024,
14
+ maxHeaderBytes: 64 * 1024,
15
+ maxRedirects: 10,
16
+ maxRetries: 5,
17
+ maxUrls: 32,
18
+ maxTimeMs: 12e4,
19
+ maxTotalTimeMs: 12e4
20
+ });
21
+ var cloudflareWorkerNetworkLimits = Object.freeze({
22
+ maxUploadBytes: 4 * 1024 * 1024,
23
+ maxDownloadBytes: 4 * 1024 * 1024,
24
+ maxBufferBytes: 1024 * 1024,
25
+ maxHeaderBytes: 32 * 1024,
26
+ maxRedirects: 2,
27
+ maxRetries: 1,
28
+ maxUrls: 8,
29
+ maxTimeMs: 1e4,
30
+ maxTotalTimeMs: 1e4
31
+ });
32
+ var CurlError = class extends Error {
33
+ constructor(exitCode, message) {
34
+ super(message);
35
+ this.exitCode = exitCode;
36
+ this.name = "CurlError";
37
+ }
38
+ exitCode;
39
+ };
40
+
41
+ // packages/safe-bash/src/commands/network/shared.ts
42
+ init_platform();
43
+ var encode = (text) => new TextEncoder().encode(text);
44
+ function limitsFor(overrides = {}) {
45
+ const result = { ...defaultNetworkLimits, ...overrides };
46
+ for (const [name, value] of Object.entries(result)) {
47
+ const minimum = name === "maxRedirects" || name === "maxRetries" ? 0 : 1;
48
+ if (!Number.isSafeInteger(value) || value < minimum || name === "maxTimeMs" && value > 2147483647) {
49
+ throw new RangeError(`Invalid network limit: ${name}`);
50
+ }
51
+ }
52
+ return Object.freeze(result);
53
+ }
54
+ async function withSignal(operation, signal) {
55
+ signal.throwIfAborted();
56
+ return new Promise((resolve, reject) => {
57
+ const onAbort = () => {
58
+ cleanup();
59
+ reject(signal.reason);
60
+ };
61
+ const cleanup = () => signal.removeEventListener("abort", onAbort);
62
+ signal.addEventListener("abort", onAbort, { once: true });
63
+ Promise.resolve().then(operation).then((value) => {
64
+ cleanup();
65
+ resolve(value);
66
+ }, (error) => {
67
+ cleanup();
68
+ reject(error);
69
+ });
70
+ });
71
+ }
72
+ async function delay(milliseconds, signal) {
73
+ let timer;
74
+ try {
75
+ await withSignal(() => new Promise((resolve) => {
76
+ timer = setTimeout(resolve, milliseconds);
77
+ }), signal);
78
+ } finally {
79
+ clearTimeout(timer);
80
+ }
81
+ }
82
+ function header(headers, name) {
83
+ return headers.find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];
84
+ }
85
+ function networkError(error) {
86
+ if (error instanceof CurlError) return error;
87
+ const code = error && typeof error === "object" && "code" in error ? String(error.code) : "";
88
+ if (["ENOTFOUND", "EAI_AGAIN"].includes(code)) return new CurlError(6, "Could not resolve host");
89
+ if (["ECONNREFUSED", "ENETUNREACH", "EHOSTUNREACH"].includes(code)) return new CurlError(7, "Failed to connect");
90
+ if (/CERT|SELF_SIGNED|UNABLE_TO_VERIFY/.test(code)) return new CurlError(60, "TLS certificate verification failed");
91
+ if (/TLS|SSL/.test(code)) return new CurlError(35, "TLS handshake failed");
92
+ return new CurlError(56, "Network transfer failed");
93
+ }
94
+ async function diagnostic(context, error) {
95
+ await writeDiagnostic(context.stderr, `${context.command}: (${error.exitCode}) ${error.message}
96
+ `, context.signal);
97
+ }
98
+
99
+ export {
100
+ defaultNetworkLimits,
101
+ cloudflareWorkerNetworkLimits,
102
+ CurlError,
103
+ encode,
104
+ limitsFor,
105
+ withSignal,
106
+ delay,
107
+ header,
108
+ networkError,
109
+ diagnostic
110
+ };
111
+ //# sourceMappingURL=chunk-EUTSYRNM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/network/types.ts", "../../src/commands/network/shared.ts"],
4
+ "sourcesContent": ["import type { ByteSource, InvocationCleanup } from \"../../contracts/index.js\";\n\nexport type HttpHeaders = readonly (readonly [string, string])[];\n\nexport interface HttpRequest {\n readonly url: string;\n readonly method: string;\n readonly headers: HttpHeaders;\n readonly body?: ByteSource;\n /** Consumer body intent, independent of method. Omitted means \"read\".\n * \"omit\" permits an empty body; \"omit-on-http-error\" permits it only for\n * status >= 400. Neither changes the HTTP request or response status/headers. */\n readonly responseBodyMode?: \"omit\" | \"omit-on-http-error\" | \"read\";\n readonly signal: AbortSignal;\n readonly registerCleanup?: (cleanup: InvocationCleanup) => void;\n readonly denyPrivateNetworks?: true;\n}\n\nexport interface HttpResponse {\n readonly status: number;\n readonly statusText: string;\n readonly headers: HttpHeaders;\n readonly httpVersion?: string;\n readonly body: ByteSource;\n dispose(): Promise<void>;\n}\n\nexport type HttpTransport = ((request: HttpRequest) => Promise<HttpResponse>) & {\n readonly supportsPrivateNetworkDeny?: true;\n};\n\nexport interface NetworkAuthorization {\n readonly url: string;\n readonly method: string;\n readonly redirectFrom?: string;\n readonly attempt: number;\n readonly signal: AbortSignal;\n readonly requirePrivateNetworkDeny?: () => void;\n}\n\nexport type NetworkAuthorizer = (request: NetworkAuthorization) => boolean | Promise<boolean>;\n\nexport interface NetworkLimits {\n readonly maxUploadBytes: number;\n readonly maxDownloadBytes: number;\n readonly maxBufferBytes: number;\n readonly maxHeaderBytes: number;\n readonly maxRedirects: number;\n readonly maxRetries: number;\n readonly maxUrls: number;\n readonly maxTimeMs: number;\n readonly maxTotalTimeMs: number;\n}\n\nexport interface NetworkCommandsOptions {\n readonly authorize: NetworkAuthorizer;\n readonly transport?: HttpTransport;\n readonly limits?: Partial<NetworkLimits>;\n readonly replace?: boolean;\n}\n\nexport const defaultNetworkLimits: Readonly<NetworkLimits> = Object.freeze({\n maxUploadBytes: 64 * 1024 * 1024,\n maxDownloadBytes: 64 * 1024 * 1024,\n maxBufferBytes: 8 * 1024 * 1024,\n maxHeaderBytes: 64 * 1024,\n maxRedirects: 10,\n maxRetries: 5,\n maxUrls: 32,\n maxTimeMs: 120_000,\n maxTotalTimeMs: 120_000,\n});\n\nexport const cloudflareWorkerNetworkLimits: Readonly<NetworkLimits> = Object.freeze({\n maxUploadBytes: 4 * 1024 * 1024,\n maxDownloadBytes: 4 * 1024 * 1024,\n maxBufferBytes: 1024 * 1024,\n maxHeaderBytes: 32 * 1024,\n maxRedirects: 2,\n maxRetries: 1,\n maxUrls: 8,\n maxTimeMs: 10_000,\n maxTotalTimeMs: 10_000,\n});\n\nexport class CurlError extends Error {\n constructor(readonly exitCode: number, message: string) {\n super(message);\n this.name = \"CurlError\";\n }\n}\n", "import type { CommandContext } from \"../../contracts/index.js\";\nimport { writeDiagnostic } from \"../../escaping.js\";\nimport { CurlError, defaultNetworkLimits, type HttpHeaders, type NetworkLimits } from \"./types.js\";\n\nexport const encode = (text: string): Uint8Array => new TextEncoder().encode(text);\n\nexport function limitsFor(overrides: Partial<NetworkLimits> = {}): NetworkLimits {\n const result = { ...defaultNetworkLimits, ...overrides };\n for (const [name, value] of Object.entries(result)) {\n const minimum = name === \"maxRedirects\" || name === \"maxRetries\" ? 0 : 1;\n if (!Number.isSafeInteger(value) || value < minimum || (name === \"maxTimeMs\" && value > 2_147_483_647)) {\n throw new RangeError(`Invalid network limit: ${name}`);\n }\n }\n return Object.freeze(result);\n}\n\nexport async function withSignal<Value>(operation: () => PromiseLike<Value> | Value, signal: AbortSignal): Promise<Value> {\n signal.throwIfAborted();\n return new Promise<Value>((resolve, reject) => {\n const onAbort = (): void => { cleanup(); reject(signal.reason); };\n const cleanup = (): void => signal.removeEventListener(\"abort\", onAbort);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(operation).then(value => { cleanup(); resolve(value); }, error => { cleanup(); reject(error); });\n });\n}\n\nexport async function delay(milliseconds: number, signal: AbortSignal): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try { await withSignal(() => new Promise<void>(resolve => { timer = setTimeout(resolve, milliseconds); }), signal); }\n finally { clearTimeout(timer); }\n}\n\nexport function header(headers: HttpHeaders, name: string): string | undefined {\n return headers.find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];\n}\n\nexport function networkError(error: unknown): CurlError {\n if (error instanceof CurlError) return error;\n const code = error && typeof error === \"object\" && \"code\" in error ? String(error.code) : \"\";\n if ([\"ENOTFOUND\", \"EAI_AGAIN\"].includes(code)) return new CurlError(6, \"Could not resolve host\");\n if ([\"ECONNREFUSED\", \"ENETUNREACH\", \"EHOSTUNREACH\"].includes(code)) return new CurlError(7, \"Failed to connect\");\n if (/CERT|SELF_SIGNED|UNABLE_TO_VERIFY/.test(code)) return new CurlError(60, \"TLS certificate verification failed\");\n if (/TLS|SSL/.test(code)) return new CurlError(35, \"TLS handshake failed\");\n return new CurlError(56, \"Network transfer failed\");\n}\n\nexport async function diagnostic(context: CommandContext, error: CurlError): Promise<void> {\n await writeDiagnostic(context.stderr, `${context.command}: (${error.exitCode}) ${error.message}\\n`, context.signal);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,355 @@
1
+ import {
2
+ createOutputOperation
3
+ } from "./chunk-EUNOVYVT.js";
4
+ import {
5
+ resolvePath
6
+ } from "./chunk-DPJWEGIX.js";
7
+ import {
8
+ getCommandArguments
9
+ } from "./chunk-UO33SQJU.js";
10
+ import {
11
+ readBytes,
12
+ writeBytes,
13
+ yieldTurn
14
+ } from "./chunk-FDGESHPB.js";
15
+ import {
16
+ init_platform
17
+ } from "./chunk-2KL6W6NB.js";
18
+
19
+ // packages/safe-bash/src/commands/llm/index.ts
20
+ init_platform();
21
+
22
+ // packages/safe-bash/src/commands/llm/command.ts
23
+ init_platform();
24
+
25
+ // packages/safe-bash/src/commands/llm/mime.ts
26
+ init_platform();
27
+
28
+ // packages/safe-bash/src/commands/file/classify.ts
29
+ init_platform();
30
+ var binary = { description: "data", mime: "application/octet-stream", encoding: "binary" };
31
+ function result(description, mime, encoding = "binary") {
32
+ return { description, mime, encoding };
33
+ }
34
+ function matches(bytes, signature, offset = 0) {
35
+ return bytes.length >= offset + signature.length && signature.every((value, index) => bytes[offset + index] === value);
36
+ }
37
+ function ascii(bytes, start, length) {
38
+ return String.fromCharCode(...bytes.subarray(start, start + length));
39
+ }
40
+ function magic(bytes) {
41
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
42
+ if (bytes.length >= 33 && matches(bytes, [137, 80, 78, 71, 13, 10, 26, 10]) && view.getUint32(8) === 13 && ascii(bytes, 12, 4) === "IHDR" && view.getUint32(16) > 0 && view.getUint32(20) > 0 && bytes[26] === 0 && bytes[27] === 0 && bytes[28] <= 1) {
43
+ const allowed = { 0: [1, 2, 4, 8, 16], 2: [8, 16], 3: [1, 2, 4, 8], 4: [8, 16], 6: [8, 16] };
44
+ if (allowed[bytes[25]]?.includes(bytes[24])) return result("PNG image data", "image/png");
45
+ }
46
+ if (bytes.length >= 13 && ["GIF87a", "GIF89a"].includes(ascii(bytes, 0, 6)) && view.getUint16(6, true) > 0 && view.getUint16(8, true) > 0) return result("GIF image data", "image/gif");
47
+ if (bytes.length >= 4 && matches(bytes, [255, 216, 255]) && bytes[3] >= 192 && bytes[3] <= 254) return result("JPEG image data", "image/jpeg");
48
+ if (bytes.length >= 20 && ascii(bytes, 0, 4) === "RIFF" && ascii(bytes, 8, 4) === "WEBP" && ["VP8 ", "VP8L", "VP8X"].includes(ascii(bytes, 12, 4)) && view.getUint32(4, true) >= 12) return result("WebP image data", "image/webp");
49
+ if (bytes.length >= 8 && (matches(bytes, [73, 73, 42, 0]) || matches(bytes, [77, 77, 0, 42]))) return result("TIFF image data", "image/tiff");
50
+ if (bytes.length >= 26 && ascii(bytes, 0, 2) === "BM" && [12, 40, 52, 56, 108, 124].includes(view.getUint32(14, true))) return result("PC bitmap image data", "image/bmp");
51
+ if (bytes.length >= 22 && matches(bytes, [0, 0, 1, 0]) && view.getUint16(4, true) > 0) return result("MS Windows icon resource", "image/vnd.microsoft.icon");
52
+ if (/^%PDF-[12]\.[0-9](?:\r|\n|\s)/u.test(ascii(bytes, 0, 16))) return result("PDF document", "application/pdf");
53
+ if (bytes.length >= 10 && matches(bytes, [31, 139, 8]) && (bytes[3] & 224) === 0) return result("gzip compressed data", "application/gzip");
54
+ if (bytes.length >= 10 && ascii(bytes, 0, 3) === "BZh" && bytes[3] >= 49 && bytes[3] <= 57 && (ascii(bytes, 4, 6) === "1AY&SY" || matches(bytes, [23, 114, 69, 56, 80, 144], 4))) return result("bzip2 compressed data", "application/x-bzip2");
55
+ if (bytes.length >= 12 && matches(bytes, [253, 55, 122, 88, 90, 0]) && bytes[6] === 0 && bytes[7] <= 15) return result("XZ compressed data", "application/x-xz");
56
+ if (bytes.length >= 6 && matches(bytes, [40, 181, 47, 253]) && (bytes[4] & 24) === 0) return result("Zstandard compressed data", "application/zstd");
57
+ if (bytes.length >= 30 && matches(bytes, [80, 75, 3, 4]) || bytes.length >= 22 && matches(bytes, [80, 75, 5, 6])) return result("Zip archive data", "application/zip");
58
+ if (bytes.length >= 32 && matches(bytes, [55, 122, 188, 175, 39, 28])) return result("7-zip archive data", "application/x-7z-compressed");
59
+ if (bytes.length >= 14 && matches(bytes, [82, 97, 114, 33, 26, 7, 0]) || bytes.length >= 16 && matches(bytes, [82, 97, 114, 33, 26, 7, 1, 0])) return result("RAR archive data", "application/x-rar");
60
+ if (bytes.length >= 512 && ascii(bytes, 257, 5) === "ustar") {
61
+ const checksum = ascii(bytes, 148, 8).replace(/\0.*$/u, "").trim();
62
+ if (/^[0-7]+$/u.test(checksum)) {
63
+ let total = 0;
64
+ for (let index = 0; index < 512; index++) total += index >= 148 && index < 156 ? 32 : bytes[index];
65
+ if (parseInt(checksum, 8) === total) return result("POSIX tar archive", "application/x-tar");
66
+ }
67
+ }
68
+ if (bytes.length >= 52 && matches(bytes, [127, 69, 76, 70]) && [1, 2].includes(bytes[4]) && [1, 2].includes(bytes[5]) && bytes[6] === 1 && (bytes[4] === 1 || bytes.length >= 64)) {
69
+ const type = view.getUint16(16, bytes[5] === 1);
70
+ const mime = type === 1 ? "application/x-object" : type === 2 ? "application/x-executable" : type === 3 ? "application/x-sharedlib" : "application/octet-stream";
71
+ return result(`ELF ${bytes[4] === 1 ? "32" : "64"}-bit ${type === 2 ? "executable" : type === 3 ? "shared object" : "object"}`, mime);
72
+ }
73
+ if (bytes.length >= 64 && ascii(bytes, 0, 2) === "MZ") {
74
+ const offset = view.getUint32(60, true);
75
+ if (offset >= 64 && offset <= bytes.length - 24 && matches(bytes, [80, 69, 0, 0], offset)) return result("PE executable", "application/vnd.microsoft.portable-executable");
76
+ return result("DOS executable", "application/x-dosexec");
77
+ }
78
+ if (bytes.length >= 8 && matches(bytes, [0, 97, 115, 109, 1, 0, 0, 0])) return result("WebAssembly binary module", "application/wasm");
79
+ if (bytes.length >= 100 && ascii(bytes, 0, 16) === "SQLite format 3\0") {
80
+ const size = view.getUint16(16);
81
+ if ((size === 1 || size >= 512 && size <= 32768 && (size & size - 1) === 0) && [1, 2].includes(bytes[18]) && [1, 2].includes(bytes[19]) && matches(bytes, [64, 32, 32], 21)) return result("SQLite 3.x database", "application/vnd.sqlite3");
82
+ }
83
+ if (bytes.length >= 512 && matches(bytes, [208, 207, 17, 224, 161, 177, 26, 225]) && matches(bytes, [254, 255], 28)) return result("OLE Compound Document", "application/x-ole-storage");
84
+ return void 0;
85
+ }
86
+ function classify(bytes, complete) {
87
+ if (!bytes.length) return complete ? result("empty", "inode/x-empty") : binary;
88
+ const recognized = magic(bytes);
89
+ if (recognized) return recognized;
90
+ if (matches(bytes, [255, 254, 0, 0]) || matches(bytes, [0, 0, 254, 255])) return binary;
91
+ let encoding = "utf-8";
92
+ let bom = 0;
93
+ if (matches(bytes, [239, 187, 191])) bom = 3;
94
+ else if (matches(bytes, [255, 254])) {
95
+ encoding = "utf-16le";
96
+ bom = 2;
97
+ } else if (matches(bytes, [254, 255])) {
98
+ encoding = "utf-16be";
99
+ bom = 2;
100
+ }
101
+ let text;
102
+ try {
103
+ text = new TextDecoder(encoding, { fatal: true }).decode(bytes, { stream: !complete });
104
+ } catch {
105
+ return binary;
106
+ }
107
+ if (!text.length && bytes.length > bom) return binary;
108
+ for (const character of text) {
109
+ const code = character.codePointAt(0);
110
+ if (code < 32 && ![8, 9, 10, 12, 13, 27].includes(code) || code >= 127 && code <= 159) return binary;
111
+ }
112
+ if (!bom && encoding === "utf-8" && bytes.every((value) => value < 128)) encoding = "us-ascii";
113
+ if (complete && /^[\x20\t\r\n]*(?:\{|\[)/u.test(text)) {
114
+ try {
115
+ JSON.parse(text);
116
+ return result("JSON text data", "application/json", encoding);
117
+ } catch {
118
+ }
119
+ }
120
+ const description = encoding === "us-ascii" ? "ASCII text" : encoding === "utf-8" ? "Unicode text, UTF-8" : `Unicode text, ${encoding === "utf-16le" ? "UTF-16, little-endian" : "UTF-16, big-endian"}`;
121
+ return result(description, "text/plain", encoding);
122
+ }
123
+
124
+ // packages/safe-bash/src/commands/llm/mime.ts
125
+ var extensions = {
126
+ png: "image/png",
127
+ jpg: "image/jpeg",
128
+ jpeg: "image/jpeg",
129
+ gif: "image/gif",
130
+ webp: "image/webp",
131
+ svg: "image/svg+xml",
132
+ mp3: "audio/mpeg",
133
+ wav: "audio/wav",
134
+ ogg: "audio/ogg",
135
+ flac: "audio/flac",
136
+ m4a: "audio/mp4",
137
+ aac: "audio/aac",
138
+ mp4: "video/mp4",
139
+ mov: "video/quicktime",
140
+ webm: "video/webm",
141
+ mkv: "video/x-matroska",
142
+ avi: "video/x-msvideo",
143
+ pdf: "application/pdf",
144
+ txt: "text/plain",
145
+ json: "application/json",
146
+ csv: "text/csv"
147
+ };
148
+ function attachmentMime(bytes, path) {
149
+ const prefix = bytes.subarray(0, 512);
150
+ const ascii2 = (offset, length) => String.fromCharCode(...prefix.subarray(offset, offset + length));
151
+ if (prefix.length >= 7 && prefix[0] === 255 && (prefix[1] & 246) === 240) return "audio/aac";
152
+ if (ascii2(0, 3) === "ID3" || prefix[0] === 255 && (prefix[1] & 224) === 224 && (prefix[1] & 6) !== 0) return "audio/mpeg";
153
+ if (ascii2(0, 4) === "fLaC") return "audio/flac";
154
+ if (ascii2(0, 4) === "OggS") return "audio/ogg";
155
+ if (ascii2(0, 4) === "RIFF") {
156
+ if (ascii2(8, 4) === "WAVE") return "audio/wav";
157
+ if (ascii2(8, 4) === "AVI ") return "video/x-msvideo";
158
+ }
159
+ if (ascii2(4, 4) === "ftyp") return ascii2(8, 4) === "M4A " ? "audio/mp4" : ascii2(8, 4) === "qt " ? "video/quicktime" : "video/mp4";
160
+ const classified = classify(prefix, bytes.length <= prefix.length).mime;
161
+ if (!["application/octet-stream", "text/plain", "inode/x-empty"].includes(classified)) return classified;
162
+ const extension = path.slice(path.lastIndexOf(".") + 1).toLowerCase();
163
+ return Object.hasOwn(extensions, extension) ? extensions[extension] : classified === "inode/x-empty" ? "application/octet-stream" : classified;
164
+ }
165
+
166
+ // packages/safe-bash/src/commands/llm/command.ts
167
+ var maxBytes = 64 * 1024 * 1024;
168
+ function createCommand(options) {
169
+ const models = /* @__PURE__ */ new Map();
170
+ const declarations = [];
171
+ for (const provider of options.providers) {
172
+ if (!provider.name || typeof provider.complete !== "function") throw new TypeError("Invalid LLM provider");
173
+ for (const source of provider.models) {
174
+ const model = { ...source, ...source.aliases ? { aliases: [...source.aliases] } : {}, ...source.attachmentTypes ? { attachmentTypes: [...source.attachmentTypes] } : {} };
175
+ const entry = { provider, model };
176
+ for (const name of [model.id, ...model.aliases ?? []]) {
177
+ if (!name) throw new TypeError("Model names must be nonempty");
178
+ if (models.has(name)) throw new Error(`Duplicate model: ${name}`);
179
+ models.set(name, entry);
180
+ }
181
+ declarations.push(entry);
182
+ }
183
+ }
184
+ return { name: "llm", description: "Query explicitly injected language and media models", async execute(context) {
185
+ const output = createOutputOperation(context, context.stdout);
186
+ const signal = output.signal;
187
+ let iterator;
188
+ let closed = false;
189
+ let ended = false;
190
+ output.registerCleanup(() => {
191
+ if (closed) return;
192
+ closed = true;
193
+ if (!ended && iterator?.return) {
194
+ const returned = Promise.resolve().then(() => iterator.return());
195
+ void returned.catch(() => {
196
+ });
197
+ }
198
+ });
199
+ const wait = (pending) => new Promise((resolve, reject) => {
200
+ const abort = () => reject(signal.reason);
201
+ signal.addEventListener("abort", abort, { once: true });
202
+ if (signal.aborted) abort();
203
+ Promise.resolve(pending).then((value) => {
204
+ signal.removeEventListener("abort", abort);
205
+ resolve(value);
206
+ }, (error) => {
207
+ signal.removeEventListener("abort", abort);
208
+ reject(error);
209
+ });
210
+ });
211
+ let inputBytes = 0;
212
+ let argumentBytes = 0;
213
+ let work = 0;
214
+ const step = async () => {
215
+ signal.throwIfAborted();
216
+ if (closed) throw new Error("LLM invocation is closed");
217
+ if (++work > 1e6) throw new Error("LLM work limit exceeded");
218
+ if (work % 256 === 0) await yieldTurn(signal);
219
+ };
220
+ const admit = (bytes) => {
221
+ context.inputBudget?.check(inputBytes + bytes);
222
+ if (bytes > maxBytes - inputBytes) throw new Error("LLM input byte limit exceeded");
223
+ inputBytes += bytes;
224
+ };
225
+ const emitText = async (text) => {
226
+ for (let offset = 0; offset < text.length; ) {
227
+ await step();
228
+ let end = Math.min(text.length, offset + 16384);
229
+ if (end < text.length && text.charCodeAt(end - 1) >= 55296 && text.charCodeAt(end - 1) <= 56319) end--;
230
+ await output.output.write(new TextEncoder().encode(text.slice(offset, end)));
231
+ offset = end;
232
+ }
233
+ };
234
+ try {
235
+ const args = getCommandArguments(context);
236
+ const text = (index) => {
237
+ const bytes = args.bytes(index);
238
+ if (!bytes) throw new Error("Missing option argument");
239
+ if (bytes.length > maxBytes - argumentBytes) throw new Error("LLM argument byte limit exceeded");
240
+ argumentBytes += bytes.length;
241
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
242
+ };
243
+ const positional = [];
244
+ const files = [];
245
+ const settings = /* @__PURE__ */ Object.create(null);
246
+ let modelName = options.defaultModel;
247
+ let system;
248
+ let operands = false;
249
+ for (let index = 0; index < args.args.length; index++) {
250
+ await step();
251
+ const arg = text(index);
252
+ if (!operands && arg === "--") {
253
+ operands = true;
254
+ continue;
255
+ }
256
+ if (!operands && ["-m", "--model"].includes(arg)) modelName = text(++index);
257
+ else if (!operands && ["-s", "--system"].includes(arg)) system = text(++index);
258
+ else if (!operands && ["-o", "--option"].includes(arg)) {
259
+ const key = text(++index);
260
+ settings[key] = text(++index);
261
+ } else if (!operands && ["-a", "--attachment", "--at"].includes(arg)) {
262
+ const path = text(++index);
263
+ files.push(arg === "--at" ? { path, mime: text(++index) } : { path });
264
+ } else if (!operands && arg.startsWith("-")) throw new Error(`Unknown option: ${arg}`);
265
+ else positional.push(arg);
266
+ }
267
+ if (args.args[0] === "models" && positional.length === 1 && !files.length) {
268
+ for (const { provider, model } of declarations) {
269
+ await step();
270
+ await emitText(`${provider.name}/${model.id} aliases: ${(model.aliases ?? []).join(", ")} attachments: ${(model.attachmentTypes ?? []).join(", ")} output: ${model.outputType ?? "text/plain"}
271
+ `);
272
+ }
273
+ return { exitCode: 0 };
274
+ }
275
+ const selected = modelName === void 0 ? void 0 : models.get(modelName);
276
+ if (!selected) throw new Error(`Unknown model: ${modelName ?? "(no default model)"}`);
277
+ const chunks = [];
278
+ let stdinBytes = 0;
279
+ for await (const bytes of readBytes(context.stdin, signal)) {
280
+ await step();
281
+ admit(bytes.length);
282
+ stdinBytes += bytes.length;
283
+ chunks.push(new Uint8Array(bytes));
284
+ }
285
+ const stdin = new Uint8Array(stdinBytes);
286
+ let offset = 0;
287
+ for (const bytes of chunks) {
288
+ stdin.set(bytes, offset);
289
+ offset += bytes.length;
290
+ }
291
+ const content = new TextDecoder("utf-8", { fatal: true }).decode(stdin);
292
+ const instruction = positional.join(" ");
293
+ const attachments = [];
294
+ for (const file of files) {
295
+ await step();
296
+ const path = resolvePath(context.cwd, file.path);
297
+ const stat = await wait(context.fs.stat(path, { signal }));
298
+ context.inputBudget?.check(inputBytes + stat.size);
299
+ if (stat.size > maxBytes - inputBytes) throw new Error("LLM input byte limit exceeded");
300
+ const bytes = await wait(context.fs.readFile(path, { signal, maxBytes: Math.min(maxBytes, context.inputBudget?.maxBytes ?? maxBytes) - inputBytes }));
301
+ signal.throwIfAborted();
302
+ admit(bytes.length);
303
+ const mimeType = file.mime ?? attachmentMime(bytes, file.path);
304
+ if (!selected.model.attachmentTypes?.some((type) => type === mimeType || type.endsWith("/*") && mimeType.startsWith(type.slice(0, -1)))) throw new Error(`Model ${selected.model.id} does not accept ${mimeType}`);
305
+ attachments.push({ mimeType, bytes: new Uint8Array(bytes) });
306
+ }
307
+ const request = { model: selected.model.id, prompt: content && instruction ? `${content}
308
+
309
+ ${instruction}` : content || instruction, attachments, options: settings, signal, ...system === void 0 ? {} : { system } };
310
+ signal.throwIfAborted();
311
+ iterator = selected.provider.complete(request)[Symbol.asyncIterator]();
312
+ const binary2 = !(selected.model.outputType ?? "text/plain").startsWith("text/");
313
+ while (true) {
314
+ await step();
315
+ const next = await wait(iterator.next());
316
+ signal.throwIfAborted();
317
+ if (next.done) {
318
+ ended = true;
319
+ break;
320
+ }
321
+ if (binary2 ? !(next.value instanceof Uint8Array) : typeof next.value !== "string") throw new Error("Invalid provider response: mixed text and binary chunks or wrong output type");
322
+ if (typeof next.value === "string") await emitText(next.value);
323
+ else await output.output.write(next.value);
324
+ }
325
+ if (!binary2) await output.output.write(new Uint8Array([10]));
326
+ return { exitCode: 0 };
327
+ } catch (error) {
328
+ context.signal.throwIfAborted();
329
+ signal.throwIfAborted();
330
+ await writeBytes(context.stderr, new TextEncoder().encode(`llm: ${error instanceof Error ? error.message.slice(0, 4096) : "Provider failed"}
331
+ `), context.signal);
332
+ return { exitCode: 1 };
333
+ } finally {
334
+ await output.close();
335
+ }
336
+ } };
337
+ }
338
+
339
+ // packages/safe-bash/src/commands/llm/index.ts
340
+ function createLlmCommands(options) {
341
+ return [createCommand(options)];
342
+ }
343
+ function llmCommands(options) {
344
+ const commands = createLlmCommands(options);
345
+ return { name: "llm-commands", setup(host) {
346
+ for (const command of commands) host.commands.register(command, { replace: options.replace ?? false });
347
+ } };
348
+ }
349
+
350
+ export {
351
+ classify,
352
+ createLlmCommands,
353
+ llmCommands
354
+ };
355
+ //# sourceMappingURL=chunk-F5AOPLRZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/llm/index.ts", "../../src/commands/llm/command.ts", "../../src/commands/llm/mime.ts", "../../src/commands/file/classify.ts"],
4
+ "sourcesContent": ["import type { CommandDefinition, VirtualShellPlugin } from \"../../contracts/index.js\";\nimport { createCommand } from \"./command.js\";\nimport type { LlmCommandsOptions } from \"./types.js\";\nexport type { LlmProvider, LlmModel, LlmRequest, LlmCommandsOptions } from \"./types.js\";\n\nexport function createLlmCommands(options: LlmCommandsOptions): readonly CommandDefinition[] {\n return [createCommand(options)];\n}\n\nexport function llmCommands(options: LlmCommandsOptions): VirtualShellPlugin {\n const commands = createLlmCommands(options);\n return { name: \"llm-commands\", setup(host) {\n for (const command of commands) host.commands.register(command, { replace: options.replace ?? false });\n } };\n}\n", "import { createOutputOperation, getCommandArguments, readBytes, resolvePath, writeBytes, type CommandDefinition } from \"../../contracts/index.js\";\nimport { yieldTurn } from \"../../contracts/yield.js\";\nimport { attachmentMime } from \"./mime.js\";\nimport type { LlmCommandsOptions, LlmModel, LlmProvider, LlmRequest } from \"./types.js\";\n\nconst maxBytes = 64 * 1024 * 1024;\n\nexport function createCommand(options: LlmCommandsOptions): CommandDefinition {\n const models = new Map<string, { provider: LlmProvider; model: LlmModel }>();\n const declarations: { provider: LlmProvider; model: LlmModel }[] = [];\n for (const provider of options.providers) {\n if (!provider.name || typeof provider.complete !== \"function\") throw new TypeError(\"Invalid LLM provider\");\n for (const source of provider.models) {\n const model: LlmModel = { ...source, ...(source.aliases ? { aliases: [...source.aliases] } : {}), ...(source.attachmentTypes ? { attachmentTypes: [...source.attachmentTypes] } : {}) };\n const entry = { provider, model };\n for (const name of [model.id, ...(model.aliases ?? [])]) {\n if (!name) throw new TypeError(\"Model names must be nonempty\");\n if (models.has(name)) throw new Error(`Duplicate model: ${name}`);\n models.set(name, entry);\n }\n declarations.push(entry);\n }\n }\n return { name: \"llm\", description: \"Query explicitly injected language and media models\", async execute(context) {\n const output = createOutputOperation(context, context.stdout);\n const signal = output.signal;\n let iterator: AsyncIterator<string | Uint8Array> | undefined;\n let closed = false;\n let ended = false;\n output.registerCleanup(() => {\n if (closed) return;\n closed = true;\n if (!ended && iterator?.return) {\n const returned = Promise.resolve().then(() => iterator!.return!());\n void returned.catch(() => {});\n }\n });\n const wait = <Value>(pending: PromiseLike<Value>): Promise<Value> => new Promise((resolve, reject) => {\n const abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n if (signal.aborted) abort();\n Promise.resolve(pending).then(value => {\n signal.removeEventListener(\"abort\", abort); resolve(value);\n }, error => { signal.removeEventListener(\"abort\", abort); reject(error); });\n });\n let inputBytes = 0;\n let argumentBytes = 0;\n let work = 0;\n const step = async () => {\n signal.throwIfAborted();\n if (closed) throw new Error(\"LLM invocation is closed\");\n if (++work > 1_000_000) throw new Error(\"LLM work limit exceeded\");\n if (work % 256 === 0) await yieldTurn(signal);\n };\n const admit = (bytes: number) => {\n context.inputBudget?.check(inputBytes + bytes);\n if (bytes > maxBytes - inputBytes) throw new Error(\"LLM input byte limit exceeded\");\n inputBytes += bytes;\n };\n const emitText = async (text: string) => {\n for (let offset = 0; offset < text.length;) {\n await step();\n let end = Math.min(text.length, offset + 16_384);\n if (end < text.length && text.charCodeAt(end - 1) >= 0xd800 && text.charCodeAt(end - 1) <= 0xdbff) end--;\n await output.output.write(new TextEncoder().encode(text.slice(offset, end)));\n offset = end;\n }\n };\n try {\n const args = getCommandArguments(context);\n const text = (index: number): string => {\n const bytes = args.bytes(index);\n if (!bytes) throw new Error(\"Missing option argument\");\n if (bytes.length > maxBytes - argumentBytes) throw new Error(\"LLM argument byte limit exceeded\");\n argumentBytes += bytes.length;\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n };\n const positional: string[] = [];\n const files: { path: string; mime?: string }[] = [];\n const settings: Record<string, string> = Object.create(null) as Record<string, string>;\n let modelName = options.defaultModel;\n let system: string | undefined;\n let operands = false;\n for (let index = 0; index < args.args.length; index++) {\n await step();\n const arg = text(index);\n if (!operands && arg === \"--\") { operands = true; continue; }\n if (!operands && [\"-m\", \"--model\"].includes(arg)) modelName = text(++index);\n else if (!operands && [\"-s\", \"--system\"].includes(arg)) system = text(++index);\n else if (!operands && [\"-o\", \"--option\"].includes(arg)) { const key = text(++index); settings[key] = text(++index); }\n else if (!operands && [\"-a\", \"--attachment\", \"--at\"].includes(arg)) {\n const path = text(++index);\n files.push(arg === \"--at\" ? { path, mime: text(++index) } : { path });\n } else if (!operands && arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n else positional.push(arg);\n }\n if (args.args[0] === \"models\" && positional.length === 1 && !files.length) {\n for (const { provider, model } of declarations) {\n await step();\n await emitText(`${provider.name}/${model.id}\\taliases: ${(model.aliases ?? []).join(\", \")}\\tattachments: ${(model.attachmentTypes ?? []).join(\", \")}\\toutput: ${model.outputType ?? \"text/plain\"}\\n`);\n }\n return { exitCode: 0 };\n }\n const selected = modelName === undefined ? undefined : models.get(modelName);\n if (!selected) throw new Error(`Unknown model: ${modelName ?? \"(no default model)\"}`);\n const chunks: Uint8Array[] = [];\n let stdinBytes = 0;\n for await (const bytes of readBytes(context.stdin, signal)) {\n await step(); admit(bytes.length); stdinBytes += bytes.length; chunks.push(new Uint8Array(bytes));\n }\n const stdin = new Uint8Array(stdinBytes);\n let offset = 0;\n for (const bytes of chunks) { stdin.set(bytes, offset); offset += bytes.length; }\n const content = new TextDecoder(\"utf-8\", { fatal: true }).decode(stdin);\n const instruction = positional.join(\" \");\n const attachments: LlmRequest[\"attachments\"][number][] = [];\n for (const file of files) {\n await step();\n const path = resolvePath(context.cwd, file.path);\n const stat = await wait(context.fs.stat(path, { signal }));\n context.inputBudget?.check(inputBytes + stat.size);\n if (stat.size > maxBytes - inputBytes) throw new Error(\"LLM input byte limit exceeded\");\n const bytes = await wait(context.fs.readFile(path, { signal, maxBytes: Math.min(maxBytes, context.inputBudget?.maxBytes ?? maxBytes) - inputBytes }));\n signal.throwIfAborted(); admit(bytes.length);\n const mimeType = file.mime ?? attachmentMime(bytes, file.path);\n if (!selected.model.attachmentTypes?.some(type => type === mimeType || (type.endsWith(\"/*\") && mimeType.startsWith(type.slice(0, -1))))) throw new Error(`Model ${selected.model.id} does not accept ${mimeType}`);\n attachments.push({ mimeType, bytes: new Uint8Array(bytes) });\n }\n const request: LlmRequest = { model: selected.model.id, prompt: content && instruction ? `${content}\\n\\n${instruction}` : content || instruction, attachments, options: settings, signal, ...(system === undefined ? {} : { system }) };\n signal.throwIfAborted();\n iterator = selected.provider.complete(request)[Symbol.asyncIterator]();\n const binary = !(selected.model.outputType ?? \"text/plain\").startsWith(\"text/\");\n while (true) {\n await step();\n const next = await wait(iterator.next());\n signal.throwIfAborted();\n if (next.done) { ended = true; break; }\n if (binary ? !(next.value instanceof Uint8Array) : typeof next.value !== \"string\") throw new Error(\"Invalid provider response: mixed text and binary chunks or wrong output type\");\n if (typeof next.value === \"string\") await emitText(next.value);\n else await output.output.write(next.value);\n }\n if (!binary) await output.output.write(new Uint8Array([10]));\n return { exitCode: 0 };\n } catch (error) {\n context.signal.throwIfAborted();\n signal.throwIfAborted();\n await writeBytes(context.stderr, new TextEncoder().encode(`llm: ${error instanceof Error ? error.message.slice(0, 4096) : \"Provider failed\"}\\n`), context.signal);\n return { exitCode: 1 };\n } finally { await output.close(); }\n } };\n}\n", "import { classify } from \"../file/classify.js\";\n\nconst extensions: Readonly<Record<string, string>> = {\n png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\", webp: \"image/webp\", svg: \"image/svg+xml\",\n mp3: \"audio/mpeg\", wav: \"audio/wav\", ogg: \"audio/ogg\", flac: \"audio/flac\", m4a: \"audio/mp4\", aac: \"audio/aac\",\n mp4: \"video/mp4\", mov: \"video/quicktime\", webm: \"video/webm\", mkv: \"video/x-matroska\", avi: \"video/x-msvideo\",\n pdf: \"application/pdf\", txt: \"text/plain\", json: \"application/json\", csv: \"text/csv\",\n};\n\nexport function attachmentMime(bytes: Uint8Array, path: string): string {\n const prefix = bytes.subarray(0, 512);\n const ascii = (offset: number, length: number) => String.fromCharCode(...prefix.subarray(offset, offset + length));\n if (prefix.length >= 7 && prefix[0] === 255 && (prefix[1]! & 246) === 240) return \"audio/aac\";\n if (ascii(0, 3) === \"ID3\" || (prefix[0] === 255 && (prefix[1]! & 224) === 224 && (prefix[1]! & 6) !== 0)) return \"audio/mpeg\";\n if (ascii(0, 4) === \"fLaC\") return \"audio/flac\";\n if (ascii(0, 4) === \"OggS\") return \"audio/ogg\";\n if (ascii(0, 4) === \"RIFF\") {\n if (ascii(8, 4) === \"WAVE\") return \"audio/wav\";\n if (ascii(8, 4) === \"AVI \") return \"video/x-msvideo\";\n }\n if (ascii(4, 4) === \"ftyp\") return ascii(8, 4) === \"M4A \" ? \"audio/mp4\" : ascii(8, 4) === \"qt \" ? \"video/quicktime\" : \"video/mp4\";\n const classified = classify(prefix, bytes.length <= prefix.length).mime;\n if (![\"application/octet-stream\", \"text/plain\", \"inode/x-empty\"].includes(classified)) return classified;\n const extension = path.slice(path.lastIndexOf(\".\") + 1).toLowerCase();\n return Object.hasOwn(extensions, extension) ? extensions[extension]! : classified === \"inode/x-empty\" ? \"application/octet-stream\" : classified;\n}\n", "export interface Classification {\n readonly description: string;\n readonly mime: string;\n readonly encoding: string;\n}\n\nexport const binary: Classification = { description: \"data\", mime: \"application/octet-stream\", encoding: \"binary\" };\n\nfunction result(description: string, mime: string, encoding = \"binary\"): Classification {\n return { description, mime, encoding };\n}\n\nfunction matches(bytes: Uint8Array, signature: readonly number[], offset = 0): boolean {\n return bytes.length >= offset + signature.length && signature.every((value, index) => bytes[offset + index] === value);\n}\n\nfunction ascii(bytes: Uint8Array, start: number, length: number): string {\n return String.fromCharCode(...bytes.subarray(start, start + length));\n}\n\nfunction magic(bytes: Uint8Array): Classification | undefined {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (bytes.length >= 33 && matches(bytes, [137, 80, 78, 71, 13, 10, 26, 10]) && view.getUint32(8) === 13 && ascii(bytes, 12, 4) === \"IHDR\"\n && view.getUint32(16) > 0 && view.getUint32(20) > 0 && bytes[26] === 0 && bytes[27] === 0 && bytes[28]! <= 1) {\n const allowed: Record<number, readonly number[]> = { 0: [1, 2, 4, 8, 16], 2: [8, 16], 3: [1, 2, 4, 8], 4: [8, 16], 6: [8, 16] };\n if (allowed[bytes[25]!]?.includes(bytes[24]!)) return result(\"PNG image data\", \"image/png\");\n }\n if (bytes.length >= 13 && [\"GIF87a\", \"GIF89a\"].includes(ascii(bytes, 0, 6)) && view.getUint16(6, true) > 0 && view.getUint16(8, true) > 0) return result(\"GIF image data\", \"image/gif\");\n if (bytes.length >= 4 && matches(bytes, [255, 216, 255]) && bytes[3]! >= 192 && bytes[3]! <= 254) return result(\"JPEG image data\", \"image/jpeg\");\n if (bytes.length >= 20 && ascii(bytes, 0, 4) === \"RIFF\" && ascii(bytes, 8, 4) === \"WEBP\" && [\"VP8 \", \"VP8L\", \"VP8X\"].includes(ascii(bytes, 12, 4)) && view.getUint32(4, true) >= 12) return result(\"WebP image data\", \"image/webp\");\n if (bytes.length >= 8 && (matches(bytes, [73, 73, 42, 0]) || matches(bytes, [77, 77, 0, 42]))) return result(\"TIFF image data\", \"image/tiff\");\n if (bytes.length >= 26 && ascii(bytes, 0, 2) === \"BM\" && [12, 40, 52, 56, 108, 124].includes(view.getUint32(14, true))) return result(\"PC bitmap image data\", \"image/bmp\");\n if (bytes.length >= 22 && matches(bytes, [0, 0, 1, 0]) && view.getUint16(4, true) > 0) return result(\"MS Windows icon resource\", \"image/vnd.microsoft.icon\");\n if (/^%PDF-[12]\\.[0-9](?:\\r|\\n|\\s)/u.test(ascii(bytes, 0, 16))) return result(\"PDF document\", \"application/pdf\");\n if (bytes.length >= 10 && matches(bytes, [31, 139, 8]) && (bytes[3]! & 224) === 0) return result(\"gzip compressed data\", \"application/gzip\");\n if (bytes.length >= 10 && ascii(bytes, 0, 3) === \"BZh\" && bytes[3]! >= 49 && bytes[3]! <= 57 && (ascii(bytes, 4, 6) === \"1AY&SY\" || matches(bytes, [23, 114, 69, 56, 80, 144], 4))) return result(\"bzip2 compressed data\", \"application/x-bzip2\");\n if (bytes.length >= 12 && matches(bytes, [253, 55, 122, 88, 90, 0]) && bytes[6] === 0 && bytes[7]! <= 15) return result(\"XZ compressed data\", \"application/x-xz\");\n if (bytes.length >= 6 && matches(bytes, [40, 181, 47, 253]) && (bytes[4]! & 24) === 0) return result(\"Zstandard compressed data\", \"application/zstd\");\n if ((bytes.length >= 30 && matches(bytes, [80, 75, 3, 4])) || (bytes.length >= 22 && matches(bytes, [80, 75, 5, 6]))) return result(\"Zip archive data\", \"application/zip\");\n if (bytes.length >= 32 && matches(bytes, [55, 122, 188, 175, 39, 28])) return result(\"7-zip archive data\", \"application/x-7z-compressed\");\n if ((bytes.length >= 14 && matches(bytes, [82, 97, 114, 33, 26, 7, 0])) || (bytes.length >= 16 && matches(bytes, [82, 97, 114, 33, 26, 7, 1, 0]))) return result(\"RAR archive data\", \"application/x-rar\");\n if (bytes.length >= 512 && ascii(bytes, 257, 5) === \"ustar\") {\n const checksum = ascii(bytes, 148, 8).replace(/\\0.*$/u, \"\").trim();\n if (/^[0-7]+$/u.test(checksum)) {\n let total = 0;\n for (let index = 0; index < 512; index++) total += index >= 148 && index < 156 ? 32 : bytes[index]!;\n if (parseInt(checksum, 8) === total) return result(\"POSIX tar archive\", \"application/x-tar\");\n }\n }\n if (bytes.length >= 52 && matches(bytes, [127, 69, 76, 70]) && [1, 2].includes(bytes[4]!) && [1, 2].includes(bytes[5]!) && bytes[6] === 1 && (bytes[4] === 1 || bytes.length >= 64)) {\n const type = view.getUint16(16, bytes[5] === 1);\n const mime = type === 1 ? \"application/x-object\" : type === 2 ? \"application/x-executable\" : type === 3 ? \"application/x-sharedlib\" : \"application/octet-stream\";\n return result(`ELF ${bytes[4] === 1 ? \"32\" : \"64\"}-bit ${type === 2 ? \"executable\" : type === 3 ? \"shared object\" : \"object\"}`, mime);\n }\n if (bytes.length >= 64 && ascii(bytes, 0, 2) === \"MZ\") {\n const offset = view.getUint32(60, true);\n if (offset >= 64 && offset <= bytes.length - 24 && matches(bytes, [80, 69, 0, 0], offset)) return result(\"PE executable\", \"application/vnd.microsoft.portable-executable\");\n return result(\"DOS executable\", \"application/x-dosexec\");\n }\n if (bytes.length >= 8 && matches(bytes, [0, 97, 115, 109, 1, 0, 0, 0])) return result(\"WebAssembly binary module\", \"application/wasm\");\n if (bytes.length >= 100 && ascii(bytes, 0, 16) === \"SQLite format 3\\0\") {\n const size = view.getUint16(16);\n if ((size === 1 || (size >= 512 && size <= 32768 && (size & (size - 1)) === 0)) && [1, 2].includes(bytes[18]!) && [1, 2].includes(bytes[19]!) && matches(bytes, [64, 32, 32], 21)) return result(\"SQLite 3.x database\", \"application/vnd.sqlite3\");\n }\n if (bytes.length >= 512 && matches(bytes, [208, 207, 17, 224, 161, 177, 26, 225]) && matches(bytes, [254, 255], 28)) return result(\"OLE Compound Document\", \"application/x-ole-storage\");\n return undefined;\n}\n\nexport function classify(bytes: Uint8Array, complete: boolean): Classification {\n if (!bytes.length) return complete ? result(\"empty\", \"inode/x-empty\") : binary;\n const recognized = magic(bytes);\n if (recognized) return recognized;\n if (matches(bytes, [255, 254, 0, 0]) || matches(bytes, [0, 0, 254, 255])) return binary;\n let encoding = \"utf-8\";\n let bom = 0;\n if (matches(bytes, [239, 187, 191])) bom = 3;\n else if (matches(bytes, [255, 254])) { encoding = \"utf-16le\"; bom = 2; }\n else if (matches(bytes, [254, 255])) { encoding = \"utf-16be\"; bom = 2; }\n let text: string;\n try { text = new TextDecoder(encoding, { fatal: true }).decode(bytes, { stream: !complete }); }\n catch { return binary; }\n if (!text.length && bytes.length > bom) return binary;\n for (const character of text) {\n const code = character.codePointAt(0)!;\n if ((code < 32 && ![8, 9, 10, 12, 13, 27].includes(code)) || (code >= 127 && code <= 159)) return binary;\n }\n if (!bom && encoding === \"utf-8\" && bytes.every(value => value < 128)) encoding = \"us-ascii\";\n if (complete && /^[\\x20\\t\\r\\n]*(?:\\{|\\[)/u.test(text)) {\n try { JSON.parse(text); return result(\"JSON text data\", \"application/json\", encoding); } catch {}\n }\n const description = encoding === \"us-ascii\" ? \"ASCII text\" : encoding === \"utf-8\" ? \"Unicode text, UTF-8\" : `Unicode text, ${encoding === \"utf-16le\" ? \"UTF-16, little-endian\" : \"UTF-16, big-endian\"}`;\n return result(description, \"text/plain\", encoding);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ascii", "binary"]
7
+ }