@poe-platform/safe-bash 0.1.543 → 0.1.545

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-VNDFKT6F.js → chunk-25GUOTPE.js} +13 -9
  3. package/dist/safe-bash/chunks/{chunk-VNDFKT6F.js.map → chunk-25GUOTPE.js.map} +1 -1
  4. package/dist/safe-bash/chunks/{chunk-EZLQA6ON.js → chunk-2YHZYNLC.js} +9 -5
  5. package/dist/safe-bash/chunks/{chunk-EZLQA6ON.js.map → chunk-2YHZYNLC.js.map} +1 -1
  6. package/dist/safe-bash/chunks/chunk-6E3FCEJ5.js +355 -0
  7. package/dist/safe-bash/chunks/chunk-6E3FCEJ5.js.map +7 -0
  8. package/dist/safe-bash/chunks/{chunk-MVVKEMEG.js → chunk-ASCV3OWE.js} +17 -10
  9. package/dist/safe-bash/chunks/chunk-ASCV3OWE.js.map +7 -0
  10. package/dist/safe-bash/chunks/chunk-BZUQJTOZ.js +322 -0
  11. package/dist/safe-bash/chunks/chunk-BZUQJTOZ.js.map +7 -0
  12. package/dist/safe-bash/chunks/{chunk-PZMJ4EC3.js → chunk-C7Z2SSTY.js} +2 -2
  13. package/dist/safe-bash/chunks/{chunk-TPD45VUZ.js → chunk-CTE3HGYS.js} +22 -109
  14. package/dist/safe-bash/chunks/chunk-CTE3HGYS.js.map +7 -0
  15. package/dist/safe-bash/chunks/{chunk-R3QJL5HH.js → chunk-EGLBB57T.js} +12 -8
  16. package/dist/safe-bash/chunks/{chunk-R3QJL5HH.js.map → chunk-EGLBB57T.js.map} +1 -1
  17. package/dist/safe-bash/chunks/chunk-EUTSYRNM.js +111 -0
  18. package/dist/safe-bash/chunks/chunk-EUTSYRNM.js.map +7 -0
  19. package/dist/safe-bash/chunks/{chunk-WODV2DVM.js → chunk-FAA2WXKH.js} +11 -7
  20. package/dist/safe-bash/chunks/{chunk-WODV2DVM.js.map → chunk-FAA2WXKH.js.map} +1 -1
  21. package/dist/safe-bash/chunks/chunk-FDGESHPB.js +224 -0
  22. package/dist/safe-bash/chunks/chunk-FDGESHPB.js.map +7 -0
  23. package/dist/safe-bash/chunks/{chunk-YEJBZLE5.js → chunk-GA43CRT3.js} +12 -8
  24. package/dist/safe-bash/chunks/{chunk-YEJBZLE5.js.map → chunk-GA43CRT3.js.map} +1 -1
  25. package/dist/safe-bash/chunks/{chunk-WF4P7XKI.js → chunk-IVJ5JGXZ.js} +12 -8
  26. package/dist/safe-bash/chunks/{chunk-WF4P7XKI.js.map → chunk-IVJ5JGXZ.js.map} +1 -1
  27. package/dist/safe-bash/chunks/{chunk-A4UXQKWZ.js → chunk-K4RQ7ASH.js} +12 -8
  28. package/dist/safe-bash/chunks/{chunk-A4UXQKWZ.js.map → chunk-K4RQ7ASH.js.map} +1 -1
  29. package/dist/safe-bash/chunks/chunk-KYU6MXVK.js +58 -0
  30. package/dist/safe-bash/chunks/chunk-KYU6MXVK.js.map +7 -0
  31. package/dist/safe-bash/chunks/{chunk-T5BV7HPD.js → chunk-O7BRWSKX.js} +17 -60
  32. package/dist/safe-bash/chunks/chunk-O7BRWSKX.js.map +7 -0
  33. package/dist/safe-bash/chunks/{chunk-6PSMEBVP.js → chunk-PPFWG34Y.js} +2 -2
  34. package/dist/safe-bash/chunks/{chunk-AZNI263O.js → chunk-R4HP2LEO.js} +3 -3
  35. package/dist/safe-bash/chunks/chunk-TTTOMUAY.js +33 -0
  36. package/dist/safe-bash/chunks/chunk-TTTOMUAY.js.map +7 -0
  37. package/dist/safe-bash/chunks/{chunk-5VBLSPNM.js → chunk-UO33SQJU.js} +2 -239
  38. package/dist/safe-bash/chunks/chunk-UO33SQJU.js.map +7 -0
  39. package/dist/safe-bash/chunks/{chunk-HFEU5SBQ.js → chunk-WISNTI7E.js} +11 -7
  40. package/dist/safe-bash/chunks/{chunk-HFEU5SBQ.js.map → chunk-WISNTI7E.js.map} +1 -1
  41. package/dist/safe-bash/chunks/{chunk-66VSWIUC.js → chunk-XWCSJDGK.js} +10 -6
  42. package/dist/safe-bash/chunks/{chunk-66VSWIUC.js.map → chunk-XWCSJDGK.js.map} +1 -1
  43. package/dist/safe-bash/commands/csplit/index.browser.js +6 -4
  44. package/dist/safe-bash/commands/factor/index.browser.js +5 -3
  45. package/dist/safe-bash/commands/getopt/index.browser.js +5 -3
  46. package/dist/safe-bash/commands/hexdump/index.browser.js +5 -3
  47. package/dist/safe-bash/commands/iconv/index.browser.js +5 -3
  48. package/dist/safe-bash/commands/line-endings/index.browser.js +6 -4
  49. package/dist/safe-bash/commands/line-endings/stage.d.ts.map +1 -1
  50. package/dist/safe-bash/commands/line-endings/stage.js +4 -1
  51. package/dist/safe-bash/commands/line-endings/stage.js.map +1 -1
  52. package/dist/safe-bash/commands/llm/command.d.ts +4 -0
  53. package/dist/safe-bash/commands/llm/command.d.ts.map +1 -0
  54. package/dist/safe-bash/commands/llm/command.js +194 -0
  55. package/dist/safe-bash/commands/llm/command.js.map +1 -0
  56. package/dist/safe-bash/commands/llm/index.browser.js +14 -0
  57. package/dist/safe-bash/commands/llm/index.browser.js.map +7 -0
  58. package/dist/safe-bash/commands/llm/index.d.ts +6 -0
  59. package/dist/safe-bash/commands/llm/index.d.ts.map +1 -0
  60. package/dist/safe-bash/commands/llm/index.js +12 -0
  61. package/dist/safe-bash/commands/llm/index.js.map +1 -0
  62. package/dist/safe-bash/commands/llm/mime.d.ts +2 -0
  63. package/dist/safe-bash/commands/llm/mime.d.ts.map +1 -0
  64. package/dist/safe-bash/commands/llm/mime.js +33 -0
  65. package/dist/safe-bash/commands/llm/mime.js.map +1 -0
  66. package/dist/safe-bash/commands/llm/providers/elevenlabs.d.ts +16 -0
  67. package/dist/safe-bash/commands/llm/providers/elevenlabs.d.ts.map +1 -0
  68. package/dist/safe-bash/commands/llm/providers/elevenlabs.js +51 -0
  69. package/dist/safe-bash/commands/llm/providers/elevenlabs.js.map +1 -0
  70. package/dist/safe-bash/commands/llm/providers/index.browser.js +13 -0
  71. package/dist/safe-bash/commands/llm/providers/index.browser.js.map +7 -0
  72. package/dist/safe-bash/commands/llm/providers/index.d.ts +4 -0
  73. package/dist/safe-bash/commands/llm/providers/index.d.ts.map +1 -0
  74. package/dist/safe-bash/commands/llm/providers/index.js +3 -0
  75. package/dist/safe-bash/commands/llm/providers/index.js.map +1 -0
  76. package/dist/safe-bash/commands/llm/providers/openai.d.ts +15 -0
  77. package/dist/safe-bash/commands/llm/providers/openai.d.ts.map +1 -0
  78. package/dist/safe-bash/commands/llm/providers/openai.js +78 -0
  79. package/dist/safe-bash/commands/llm/providers/openai.js.map +1 -0
  80. package/dist/safe-bash/commands/llm/providers/shared.d.ts +34 -0
  81. package/dist/safe-bash/commands/llm/providers/shared.d.ts.map +1 -0
  82. package/dist/safe-bash/commands/llm/providers/shared.js +220 -0
  83. package/dist/safe-bash/commands/llm/providers/shared.js.map +1 -0
  84. package/dist/safe-bash/commands/llm/types.d.ts +28 -0
  85. package/dist/safe-bash/commands/llm/types.d.ts.map +1 -0
  86. package/dist/safe-bash/commands/llm/types.js +2 -0
  87. package/dist/safe-bash/commands/llm/types.js.map +1 -0
  88. package/dist/safe-bash/commands/network/index.browser.js +13 -8
  89. package/dist/safe-bash/commands/pr/index.browser.js +5 -3
  90. package/dist/safe-bash/commands/tsort/index.browser.js +5 -3
  91. package/dist/safe-bash/commands/xml/index.browser.js +7 -4
  92. package/dist/safe-bash/commands/yq/index.browser.js +8 -5
  93. package/dist/safe-bash/contracts/command.d.ts +4 -0
  94. package/dist/safe-bash/contracts/command.d.ts.map +1 -1
  95. package/dist/safe-bash/contracts/command.js.map +1 -1
  96. package/dist/safe-bash/core.browser.js +1093 -1160
  97. package/dist/safe-bash/core.browser.js.map +4 -4
  98. package/dist/safe-bash/core.d.ts +2 -0
  99. package/dist/safe-bash/core.d.ts.map +1 -1
  100. package/dist/safe-bash/core.js +2 -0
  101. package/dist/safe-bash/core.js.map +1 -1
  102. package/dist/safe-bash/shell/runtime.d.ts.map +1 -1
  103. package/dist/safe-bash/shell/runtime.js +10 -0
  104. package/dist/safe-bash/shell/runtime.js.map +1 -1
  105. package/package.json +14 -2
  106. package/dist/safe-bash/chunks/chunk-5VBLSPNM.js.map +0 -7
  107. package/dist/safe-bash/chunks/chunk-MVVKEMEG.js.map +0 -7
  108. package/dist/safe-bash/chunks/chunk-T5BV7HPD.js.map +0 -7
  109. package/dist/safe-bash/chunks/chunk-TPD45VUZ.js.map +0 -7
  110. /package/dist/safe-bash/chunks/{chunk-PZMJ4EC3.js.map → chunk-C7Z2SSTY.js.map} +0 -0
  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-R4HP2LEO.js.map} +0 -0
