@poe-platform/safe-bash 0.1.665 → 0.1.667

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.
@@ -7,7 +7,7 @@ import {
7
7
  isPythonFailureCategory,
8
8
  parsePythonInvocation,
9
9
  reportPythonFailure
10
- } from "./chunk-AJ355TRJ.js";
10
+ } from "./chunk-YNJE6FJI.js";
11
11
  import {
12
12
  createOutputOperation
13
13
  } from "./chunk-CDBQXRWL.js";
@@ -1866,4 +1866,4 @@ export {
1866
1866
  createPythonCommands,
1867
1867
  pythonCommands
1868
1868
  };
1869
- //# sourceMappingURL=chunk-6VT3VSBX.js.map
1869
+ //# sourceMappingURL=chunk-NLTXADDK.js.map
@@ -77,6 +77,8 @@ var messages = {
77
77
  "transport-unavailable": "Python worker transport or shared-memory operations are unavailable.",
78
78
  "runtime-abi": "Python runtime version or native ABI is unsupported.",
79
79
  "runtime-assets": "Python runtime or package assets could not be loaded.",
80
+ "isolation-unavailable": "Python host isolation or resource enforcement is unavailable.",
81
+ deadline: "Python execution exceeded its host deadline.",
80
82
  "filesystem-open": "Python filesystem handle access is unavailable; the backend must support retained open.",
81
83
  "filesystem-read": "Python filesystem reads are unavailable for this backend.",
82
84
  "filesystem-write": "Python filesystem writes are unavailable for this backend.",
@@ -140,4 +142,4 @@ export {
140
142
  reportPythonFailure,
141
143
  inspectPythonCapabilities
142
144
  };
143
- //# sourceMappingURL=chunk-AJ355TRJ.js.map
145
+ //# sourceMappingURL=chunk-YNJE6FJI.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/python/invocation.ts", "../../src/commands/python/diagnostics.ts"],
4
- "sourcesContent": ["/** An explicit compatibility failure, rendered as Python usage status 2. */\nexport class PythonInvocationError extends Error {\n constructor(message: string) { super(message); this.name = 'PythonInvocationError'; }\n}\n\n/** Extract native initialization flags without consuming script/module arguments. */\nexport function parsePythonInvocation(args: readonly string[], env: Readonly<Record<string, string>>): {\n readonly startupArgs: string[];\n readonly env: Record<string, string>;\n} {\n const startupArgs: string[] = [];\n let informational = false;\n scan: for (let index = 0; index < args.length; index++) {\n const option = args[index]!;\n if (option === '--' || option === '-' || !option.startsWith('-')) break;\n if (option === '--help') { informational = true; break; }\n if (option === '--version') { informational = true; continue; }\n if (option.startsWith('--')) throw new PythonInvocationError('unsupported option ' + option);\n for (let offset = 1; offset < option.length; offset++) {\n const flag = option[offset]!;\n if (flag === 'h' || flag === '?') { informational = true; break scan; }\n if (flag === 'V') { informational = true; continue; }\n if ('cmWX'.includes(flag)) {\n const operand = option.slice(offset + 1) || args[++index];\n if (operand === undefined) throw new PythonInvocationError('argument expected for -' + flag);\n if (flag === 'c' || flag === 'm') break scan;\n if (flag === 'X') {\n const separator = operand.indexOf('=');\n const name = separator < 0 ? operand : operand.slice(0, separator);\n const value = separator < 0 ? undefined : operand.slice(separator + 1);\n let decimal = value ?? '';\n while (decimal.length && ' \\t\\n\\r\\v\\f'.includes(decimal[0]!)) decimal = decimal.slice(1);\n if (decimal[0] === '+' || decimal[0] === '-') decimal = decimal.slice(1);\n const digits = decimal.length > 0 && [...decimal].every(character => character >= '0' && character <= '9');\n const supported = (name === 'utf8' && (value === undefined || value === '0' || value === '1'))\n || ((name === 'dev' || name === 'warn_default_encoding') && value === undefined)\n || (name === 'int_max_str_digits' && digits && Number.isSafeInteger(Number(value)) && Number(value) <= 2147483647 && (Number(value) === 0 || Number(value) >= 640));\n if (!supported) throw new PythonInvocationError('unsupported -X option ' + operand);\n startupArgs.push('-X', operand);\n }\n // Warning-as-error can prevent Pyodide bootstrap; apply -W after bootstrap.\n break;\n }\n if (!'BEPOusISbdvqR'.includes(flag)) throw new PythonInvocationError('unsupported option -' + flag);\n startupArgs.push('-' + flag);\n }\n }\n if (!informational && !startupArgs.includes('-E') && !startupArgs.includes('-I')) {\n if (env.PYTHONINSPECT) throw new PythonInvocationError('PYTHONINSPECT requires an interactive terminal, which the shell does not expose');\n if (env.PYTHONHOME) throw new PythonInvocationError('PYTHONHOME cannot replace the configured Pyodide runtime');\n }\n const runtimeEnv = { ...env };\n // These paths belong to the canonical filesystem, mounted after bootstrap.\n delete runtimeEnv.PYTHONPATH;\n delete runtimeEnv.PYTHONHOME;\n delete runtimeEnv.PYTHONWARNINGS;\n // Pyodide otherwise supplies PYTHONINSPECT=1, including with a -c operand.\n runtimeEnv.PYTHONINSPECT = '';\n // Without a command Pyodide initializes CPython in inspect mode.\n startupArgs.push('-c', '');\n return { startupArgs, env: runtimeEnv };\n}\n", "import type { FileSystem } from '../../contracts/filesystem.js';\n\nconst messages = {\n 'executor-unavailable': 'Python executor is unavailable; configure exactly one supported executor or interpreter worker.',\n 'transport-unavailable': 'Python worker transport or shared-memory operations are unavailable.',\n 'runtime-abi': 'Python runtime version or native ABI is unsupported.',\n 'runtime-assets': 'Python runtime or package assets could not be loaded.',\n 'filesystem-open': 'Python filesystem handle access is unavailable; the backend must support retained open.',\n 'filesystem-read': 'Python filesystem reads are unavailable for this backend.',\n 'filesystem-write': 'Python filesystem writes are unavailable for this backend.',\n 'filesystem-directory': 'Python retained directory operations are unavailable for this backend.',\n 'filesystem-operation': 'The requested Python filesystem operation is unavailable for this backend.',\n capacity: 'Python worker capacity exhausted.',\n cleanup: 'Python resource cleanup failed; retirement could not be confirmed.',\n startup: 'Python startup failed; consult the host diagnostic callback.',\n runtime: 'Python runtime failed; consult the host diagnostic callback.',\n} as const;\n\nexport type PythonFailureCategory = keyof typeof messages;\n\nexport class PythonFailure extends Error {\n constructor(readonly category: PythonFailureCategory, options?: ErrorOptions) {\n super(messages[category], options);\n this.name = 'PythonFailure';\n }\n}\n\nexport interface PythonDiagnostic {\n readonly failure: PythonFailure;\n readonly cause: unknown;\n}\n\nexport type PythonDiagnosticObserver = (diagnostic: PythonDiagnostic) => void | Promise<void>;\nexport type PythonFileSystemRequirement = 'open' | 'read' | 'write' | 'directory';\n\nexport function isPythonFailureCategory(value: unknown): value is PythonFailureCategory {\n return typeof value === 'string' && Object.hasOwn(messages, value);\n}\n\nexport function reportPythonFailure(category: PythonFailureCategory, cause: unknown, observer?: PythonDiagnosticObserver): PythonFailure {\n const failure = new PythonFailure(category);\n try { void Promise.resolve(observer?.({ failure, cause })).catch(() => {}); } catch {}\n return failure;\n}\n\nexport interface PythonCapabilityOptions {\n readonly createWorker?: () => unknown;\n readonly createExecutor?: () => unknown;\n readonly fs?: FileSystem;\n readonly requiredFileSystem?: readonly PythonFileSystemRequirement[];\n readonly runtimeVersion?: string;\n}\n\nexport interface PythonCapabilityReport {\n readonly configurationValid: boolean;\n readonly failures: readonly PythonFailure[];\n}\n\nexport function inspectPythonCapabilities(options: PythonCapabilityOptions = {}): PythonCapabilityReport {\n const failures = new Set<PythonFailureCategory>();\n if ((typeof options.createWorker === 'function') === (typeof options.createExecutor === 'function')\n || options.createWorker !== undefined && typeof options.createWorker !== 'function'\n || options.createExecutor !== undefined && typeof options.createExecutor !== 'function') failures.add('executor-unavailable');\n if (typeof options.createExecutor !== 'function' && (typeof SharedArrayBuffer !== 'function' || typeof Atomics !== 'object'\n || typeof Atomics.store !== 'function' || typeof Atomics.notify !== 'function')) failures.add('transport-unavailable');\n if (options.runtimeVersion !== undefined && options.runtimeVersion !== '314.0.6') failures.add('runtime-abi');\n for (const requirement of options.requiredFileSystem ?? []) {\n if (!['open', 'read', 'write', 'directory'].includes(requirement)) throw new TypeError('Unknown Python filesystem requirement');\n const category: PythonFailureCategory = requirement === 'open' ? 'filesystem-open'\n : requirement === 'read' ? 'filesystem-read' : requirement === 'write' ? 'filesystem-write' : 'filesystem-directory';\n try {\n const fs = options.fs;\n if (requirement === 'directory') {\n failures.add(category);\n } else if (!fs || typeof fs.open !== 'function' || fs.capabilities.open === false) failures.add('filesystem-open');\n else if (requirement === 'write' && (fs.capabilities.readOnly === true || fs.capabilities.write === false)) failures.add(category);\n else if (requirement === 'read' && fs.capabilities.read === false) failures.add(category);\n } catch { failures.add(category); }\n }\n return Object.freeze({ configurationValid: failures.size === 0,\n failures: Object.freeze([...failures].map(category => new PythonFailure(category))) });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/** An explicit compatibility failure, rendered as Python usage status 2. */\nexport class PythonInvocationError extends Error {\n constructor(message: string) { super(message); this.name = 'PythonInvocationError'; }\n}\n\n/** Extract native initialization flags without consuming script/module arguments. */\nexport function parsePythonInvocation(args: readonly string[], env: Readonly<Record<string, string>>): {\n readonly startupArgs: string[];\n readonly env: Record<string, string>;\n} {\n const startupArgs: string[] = [];\n let informational = false;\n scan: for (let index = 0; index < args.length; index++) {\n const option = args[index]!;\n if (option === '--' || option === '-' || !option.startsWith('-')) break;\n if (option === '--help') { informational = true; break; }\n if (option === '--version') { informational = true; continue; }\n if (option.startsWith('--')) throw new PythonInvocationError('unsupported option ' + option);\n for (let offset = 1; offset < option.length; offset++) {\n const flag = option[offset]!;\n if (flag === 'h' || flag === '?') { informational = true; break scan; }\n if (flag === 'V') { informational = true; continue; }\n if ('cmWX'.includes(flag)) {\n const operand = option.slice(offset + 1) || args[++index];\n if (operand === undefined) throw new PythonInvocationError('argument expected for -' + flag);\n if (flag === 'c' || flag === 'm') break scan;\n if (flag === 'X') {\n const separator = operand.indexOf('=');\n const name = separator < 0 ? operand : operand.slice(0, separator);\n const value = separator < 0 ? undefined : operand.slice(separator + 1);\n let decimal = value ?? '';\n while (decimal.length && ' \\t\\n\\r\\v\\f'.includes(decimal[0]!)) decimal = decimal.slice(1);\n if (decimal[0] === '+' || decimal[0] === '-') decimal = decimal.slice(1);\n const digits = decimal.length > 0 && [...decimal].every(character => character >= '0' && character <= '9');\n const supported = (name === 'utf8' && (value === undefined || value === '0' || value === '1'))\n || ((name === 'dev' || name === 'warn_default_encoding') && value === undefined)\n || (name === 'int_max_str_digits' && digits && Number.isSafeInteger(Number(value)) && Number(value) <= 2147483647 && (Number(value) === 0 || Number(value) >= 640));\n if (!supported) throw new PythonInvocationError('unsupported -X option ' + operand);\n startupArgs.push('-X', operand);\n }\n // Warning-as-error can prevent Pyodide bootstrap; apply -W after bootstrap.\n break;\n }\n if (!'BEPOusISbdvqR'.includes(flag)) throw new PythonInvocationError('unsupported option -' + flag);\n startupArgs.push('-' + flag);\n }\n }\n if (!informational && !startupArgs.includes('-E') && !startupArgs.includes('-I')) {\n if (env.PYTHONINSPECT) throw new PythonInvocationError('PYTHONINSPECT requires an interactive terminal, which the shell does not expose');\n if (env.PYTHONHOME) throw new PythonInvocationError('PYTHONHOME cannot replace the configured Pyodide runtime');\n }\n const runtimeEnv = { ...env };\n // These paths belong to the canonical filesystem, mounted after bootstrap.\n delete runtimeEnv.PYTHONPATH;\n delete runtimeEnv.PYTHONHOME;\n delete runtimeEnv.PYTHONWARNINGS;\n // Pyodide otherwise supplies PYTHONINSPECT=1, including with a -c operand.\n runtimeEnv.PYTHONINSPECT = '';\n // Without a command Pyodide initializes CPython in inspect mode.\n startupArgs.push('-c', '');\n return { startupArgs, env: runtimeEnv };\n}\n", "import type { FileSystem } from '../../contracts/filesystem.js';\n\nconst messages = {\n 'executor-unavailable': 'Python executor is unavailable; configure exactly one supported executor or interpreter worker.',\n 'transport-unavailable': 'Python worker transport or shared-memory operations are unavailable.',\n 'runtime-abi': 'Python runtime version or native ABI is unsupported.',\n 'runtime-assets': 'Python runtime or package assets could not be loaded.',\n 'isolation-unavailable': 'Python host isolation or resource enforcement is unavailable.',\n deadline: 'Python execution exceeded its host deadline.',\n 'filesystem-open': 'Python filesystem handle access is unavailable; the backend must support retained open.',\n 'filesystem-read': 'Python filesystem reads are unavailable for this backend.',\n 'filesystem-write': 'Python filesystem writes are unavailable for this backend.',\n 'filesystem-directory': 'Python retained directory operations are unavailable for this backend.',\n 'filesystem-operation': 'The requested Python filesystem operation is unavailable for this backend.',\n capacity: 'Python worker capacity exhausted.',\n cleanup: 'Python resource cleanup failed; retirement could not be confirmed.',\n startup: 'Python startup failed; consult the host diagnostic callback.',\n runtime: 'Python runtime failed; consult the host diagnostic callback.',\n} as const;\n\nexport type PythonFailureCategory = keyof typeof messages;\n\nexport class PythonFailure extends Error {\n constructor(readonly category: PythonFailureCategory, options?: ErrorOptions) {\n super(messages[category], options);\n this.name = 'PythonFailure';\n }\n}\n\nexport interface PythonDiagnostic {\n readonly failure: PythonFailure;\n readonly cause: unknown;\n}\n\nexport type PythonDiagnosticObserver = (diagnostic: PythonDiagnostic) => void | Promise<void>;\nexport type PythonFileSystemRequirement = 'open' | 'read' | 'write' | 'directory';\n\nexport function isPythonFailureCategory(value: unknown): value is PythonFailureCategory {\n return typeof value === 'string' && Object.hasOwn(messages, value);\n}\n\nexport function reportPythonFailure(category: PythonFailureCategory, cause: unknown, observer?: PythonDiagnosticObserver): PythonFailure {\n const failure = new PythonFailure(category);\n try { void Promise.resolve(observer?.({ failure, cause })).catch(() => {}); } catch {}\n return failure;\n}\n\nexport interface PythonCapabilityOptions {\n readonly createWorker?: () => unknown;\n readonly createExecutor?: () => unknown;\n readonly fs?: FileSystem;\n readonly requiredFileSystem?: readonly PythonFileSystemRequirement[];\n readonly runtimeVersion?: string;\n}\n\nexport interface PythonCapabilityReport {\n readonly configurationValid: boolean;\n readonly failures: readonly PythonFailure[];\n}\n\nexport function inspectPythonCapabilities(options: PythonCapabilityOptions = {}): PythonCapabilityReport {\n const failures = new Set<PythonFailureCategory>();\n if ((typeof options.createWorker === 'function') === (typeof options.createExecutor === 'function')\n || options.createWorker !== undefined && typeof options.createWorker !== 'function'\n || options.createExecutor !== undefined && typeof options.createExecutor !== 'function') failures.add('executor-unavailable');\n if (typeof options.createExecutor !== 'function' && (typeof SharedArrayBuffer !== 'function' || typeof Atomics !== 'object'\n || typeof Atomics.store !== 'function' || typeof Atomics.notify !== 'function')) failures.add('transport-unavailable');\n if (options.runtimeVersion !== undefined && options.runtimeVersion !== '314.0.6') failures.add('runtime-abi');\n for (const requirement of options.requiredFileSystem ?? []) {\n if (!['open', 'read', 'write', 'directory'].includes(requirement)) throw new TypeError('Unknown Python filesystem requirement');\n const category: PythonFailureCategory = requirement === 'open' ? 'filesystem-open'\n : requirement === 'read' ? 'filesystem-read' : requirement === 'write' ? 'filesystem-write' : 'filesystem-directory';\n try {\n const fs = options.fs;\n if (requirement === 'directory') {\n failures.add(category);\n } else if (!fs || typeof fs.open !== 'function' || fs.capabilities.open === false) failures.add('filesystem-open');\n else if (requirement === 'write' && (fs.capabilities.readOnly === true || fs.capabilities.write === false)) failures.add(category);\n else if (requirement === 'read' && fs.capabilities.read === false) failures.add(category);\n } catch { failures.add(category); }\n }\n return Object.freeze({ configurationValid: failures.size === 0,\n failures: Object.freeze([...failures].map(category => new PythonFailure(category))) });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,6 +4,8 @@ declare const messages: {
4
4
  readonly 'transport-unavailable': "Python worker transport or shared-memory operations are unavailable.";
5
5
  readonly 'runtime-abi': "Python runtime version or native ABI is unsupported.";
6
6
  readonly 'runtime-assets': "Python runtime or package assets could not be loaded.";
7
+ readonly 'isolation-unavailable': "Python host isolation or resource enforcement is unavailable.";
8
+ readonly deadline: "Python execution exceeded its host deadline.";
7
9
  readonly 'filesystem-open': "Python filesystem handle access is unavailable; the backend must support retained open.";
8
10
  readonly 'filesystem-read': "Python filesystem reads are unavailable for this backend.";
9
11
  readonly 'filesystem-write': "Python filesystem writes are unavailable for this backend.";
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/commands/python/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,QAAA,MAAM,QAAQ;;;;;;;;;;;;;;CAcJ,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE1D,qBAAa,aAAc,SAAQ,KAAK;IAC1B,QAAQ,CAAC,QAAQ,EAAE,qBAAqB;gBAA/B,QAAQ,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,YAAY;CAI7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9F,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAElF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,wBAAwB,GAAG,aAAa,CAIvI;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAuBvG"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/commands/python/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,QAAA,MAAM,QAAQ;;;;;;;;;;;;;;;;CAgBJ,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,QAAQ,CAAC;AAE1D,qBAAa,aAAc,SAAQ,KAAK;IAC1B,QAAQ,CAAC,QAAQ,EAAE,qBAAqB;gBAA/B,QAAQ,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,YAAY;CAI7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9F,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAElF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,wBAAwB,GAAG,aAAa,CAIvI;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAuBvG"}
@@ -3,6 +3,8 @@ const messages = {
3
3
  'transport-unavailable': 'Python worker transport or shared-memory operations are unavailable.',
4
4
  'runtime-abi': 'Python runtime version or native ABI is unsupported.',
5
5
  'runtime-assets': 'Python runtime or package assets could not be loaded.',
6
+ 'isolation-unavailable': 'Python host isolation or resource enforcement is unavailable.',
7
+ deadline: 'Python execution exceeded its host deadline.',
6
8
  'filesystem-open': 'Python filesystem handle access is unavailable; the backend must support retained open.',
7
9
  'filesystem-read': 'Python filesystem reads are unavailable for this backend.',
8
10
  'filesystem-write': 'Python filesystem writes are unavailable for this backend.',
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/commands/python/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG;IACf,sBAAsB,EAAE,iGAAiG;IACzH,uBAAuB,EAAE,sEAAsE;IAC/F,aAAa,EAAE,sDAAsD;IACrE,gBAAgB,EAAE,uDAAuD;IACzE,iBAAiB,EAAE,yFAAyF;IAC5G,iBAAiB,EAAE,2DAA2D;IAC9E,kBAAkB,EAAE,4DAA4D;IAChF,sBAAsB,EAAE,wEAAwE;IAChG,sBAAsB,EAAE,4EAA4E;IACpG,QAAQ,EAAE,mCAAmC;IAC7C,OAAO,EAAE,oEAAoE;IAC7E,OAAO,EAAE,8DAA8D;IACvE,OAAO,EAAE,8DAA8D;CAC/D,CAAC;AAIX,MAAM,OAAO,aAAc,SAAQ,KAAK;IACjB;IAArB,YAAqB,QAA+B,EAAE,OAAsB;QAC1E,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QADhB,aAAQ,GAAR,QAAQ,CAAuB;QAElD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAUD,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA+B,EAAE,KAAc,EAAE,QAAmC;IACtH,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC;QAAC,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACtF,OAAO,OAAO,CAAC;AACjB,CAAC;AAeD,MAAM,UAAU,yBAAyB,CAAC,UAAmC,EAAE;IAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,IAAI,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,CAAC;WAC9F,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU;WAChF,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU;QAAE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAChI,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,IAAI,CAAC,OAAO,iBAAiB,KAAK,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ;WACtH,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACzH,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9G,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;QAChI,MAAM,QAAQ,GAA0B,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB;YAChF,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACvH,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;YACtB,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;iBAC9G,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,KAAK,KAAK,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;iBAC9H,IAAI,WAAW,KAAK,MAAM,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC;YAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC;QAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/commands/python/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface DockerPythonRunnerOptions {
2
+ readonly isolatedContainer: true;
3
+ readonly runtimeModuleURL: string;
4
+ readonly indexURL?: string;
5
+ }
6
+ export declare function runDockerPythonExecutor(options: DockerPythonRunnerOptions): Promise<void>;
7
+ //# sourceMappingURL=docker-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-runner.d.ts","sourceRoot":"","sources":["../../../src/commands/python/docker-runner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6F/F"}
@@ -0,0 +1,136 @@
1
+ import { createNodePythonWorker } from './node.js';
2
+ import { encodePythonReply } from './reply.js';
3
+ import { PythonFailure } from './diagnostics.js';
4
+ export async function runDockerPythonExecutor(options) {
5
+ if (options.isolatedContainer !== true)
6
+ throw new TypeError('The Python stdio runner requires an explicitly isolated container');
7
+ const runtimeModuleURL = new URL(options.runtimeModuleURL);
8
+ if (runtimeModuleURL.protocol !== 'file:')
9
+ throw new TypeError('The isolated Python runtime must be present in its immutable image');
10
+ const input = process.stdin;
11
+ const output = process.stdout;
12
+ let buffered = Buffer.alloc(0);
13
+ let limit = 16777216;
14
+ let endpoint;
15
+ let unsubscribe;
16
+ let retirement;
17
+ let control;
18
+ let payload;
19
+ let identifier = 0;
20
+ let requesting = false;
21
+ let finished = false;
22
+ let resolveRun;
23
+ let rejectRun;
24
+ const completion = new Promise((resolve, reject) => { resolveRun = resolve; rejectRun = reject; });
25
+ const fail = () => { finished = true; rejectRun(new PythonFailure('transport-unavailable')); };
26
+ const retire = () => retirement ??= Promise.resolve().then(async () => {
27
+ finished = true;
28
+ input.off('data', data);
29
+ input.destroy();
30
+ unsubscribe?.();
31
+ await endpoint?.terminate();
32
+ });
33
+ const write = (value) => new Promise((resolve, reject) => {
34
+ try {
35
+ output.write(Buffer.concat([encodePythonReply(value, limit), Buffer.from('\n')]), error => error ? reject(error) : resolve());
36
+ }
37
+ catch (error) {
38
+ reject(error);
39
+ }
40
+ });
41
+ const receive = (frame) => {
42
+ if (endpoint) {
43
+ if (!requesting || frame?.id !== identifier || ![1, 2].includes(frame.status))
44
+ throw new PythonFailure('transport-unavailable');
45
+ const bytes = encodePythonReply(frame.value, payload.length);
46
+ payload.set(bytes);
47
+ requesting = false;
48
+ Atomics.store(control, 1, bytes.length);
49
+ Atomics.store(control, 0, frame.status);
50
+ Atomics.notify(control, 0);
51
+ return;
52
+ }
53
+ if (frame?.type !== 'start' || !Number.isSafeInteger(frame.maxTransferBytes) || frame.maxTransferBytes < 1 || frame.maxTransferBytes > 1048576
54
+ || !Number.isSafeInteger(frame.maxFrameBytes) || frame.maxFrameBytes < 65536 || frame.maxFrameBytes > 16777216)
55
+ throw new PythonFailure('transport-unavailable');
56
+ limit = frame.maxFrameBytes;
57
+ const shared = new SharedArrayBuffer(8 + frame.maxTransferBytes * 6 + 65536);
58
+ control = new Int32Array(shared, 0, 2);
59
+ payload = new Uint8Array(shared, 8);
60
+ endpoint = createNodePythonWorker({ trustedPython: true, runtimeModuleURL: runtimeModuleURL.href,
61
+ ...(options.indexURL === undefined ? {} : { indexURL: options.indexURL }) });
62
+ unsubscribe = endpoint.subscribe(message => {
63
+ if (finished)
64
+ return;
65
+ if (!message || typeof message !== 'object') {
66
+ fail();
67
+ return;
68
+ }
69
+ const record = message;
70
+ if (typeof record.op === 'string') {
71
+ if (requesting) {
72
+ fail();
73
+ return;
74
+ }
75
+ requesting = true;
76
+ void write({ type: 'request', id: ++identifier, op: record.op, args: record.args }).catch(fail);
77
+ }
78
+ else {
79
+ const terminal = record.type === 'exit' || record.type === 'error';
80
+ if (terminal)
81
+ finished = true;
82
+ void write(message).then(() => { if (terminal)
83
+ resolveRun(); }, rejectRun);
84
+ }
85
+ }, fail);
86
+ endpoint.postMessage({ ...frame, shared });
87
+ };
88
+ const data = (chunk) => {
89
+ if (finished)
90
+ return;
91
+ try {
92
+ if (buffered.length + chunk.length > limit + 1)
93
+ throw new PythonFailure('transport-unavailable');
94
+ buffered = Buffer.concat([buffered, chunk]);
95
+ let end;
96
+ while (!finished && (end = buffered.indexOf(10)) >= 0) {
97
+ if (end > limit)
98
+ throw new PythonFailure('transport-unavailable');
99
+ const frame = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(buffered.subarray(0, end)));
100
+ buffered = Buffer.from(buffered.subarray(end + 1));
101
+ receive(frame);
102
+ }
103
+ if (buffered.length > limit)
104
+ throw new PythonFailure('transport-unavailable');
105
+ }
106
+ catch {
107
+ fail();
108
+ }
109
+ };
110
+ input.on('data', data);
111
+ input.once('end', fail);
112
+ input.once('close', fail);
113
+ input.once('error', fail);
114
+ output.once('error', fail);
115
+ output.once('close', fail);
116
+ try {
117
+ await completion;
118
+ }
119
+ catch {
120
+ await retire();
121
+ await write({ type: 'error', category: 'transport-unavailable' });
122
+ }
123
+ finally {
124
+ try {
125
+ await retire();
126
+ }
127
+ finally {
128
+ input.off('end', fail);
129
+ input.off('close', fail);
130
+ input.off('error', fail);
131
+ output.off('error', fail);
132
+ output.off('close', fail);
133
+ }
134
+ }
135
+ }
136
+ //# sourceMappingURL=docker-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-runner.js","sourceRoot":"","sources":["../../../src/commands/python/docker-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type PythonExecutorPool } from './executor-pool.js';
2
+ export { runDockerPythonExecutor } from './docker-runner.js';
3
+ export type { DockerPythonRunnerOptions } from './docker-runner.js';
4
+ export interface DockerPythonExecutorOptions {
5
+ readonly socketPath: string;
6
+ readonly image: string;
7
+ readonly memoryBytes: number;
8
+ readonly cpus: number;
9
+ readonly deadlineMs: number;
10
+ readonly maxConcurrentExecutors: number;
11
+ readonly temporaryBytes?: number;
12
+ readonly controlTimeoutMs?: number;
13
+ readonly maxFrameBytes?: number;
14
+ }
15
+ export declare function createDockerPythonExecutorPool(options: DockerPythonExecutorOptions): Promise<PythonExecutorPool>;
16
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/commands/python/docker.ts"],"names":[],"mappings":"AAIA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAKvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAWD,wBAAsB,8BAA8B,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwPtH"}
@@ -0,0 +1,352 @@
1
+ import http from 'node:http';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { createPythonExecutorPool } from './executor-pool.js';
4
+ import { PythonFailure, isPythonFailureCategory } from './diagnostics.js';
5
+ import { encodePythonReply } from './reply.js';
6
+ import { isErrnoCode } from '../../contracts/errors.js';
7
+ export { runDockerPythonExecutor } from './docker-runner.js';
8
+ class DockerControlFailure extends Error {
9
+ status;
10
+ constructor(status) {
11
+ super('Container control request failed');
12
+ this.status = status;
13
+ }
14
+ }
15
+ function boundedInteger(value, minimum, maximum) {
16
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
17
+ throw new RangeError('Invalid Python container resource limit');
18
+ return value;
19
+ }
20
+ export async function createDockerPythonExecutorPool(options) {
21
+ if (typeof options?.socketPath !== 'string' || !options.socketPath.startsWith('/') || options.socketPath.includes('\0'))
22
+ throw new TypeError('An explicit Docker Unix socket is required');
23
+ if (typeof options.image !== 'string' || !options.image.startsWith('sha256:') || options.image.length !== 71
24
+ || [...options.image.slice(7)].some(character => !'0123456789abcdef'.includes(character)))
25
+ throw new TypeError('An immutable Docker image ID is required');
26
+ const configuration = Object.freeze({
27
+ socketPath: options.socketPath, image: options.image,
28
+ memoryBytes: boundedInteger(options.memoryBytes, 67108864, Number.MAX_SAFE_INTEGER),
29
+ cpus: options.cpus,
30
+ deadlineMs: boundedInteger(options.deadlineMs, 1, 86400000),
31
+ maxConcurrentExecutors: boundedInteger(options.maxConcurrentExecutors, 1, Number.MAX_SAFE_INTEGER),
32
+ temporaryBytes: boundedInteger(options.temporaryBytes ?? 16777216, 1, Number.MAX_SAFE_INTEGER),
33
+ controlTimeoutMs: boundedInteger(options.controlTimeoutMs ?? 10000, 1, 300000),
34
+ maxFrameBytes: boundedInteger(options.maxFrameBytes ?? 8388608, 65536, 16777216),
35
+ });
36
+ if (!Number.isFinite(configuration.cpus) || configuration.cpus < 0.01 || configuration.cpus > 64)
37
+ throw new RangeError('Invalid Python container CPU quota');
38
+ const request = (method, path, body) => new Promise((resolve, reject) => {
39
+ const payload = body === undefined ? undefined : JSON.stringify(body);
40
+ const control = http.request({ socketPath: configuration.socketPath, method, path: '/v1.45' + path,
41
+ headers: payload === undefined ? {} : { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
42
+ }, response => {
43
+ const chunks = [];
44
+ let size = 0;
45
+ response.on('data', chunk => {
46
+ size += chunk.length;
47
+ if (size > 1048576) {
48
+ control.destroy(new DockerControlFailure());
49
+ return;
50
+ }
51
+ chunks.push(Buffer.from(chunk));
52
+ });
53
+ response.once('error', () => reject(new DockerControlFailure()));
54
+ response.once('aborted', () => reject(new DockerControlFailure()));
55
+ response.once('end', () => {
56
+ const status = response.statusCode ?? 0;
57
+ try {
58
+ const value = size ? JSON.parse(Buffer.concat(chunks).toString('utf8')) : undefined;
59
+ resolve({ status, value });
60
+ }
61
+ catch {
62
+ reject(new DockerControlFailure(status));
63
+ }
64
+ });
65
+ });
66
+ control.once('error', () => reject(new DockerControlFailure()));
67
+ control.setTimeout(configuration.controlTimeoutMs, () => control.destroy(new DockerControlFailure()));
68
+ control.end(payload);
69
+ });
70
+ try {
71
+ const information = await request('GET', '/info');
72
+ if (information.status !== 200 || information.value?.OSType !== 'linux'
73
+ || !['MemoryLimit', 'SwapLimit', 'CpuCfsQuota', 'PidsLimit'].every(key => information.value[key] === true)
74
+ || !Array.isArray(information.value.SecurityOptions)
75
+ || !information.value.SecurityOptions.includes('name=seccomp,profile=builtin'))
76
+ throw new PythonFailure('isolation-unavailable');
77
+ const image = await request('GET', '/images/' + encodeURIComponent(configuration.image) + '/json');
78
+ if (image.status !== 200 || image.value?.Id !== configuration.image
79
+ || image.value.Config?.Labels?.['org.poe-platform.python-executor'] !== '1'
80
+ || Object.keys(image.value.Config?.Volumes ?? {}).length)
81
+ throw new PythonFailure('isolation-unavailable');
82
+ }
83
+ catch {
84
+ throw new PythonFailure('isolation-unavailable');
85
+ }
86
+ return createPythonExecutorPool({ maxConcurrentExecutors: configuration.maxConcurrentExecutors, createExecutor() {
87
+ const name = 'poe-python-' + randomUUID();
88
+ let container;
89
+ let creationUnconfirmed = false;
90
+ let initialization;
91
+ let retirement;
92
+ let socket;
93
+ let timer;
94
+ let start;
95
+ let settled = false;
96
+ let retired = false;
97
+ let requesting = false;
98
+ let ready = false;
99
+ let admitted = false;
100
+ let requestId = 0;
101
+ const pending = new Set();
102
+ let resolveRun;
103
+ let rejectRun;
104
+ const fail = (reason) => { if (!settled) {
105
+ settled = true;
106
+ rejectRun?.(reason);
107
+ } };
108
+ const aborted = () => fail(start.signal.reason);
109
+ const send = (message, startup = false) => new Promise((resolve, reject) => {
110
+ if (retired || settled || !socket || socket.destroyed) {
111
+ reject(new PythonFailure('transport-unavailable'));
112
+ return;
113
+ }
114
+ let bytes;
115
+ try {
116
+ bytes = encodePythonReply(message, configuration.maxFrameBytes);
117
+ }
118
+ catch {
119
+ reject(new PythonFailure('transport-unavailable'));
120
+ return;
121
+ }
122
+ if (startup)
123
+ admitted = true;
124
+ try {
125
+ socket.write(Buffer.concat([bytes, Buffer.from('\n')]), error => {
126
+ if (error || retired || settled) {
127
+ admitted = false;
128
+ const failure = new PythonFailure('transport-unavailable');
129
+ fail(failure);
130
+ reject(failure);
131
+ return;
132
+ }
133
+ resolve();
134
+ });
135
+ }
136
+ catch {
137
+ admitted = false;
138
+ const failure = new PythonFailure('transport-unavailable');
139
+ fail(failure);
140
+ reject(failure);
141
+ }
142
+ });
143
+ const message = (frame) => {
144
+ if (retired || settled)
145
+ return;
146
+ if (!admitted) {
147
+ fail(new PythonFailure('transport-unavailable'));
148
+ return;
149
+ }
150
+ if (!frame || typeof frame !== 'object') {
151
+ fail(new PythonFailure('transport-unavailable'));
152
+ return;
153
+ }
154
+ if (frame.type === 'ready' && !ready) {
155
+ ready = true;
156
+ try {
157
+ start.onReady();
158
+ }
159
+ catch (error) {
160
+ fail(error);
161
+ }
162
+ return;
163
+ }
164
+ if (frame.type === 'exit' && !requesting) {
165
+ if (!Number.isInteger(frame.exitCode) || frame.exitCode < 0 || frame.exitCode > 255) {
166
+ fail(new PythonFailure('transport-unavailable'));
167
+ return;
168
+ }
169
+ settled = true;
170
+ resolveRun(frame.exitCode);
171
+ return;
172
+ }
173
+ if (frame.type === 'error' && isPythonFailureCategory(frame.category)) {
174
+ fail(new PythonFailure(frame.category));
175
+ return;
176
+ }
177
+ if (frame.type !== 'request' || requesting || !Number.isSafeInteger(frame.id) || frame.id !== requestId + 1
178
+ || typeof frame.op !== 'string' || !Array.isArray(frame.args)) {
179
+ fail(new PythonFailure('transport-unavailable'));
180
+ return;
181
+ }
182
+ requestId = frame.id;
183
+ requesting = true;
184
+ const work = Promise.resolve().then(() => {
185
+ if (!admitted || retired || settled)
186
+ throw new PythonFailure('transport-unavailable');
187
+ start.signal.throwIfAborted();
188
+ return start.dispatch({ op: frame.op, args: frame.args });
189
+ }).then(value => send({ id: frame.id, status: 1, value }), error => {
190
+ let code;
191
+ try {
192
+ code = error?.code;
193
+ }
194
+ catch { }
195
+ return send({ id: frame.id, status: 2, value: {
196
+ code: isErrnoCode(code) || code === 'EPACKAGE' ? code : 'EIO',
197
+ ...(code === 'EPACKAGE' ? { message: new PythonFailure('runtime-assets').message } : {}),
198
+ } });
199
+ }).then(() => { requesting = false; }, error => { requesting = false; fail(error); });
200
+ pending.add(work);
201
+ void work.then(() => pending.delete(work));
202
+ };
203
+ const attach = () => new Promise((resolve, reject) => {
204
+ const control = http.request({ socketPath: configuration.socketPath, method: 'POST',
205
+ path: '/v1.45/containers/' + encodeURIComponent(container) + '/attach?stream=1&stdin=1&stdout=1&stderr=1',
206
+ headers: { Connection: 'Upgrade', Upgrade: 'tcp' }, });
207
+ control.once('error', () => reject(new PythonFailure('transport-unavailable')));
208
+ control.setTimeout(configuration.controlTimeoutMs, () => control.destroy(new DockerControlFailure()));
209
+ control.once('response', response => { response.resume(); reject(new PythonFailure('transport-unavailable')); });
210
+ control.once('upgrade', (_response, stream, head) => {
211
+ socket = stream;
212
+ stream.setTimeout?.(0);
213
+ let buffered = Buffer.alloc(0);
214
+ let line = Buffer.alloc(0);
215
+ let stderrBytes = 0;
216
+ const receive = (chunk) => {
217
+ if (retired || settled)
218
+ return;
219
+ if (buffered.length + chunk.length > configuration.maxFrameBytes + 65544) {
220
+ fail(new PythonFailure('transport-unavailable'));
221
+ return;
222
+ }
223
+ buffered = Buffer.concat([buffered, chunk]);
224
+ while (buffered.length >= 8 && !settled && !retired) {
225
+ const length = buffered.readUInt32BE(4);
226
+ if (length > configuration.maxFrameBytes || ![1, 2].includes(buffered[0]) || buffered[1] || buffered[2] || buffered[3]) {
227
+ fail(new PythonFailure('transport-unavailable'));
228
+ return;
229
+ }
230
+ if (buffered.length < 8 + length)
231
+ return;
232
+ const output = buffered.subarray(8, 8 + length);
233
+ if (buffered[0] === 2) {
234
+ stderrBytes += length;
235
+ if (stderrBytes > configuration.maxFrameBytes) {
236
+ fail(new PythonFailure('transport-unavailable'));
237
+ return;
238
+ }
239
+ }
240
+ else {
241
+ if (line.length + output.length > configuration.maxFrameBytes) {
242
+ fail(new PythonFailure('transport-unavailable'));
243
+ return;
244
+ }
245
+ line = Buffer.concat([line, output]);
246
+ let end;
247
+ while ((end = line.indexOf(10)) >= 0 && !settled && !retired) {
248
+ try {
249
+ message(JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(line.subarray(0, end))));
250
+ }
251
+ catch {
252
+ fail(new PythonFailure('transport-unavailable'));
253
+ }
254
+ line = Buffer.from(line.subarray(end + 1));
255
+ }
256
+ }
257
+ buffered = Buffer.from(buffered.subarray(8 + length));
258
+ }
259
+ };
260
+ stream.on('data', receive);
261
+ stream.once('error', () => fail(new PythonFailure('transport-unavailable')));
262
+ stream.once('end', () => fail(new PythonFailure(ready ? 'runtime' : 'startup')));
263
+ stream.once('close', () => fail(new PythonFailure(ready ? 'runtime' : 'startup')));
264
+ if (head.length)
265
+ receive(head);
266
+ resolve();
267
+ });
268
+ control.end();
269
+ });
270
+ return {
271
+ run(invocation) {
272
+ if (start || retired)
273
+ return Promise.reject(new PythonFailure('executor-unavailable'));
274
+ start = invocation;
275
+ const running = new Promise((resolve, reject) => { resolveRun = resolve; rejectRun = reject; });
276
+ start.signal.addEventListener('abort', aborted, { once: true });
277
+ timer = setTimeout(() => fail(new PythonFailure('deadline')), configuration.deadlineMs);
278
+ initialization = (async () => {
279
+ start.signal.throwIfAborted();
280
+ if (retired || settled)
281
+ return;
282
+ let creation;
283
+ try {
284
+ creation = await request('POST', '/containers/create?name=' + encodeURIComponent(name), {
285
+ Image: configuration.image, User: '65534:65534', Env: [], WorkingDir: '/runtime',
286
+ Entrypoint: ['/usr/local/bin/node'], Cmd: ['/runtime/python-executor.mjs'],
287
+ AttachStdin: true, AttachStdout: true, AttachStderr: true, OpenStdin: true, StdinOnce: true, Tty: false,
288
+ HostConfig: { NetworkMode: 'none', ReadonlyRootfs: true, CapDrop: ['ALL'], SecurityOpt: ['no-new-privileges'],
289
+ Memory: configuration.memoryBytes, MemorySwap: configuration.memoryBytes,
290
+ NanoCpus: Math.round(configuration.cpus * 1e9), PidsLimit: 64,
291
+ Tmpfs: { '/tmp': 'rw,noexec,nosuid,nodev,mode=1777,size=' + configuration.temporaryBytes }, LogConfig: { Type: 'none' },
292
+ },
293
+ });
294
+ }
295
+ catch {
296
+ creationUnconfirmed = true;
297
+ throw new PythonFailure('startup');
298
+ }
299
+ if (creation.status !== 201 || typeof creation.value?.Id !== 'string' || !creation.value.Id) {
300
+ creationUnconfirmed = creation.status < 400 || creation.status >= 500;
301
+ throw new PythonFailure('startup');
302
+ }
303
+ container = creation.value.Id;
304
+ if (retired || settled)
305
+ return;
306
+ await attach();
307
+ if (retired || settled)
308
+ return;
309
+ const started = await request('POST', '/containers/' + encodeURIComponent(container) + '/start');
310
+ if (started.status !== 204 && started.status !== 304)
311
+ throw new PythonFailure('startup');
312
+ if (retired || settled)
313
+ return;
314
+ await send({ type: 'start', invocation: start.invocation, runtimeMount: start.runtimeMount,
315
+ maxTransferBytes: start.maxTransferBytes, maxFrameBytes: configuration.maxFrameBytes,
316
+ ...(start.packages ? { packages: start.packages } : {}), installOnly: !!start.installOnly,
317
+ }, true);
318
+ })().catch(error => fail(error instanceof PythonFailure || start.signal.aborted ? error : new PythonFailure('startup')));
319
+ return running;
320
+ },
321
+ terminate() {
322
+ retired = true;
323
+ if (timer)
324
+ clearTimeout(timer);
325
+ start?.signal.removeEventListener('abort', aborted);
326
+ if (start && !settled)
327
+ fail(new PythonFailure('runtime'));
328
+ retirement ??= (async () => {
329
+ socket?.destroy();
330
+ await initialization;
331
+ socket?.destroy();
332
+ let failure;
333
+ if (container || creationUnconfirmed) {
334
+ try {
335
+ const removed = await request('DELETE', '/containers/' + encodeURIComponent(container ?? name) + '?force=1&v=1');
336
+ if (![204, 404].includes(removed.status) || creationUnconfirmed)
337
+ throw new PythonFailure('cleanup');
338
+ }
339
+ catch {
340
+ failure = new PythonFailure('cleanup');
341
+ }
342
+ }
343
+ await Promise.allSettled([...pending]);
344
+ if (failure)
345
+ throw failure;
346
+ })();
347
+ return retirement;
348
+ },
349
+ };
350
+ } });
351
+ }
352
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/commands/python/docker.ts"],"names":[],"mappings":"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"}
@@ -7,12 +7,12 @@ import {
7
7
  createPythonPackageManifestStore,
8
8
  pythonCommands,
9
9
  pythonDocumentPackages
10
- } from "../../chunks/chunk-6VT3VSBX.js";
10
+ } from "../../chunks/chunk-NLTXADDK.js";
11
11
  import "../../chunks/chunk-2E4KBFO6.js";
