@poe-platform/safe-bash 0.1.821 → 0.1.823

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 (93) hide show
  1. package/dist/safe-bash/chunks/{chunk-HNT2MR4W.js → chunk-363QOIDR.js} +2 -1
  2. package/dist/safe-bash/chunks/chunk-AGHV53VF.js +42 -0
  3. package/dist/safe-bash/chunks/{chunk-VF3Q2V3E.js → chunk-RAFD5ZAH.js} +1 -1
  4. package/dist/safe-bash/chunks/{chunk-67QE3JLU.js → chunk-TZRVK3NU.js} +1 -1
  5. package/dist/safe-bash/chunks/{chunk-IRJS54AA.js → chunk-VWLQDZFF.js} +20 -12
  6. package/dist/safe-bash/chunks/{chunk-NAETSXBW.js → chunk-ZJAXMB5M.js} +1 -1
  7. package/dist/safe-bash/command-chunks/{chunk-QX3WKBLI.js → chunk-36FV6BAG.js} +5 -3
  8. package/dist/safe-bash/command-chunks/{chunk-ZSHXZ3XG.js → chunk-3EAZRKI4.js} +7 -7
  9. package/dist/safe-bash/command-chunks/chunk-64HIOP7Q.js +993 -0
  10. package/dist/safe-bash/command-chunks/{chunk-WOT2YXBT.js → chunk-7ZQVMPSB.js} +213 -42
  11. package/dist/safe-bash/command-chunks/{chunk-GRFJKJFN.js → chunk-AVSINNZ6.js} +233 -3
  12. package/dist/safe-bash/command-chunks/{chunk-BZLLQWRK.js → chunk-E5CDHXFA.js} +2 -2
  13. package/dist/safe-bash/command-chunks/{chunk-RHXV2KG5.js → chunk-EO3RYGUZ.js} +1010 -58
  14. package/dist/safe-bash/command-chunks/{chunk-MCUDSE4H.js → chunk-EWECMOQ5.js} +1 -1
  15. package/dist/safe-bash/command-chunks/{chunk-RTUDDAAY.js → chunk-O3KFOFJM.js} +1 -1
  16. package/dist/safe-bash/command-chunks/{chunk-SLD5A7IL.js → chunk-OU5UEUZN.js} +1 -1
  17. package/dist/safe-bash/command-chunks/{chunk-RKAL5VFP.js → chunk-PLVFJ6FF.js} +255 -616
  18. package/dist/safe-bash/command-chunks/{chunk-CJIFJ45R.js → chunk-QBCEAYQT.js} +1 -1
  19. package/dist/safe-bash/command-chunks/{chunk-4Q3HP33O.js → chunk-RGKHTSUY.js} +146 -123
  20. package/dist/safe-bash/command-chunks/{chunk-I7MEH76L.js → chunk-UYNJF5QN.js} +1 -1
  21. package/dist/safe-bash/command-chunks/{chunk-IAHYG67O.js → chunk-V5ZBRM5R.js} +3 -3
  22. package/dist/safe-bash/command-chunks/{chunk-R4NPYXQX.js → chunk-WDTWJFPK.js} +320 -67
  23. package/dist/safe-bash/command-chunks/{chunk-GQV5RWMN.js → chunk-ZFXHSFTU.js} +1 -1
  24. package/dist/safe-bash/command-chunks/{prompt-tool-debug-ERJKK3XZ.js → prompt-tool-debug-3POFNRYP.js} +5 -5
  25. package/dist/safe-bash/commands/bc/index.browser.js +1 -1
  26. package/dist/safe-bash/commands/llm/index.browser.js +3 -1
  27. package/dist/safe-bash/commands/llm/index.js +1 -1
  28. package/dist/safe-bash/commands/python/executor.browser.js +12 -1
  29. package/dist/safe-bash/commands/python/executor.js +1 -1
  30. package/dist/safe-bash/commands/python/index.browser.js +23 -1
  31. package/dist/safe-bash/commands/python/index.js +1 -1
  32. package/dist/safe-bash/core.browser.js +2 -2
  33. package/dist/safe-bash/full-core.browser.js +30 -6
  34. package/dist/safe-bash/plugins/index.browser.js +3 -3
  35. package/dist/safe-bash/registry-entry.browser.js +2 -2
  36. package/dist/safe-bash/search.browser.js +1 -1
  37. package/dist/safe-bash/shell/runtime.d.ts +2 -2
  38. package/dist/safe-bash/shell/runtime.js +11 -2
  39. package/dist/safe-bash/shell/sync-extra-evaluators.js +12 -12
  40. package/dist/safe-bash/shell-entry.browser.js +2 -2
  41. package/dist/safe-bash-command-llm/collections.js +24 -65
  42. package/dist/safe-bash-command-llm/command.js +6 -6
  43. package/dist/safe-bash-command-llm/fragment-loaders.d.ts +3 -2
  44. package/dist/safe-bash-command-llm/index.d.ts +3 -2
  45. package/dist/safe-bash-command-llm/index.js +10 -8
  46. package/dist/safe-bash-command-llm/loader-provider.d.ts +25 -0
  47. package/dist/safe-bash-command-llm/openai-sse.js +2 -2
  48. package/dist/safe-bash-command-llm/openai.js +4 -4
  49. package/dist/safe-bash-command-llm/providers/index.js +4 -4
  50. package/dist/safe-bash-command-llm/providers/openai.js +4 -4
  51. package/dist/safe-bash-command-llm/python-unicode.d.ts +2 -0
  52. package/dist/safe-bash-command-llm/templates.d.ts +7 -2
  53. package/dist/safe-bash-command-llm/types.d.ts +7 -1
  54. package/dist/safe-bash-command-mcp/index.browser.js +3 -0
  55. package/dist/safe-bash-command-mcp/index.js +3 -0
  56. package/dist/safe-bash-command-patch/index.js +2 -2
  57. package/dist/safe-bash-command-patch/patch-publication.js +1 -1
  58. package/dist/safe-bash-command-patch/patch.js +2 -2
  59. package/dist/safe-bash-command-python/build-backend.d.ts +51 -0
  60. package/dist/safe-bash-command-python/build-dependencies.d.ts +12 -0
  61. package/dist/safe-bash-command-python/build-environment.d.ts +3 -0
  62. package/dist/safe-bash-command-python/build-wheel.d.ts +8 -0
  63. package/dist/safe-bash-command-python/executor.d.ts +12 -2
  64. package/dist/safe-bash-command-python/executor.js +26 -4
  65. package/dist/safe-bash-command-python/index.js +26 -4
  66. package/dist/safe-bash-command-python/jspi.js +2 -2
  67. package/dist/safe-bash-command-python/llm-assets-node.js +1 -1
  68. package/dist/safe-bash-command-python/llm-fragment-loader.d.ts +6 -0
  69. package/dist/safe-bash-command-python/llm-functions-loader.d.ts +5 -1
  70. package/dist/safe-bash-command-python/llm-loader-discovery.d.ts +13 -0
  71. package/dist/safe-bash-command-python/llm-package-manager.d.ts +7 -0
  72. package/dist/safe-bash-command-python/llm-template-loader.d.ts +6 -0
  73. package/dist/safe-bash-command-python/manifest.d.ts +13 -0
  74. package/dist/safe-bash-command-python/provisioning.d.ts +33 -5
  75. package/dist/safe-bash-command-python/provisioning.js +1 -1
  76. package/dist/safe-bash-command-python/source-environment.d.ts +9 -0
  77. package/dist/safe-bash-command-python/source-snapshot.d.ts +8 -0
  78. package/dist/safe-bash-command-python/worker.js +3 -185
  79. package/dist/safe-bash-csv-engine/index.js +1 -1
  80. package/dist/safe-bash-csv-engine/python-iso2022.d.ts +21 -0
  81. package/dist/safe-bash-csv-engine/python-utf7.d.ts +18 -0
  82. package/dist/safe-bash-csv-engine/text-decoder.d.ts +2 -0
  83. package/dist/safe-bash-csv-engine/text-decoder.js +7 -3
  84. package/dist/safe-bash-zip-engine/index.js +1 -1
  85. package/dist/safe-bash-zip-engine/zip/repair.js +1 -1
  86. package/dist/safe-bash-zip-engine/zip/sfx.js +1 -1
  87. package/dist/safe-bash-zip-engine/zip-format.d.ts +3 -1
  88. package/dist/safe-bash-zip-engine/zip-format.js +1 -1
  89. package/dist/safe-playwright-cloudflare/shell-browser-resource.d.ts +1 -1
  90. package/dist/safe-playwright-cloudflare/shell-browser-resource.js +35 -20
  91. package/package.json +3 -3
  92. package/dist/safe-bash/chunks/chunk-PSD2RSOS.js +0 -31
  93. package/dist/safe-bash/command-chunks/chunk-5EFNQ6FY.js +0 -458