@@ -0,0 +1,355 @@
1
+ import {
2
+ createOutputOperation
3
+ } from "./chunk-C7Z2SSTY.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-6E3FCEJ5.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
+ }
@@ -1,22 +1,26 @@
1
1
  import {
2
2
  writeFileOutput
3
- } from "./chunk-AZNI263O.js";
3
+ } from "./chunk-R4HP2LEO.js";
4
+ import {
5
+ createOutputOperation
6
+ } from "./chunk-C7Z2SSTY.js";
7
+ import {
8
+ PublicDiagnostic
9
+ } from "./chunk-TTTOMUAY.js";
4
10
  import {
5
11
  dirname,
6
12
  resolvePath
7
13
  } from "./chunk-DPJWEGIX.js";
8
14
  import {
9
- createOutputOperation
10
- } from "./chunk-PZMJ4EC3.js";
15
+ getCommandArguments,
16
+ shellValueByteLength,
17
+ shellValueBytes
18
+ } from "./chunk-UO33SQJU.js";
11
19
  import {
12
20
  FsError,
13
- PublicDiagnostic,
14
- getCommandArguments,
15
21
  outputFailure,
16
- shellValueByteLength,
17
- shellValueBytes,
18
22
  yieldTurn
19
- } from "./chunk-5VBLSPNM.js";
23
+ } from "./chunk-FDGESHPB.js";
20
24
  import {
21
25
  init_platform
22
26
  } from "./chunk-2KL6W6NB.js";