12
12
  import {
13
13
  PythonFailure,
14
14
  inspectPythonCapabilities
15
- } from "../../chunks/chunk-AJ355TRJ.js";
15
+ } from "../../chunks/chunk-YNJE6FJI.js";
16
16
  import "../../chunks/chunk-CDBQXRWL.js";
17
17
  import "../../chunks/chunk-THXJ6CLF.js";
18
18
  import "../../chunks/chunk-CHHAB5SS.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PythonFailure,
3
3
  parsePythonInvocation
4
- } from "../../chunks/chunk-AJ355TRJ.js";
4
+ } from "../../chunks/chunk-YNJE6FJI.js";
5
5
  import {
6
6
  init_platform
7
7
  } from "../../chunks/chunk-O2EVBRKF.js";
@@ -111,7 +111,7 @@ import {
111
111
  sha256,
112
112
  sha384,
113
113
  sha512
114
- } from "./chunks/chunk-6VT3VSBX.js";
114
+ } from "./chunks/chunk-NLTXADDK.js";
115
115
  import {
116
116
  bindFileOutputBudget,
117
117
  openCommandFile
@@ -119,7 +119,7 @@ import {
119
119
  import {
120
120
  PythonFailure,
121
121
  inspectPythonCapabilities
122
- } from "./chunks/chunk-AJ355TRJ.js";
122
+ } from "./chunks/chunk-YNJE6FJI.js";
123
123
  import {
124
124
  createLlmCommands,
125
125
  llmCommands
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poe-platform/safe-bash",
3
- "version": "0.1.665",
3
+ "version": "0.1.667",
4
4
  "description": "Extensible virtual shell with pluggable filesystems and streaming commands",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -284,6 +284,11 @@
284
284
  "browser": null,
285
285
  "import": "./dist/safe-bash/commands/python/node.js"
286
286
  },
287
+ "./commands/python/docker": {
288
+ "types": "./dist/safe-bash/commands/python/docker.d.ts",
289
+ "browser": null,
290
+ "import": "./dist/safe-bash/commands/python/docker.js"
291
+ },
287
292
  "./commands/pandoc": {
288
293
  "types": "./dist/safe-bash/commands/pandoc/index.d.ts",
289
294
  "import": "./dist/safe-bash/commands/pandoc/index.js"
@@ -360,7 +365,7 @@
360
365
  "access": "public"
361
366
  },
362
367
  "dependencies": {
363
- "@poe-platform/safe-fs": "0.1.665",
368
+ "@poe-platform/safe-fs": "0.1.667",
364
369
  "pako": "3.0.1",
365
370
  "@types/node": "^25.2.2",
366
371
  "@noble/hashes": "2.4.0",