@@ -2,10 +2,94 @@ import {
2
2
  createLlmSpool,
3
3
  fileSource,
4
4
  serializeLlmEmbedding
5
- } from "./chunk-BZLLQWRK.js";
5
+ } from "./chunk-E5CDHXFA.js";
6
6
  import {
7
7
  sourceBytes
8
- } from "./chunk-QX3WKBLI.js";
8
+ } from "./chunk-36FV6BAG.js";
9
+
10
+ // packages/safe-bash-command-llm/src/help-data.ts
11
+ var packedHelp = "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";
12
+
13
+ // packages/safe-bash-command-llm/src/help-text.ts
14
+ var catalog;
15
+ async function loadLlmHelp(name) {
16
+ catalog ??= new Response(new Blob([Uint8Array.from(atob(packedHelp), (character) => character.charCodeAt(0))]).stream().pipeThrough(new DecompressionStream("gzip"))).json();
17
+ return (await catalog)[name];
18
+ }
19
+
20
+ // packages/safe-bash-command-llm/src/chat-options.ts
21
+ var chatOptions = [
22
+ "-h",
23
+ "--help",
24
+ "--td",
25
+ "--tools-debug",
26
+ "--ta",
27
+ "--tools-approve",
28
+ "--no-stream",
29
+ "--functions",
30
+ "-T",
31
+ "--tool",
32
+ "--cl",
33
+ "--chain-limit",
34
+ "-f",
35
+ "--fragment",
36
+ "--sf",
37
+ "--system-fragment",
38
+ "-m",
39
+ "--model",
40
+ "-s",
41
+ "--system",
42
+ "-o",
43
+ "--option",
44
+ "-t",
45
+ "--template",
46
+ "-p",
47
+ "--param",
48
+ "--key"
49
+ ];
50
+ async function chatOptionSuggestion(value, step, choices = chatOptions) {
51
+ if (!value.startsWith("--")) return "";
52
+ const options = choices.filter((option) => option.startsWith("--"));
53
+ const cutoff = 0.6;
54
+ const maximum = Math.floor(Math.max(...options.map((option) => option.length)) * (2 / cutoff - 1));
55
+ const input = [];
56
+ for (const char of value) {
57
+ await step();
58
+ input.push(char);
59
+ if (input.length > maximum) return "";
60
+ }
61
+ const matches = [];
62
+ for (const option of options) {
63
+ if (2 * Math.min(option.length, input.length) / (option.length + input.length) < cutoff) continue;
64
+ const pending = [[0, option.length, 0, input.length]];
65
+ let matched = 0;
66
+ while (pending.length) {
67
+ const [aStart, aEnd, bStart, bEnd] = pending.pop();
68
+ let bestA = aStart, bestB = bStart, size = 0;
69
+ for (let a = aStart; a < aEnd; a++) {
70
+ await step();
71
+ for (let b = bStart; b < bEnd; b++) {
72
+ let length = 0;
73
+ while (a + length < aEnd && b + length < bEnd && option[a + length] === input[b + length]) length++;
74
+ if (length > size) {
75
+ bestA = a;
76
+ bestB = b;
77
+ size = length;
78
+ }
79
+ }
80
+ }
81
+ if (!size) continue;
82
+ matched += size;
83
+ if (aStart < bestA && bStart < bestB) pending.push([aStart, bestA, bStart, bestB]);
84
+ if (bestA + size < aEnd && bestB + size < bEnd) pending.push([bestA + size, aEnd, bestB + size, bEnd]);
85
+ }
86
+ const score = 2 * matched / (option.length + input.length);
87
+ if (score >= cutoff) matches.push({ option, score });
88
+ }
89
+ matches.sort((left, right) => right.score - left.score || (left.option < right.option ? 1 : left.option > right.option ? -1 : 0));
90
+ const suggestions = matches.slice(0, 3).map((match) => match.option).sort();
91
+ return !suggestions.length ? "" : suggestions.length === 1 ? ` Did you mean ${suggestions[0]}?` : ` (Possible options: ${suggestions.join(", ")})`;
92
+ }
9
93
 