@@ -529,6 +533,9 @@ var Stage = class {
529
533
  if (capabilities.atomicRename !== true || capabilities.exclusiveCreate !== true || capabilities.permissions !== true || capabilities.append === false || capabilities.remove === false) {
530
534
  throw new LineEndingError("file conversion requires atomic rename, exclusive create, permissions, append and cleanup capabilities");
531
535
  }
536
+ if (this.expected === void 0 && capabilities.atomicRenameNoReplace !== true) {
537
+ throw new LineEndingError("new destination requires atomic no-replace rename capability");
538
+ }
532
539
  this.parents = await this.files.parents(this.path);
533
540
  for (let attempt = 0; attempt < limits.maxTempAttempts; attempt++) {
534
541
  this.temporary = resolvePath(dirname(this.path), `.line-ending-${attempt + 1}`);
@@ -581,7 +588,7 @@ var Stage = class {
581
588
  await this.checked();
582
589
  const current = await this.files.stat(this.path);
583
590
  if (current ? !this.expected || current.type !== "file" || !sameIdentity(current, this.expected) : this.expected !== void 0) throw new LineEndingError("destination changed before publication");
584
- await this.files.call((fs) => fs.rename, [this.temporary, this.path, { signal }]);
591
+ await this.files.call((fs) => fs.rename, [this.temporary, this.path, { signal, noReplace: this.expected === void 0 }]);
585
592
  this.created = false;
586
593
  }
587
594
  };
@@ -1066,4 +1073,4 @@ export {
1066
1073
  createLineEndingCommands,
1067
1074
  lineEndingCommands
1068
1075
  };
1069
- //# sourceMappingURL=chunk-MVVKEMEG.js.map
1076
+ //# sourceMappingURL=chunk-ASCV3OWE.js.map