@qvac/harness 0.4.0 → 0.5.0
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/CHANGELOG.md +689 -141
- package/README.md +29 -7
- package/dist/harness.bundle +71 -50
- package/dist-lib/index.d.ts +36 -39
- package/dist-lib/index.js +279 -114
- package/dist-lib/lib/audio-transcode-bare.d.ts +2 -2
- package/dist-lib/lib/audio-transcode-bare.js +28 -18
- package/dist-lib/lib/audio-transcode-node.d.ts +2 -2
- package/dist-lib/lib/capabilities/audio-resample.d.ts +7 -6
- package/dist-lib/lib/capabilities/audio-resample.js +30 -18
- package/dist-lib/lib/capabilities/completion.d.ts +20 -19
- package/dist-lib/lib/capabilities/completion.js +193 -132
- package/dist-lib/lib/capabilities/download.d.ts +6 -6
- package/dist-lib/lib/capabilities/download.js +15 -8
- package/dist-lib/lib/capabilities/embed.js +2 -1
- package/dist-lib/lib/capabilities/enhance.d.ts +6 -1
- package/dist-lib/lib/capabilities/enhance.js +7 -4
- package/dist-lib/lib/capabilities/invoke.js +7 -4
- package/dist-lib/lib/capabilities/kv-cache.js +2 -1
- package/dist-lib/lib/capabilities/preview-model-source.d.ts +9 -7
- package/dist-lib/lib/capabilities/preview-model-source.js +80 -28
- package/dist-lib/lib/capabilities/speech-text.js +5 -4
- package/dist-lib/lib/capabilities/tool-selection.js +10 -9
- package/dist-lib/lib/capabilities/tool-turns.js +30 -16
- package/dist-lib/lib/capabilities/usage-breakdown.js +2 -1
- package/dist-lib/lib/capabilities/voice.d.ts +5 -1
- package/dist-lib/lib/capabilities/voice.js +22 -12
- package/dist-lib/lib/connect.d.ts +11 -32
- package/dist-lib/lib/connect.js +152 -112
- package/dist-lib/lib/context-window.js +25 -21
- package/dist-lib/lib/contract-types.d.ts +22 -15
- package/dist-lib/lib/diagram-repair.d.ts +4 -4
- package/dist-lib/lib/diagram-repair.js +6 -3
- package/dist-lib/lib/docx/index.d.ts +3 -2
- package/dist-lib/lib/{error-fields.d.ts → guards.d.ts} +1 -0
- package/dist-lib/lib/{error-fields.js → guards.js} +3 -0
- package/dist-lib/lib/hardware/capability-probe.js +20 -10
- package/dist-lib/lib/hardware/gpu-classify.js +6 -3
- package/dist-lib/lib/hardware/gpu-probe-addon.js +8 -4
- package/dist-lib/lib/hardware/gpu-probe.js +4 -2
- package/dist-lib/lib/hardware/gpu-stats.native.cjs +8 -9
- package/dist-lib/lib/hardware/parsers.js +8 -4
- package/dist-lib/lib/helpers/buffer-burst.js +4 -2
- package/dist-lib/lib/helpers/control-tokens.js +4 -2
- package/dist-lib/lib/helpers/join-guard.d.ts +2 -2
- package/dist-lib/lib/helpers/join-guard.js +4 -2
- package/dist-lib/lib/helpers/load-stall.js +4 -2
- package/dist-lib/lib/helpers/markup-stream-filter.d.ts +2 -2
- package/dist-lib/lib/helpers/markup-stream-filter.js +6 -3
- package/dist-lib/lib/helpers/race-abort.js +2 -1
- package/dist-lib/lib/helpers/race-timeout.d.ts +5 -0
- package/dist-lib/lib/helpers/race-timeout.js +14 -0
- package/dist-lib/lib/helpers/run-outcome.d.ts +6 -8
- package/dist-lib/lib/helpers/run-outcome.js +36 -20
- package/dist-lib/lib/helpers/spawn-path.js +6 -3
- package/dist-lib/lib/helpers/text-coalescer.js +6 -3
- package/dist-lib/lib/helpers/thinking.js +38 -45
- package/dist-lib/lib/helpers/tool-call-markup.d.ts +9 -7
- package/dist-lib/lib/helpers/tool-call-markup.js +36 -20
- package/dist-lib/lib/helpers/tool-intent.d.ts +3 -2
- package/dist-lib/lib/helpers/tool-intent.js +4 -2
- package/dist-lib/lib/helpers/tool-label.js +18 -9
- package/dist-lib/lib/hooks/built-in/arg-repair.js +23 -13
- package/dist-lib/lib/hooks/built-in/egress.js +2 -1
- package/dist-lib/lib/hooks/built-in/skill-catalog.js +2 -1
- package/dist-lib/lib/hooks/pipeline.d.ts +5 -4
- package/dist-lib/lib/hooks/pipeline.js +6 -3
- package/dist-lib/lib/hooks/run.js +12 -8
- package/dist-lib/lib/model-download-progress.js +10 -8
- package/dist-lib/lib/models/context.d.ts +1 -1
- package/dist-lib/lib/models/context.js +5 -1
- package/dist-lib/lib/models/custom-model-cache.d.ts +10 -1
- package/dist-lib/lib/models/custom-model-cache.js +43 -15
- package/dist-lib/lib/models/gguf-header.d.ts +3 -2
- package/dist-lib/lib/models/gguf-header.js +44 -22
- package/dist-lib/lib/models/idle-unload.d.ts +14 -0
- package/dist-lib/lib/models/idle-unload.js +51 -0
- package/dist-lib/lib/models/kv-cache.d.ts +3 -2
- package/dist-lib/lib/models/kv-cache.js +4 -3
- package/dist-lib/lib/models/llm-presets.d.ts +2 -2
- package/dist-lib/lib/models/llm-presets.js +4 -2
- package/dist-lib/lib/models/model-catalog-constants.js +3 -2
- package/dist-lib/lib/models/model-catalog.d.ts +13 -20
- package/dist-lib/lib/models/model-catalog.js +59 -31
- package/dist-lib/lib/models/model-delete.js +18 -8
- package/dist-lib/lib/models/model-handle.js +2 -1
- package/dist-lib/lib/models/model-list.d.ts +8 -3
- package/dist-lib/lib/models/model-list.js +11 -6
- package/dist-lib/lib/models/model-pool.d.ts +44 -10
- package/dist-lib/lib/models/model-pool.js +47 -42
- package/dist-lib/lib/models/model-source.js +10 -5
- package/dist-lib/lib/models/music-catalog.d.ts +2 -2
- package/dist-lib/lib/models/nmt-catalog.d.ts +4 -3
- package/dist-lib/lib/models/nmt-catalog.js +10 -5
- package/dist-lib/lib/models/opencl-cache.d.ts +6 -1
- package/dist-lib/lib/models/opencl-cache.js +5 -3
- package/dist-lib/lib/models/sdk-faults.d.ts +11 -8
- package/dist-lib/lib/models/sdk-faults.js +9 -6
- package/dist-lib/lib/models/shards.d.ts +11 -0
- package/dist-lib/lib/models/shards.js +15 -0
- package/dist-lib/lib/models/tool-dialect.js +10 -5
- package/dist-lib/lib/no-redirect-fetch-bare.d.ts +3 -3
- package/dist-lib/lib/no-redirect-fetch-bare.js +1 -1
- package/dist-lib/lib/no-redirect-fetch-impl.js +6 -3
- package/dist-lib/lib/no-redirect-fetch-node.d.ts +1 -1
- package/dist-lib/lib/no-redirect-fetch-node.js +9 -9
- package/dist-lib/lib/office/index.d.ts +3 -2
- package/dist-lib/lib/office/python.d.ts +3 -2
- package/dist-lib/lib/office/python.js +2 -1
- package/dist-lib/lib/prompt.d.ts +5 -4
- package/dist-lib/lib/prompt.js +8 -4
- package/dist-lib/lib/queue.js +10 -5
- package/dist-lib/lib/resolution-detector.js +21 -11
- package/dist-lib/lib/rpc-session.js +2 -1
- package/dist-lib/lib/sdk-loader.js +2 -1
- package/dist-lib/lib/sdk-storage.js +4 -2
- package/dist-lib/lib/serve.js +110 -66
- package/dist-lib/lib/spawn.js +7 -4
- package/dist-lib/lib/tmp-path.d.ts +7 -6
- package/dist-lib/lib/tool-call-display.d.ts +2 -2
- package/dist-lib/lib/tools/create-documents.js +18 -10
- package/dist-lib/lib/tools/edit-documents.js +23 -13
- package/dist-lib/lib/tools/edit-image.d.ts +2 -2
- package/dist-lib/lib/tools/edit-image.js +60 -36
- package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +10 -10
- package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +17 -11
- package/dist-lib/lib/tools/exec/adapters/python/attachments.js +53 -40
- package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +60 -32
- package/dist-lib/lib/tools/exec/adapters/python/guarded-fetch.d.ts +33 -22
- package/dist-lib/lib/tools/exec/adapters/python/guarded-fetch.js +58 -29
- package/dist-lib/lib/tools/exec/adapters/python/interrupt-timer.d.ts +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/loader.js +23 -12
- package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +13 -11
- package/dist-lib/lib/tools/exec/adapters/python/memfs.js +10 -5
- package/dist-lib/lib/tools/exec/adapters/python/net-shim.js +3 -1
- package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +6 -4
- package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +20 -10
- package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +14 -7
- package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +41 -34
- package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +316 -166
- package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +9 -8
- package/dist-lib/lib/tools/exec/adapters/python/run-session.js +56 -28
- package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +8 -10
- package/dist-lib/lib/tools/exec/adapters/python/wheels.js +22 -11
- package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +3 -2
- package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +41 -26
- package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +27 -18
- package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +14 -13
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +4 -4
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +10 -5
- package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +4 -4
- package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +2 -1
- package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +6 -1
- package/dist-lib/lib/tools/exec/obsidian/cli-process.js +8 -5
- package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +6 -6
- package/dist-lib/lib/tools/exec/obsidian/cli.js +4 -4
- package/dist-lib/lib/tools/exec/obsidian/command.d.ts +3 -2
- package/dist-lib/lib/tools/exec/obsidian/command.js +6 -3
- package/dist-lib/lib/tools/exec/obsidian/output.js +2 -1
- package/dist-lib/lib/tools/exec/obsidian/route.d.ts +4 -6
- package/dist-lib/lib/tools/exec/obsidian/route.js +17 -11
- package/dist-lib/lib/tools/exec/obsidian/safe-path.js +2 -1
- package/dist-lib/lib/tools/exec/obsidian/vault-create.js +15 -7
- package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +2 -2
- package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +20 -10
- package/dist-lib/lib/tools/exec/obsidian/vault-read.js +20 -13
- package/dist-lib/lib/tools/exec/obsidian/vault-write.js +24 -12
- package/dist-lib/lib/tools/exec/runner.d.ts +14 -14
- package/dist-lib/lib/tools/exec/runner.js +5 -3
- package/dist-lib/lib/tools/exec/scope.js +52 -28
- package/dist-lib/lib/tools/exec/shell-argv.js +31 -18
- package/dist-lib/lib/tools/exec/shell-guidance.d.ts +6 -1
- package/dist-lib/lib/tools/exec/shell-guidance.js +35 -20
- package/dist-lib/lib/tools/exec/video-tools.js +2 -2
- package/dist-lib/lib/tools/exec.d.ts +6 -8
- package/dist-lib/lib/tools/exec.js +113 -54
- package/dist-lib/lib/tools/file-glob.d.ts +4 -5
- package/dist-lib/lib/tools/file-glob.js +16 -11
- package/dist-lib/lib/tools/fs/glob.js +13 -18
- package/dist-lib/lib/tools/fs/remote-protocol.d.ts +10 -10
- package/dist-lib/lib/tools/fs/remote.d.ts +3 -2
- package/dist-lib/lib/tools/fs/remote.js +13 -7
- package/dist-lib/lib/tools/fs/scope.d.ts +8 -3
- package/dist-lib/lib/tools/fs/scope.js +20 -12
- package/dist-lib/lib/tools/fs/walk.js +6 -3
- package/dist-lib/lib/tools/fs/write.d.ts +3 -2
- package/dist-lib/lib/tools/generate-image.d.ts +11 -9
- package/dist-lib/lib/tools/generate-image.js +73 -37
- package/dist-lib/lib/tools/generate-music.d.ts +22 -11
- package/dist-lib/lib/tools/generate-music.js +79 -48
- package/dist-lib/lib/tools/grep.js +66 -41
- package/dist-lib/lib/tools/http-request/encode-fields.js +18 -9
- package/dist-lib/lib/tools/http-request/{utils.js → request.js} +20 -11
- package/dist-lib/lib/tools/http-request/truncate-response.js +57 -46
- package/dist-lib/lib/tools/http-request.d.ts +1 -1
- package/dist-lib/lib/tools/http-request.js +33 -18
- package/dist-lib/lib/tools/mcp/protocol.d.ts +53 -0
- package/dist-lib/lib/tools/mcp/{utils.js → protocol.js} +45 -23
- package/dist-lib/lib/tools/mcp-call.d.ts +1 -1
- package/dist-lib/lib/tools/mcp-call.js +37 -16
- package/dist-lib/lib/tools/operations/builders.js +10 -6
- package/dist-lib/lib/tools/operations/compile.js +20 -10
- package/dist-lib/lib/tools/operations/decoders.js +12 -6
- package/dist-lib/lib/tools/operations/gmail-message.js +3 -2
- package/dist-lib/lib/tools/outbound-guard.d.ts +4 -3
- package/dist-lib/lib/tools/outbound-guard.js +14 -8
- package/dist-lib/lib/tools/private-ip.js +8 -7
- package/dist-lib/lib/tools/rag-search.js +14 -7
- package/dist-lib/lib/tools/read-files.js +23 -20
- package/dist-lib/lib/tools/skill.js +19 -10
- package/dist-lib/lib/tools/skills/auth-resolver.d.ts +11 -18
- package/dist-lib/lib/tools/skills/auth-resolver.js +30 -18
- package/dist-lib/lib/tools/skills/bin-check.d.ts +3 -2
- package/dist-lib/lib/tools/skills/bin-check.js +10 -3
- package/dist-lib/lib/tools/skills/bundled-dir.js +20 -10
- package/dist-lib/lib/tools/skills/bundled-hash.d.ts +3 -2
- package/dist-lib/lib/tools/skills/bundled-hash.js +6 -1
- package/dist-lib/lib/tools/skills/catalog.d.ts +3 -2
- package/dist-lib/lib/tools/skills/catalog.js +33 -28
- package/dist-lib/lib/tools/skills/cli-argv.d.ts +3 -2
- package/dist-lib/lib/tools/skills/cli-argv.js +55 -52
- package/dist-lib/lib/tools/skills/cli-schema-check.js +21 -10
- package/dist-lib/lib/tools/skills/cli-schema-load.js +28 -20
- package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +6 -6
- package/dist-lib/lib/tools/skills/cli-schema.js +2 -1
- package/dist-lib/lib/tools/skills/credential-check.d.ts +6 -3
- package/dist-lib/lib/tools/skills/credential-check.js +24 -12
- package/dist-lib/lib/tools/skills/credential-grants.js +1 -6
- package/dist-lib/lib/tools/skills/credential-health.d.ts +5 -1
- package/dist-lib/lib/tools/skills/credential-health.js +5 -3
- package/dist-lib/lib/tools/skills/frontmatter-parser.js +10 -5
- package/dist-lib/lib/tools/skills/manifest-parse.js +84 -64
- package/dist-lib/lib/tools/skills/mention.js +7 -6
- package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +2 -2
- package/dist-lib/lib/tools/skills/obsidian-readiness.js +11 -3
- package/dist-lib/lib/tools/skills/overlay-crud.d.ts +6 -4
- package/dist-lib/lib/tools/skills/overlay-crud.js +12 -6
- package/dist-lib/lib/tools/skills/overlay-dir.js +4 -2
- package/dist-lib/lib/tools/skills/overlay-watch.d.ts +3 -2
- package/dist-lib/lib/tools/skills/overlay-watch.js +8 -4
- package/dist-lib/lib/tools/skills/setup-routes.js +1 -3
- package/dist-lib/lib/tools/skills/skill-settings.js +4 -1
- package/dist-lib/lib/tools/skills/skill-state.d.ts +6 -11
- package/dist-lib/lib/tools/skills/skill-state.js +48 -29
- package/dist-lib/lib/tools/skills/tool-grants.js +6 -3
- package/dist-lib/lib/tools/toolsets.js +2 -1
- package/dist-lib/lib/tools/translate.d.ts +4 -5
- package/dist-lib/lib/tools/translate.js +31 -14
- package/dist-lib/lib/tools/url-guard.js +2 -1
- package/dist-lib/lib/tools/weather-lookup/place.js +8 -4
- package/dist-lib/lib/tools/weather-lookup/report.d.ts +7 -1
- package/dist-lib/lib/tools/weather-lookup/report.js +46 -9
- package/dist-lib/lib/tools/weather-lookup.js +18 -12
- package/dist-lib/lib/tools/web-fetch.js +47 -24
- package/dist-lib/lib/tools/web-search.js +8 -3
- package/dist-lib/lib/validating-lookup.d.ts +4 -4
- package/dist-lib/lib/wav-encode.d.ts +1 -1
- package/dist-lib/lib/wav-encode.js +11 -10
- package/dist-lib/lib/web-fetch/embedded-state.js +24 -12
- package/dist-lib/lib/web-fetch/extract.js +4 -2
- package/dist-lib/lib/web-fetch/images.js +8 -4
- package/dist-lib/lib/web-fetch/video.d.ts +2 -2
- package/dist-lib/lib/web-fetch/video.js +8 -4
- package/dist-lib/lib/web-search/engine-registry.d.ts +2 -2
- package/dist-lib/lib/web-search/engines/aol.js +1 -1
- package/dist-lib/lib/web-search/engines/bing.js +1 -1
- package/dist-lib/lib/web-search/engines/brave.js +4 -1
- package/dist-lib/lib/web-search/engines/duckduckgo.js +3 -2
- package/dist-lib/lib/web-search/engines/google.js +7 -3
- package/dist-lib/lib/web-search/engines/wikipedia.js +5 -4
- package/dist-lib/lib/web-search/engines/yahoo.js +1 -1
- package/dist-lib/lib/web-search/fetch-html.d.ts +5 -4
- package/dist-lib/lib/web-search/fetch-html.js +13 -7
- package/dist-lib/lib/web-search/orchestrator.d.ts +9 -5
- package/dist-lib/lib/web-search/orchestrator.js +3 -3
- package/dist-lib/lib/wire.d.ts +3 -2
- package/dist-lib/lib/wire.js +23 -15
- package/dist-lib/schema/baseline.js +10 -5
- package/dist-lib/schema/build.js +2 -1
- package/dist-lib/schema/harness.d.ts +15 -2
- package/dist-lib/schema/harness.js +14 -2
- package/dist-lib/schema/release-tags.d.ts +3 -2
- package/dist-lib/schema/release-tags.js +6 -3
- package/dist-lib/spec/bind.js +3 -0
- package/dist-lib/spec/calls.js +1 -0
- package/dist-lib/spec/hrpc/hrpc.json +13 -0
- package/dist-lib/spec/hrpc/index.js +15 -3
- package/dist-lib/spec/hrpc/messages.js +39 -8
- package/dist-lib/spec/hyperschema/index.js +39 -8
- package/dist-lib/spec/hyperschema/schema.json +30 -1
- package/dist-lib/spec/hyperschema/types.d.ts +9 -1
- package/package.json +13 -14
- package/worker/harness-sidecar.mjs +15 -22
- package/worker/stow-entry.mjs +7 -4
- package/dist-lib/lib/tools/mcp/utils.d.ts +0 -47
- /package/dist-lib/lib/tools/http-request/{utils.d.ts → request.d.ts} +0 -0
|
@@ -15,12 +15,15 @@ class B4aTextDecoder {
|
|
|
15
15
|
encoding;
|
|
16
16
|
constructor(label = 'utf-8') {
|
|
17
17
|
const normalized = String(label).toLowerCase();
|
|
18
|
-
if (normalized.includes('16'))
|
|
18
|
+
if (normalized.includes('16')) {
|
|
19
19
|
this.encoding = 'utf16le';
|
|
20
|
-
|
|
20
|
+
}
|
|
21
|
+
else if (/latin1|iso-8859|ascii/.test(normalized)) {
|
|
21
22
|
this.encoding = 'latin1';
|
|
22
|
-
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
23
25
|
this.encoding = 'utf8';
|
|
26
|
+
}
|
|
24
27
|
}
|
|
25
28
|
decode(input) {
|
|
26
29
|
if (input === undefined)
|
|
@@ -39,13 +42,15 @@ class B4aTextEncoder {
|
|
|
39
42
|
export function nodeShapedProcess(base) {
|
|
40
43
|
return new Proxy(base, {
|
|
41
44
|
get(target, prop) {
|
|
42
|
-
if (prop === 'versions')
|
|
45
|
+
if (prop === 'versions') {
|
|
43
46
|
return { ...target.versions, node: '22.0.0' };
|
|
47
|
+
}
|
|
44
48
|
if (prop === 'binding') {
|
|
45
49
|
return (name) => (name === 'constants' ? { fs: fsConstants } : {});
|
|
46
50
|
}
|
|
47
|
-
if (prop === 'getuid')
|
|
51
|
+
if (prop === 'getuid') {
|
|
48
52
|
return () => 0;
|
|
53
|
+
}
|
|
49
54
|
return Reflect.get(target, prop);
|
|
50
55
|
}
|
|
51
56
|
});
|
|
@@ -64,12 +69,15 @@ async function shapeBareGlobals() {
|
|
|
64
69
|
g.AbortController = AbortController;
|
|
65
70
|
g.AbortSignal = AbortSignal;
|
|
66
71
|
}
|
|
67
|
-
if (!g.TextDecoder)
|
|
72
|
+
if (!g.TextDecoder) {
|
|
68
73
|
g.TextDecoder = B4aTextDecoder;
|
|
69
|
-
|
|
74
|
+
}
|
|
75
|
+
if (!g.TextEncoder) {
|
|
70
76
|
g.TextEncoder = B4aTextEncoder;
|
|
71
|
-
|
|
77
|
+
}
|
|
78
|
+
if (!g.process) {
|
|
72
79
|
g.process = nodeShapedProcess(process);
|
|
80
|
+
}
|
|
73
81
|
if (!g.performance) {
|
|
74
82
|
const origin = Date.now();
|
|
75
83
|
g.performance = { now: () => Date.now() - origin, timeOrigin: origin };
|
|
@@ -82,17 +90,20 @@ const silentStdio = {
|
|
|
82
90
|
};
|
|
83
91
|
export function pyodideLoadOptions() {
|
|
84
92
|
const cacheDir = process.env.QVAC_PYODIDE_CACHE_DIR;
|
|
85
|
-
if (!cacheDir)
|
|
93
|
+
if (!cacheDir) {
|
|
86
94
|
return { ...silentStdio };
|
|
95
|
+
}
|
|
87
96
|
return { ...silentStdio, packageCacheDir: cacheDir };
|
|
88
97
|
}
|
|
89
98
|
export const defaultLoad = async () => {
|
|
90
|
-
if (typeof globalThis.Bare !== 'undefined')
|
|
99
|
+
if (typeof globalThis.Bare !== 'undefined') {
|
|
91
100
|
await shapeBareGlobals();
|
|
101
|
+
}
|
|
92
102
|
const moduleName = 'pyodide';
|
|
93
|
-
const { loadPyodide } =
|
|
103
|
+
const { loadPyodide } = await import(__rewriteRelativeImportExtension(moduleName));
|
|
94
104
|
const options = pyodideLoadOptions();
|
|
95
|
-
if (options.packageCacheDir)
|
|
105
|
+
if (options.packageCacheDir) {
|
|
96
106
|
seedPackageCache(options.packageCacheDir);
|
|
107
|
+
}
|
|
97
108
|
return (await loadPyodide(options));
|
|
98
109
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
interface Fs {
|
|
2
2
|
mkdirTree(path: string): void;
|
|
3
3
|
chdir(path: string): void;
|
|
4
4
|
writeFile(path: string, data: Uint8Array): void;
|
|
@@ -20,28 +20,30 @@ type Fs = {
|
|
|
20
20
|
isLink(mode: number): boolean;
|
|
21
21
|
unlink(path: string): void;
|
|
22
22
|
rmdir(path: string): void;
|
|
23
|
-
}
|
|
24
|
-
|
|
23
|
+
}
|
|
24
|
+
interface CwdFs extends Fs {
|
|
25
|
+
cwd(): string;
|
|
26
|
+
}
|
|
27
|
+
export interface Scratch {
|
|
25
28
|
readonly dir: string;
|
|
26
29
|
readonly cwd: string;
|
|
27
30
|
[Symbol.dispose](): void;
|
|
28
|
-
}
|
|
29
|
-
|
|
31
|
+
}
|
|
32
|
+
interface InputFile {
|
|
30
33
|
readonly path: string;
|
|
31
34
|
readonly bytes: Uint8Array;
|
|
32
|
-
}
|
|
35
|
+
}
|
|
33
36
|
export declare function nextScratchDir(fs: Pick<Fs, 'analyzePath'>): string;
|
|
34
37
|
export declare function stageInputFiles(fs: Fs, dir: string, inputs: readonly InputFile[]): void;
|
|
35
|
-
export
|
|
38
|
+
export interface CollectedOutputs {
|
|
36
39
|
files: Map<string, Uint8Array>;
|
|
37
40
|
missing: string[];
|
|
38
41
|
rejected: {
|
|
39
42
|
name: string;
|
|
40
43
|
reason: string;
|
|
41
44
|
}[];
|
|
42
|
-
}
|
|
45
|
+
}
|
|
46
|
+
export declare function collectOutputs(fs: Fs, dir: string, names: readonly string[]): CollectedOutputs;
|
|
43
47
|
export declare function removeScratch(fs: Fs, dir: string, previousCwd: string): void;
|
|
44
|
-
export declare function openScratch(fs:
|
|
45
|
-
cwd(): string;
|
|
46
|
-
}, workdir?: string): Scratch;
|
|
48
|
+
export declare function openScratch(fs: CwdFs, workdir?: string): Scratch;
|
|
47
49
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorMessage } from '../../../../guards.js';
|
|
1
2
|
import { hlog } from '../../../../log.js';
|
|
2
3
|
import { MAX_OUTPUT_FILE_BYTES, MAX_OUTPUT_TOTAL_BYTES } from './output-policy.js';
|
|
3
4
|
let runCounter = 0;
|
|
@@ -6,14 +7,16 @@ function filePath(dir, name) {
|
|
|
6
7
|
}
|
|
7
8
|
export function nextScratchDir(fs) {
|
|
8
9
|
let candidate = `/tmp/qvac-exec-${++runCounter}`;
|
|
9
|
-
while (fs.analyzePath(candidate).exists)
|
|
10
|
+
while (fs.analyzePath(candidate).exists) {
|
|
10
11
|
candidate = `/tmp/qvac-exec-${++runCounter}`;
|
|
12
|
+
}
|
|
11
13
|
return candidate;
|
|
12
14
|
}
|
|
13
15
|
export function stageInputFiles(fs, dir, inputs) {
|
|
14
16
|
fs.mkdirTree(dir);
|
|
15
|
-
for (const input of inputs)
|
|
17
|
+
for (const input of inputs) {
|
|
16
18
|
fs.writeFile(filePath(dir, input.path), input.bytes);
|
|
19
|
+
}
|
|
17
20
|
}
|
|
18
21
|
function isRegularFile(fs, path) {
|
|
19
22
|
const mode = fs.lstat(path).mode;
|
|
@@ -51,10 +54,12 @@ function removeTree(fs, dir) {
|
|
|
51
54
|
continue;
|
|
52
55
|
const path = filePath(dir, name);
|
|
53
56
|
const mode = fs.lstat(path).mode;
|
|
54
|
-
if (fs.isDir(mode) && !fs.isLink(mode))
|
|
57
|
+
if (fs.isDir(mode) && !fs.isLink(mode)) {
|
|
55
58
|
removeTree(fs, path);
|
|
56
|
-
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
57
61
|
fs.unlink(path);
|
|
62
|
+
}
|
|
58
63
|
}
|
|
59
64
|
fs.rmdir(dir);
|
|
60
65
|
}
|
|
@@ -66,7 +71,7 @@ export function removeScratch(fs, dir, previousCwd) {
|
|
|
66
71
|
catch (error) {
|
|
67
72
|
hlog('python: scratch cleanup failed', {
|
|
68
73
|
dir,
|
|
69
|
-
err:
|
|
74
|
+
err: errorMessage(error)
|
|
70
75
|
});
|
|
71
76
|
}
|
|
72
77
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export function pythonReachesNetwork() {
|
|
2
|
+
const wasm = WebAssembly;
|
|
2
3
|
return (typeof globalThis.Bare !== 'undefined' &&
|
|
3
|
-
|
|
4
|
+
'Suspending' in wasm &&
|
|
5
|
+
typeof wasm.Suspending === 'function');
|
|
4
6
|
}
|
|
5
7
|
export const NET_SHIM = `
|
|
6
8
|
def _qvac_install_net():
|
|
@@ -6,8 +6,10 @@ export declare const MAX_INPUTS = 24;
|
|
|
6
6
|
export declare const MAX_INPUT_TOTAL_BYTES: number;
|
|
7
7
|
export declare function checkFileName(name: string): string | null;
|
|
8
8
|
export declare function checkOutputName(name: string): string | null;
|
|
9
|
-
export
|
|
10
|
-
mimeType: string;
|
|
11
|
-
} | {
|
|
9
|
+
export interface ExecError {
|
|
12
10
|
error: string;
|
|
13
|
-
}
|
|
11
|
+
}
|
|
12
|
+
export interface AcceptedOutput {
|
|
13
|
+
mimeType: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function checkOutputBytes(name: string, bytes: Uint8Array, runningTotal: number): AcceptedOutput | ExecError;
|
|
@@ -55,17 +55,21 @@ function hasExpectedSignature(extension, bytes) {
|
|
|
55
55
|
if (extension === 'mp4' || extension === 'm4a') {
|
|
56
56
|
return matches(bytes.slice(4), [0x66, 0x74, 0x79, 0x70]);
|
|
57
57
|
}
|
|
58
|
-
if (extension === 'webm')
|
|
58
|
+
if (extension === 'webm') {
|
|
59
59
|
return matches(bytes, [0x1a, 0x45, 0xdf, 0xa3]);
|
|
60
|
+
}
|
|
60
61
|
if (extension === 'mp3') {
|
|
61
62
|
return (matches(bytes, [0x49, 0x44, 0x33]) || (bytes[0] === 0xff && ((bytes[1] ?? 0) & 0xe0) === 0xe0));
|
|
62
63
|
}
|
|
63
|
-
if (extension === 'pdf')
|
|
64
|
+
if (extension === 'pdf') {
|
|
64
65
|
return matches(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d]);
|
|
65
|
-
|
|
66
|
+
}
|
|
67
|
+
if (extension === 'png') {
|
|
66
68
|
return matches(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
67
|
-
|
|
69
|
+
}
|
|
70
|
+
if (extension === 'jpeg' || extension === 'jpg') {
|
|
68
71
|
return matches(bytes, [0xff, 0xd8, 0xff]);
|
|
72
|
+
}
|
|
69
73
|
if (extension === 'gif') {
|
|
70
74
|
return (matches(bytes, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]) ||
|
|
71
75
|
matches(bytes, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]));
|
|
@@ -92,8 +96,9 @@ export function checkFileName(name) {
|
|
|
92
96
|
}
|
|
93
97
|
if (name.includes('..'))
|
|
94
98
|
return 'file name must not contain double dots';
|
|
95
|
-
if (name.startsWith('.'))
|
|
99
|
+
if (name.startsWith('.')) {
|
|
96
100
|
return 'file name must not start with a dot';
|
|
101
|
+
}
|
|
97
102
|
if (name.endsWith('.') || name.endsWith(' ')) {
|
|
98
103
|
return 'file name must not end with a dot or space';
|
|
99
104
|
}
|
|
@@ -101,15 +106,17 @@ export function checkFileName(name) {
|
|
|
101
106
|
if (segments.slice(1, -1).some((segment) => isKnownExtension(segment.toLowerCase()))) {
|
|
102
107
|
return 'file name must have at most one extension';
|
|
103
108
|
}
|
|
104
|
-
if (name.length > MAX_FILE_NAME_LENGTH)
|
|
109
|
+
if (name.length > MAX_FILE_NAME_LENGTH) {
|
|
105
110
|
return 'file name must be 255 characters or fewer';
|
|
111
|
+
}
|
|
106
112
|
return null;
|
|
107
113
|
}
|
|
108
114
|
const SUPERSEDED = { ppt: 'pptx', doc: 'docx', xls: 'xlsx' };
|
|
109
115
|
export function checkOutputName(name) {
|
|
110
116
|
const nameError = checkFileName(name);
|
|
111
|
-
if (nameError)
|
|
117
|
+
if (nameError) {
|
|
112
118
|
return nameError;
|
|
119
|
+
}
|
|
113
120
|
const extension = extensionOf(name);
|
|
114
121
|
const mimeType = MIME_TYPES[extension];
|
|
115
122
|
if (DENIED_EXTENSIONS.has(extension) || !mimeType) {
|
|
@@ -126,14 +133,17 @@ export function checkOutputName(name) {
|
|
|
126
133
|
}
|
|
127
134
|
export function checkOutputBytes(name, bytes, runningTotal) {
|
|
128
135
|
const nameError = checkOutputName(name);
|
|
129
|
-
if (nameError)
|
|
136
|
+
if (nameError) {
|
|
130
137
|
return { error: nameError };
|
|
138
|
+
}
|
|
131
139
|
const extension = extensionOf(name);
|
|
132
140
|
const mimeType = MIME_TYPES[extension];
|
|
133
|
-
if (!hasExpectedSignature(extension, bytes))
|
|
141
|
+
if (!hasExpectedSignature(extension, bytes)) {
|
|
134
142
|
return { error: 'file bytes do not match file type' };
|
|
135
|
-
|
|
143
|
+
}
|
|
144
|
+
if (bytes.length > MAX_OUTPUT_FILE_BYTES) {
|
|
136
145
|
return { error: 'file exceeds maximum output size' };
|
|
146
|
+
}
|
|
137
147
|
if (runningTotal + bytes.length > MAX_OUTPUT_TOTAL_BYTES) {
|
|
138
148
|
return { error: 'outputs exceed maximum total size' };
|
|
139
149
|
}
|
|
@@ -3,7 +3,7 @@ import { pyodideLoadOptions } from './loader.ts';
|
|
|
3
3
|
import { type LoadPyodideFn, type PyodideLike, type PythonRunResult } from './run-session.ts';
|
|
4
4
|
export { pyodideLoadOptions };
|
|
5
5
|
export type { LoadPyodideFn, PyodideLike, PythonRunResult };
|
|
6
|
-
export
|
|
6
|
+
export interface RunPythonOptions {
|
|
7
7
|
readonly timeoutMs?: number;
|
|
8
8
|
readonly maxOutputChars?: number;
|
|
9
9
|
readonly signal?: BareAbortSignal;
|
|
@@ -18,5 +18,5 @@ export type RunPythonOptions = {
|
|
|
18
18
|
readonly network?: boolean;
|
|
19
19
|
readonly hosts?: readonly string[];
|
|
20
20
|
readonly askConnect?: (host: string) => Promise<boolean>;
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
export declare function runPython(code: string, options?: RunPythonOptions): Promise<PythonRunResult>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AbortController } from 'bare-abort-controller';
|
|
2
2
|
import process from 'process';
|
|
3
3
|
import ScopeLock from 'scope-lock';
|
|
4
|
+
import { errorMessage } from '../../../../guards.js';
|
|
4
5
|
import { AbortedError, raceAbort } from '../../../../helpers/race-abort.js';
|
|
5
6
|
import { hlog } from '../../../../log.js';
|
|
6
7
|
import { MAX_OUTPUT_CHARS } from '../../runner.js';
|
|
@@ -24,7 +25,7 @@ function getPyodide(load) {
|
|
|
24
25
|
.catch((error) => {
|
|
25
26
|
cache.delete(load);
|
|
26
27
|
hlog('python: interpreter boot failed', {
|
|
27
|
-
err:
|
|
28
|
+
err: errorMessage(error)
|
|
28
29
|
});
|
|
29
30
|
throw error;
|
|
30
31
|
});
|
|
@@ -43,8 +44,9 @@ async function runInProcess(load, spec, options) {
|
|
|
43
44
|
await runLock.lock();
|
|
44
45
|
try {
|
|
45
46
|
const isCancelled = () => timedOut || options.signal?.aborted === true;
|
|
46
|
-
if (isCancelled())
|
|
47
|
+
if (isCancelled()) {
|
|
47
48
|
throw new AbortedError();
|
|
49
|
+
}
|
|
48
50
|
const py = await getPyodide(load);
|
|
49
51
|
const timer = startInterruptTimer(Math.max(0, deadline - Date.now()));
|
|
50
52
|
py.setInterruptBuffer(timer.interrupt);
|
|
@@ -56,20 +58,23 @@ async function runInProcess(load, spec, options) {
|
|
|
56
58
|
});
|
|
57
59
|
}
|
|
58
60
|
finally {
|
|
59
|
-
if (timer.disarm())
|
|
61
|
+
if (timer.disarm()) {
|
|
60
62
|
timedOut = true;
|
|
63
|
+
}
|
|
61
64
|
}
|
|
62
65
|
if (outcome.evict) {
|
|
63
66
|
cache.delete(load);
|
|
64
67
|
hlog('python: interpreter evicted; next run boots fresh');
|
|
65
68
|
}
|
|
66
|
-
if (timedOut)
|
|
69
|
+
if (timedOut) {
|
|
67
70
|
throw new Error(timeoutMessage);
|
|
71
|
+
}
|
|
68
72
|
return outcome.result;
|
|
69
73
|
}
|
|
70
74
|
catch (error) {
|
|
71
|
-
if (isPyodideFatal(error))
|
|
75
|
+
if (isPyodideFatal(error)) {
|
|
72
76
|
cache.delete(load);
|
|
77
|
+
}
|
|
73
78
|
throw error;
|
|
74
79
|
}
|
|
75
80
|
finally {
|
|
@@ -87,8 +92,9 @@ async function runInProcess(load, spec, options) {
|
|
|
87
92
|
return await raceAbort(Promise.race([run, timeout]), options.signal);
|
|
88
93
|
}
|
|
89
94
|
finally {
|
|
90
|
-
if (timer)
|
|
95
|
+
if (timer) {
|
|
91
96
|
clearTimeout(timer);
|
|
97
|
+
}
|
|
92
98
|
stop.abort(undefined);
|
|
93
99
|
}
|
|
94
100
|
}
|
|
@@ -130,8 +136,9 @@ export async function runPython(code, options = {}) {
|
|
|
130
136
|
}
|
|
131
137
|
await runLock.lock();
|
|
132
138
|
try {
|
|
133
|
-
if (options.signal?.aborted)
|
|
139
|
+
if (options.signal?.aborted) {
|
|
134
140
|
throw new AbortedError();
|
|
141
|
+
}
|
|
135
142
|
return await runPythonInWorker(spec, {
|
|
136
143
|
timeoutMs,
|
|
137
144
|
signal: options.signal,
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
+
import type { ExecAttachment } from '../../runner.ts';
|
|
1
2
|
import type { ExecutionAdapter } from '../adapter.ts';
|
|
2
3
|
import { type ExecInput } from './attachments.ts';
|
|
3
|
-
import { type
|
|
4
|
+
import { type ExecError } from './output-policy.ts';
|
|
5
|
+
import { type LoadPyodideFn, type PythonRunResult } from './pyodide.ts';
|
|
4
6
|
export declare function isPythonLanguage(language: unknown): boolean;
|
|
5
7
|
export declare function runsThroughPyodide(language: unknown, disablePyodide: boolean): boolean;
|
|
6
8
|
export declare function unwrapPythonSource(command: string): string | null;
|
|
7
9
|
export declare function withoutProgramDir(command: string): string;
|
|
8
10
|
export declare function pipInstallTargets(command: string): string[] | null;
|
|
9
11
|
export declare function pinned(spec: string): string;
|
|
10
|
-
export declare function pipMessage(targets: readonly string[] | null, sandbox?:
|
|
11
|
-
|
|
12
|
+
export declare function pipMessage(targets: readonly string[] | null, { sandbox }?: {
|
|
13
|
+
sandbox?: boolean | undefined;
|
|
14
|
+
}): string;
|
|
15
|
+
export interface PipFromSourceHintOptions {
|
|
16
|
+
readonly packages?: readonly string[] | undefined;
|
|
17
|
+
readonly sandbox?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function pipFromSourceHint(stderr: string, source: string, { packages, sandbox }?: PipFromSourceHintOptions): string | null;
|
|
12
20
|
export declare function stringLiteralProgramHint(source: string): string | null;
|
|
13
21
|
export declare function checkCollapsedCompound(source: string): string | null;
|
|
14
22
|
export declare function mangledPptxApiHint(source: string): string | null;
|
|
@@ -25,29 +33,25 @@ export declare function rgbColorImportHint(stderr: string): string | null;
|
|
|
25
33
|
export declare function checkPythonSource(command: string): string | null;
|
|
26
34
|
export declare function syntaxErrorHint(stderr: string, source: string): string | null;
|
|
27
35
|
export declare function checkPptxBuildSource(source: string, outputs: readonly string[] | undefined, packages?: readonly string[] | undefined): string | null;
|
|
36
|
+
export declare function tripleQuoteAt(source: string, index: number): string | null;
|
|
28
37
|
export declare function isEscaped(source: string, index: number): boolean;
|
|
29
38
|
export declare function checkBareLengthArgs(source: string, packages?: readonly string[] | undefined): string | null;
|
|
30
39
|
export declare function checkPdfBuildSource(source: string, outputs: readonly string[] | undefined, packages?: readonly string[] | undefined): string | null;
|
|
31
40
|
export declare function stripCommentsAndDocstrings(source: string): string;
|
|
32
41
|
export declare const PDF_READ: RegExp;
|
|
33
42
|
export declare const OFFICE_READ: RegExp;
|
|
34
|
-
export declare function checkUnstagedRead(source: string, inputs: readonly
|
|
35
|
-
path: string;
|
|
36
|
-
}[] | undefined): string | null;
|
|
43
|
+
export declare function checkUnstagedRead(source: string, inputs: readonly Pick<ExecInput, 'path'>[] | undefined): string | null;
|
|
37
44
|
export declare function missingFileHint(stderr: string): string | null;
|
|
38
|
-
export declare function parsePackages(value: unknown): string[] |
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
export declare function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
export declare function
|
|
48
|
-
error: string;
|
|
49
|
-
} | undefined;
|
|
50
|
-
export declare function missingModuleHint(stderr: string, packages: readonly string[] | undefined, sandbox?: boolean, network?: boolean): string | null;
|
|
45
|
+
export declare function parsePackages(value: unknown): string[] | ExecError | undefined;
|
|
46
|
+
export declare function parseInputs(value: unknown): ExecInput[] | ExecError | undefined;
|
|
47
|
+
export declare function parseOutputs(value: unknown): string[] | ExecError | undefined;
|
|
48
|
+
export declare function parseWorkdir(value: unknown): string | ExecError | undefined;
|
|
49
|
+
export interface MissingModuleHintOptions {
|
|
50
|
+
readonly packages?: readonly string[] | undefined;
|
|
51
|
+
readonly sandbox?: boolean;
|
|
52
|
+
readonly network?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare function missingModuleHint(stderr: string, { packages, sandbox, network }?: MissingModuleHintOptions): string | null;
|
|
51
55
|
export declare function nonePlaceholderHint(stderr: string): string | null;
|
|
52
56
|
export declare function slideShapesHint(stderr: string): string | null;
|
|
53
57
|
export declare function shapeFontHint(stderr: string): string | null;
|
|
@@ -63,19 +67,22 @@ export declare function packageFetchFailedHint(stderr: string): string | null;
|
|
|
63
67
|
export declare const IMAGE_INPUT: RegExp;
|
|
64
68
|
export declare function pptxHasEmbeddedMedia(bytes: Uint8Array): boolean;
|
|
65
69
|
export declare function softFailedDeckHint(stdout: string, exitCode: number, source: string): string | null;
|
|
66
|
-
export
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
export
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}[] | undefined
|
|
70
|
+
export interface DeckImagesOptions {
|
|
71
|
+
readonly inputs: readonly {
|
|
72
|
+
path: string;
|
|
73
|
+
}[] | undefined;
|
|
74
|
+
readonly outputs: readonly string[] | undefined;
|
|
75
|
+
readonly source: string;
|
|
76
|
+
}
|
|
77
|
+
export declare function stagedImagesMissingFromDeck(result: Pick<PythonRunResult, 'exitCode' | 'files'>, { inputs, outputs, source }: DeckImagesOptions): string | null;
|
|
78
|
+
export declare function checkStagedImagesUsed(source: string, inputs: readonly Pick<ExecInput, 'path'>[] | undefined, outputs: readonly string[] | undefined): string | null;
|
|
79
|
+
export interface TurnImagesStagedOptions {
|
|
80
|
+
readonly inputs: readonly ExecInput[] | undefined;
|
|
81
|
+
readonly outputs: readonly string[] | undefined;
|
|
82
|
+
readonly turnImages: readonly {
|
|
83
|
+
path: string;
|
|
84
|
+
}[] | undefined;
|
|
85
|
+
}
|
|
86
|
+
export declare function checkTurnImagesStaged(source: string, { inputs, outputs, turnImages }: TurnImagesStagedOptions): string | null;
|
|
87
|
+
export declare function deckDeliveredStop(attachments: readonly Pick<ExecAttachment, 'fileName'>[] | undefined, exitCode: number, source?: string): string | null;
|
|
81
88
|
export declare function createPythonAdapter(disabled: boolean, loadPyodide?: LoadPyodideFn, network?: boolean): ExecutionAdapter;
|