10
94
  // packages/safe-bash-command-llm/src/configuration.ts
11
95
  import { FsError as FsError2, toByteSource as toByteSource2 } from "../../safe-bash-contracts/index.js";
@@ -218,6 +302,7 @@ function createLlmConfiguration(context, maxConfigurationBytes = Infinity, admis
218
302
  }),
219
303
  removeAlias: (name) => serialized(async () => {
220
304
  const expected = await stat(filename("aliases.json"));
305
+ if (!expected) throw new Error("No aliases.json file exists");
221
306
  const values = await aliases();
222
307
  if (!Object.hasOwn(values, name)) throw new Error(`No such alias: ${name}`);
223
308
  delete values[name];
@@ -255,6 +340,100 @@ function createLlmConfiguration(context, maxConfigurationBytes = Infinity, admis
255
340
  };
256
341
  }
257
342
 
343
+ // packages/safe-bash-command-llm/src/command-arguments.ts
344
+ async function commandArguments(group, tokens, commands, emit, diagnostic, step, prompt, help = (name) => loadLlmHelp(name.replaceAll(" ", "-"))) {
345
+ if (commands.length) {
346
+ let groupHelp = false;
347
+ for (const token of tokens) {
348
+ await step();
349
+ if (token === "--" || !token.startsWith("-")) break;
350
+ if (token.startsWith("--help=")) {
351
+ await diagnostic("Error: Option '--help' does not take a value.\n");
352
+ return 2;
353
+ }
354
+ if (token === "--help" || !token.startsWith("--") && token.includes("h")) groupHelp = true;
355
+ }
356
+ if (groupHelp) {
357
+ await emit(await help(group));
358
+ return 0;
359
+ }
360
+ if (tokens[0] === "--") tokens = tokens.slice(1);
361
+ }
362
+ const command = commands.length ? commands.includes(tokens[0] ?? "") ? tokens[0] : "list" : "";
363
+ if (command && tokens[0] === command) tokens = tokens.slice(1);
364
+ const path = group + (command ? " " + command : "");
365
+ const text = await help(path), usage2 = text.slice(0, text.indexOf("\n"));
366
+ const fail = async (message, withUsage = true) => {
367
+ await diagnostic((withUsage ? usage2 + `
368
+ Try 'llm ${path} -h' for help.
369
+
370
+ ` : "") + `Error: ${message}
371
+ `);
372
+ return 2;
373
+ };
374
+ const specs = /* @__PURE__ */ new Map();
375
+ for (const line of text.slice(text.indexOf("Options:\n")).split("\n")) {
376
+ if (!line.startsWith(" -")) continue;
377
+ const declaration = line.trim().split(" ")[0];
378
+ const aliases = declaration.split(", ").map((part) => part.split(" ")[0]);
379
+ const spec = { name: aliases.at(-1), value: declaration.split(", ").at(-1).includes(" ") };
380
+ for (const alias of aliases) specs.set(alias, spec);
381
+ }
382
+ const values = /* @__PURE__ */ new Map(), operands = [];
383
+ let ended = false, wantsHelp = false;
384
+ for (let index = 0; index < tokens.length; index++) {
385
+ await step();
386
+ const token = tokens[index];
387
+ if (!ended && token === "--") {
388
+ ended = true;
389
+ continue;
390
+ }
391
+ if (ended || !token.startsWith("-") || token === "-") {
392
+ operands.push(token);
393
+ continue;
394
+ }
395
+ const long = token.startsWith("--"), equals = token.indexOf("=");
396
+ for (let cursor = long ? 0 : 1; cursor < token.length; cursor++) {
397
+ const flag = long ? token.slice(0, equals < 0 ? void 0 : equals) : "-" + token[cursor];
398
+ const spec = specs.get(flag);
399
+ if (!spec) return fail(`No such option: ${flag}` + await chatOptionSuggestion(flag, step, [...specs.keys()]));
400
+ if (!spec.value) {
401
+ if (long && equals >= 0) return fail(`Option '${flag}' does not take a value.`, false);
402
+ if (spec.name === "--help") wantsHelp = true;
403
+ else values.set(spec.name, []);
404
+ if (long) break;
405
+ continue;
406
+ }
407
+ const value = (long ? equals < 0 ? void 0 : token.slice(equals + 1) : token.slice(cursor + 1) || void 0) ?? tokens[++index];
408
+ if (value === void 0) return fail(`Option '${flag}' requires an argument.`, false);
409
+ const key = spec.name;
410
+ const list = values.get(key) ?? [];
411
+ list.push(value);
412
+ values.set(key, list);
413
+ break;
414
+ }
415
+ }
416
+ if (wantsHelp) {
417
+ await emit(text);
418
+ return 0;
419
+ }
420
+ const parameters = usage2.split("[OPTIONS]")[1].trim().split(" ").filter(Boolean);
421
+ for (let index = operands.length; index < parameters.length; index++) {
422
+ if (!parameters[index].startsWith("[")) return fail(`Missing argument '${parameters[index]}'.`);
423
+ }
424
+ if (path === "keys set" && !values.has("--value")) {
425
+ const value = await prompt();
426
+ if (value === void 0) {
427
+ await diagnostic("Aborted!\n");
428
+ return 1;
429
+ }
430
+ values.set("--value", [value]);
431
+ }
432
+ const extra = parameters.at(-1)?.endsWith("...") ? [] : operands.slice(parameters.length);
433
+ if (extra.length) return fail(`Got unexpected extra argument${extra.length === 1 ? "" : "s"} (${extra.join(" ")})`);
434
+ return { command, operands, values };
435
+ }
436
+
258
437
  // packages/safe-bash-command-llm/src/embed-command.ts
259
438
  import { FsError as FsError3 } from "../../safe-bash-contracts/index.js";
260
439
  import { pathOf as pathOf3 } from "../../safe-bash-contracts/path.js";
@@ -335,7 +514,6 @@ async function acquireEmbeddingInput(context, values, binary, admit) {
335
514
 
336
515
  // packages/safe-bash-command-llm/src/embed-command.ts
337
516
  var usage = "Usage: llm embed [OPTIONS] [COLLECTION] [ID]\n";
338
- var help = "Usage: llm embed [OPTIONS] [COLLECTION] [ID]\n\n Embed text and store or return the result\n\nOptions:\n -i, --input PATH File to embed\n -m, --model TEXT Embedding model to use\n --store Store the text itself in the database\n -d, --database FILE\n -c, --content TEXT Content to embed\n --binary Treat input as binary data\n --metadata TEXT JSON object metadata to store\n -f, --format [json|blob|base64|hex]\n Output format\n -h, --help Show this message and exit.\n";
339
517
  async function embeddingCommand(context, service, tokens, write, diagnostic, step, admit, maxConfigurationBytes = Infinity, stored) {
340
518
  const encoder = new TextEncoder();
341
519
  const fail = async (message, code = 1, withUsage = false) => {
@@ -343,45 +521,11 @@ async function embeddingCommand(context, service, tokens, write, diagnostic, ste
343
521
  `);
344
522
  return code;
345
523
  };
346
- const values = {}, operands = [];
347
- let ended = false, wantsHelp = false, store = false, binary = false;
348
- const names = { "-m": "model", "--model": "model", "-c": "content", "--content": "content", "-i": "input", "--input": "input", "-f": "format", "--format": "format", "-d": "database", "--database": "database", "--metadata": "metadata" };
349
- for (let index = 0; index < tokens.length; index++) {
350
- await step();
351
- const token = tokens[index];
352
- if (!ended && token === "--") {
353
- ended = true;
354
- continue;
355
- }
356
- if (ended || !token.startsWith("-") || token === "-") {
357
- operands.push(token);
358
- continue;
359
- }
360
- const long = token.startsWith("--"), equals = token.indexOf("=");
361
- for (let cursor = long ? 0 : 1; cursor < token.length; cursor++) {
362
- const flag = long ? token.slice(0, equals < 0 ? void 0 : equals) : "-" + token[cursor];
363
- if (["--help", "-h", "--store", "--binary"].includes(flag)) {
364
- if (long && equals >= 0) return fail(`Option '${flag}' does not take a value.`, 2);
365
- if (flag === "--store") store = true;
366
- else if (flag === "--binary") binary = true;
367
- else wantsHelp = true;
368
- if (long) break;
369
- continue;
370
- }
371
- const name = names[flag];
372
- if (!name) return fail(`No such option: ${flag}`, 2, true);
373
- const attached = long ? equals < 0 ? void 0 : token.slice(equals + 1) : token.slice(cursor + 1) || void 0;
374
- const value = attached ?? tokens[++index];
375
- if (value === void 0) return fail(`Option '${flag}' requires an argument.`, 2);
376
- values[name] = value;
377
- break;
378
- }
379
- }
380
- if (wantsHelp) {
381
- await write(encoder.encode(help));
382
- return 0;
383
- }
384
- if (operands.length > 2) return fail(`Got unexpected extra argument${operands.length > 3 ? "s" : ""} (${operands.slice(2).join(" ")})`, 2, true);
524
+ const parsed = await commandArguments("embed", tokens, [], (text) => write(encoder.encode(text)), diagnostic, step);
525
+ if (typeof parsed === "number") return parsed;
526
+ const operands = parsed.operands, store = parsed.values.has("--store"), binary = parsed.values.has("--binary");
527
+ const values = {};
528
+ for (const [flag, entries] of parsed.values) if (entries.length) values[flag.slice(2)] = entries.at(-1);
385
529
  if (values.format !== void 0 && !["json", "blob", "base64", "hex"].includes(values.format)) return fail(`Invalid value for '-f' / '--format': '${values.format}' is not one of 'json', 'blob', 'base64', 'hex'.`, 2, true);
386
530
  if (values.metadata !== void 0) {
387
531
  let metadata;
@@ -436,7 +580,34 @@ async function embeddingCommand(context, service, tokens, write, diagnostic, ste
436
580
  }
437
581
  }
438
582
 
583
+ // packages/safe-bash-command-llm/src/python-unicode.ts
584
+ function hasUnpairedSurrogate(value) {
585
+ for (const char of value) {
586
+ const point = char.codePointAt(0);
587
+ if (point >= 55296 && point <= 57343) return true;
588
+ }
589
+ return false;
590
+ }
591
+ var pythonSurrogateId = /* @__PURE__ */ Symbol("pythonSurrogateId");
592
+ function unicodeOrder(left, right) {
593
+ let a = 0, b = 0;
594
+ while (a < left.length && b < right.length) {
595
+ const x = left.codePointAt(a), y = right.codePointAt(b);
596
+ if (x !== y) return x - y;
597
+ a += x > 65535 ? 2 : 1;
598
+ b += y > 65535 ? 2 : 1;
599
+ }
600
+ return (a < left.length ? 1 : 0) - (b < right.length ? 1 : 0);
601
+ }
602
+
439
603
  export {
604
+ loadLlmHelp,
605
+ chatOptions,
606
+ chatOptionSuggestion,
607
+ commandArguments,
608
+ hasUnpairedSurrogate,
609
+ pythonSurrogateId,
610
+ unicodeOrder,
440
611
  publishConfiguration,
441
612
  createLlmConfiguration,
442
613
  embeddingText,
@@ -19,6 +19,82 @@ import {
19
19
  encodeBase64Latin1
20
20
  } from "./chunk-HNEWGADJ.js";
21
21
 
22
+ // packages/safe-bash-csv-engine/src/python-utf7.ts
23
+ var PythonUtf7EncodingError = class extends TypeError {
24
+ constructor() {
25
+ super("surrogates not allowed");
26
+ }
27
+ };
28
+ var PythonUtf7FileDecoder = class {
29
+ shifted = false;
30
+ haveSextet = false;
31
+ bits = 0;
32
+ value = 0;
33
+ high;
34
+ loneSurrogate = false;
35
+ unit(point) {
36
+ let output = "";
37
+ if (this.high !== void 0) {
38
+ const high = this.high;
39
+ this.high = void 0;
40
+ if (point >= 56320 && point <= 57343) return String.fromCodePoint(65536 + (high - 55296) * 1024 + point - 56320);
41
+ this.loneSurrogate = true;
42
+ output += String.fromCharCode(high);
43
+ }
44
+ if (point >= 55296 && point <= 56319) this.high = point;
45
+ else {
46
+ if (point >= 56320 && point <= 57343) this.loneSurrogate = true;
47
+ output += String.fromCharCode(point);
48
+ }
49
+ return output;
50
+ }
51
+ decode(bytes = new Uint8Array(), options = {}) {
52
+ let output = "";
53
+ for (const byte of bytes) {
54
+ if (this.shifted) {
55
+ const sextet = byte >= 65 && byte <= 90 ? byte - 65 : byte >= 97 && byte <= 122 ? byte - 71 : byte >= 48 && byte <= 57 ? byte + 4 : byte === 43 ? 62 : byte === 47 ? 63 : -1;
56
+ if (sextet >= 0) {
57
+ this.haveSextet = true;
58
+ this.value = this.value << 6 | sextet;
59
+ this.bits += 6;
60
+ if (this.bits >= 16) {
61
+ this.bits -= 16;
62
+ output += this.unit(this.value >>> this.bits);
63
+ this.value &= (1 << this.bits) - 1;
64
+ }
65
+ continue;
66
+ }
67
+ if (!this.haveSextet) {
68
+ if (byte !== 45) throw new PythonTextDecodeError("Invalid UTF-7 shift");
69
+ output += "+";
70
+ } else {
71
+ if (this.bits >= 6 || this.value !== 0) throw new PythonTextDecodeError("Invalid UTF-7 padding");
72
+ if (this.high !== void 0) {
73
+ this.loneSurrogate = true;
74
+ output += String.fromCharCode(this.high);
75
+ this.high = void 0;
76
+ }
77
+ }
78
+ this.shifted = false;
79
+ if (byte === 45) continue;
80
+ }
81
+ if (byte >= 128) throw new PythonTextDecodeError("Invalid UTF-7 byte");
82
+ if (byte === 43) {
83
+ this.shifted = true;
84
+ this.haveSextet = false;
85
+ this.bits = 0;
86
+ this.value = 0;
87
+ } else output += String.fromCharCode(byte);
88
+ }
89
+ if (!options.stream) {
90
+ if (this.shifted && (this.bits >= 6 || this.value !== 0 || this.high !== void 0)) throw new PythonTextDecodeError("Incomplete UTF-7 shift");
91
+ this.shifted = false;
92
+ if (this.loneSurrogate) throw new PythonUtf7EncodingError();
93
+ }
94
+ return output;
95
+ }
96
+ };
97
+
22
98
  // packages/safe-bash-csv-engine/src/python-gb18030-table.ts
23
99
  var pythonGb18030Table = { "nativeEncoding": "gb18030", "native": "APwDgIUE+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4A4AD+AGAAfgDgAP4AYAB+AOAA/gBgAH4Aw==", "ranges": "", "prefixes": "gAL8Aw==", "codepoints": "wI4FAsqXB/IMAtAGAgACAAIAAgACAAIAGgICAgAMAgKSBwJiutYCAq4BEAAKAAIADAAiACQCIiAA", "gb18030": "AI4BgAJIBkoEGggOEhIKegw+HkAQFhQMAhICDgYICgwGAggCAgYCDgQIQgoiGiQOOhAeXiAwCjIGDggIcgo6hgM8xAECxgECAgQCAgQCAgQCAgQCAgQCAgQCbgQ42gI6rgE6sAEekgMgygECzAECMgga2gUc7gICkAMCGhAOAjAC2gEQbjZwHAKcAQL23QEE/G4G/m4EAgwCBgYEGggOIhISAhQCAgYCEgQKvgMM4AHWAuIBrAECrgECCgQGLggYJhoU9gEWfA6UAQhWHCwGNAS2AwzcARbeAQwCDgIKBAYOCAgGCgQGDAQCBgICBAIGDAQSBgoSEgomDBQKFgYSCAoyDBoGHgQWDAySARBKCkwGKggWYhgyxgI0pAGyCqYBmgUmrgUUjgNkyAEO4AIIMlAaCjgGJgwUPhggHiQQHhQQChQGBggERggkeiw+BkIE1gEGbAJuAvZBBPwgBv4gBAoGBgYIBCYIFDoWHgYgBAoGBg4ICAYKBAoIBjYIHJIJHsoEDuIECAIQAhIoCgYOBE4WKAYqBBqqAQ4GFgQSsAEKFhAM1gdW7AMagAQOwgMQ4gGmB+QB1AMu2AMYBh4EhgEGRCJGEgYUBAYIBMIDBuIBqgHkAVamCVjUBLoD1gTeASrgARbyFxj6C9IC/AuqAf4CrAHAATbEARzKBB6mAuYGqAK0A/oItgO+BMIDwATiAdIb5AHqDZ4I7A2QBNoOkgSuB84DsAfoAQ7qAQiqAQpW3gdY8APSC/ID6gVO7AUoggYqggMShAMKxgIMpAE+pgEg4g0i8gbGAfQGZAZmBA4GCAIMAk4GKAoqBlYILPoVMP4KmgGAC066A1jeAc4E7AGoAsICqgKiAebCA+7HArThAQKMnwICArgBAjI+GgJcAhIIChoMDg4QCA4MCB4MEBoSDj4QIDYkHJqGAR6OQ64CkEOYAWqaATbCAjiiASKkARJmFDQCPAICBAIKBgYWCAwCEgIGBgSWIAqMEAKQEAIOJggCHAICCgICHgLSBAqqAoIE5gOCAmaOAsyhEv7//wE0" };
24
100
 
@@ -172,6 +248,158 @@ var PythonMultibyteDecoder = class {
172
248
  }
173
249
  };
174
250
 
251
+ // packages/safe-bash-csv-engine/src/python-iso2022.ts
252
+ var pythonIso2022Charsets = {
253
+ iso2022_jp: [194, 74, 192],
254
+ iso2022_jp_1: [194, 196, 74, 192],
255
+ iso2022_jp_2: [194, 196, 195, 193, 74, 192, 65, 70],
256
+ iso2022_jp_2004: [209, 194, 208],
257
+ iso2022_jp_3: [207, 194, 208],
258
+ iso2022_jp_ext: [194, 196, 74, 73, 192],
259
+ iso2022_kr: [195]
260
+ };
261
+ var escapeEnd = (byte) => byte === 64 || byte >= 65 && byte <= 90;
262
+ var PythonIso2022PendingError = class extends Error {
263
+ constructor() {
264
+ super("pending buffer overflow");
265
+ }
266
+ };
267
+ var PythonIso2022Decoder = class {
268
+ constructor(encoding) {
269
+ this.encoding = encoding;
270
+ }
271
+ encoding;
272
+ groups = [66, 66, 66];
273
+ shifted = false;
274
+ through = false;
275
+ pending = [];
276
+ maps = /* @__PURE__ */ new Map();
277
+ invalid() {
278
+ throw new PythonTextDecodeError("Invalid ISO-2022 input");
279
+ }
280
+ character(charset, bytes) {
281
+ const a = bytes[0];
282
+ if (charset === 74) return String.fromCodePoint(a === 92 ? 165 : a === 126 ? 8254 : a);
283
+ if (charset === 73) {
284
+ if (a < 33 || a > 95) return this.invalid();
285
+ return String.fromCodePoint(a + 65344);
286
+ }
287
+ if (charset === 65 || charset === 70) return this.invalid();
288
+ const b = bytes[1];
289
+ if (a < 33 || a > 126 || b < 33 || b > 126) return this.invalid();
290
+ if (charset === 208 && a < 110 && ![33, 35, 36, 37, 40, 44, 45, 46, 47].includes(a)) return this.invalid();
291
+ if ((charset === 207 || charset === 209) && a === 34 && b === 50) return "~";
292
+ const mapping = charset === 193 ? "gb2312" : charset === 195 ? "cp949" : charset === 207 ? "euc_jisx0213" : charset === 209 ? "euc_jis_2004" : charset === 208 ? "euc_jis_2004" : "euc_jp";
293
+ let decoder = this.maps.get(mapping);
294
+ if (!decoder) {
295
+ decoder = new PythonMultibyteDecoder(pythonMultibyteTables[mapping]);
296
+ this.maps.set(mapping, decoder);
297
+ }
298
+ return decoder.decode(Uint8Array.from(charset === 196 || charset === 208 ? [143, a + 128, b + 128] : [a + 128, b + 128]));
299
+ }
300
+ secondary(byte) {
301
+ const group = this.groups[2];
302
+ if (group === 66) {
303
+ if (byte >= 128) return this.invalid();
304
+ return String.fromCharCode(byte);
305
+ }
306
+ if (group === 65) {
307
+ if (byte >= 128) return this.invalid();
308
+ return String.fromCharCode(byte + 128);
309
+ }
310
+ if (group !== 70) throw new Error("Invalid ISO-2022 secondary designation");
311
+ const value = byte ^ 128;
312
+ if (value === 164 || value === 165 || value === 170) return this.invalid();
313
+ const point = pythonFileCodepages["iso8859-7"]?.[value];
314
+ if (point === void 0 || point < 0) return this.invalid();
315
+ return String.fromCodePoint(point);
316
+ }
317
+ escape(bytes) {
318
+ let length = 0;
319
+ for (let i = 1; i < 16; i++) {
320
+ if (i >= bytes.length) return void 0;
321
+ if (escapeEnd(bytes[i])) {
322
+ length = i + 1;
323
+ break;
324
+ }
325
+ if (this.encoding !== "iso2022_kr" && bytes[i] === 38 && bytes[i + 1] === 64) i += 2;
326
+ }
327
+ if (!length) return this.invalid();
328
+ let group, charset;
329
+ if (length === 3) {
330
+ charset = bytes[2];
331
+ if (bytes[1] === 36) {
332
+ charset |= 128;
333
+ group = 0;
334
+ } else if (bytes[1] === 40) group = 0;
335
+ else if (bytes[1] === 41) group = 1;
336
+ else if (bytes[1] === 46 && this.encoding === "iso2022_jp_2") group = 2;
337
+ else return this.invalid();
338
+ } else if (length === 4 && bytes[1] === 36 && (bytes[2] === 40 || bytes[2] === 41)) {
339
+ group = bytes[2] === 40 ? 0 : 1;
340
+ charset = bytes[3] | 128;
341
+ } else if (length === 6 && this.encoding !== "iso2022_kr" && bytes[3] === 27 && bytes[4] === 36 && bytes[5] === 66) {
342
+ group = 0;
343
+ charset = 194;
344
+ } else return this.invalid();
345
+ if (charset !== 66 && !pythonIso2022Charsets[this.encoding].includes(charset)) return this.invalid();
346
+ this.groups[group] = charset;
347
+ return length;
348
+ }
349
+ decode(bytes = new Uint8Array(), options = {}) {
350
+ const previous = this.pending, pending = [...previous];
351
+ let output = "";
352
+ if (bytes.length) this.pending = [];
353
+ for (const byte of bytes) {
354
+ pending.push(byte);
355
+ while (pending.length) {
356
+ const first = pending[0];
357
+ let consumed = 1;
358
+ if (this.through) {
359
+ output += String.fromCharCode(first);
360
+ if (escapeEnd(first)) this.through = false;
361
+ } else if (first === 27) {
362
+ if (pending.length < 2) break;
363
+ if ([40, 41, 36, 46, 38].includes(pending[1])) {
364
+ const length = this.escape(pending);
365
+ if (length === void 0) break;
366
+ consumed = length;
367
+ } else if (this.encoding === "iso2022_jp_2" && pending[1] === 78) {
368
+ if (pending.length < 3) break;
369
+ output += this.secondary(pending[2]);
370
+ consumed = 3;
371
+ } else {
372
+ output += "\x1B";
373
+ this.through = true;
374
+ }
375
+ } else if (this.encoding === "iso2022_kr" && (first === 14 || first === 15)) this.shifted = first === 14;
376
+ else if (first === 10) {
377
+ this.shifted = false;
378
+ output += "\n";
379
+ } else if (first < 32) output += String.fromCharCode(first);
380
+ else if (first >= 128) return this.invalid();
381
+ else {
382
+ const charset = this.groups[this.shifted ? 1 : 0];
383
+ if (charset === 66) output += String.fromCharCode(first);
384
+ else {
385
+ consumed = charset & 128 ? 2 : 1;
386
+ if (pending.length < consumed) break;
387
+ output += this.character(charset, pending);
388
+ }
389
+ }
390
+ pending.splice(0, consumed);
391
+ }
392
+ }
393
+ if (!options.stream && pending.length) {
394
+ this.pending = previous;
395
+ throw new PythonTextDecodeError("Incomplete ISO-2022 input");
396
+ }
397
+ if (pending.length > 8) throw new PythonIso2022PendingError();
398
+ this.pending = pending;
399
+ return output;
400
+ }
401
+ };
402
+
175
403
  // packages/safe-bash-csv-engine/src/python-hz.ts
176
404
  var PythonHzDecoder = class {
177
405
  shifted = false;
@@ -255,15 +483,15 @@ var PythonTextDecoder = class {
255
483
  constructor(encoding) {
256
484
  const name = normalizeEncoding(encoding);
257
485
  const canonical = Object.hasOwn(pythonCodecAliases, name) ? pythonCodecAliases[name] : void 0;
258
- if (canonical === void 0 || !["hz", "utf-8-sig", "utf-8", "utf-16", "utf-16-le", "utf-16-be", "utf-32", "utf-32-le", "utf-32-be"].includes(canonical) && !Object.hasOwn(fileCodepages, canonical) && !Object.hasOwn(pythonMultibyteTables, canonical)) throw new RangeError(`unknown encoding: ${encoding}`);
486
+ if (canonical === void 0 || !["utf-7", "hz", "utf-8-sig", "utf-8", "utf-16", "utf-16-le", "utf-16-be", "utf-32", "utf-32-le", "utf-32-be"].includes(canonical) && !Object.hasOwn(pythonIso2022Charsets, canonical) && !Object.hasOwn(fileCodepages, canonical) && !Object.hasOwn(pythonMultibyteTables, canonical)) throw new RangeError(`unknown encoding: ${encoding}`);
259
487
  this.encoding = canonical;
260
488
  this.codepoints = fileCodepages[canonical];
261
489
  this.signatureComplete = canonical !== "utf-8-sig";
262
- this.decoder = canonical === "hz" ? new PythonHzDecoder() : pythonMultibyteTables[canonical] ? new PythonMultibyteDecoder(pythonMultibyteTables[canonical]) : canonical === "utf-16" || canonical === "utf-16-le" || canonical === "utf-16-be" ? new PythonUtf16Decoder(canonical) : canonical === "utf-32" || canonical === "utf-32-le" || canonical === "utf-32-be" ? new PythonUtf32Decoder(canonical) : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
490
+ this.decoder = canonical === "utf-7" ? new PythonUtf7FileDecoder() : Object.hasOwn(pythonIso2022Charsets, canonical) ? new PythonIso2022Decoder(canonical) : canonical === "hz" ? new PythonHzDecoder() : pythonMultibyteTables[canonical] ? new PythonMultibyteDecoder(pythonMultibyteTables[canonical]) : canonical === "utf-16" || canonical === "utf-16-le" || canonical === "utf-16-be" ? new PythonUtf16Decoder(canonical) : canonical === "utf-32" || canonical === "utf-32-le" || canonical === "utf-32-be" ? new PythonUtf32Decoder(canonical) : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
263
491
  }
264
492
  decode(bytes, options) {
265
493
  if (this.codepoints) return decodePythonSingleByte(bytes ?? new Uint8Array(), this.codepoints, this.encoding);
266
- if (this.decoder instanceof PythonHzDecoder || this.decoder instanceof PythonUtf16Decoder || this.decoder instanceof PythonUtf32Decoder || this.decoder instanceof PythonMultibyteDecoder) return this.decoder.decode(bytes, options);
494
+ if (this.decoder instanceof PythonUtf7FileDecoder || this.decoder instanceof PythonIso2022Decoder || this.decoder instanceof PythonHzDecoder || this.decoder instanceof PythonUtf16Decoder || this.decoder instanceof PythonUtf32Decoder || this.decoder instanceof PythonMultibyteDecoder) return this.decoder.decode(bytes, options);
267
495
  try {
268
496
  let offset = 0;
269
497
  if (!this.signatureComplete) {
@@ -290,5 +518,7 @@ var PythonTextDecoder = class {
290
518
  };
291
519
 
292
520
  export {
521
+ PythonUtf7EncodingError,
522
+ PythonIso2022PendingError,
293
523
  PythonTextDecoder
294
524
  };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  base64Stream
3
- } from "./chunk-GQV5RWMN.js";
3
+ } from "./chunk-ZFXHSFTU.js";
4
4
  import {
5
5
  waitForSource
6
- } from "./chunk-QX3WKBLI.js";
6
+ } from "./chunk-36FV6BAG.js";
7
7
 
8
8
  // packages/safe-bash-command-llm/src/file-source.ts
9
9
  import { FsError } from "../../safe-bash-contracts/index.js";