@poe-platform/safe-bash 0.1.664 → 0.1.666
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.
- package/dist/safe-bash/chunks/{chunk-6VT3VSBX.js → chunk-NLTXADDK.js} +2 -2
- package/dist/safe-bash/chunks/{chunk-AJ355TRJ.js → chunk-YNJE6FJI.js} +3 -1
- package/dist/safe-bash/chunks/{chunk-AJ355TRJ.js.map → chunk-YNJE6FJI.js.map} +2 -2
- package/dist/safe-bash/commands/python/diagnostics.d.ts +2 -0
- package/dist/safe-bash/commands/python/diagnostics.d.ts.map +1 -1
- package/dist/safe-bash/commands/python/diagnostics.js +2 -0
- package/dist/safe-bash/commands/python/diagnostics.js.map +1 -1
- package/dist/safe-bash/commands/python/docker-runner.d.ts +7 -0
- package/dist/safe-bash/commands/python/docker-runner.d.ts.map +1 -0
- package/dist/safe-bash/commands/python/docker-runner.js +136 -0
- package/dist/safe-bash/commands/python/docker-runner.js.map +1 -0
- package/dist/safe-bash/commands/python/docker.d.ts +16 -0
- package/dist/safe-bash/commands/python/docker.d.ts.map +1 -0
- package/dist/safe-bash/commands/python/docker.js +352 -0
- package/dist/safe-bash/commands/python/docker.js.map +1 -0
- package/dist/safe-bash/commands/python/index.browser.js +2 -2
- package/dist/safe-bash/commands/python/worker.browser.js +1 -1
- package/dist/safe-bash/core.browser.js +2 -2
- package/package.json +7 -2
- /package/dist/safe-bash/chunks/{chunk-6VT3VSBX.js.map → chunk-NLTXADDK.js.map} +0 -0
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
isPythonFailureCategory,
|
|
8
8
|
parsePythonInvocation,
|
|
9
9
|
reportPythonFailure
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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
|
|
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":"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"}
|
|
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-
|
|
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-
|
|
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";
|
|
@@ -111,7 +111,7 @@ import {
|
|
|
111
111
|
sha256,
|
|
112
112
|
sha384,
|
|
113
113
|
sha512
|
|
114
|
-
} from "./chunks/chunk-
|
|
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-
|
|
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.
|
|
3
|
+
"version": "0.1.666",
|
|
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.
|
|
368
|
+
"@poe-platform/safe-fs": "0.1.666",
|
|
364
369
|
"pako": "3.0.1",
|
|
365
370
|
"@types/node": "^25.2.2",
|
|
366
371
|
"@noble/hashes": "2.4.0",
|
|
File without changes
|