@qvac/harness 0.4.0 → 0.6.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.
Files changed (299) hide show
  1. package/CHANGELOG.md +740 -141
  2. package/README.md +75 -7
  3. package/dist/harness.bundle +72 -50
  4. package/dist-lib/index.d.ts +49 -39
  5. package/dist-lib/index.js +448 -161
  6. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -2
  7. package/dist-lib/lib/audio-transcode-bare.js +28 -18
  8. package/dist-lib/lib/audio-transcode-node.d.ts +2 -2
  9. package/dist-lib/lib/capabilities/audio-resample.d.ts +7 -6
  10. package/dist-lib/lib/capabilities/audio-resample.js +30 -18
  11. package/dist-lib/lib/capabilities/completion.d.ts +20 -19
  12. package/dist-lib/lib/capabilities/completion.js +193 -132
  13. package/dist-lib/lib/capabilities/download.d.ts +6 -6
  14. package/dist-lib/lib/capabilities/download.js +15 -8
  15. package/dist-lib/lib/capabilities/embed.js +2 -1
  16. package/dist-lib/lib/capabilities/enhance.d.ts +6 -1
  17. package/dist-lib/lib/capabilities/enhance.js +7 -4
  18. package/dist-lib/lib/capabilities/invoke.js +7 -4
  19. package/dist-lib/lib/capabilities/kv-cache.js +2 -1
  20. package/dist-lib/lib/capabilities/preview-model-source.d.ts +9 -7
  21. package/dist-lib/lib/capabilities/preview-model-source.js +80 -28
  22. package/dist-lib/lib/capabilities/speech-text.js +5 -4
  23. package/dist-lib/lib/capabilities/tool-selection.js +10 -9
  24. package/dist-lib/lib/capabilities/tool-turns.js +30 -16
  25. package/dist-lib/lib/capabilities/usage-breakdown.js +2 -1
  26. package/dist-lib/lib/capabilities/voice.d.ts +5 -1
  27. package/dist-lib/lib/capabilities/voice.js +22 -12
  28. package/dist-lib/lib/connect.d.ts +13 -32
  29. package/dist-lib/lib/connect.js +170 -112
  30. package/dist-lib/lib/context-window.js +25 -21
  31. package/dist-lib/lib/contract-types.d.ts +35 -15
  32. package/dist-lib/lib/diagram-repair.d.ts +4 -4
  33. package/dist-lib/lib/diagram-repair.js +6 -3
  34. package/dist-lib/lib/docx/index.d.ts +3 -2
  35. package/dist-lib/lib/{error-fields.d.ts → guards.d.ts} +1 -0
  36. package/dist-lib/lib/{error-fields.js → guards.js} +3 -0
  37. package/dist-lib/lib/hardware/capability-probe.js +20 -10
  38. package/dist-lib/lib/hardware/gpu-classify.js +6 -3
  39. package/dist-lib/lib/hardware/gpu-probe-addon.js +8 -4
  40. package/dist-lib/lib/hardware/gpu-probe.js +4 -2
  41. package/dist-lib/lib/hardware/gpu-stats.native.cjs +8 -9
  42. package/dist-lib/lib/hardware/parsers.js +8 -4
  43. package/dist-lib/lib/helpers/buffer-burst.js +4 -2
  44. package/dist-lib/lib/helpers/control-tokens.js +4 -2
  45. package/dist-lib/lib/helpers/join-guard.d.ts +2 -2
  46. package/dist-lib/lib/helpers/join-guard.js +4 -2
  47. package/dist-lib/lib/helpers/load-stall.js +4 -2
  48. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +2 -2
  49. package/dist-lib/lib/helpers/markup-stream-filter.js +6 -3
  50. package/dist-lib/lib/helpers/race-abort.js +2 -1
  51. package/dist-lib/lib/helpers/race-timeout.d.ts +5 -0
  52. package/dist-lib/lib/helpers/race-timeout.js +14 -0
  53. package/dist-lib/lib/helpers/run-outcome.d.ts +6 -8
  54. package/dist-lib/lib/helpers/run-outcome.js +36 -20
  55. package/dist-lib/lib/helpers/spawn-path.js +6 -3
  56. package/dist-lib/lib/helpers/text-coalescer.js +6 -3
  57. package/dist-lib/lib/helpers/thinking.js +38 -45
  58. package/dist-lib/lib/helpers/tool-call-markup.d.ts +9 -7
  59. package/dist-lib/lib/helpers/tool-call-markup.js +36 -20
  60. package/dist-lib/lib/helpers/tool-intent.d.ts +3 -2
  61. package/dist-lib/lib/helpers/tool-intent.js +4 -2
  62. package/dist-lib/lib/helpers/tool-label.js +18 -9
  63. package/dist-lib/lib/hooks/built-in/arg-repair.js +23 -13
  64. package/dist-lib/lib/hooks/built-in/egress.js +2 -1
  65. package/dist-lib/lib/hooks/built-in/skill-catalog.js +2 -1
  66. package/dist-lib/lib/hooks/pipeline.d.ts +5 -4
  67. package/dist-lib/lib/hooks/pipeline.js +6 -3
  68. package/dist-lib/lib/hooks/run.js +12 -8
  69. package/dist-lib/lib/model-download-progress.js +10 -8
  70. package/dist-lib/lib/models/context.d.ts +1 -1
  71. package/dist-lib/lib/models/context.js +5 -1
  72. package/dist-lib/lib/models/custom-model-cache.d.ts +10 -1
  73. package/dist-lib/lib/models/custom-model-cache.js +43 -15
  74. package/dist-lib/lib/models/gguf-header.d.ts +3 -2
  75. package/dist-lib/lib/models/gguf-header.js +44 -22
  76. package/dist-lib/lib/models/idle-unload.d.ts +14 -0
  77. package/dist-lib/lib/models/idle-unload.js +51 -0
  78. package/dist-lib/lib/models/kv-cache.d.ts +3 -2
  79. package/dist-lib/lib/models/kv-cache.js +4 -3
  80. package/dist-lib/lib/models/llm-presets.d.ts +2 -2
  81. package/dist-lib/lib/models/llm-presets.js +4 -2
  82. package/dist-lib/lib/models/model-catalog-constants.js +3 -2
  83. package/dist-lib/lib/models/model-catalog.d.ts +15 -20
  84. package/dist-lib/lib/models/model-catalog.js +66 -31
  85. package/dist-lib/lib/models/model-delete.js +18 -8
  86. package/dist-lib/lib/models/model-handle.js +2 -1
  87. package/dist-lib/lib/models/model-list.d.ts +8 -3
  88. package/dist-lib/lib/models/model-list.js +11 -6
  89. package/dist-lib/lib/models/model-pool.d.ts +48 -10
  90. package/dist-lib/lib/models/model-pool.js +106 -45
  91. package/dist-lib/lib/models/model-source.js +10 -5
  92. package/dist-lib/lib/models/music-catalog.d.ts +2 -2
  93. package/dist-lib/lib/models/nmt-catalog.d.ts +4 -3
  94. package/dist-lib/lib/models/nmt-catalog.js +10 -5
  95. package/dist-lib/lib/models/opencl-cache.d.ts +6 -1
  96. package/dist-lib/lib/models/opencl-cache.js +5 -3
  97. package/dist-lib/lib/models/sdk-faults.d.ts +11 -8
  98. package/dist-lib/lib/models/sdk-faults.js +9 -6
  99. package/dist-lib/lib/models/shards.d.ts +11 -0
  100. package/dist-lib/lib/models/shards.js +15 -0
  101. package/dist-lib/lib/models/tool-dialect.js +10 -5
  102. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +3 -3
  103. package/dist-lib/lib/no-redirect-fetch-bare.js +1 -1
  104. package/dist-lib/lib/no-redirect-fetch-impl.js +6 -3
  105. package/dist-lib/lib/no-redirect-fetch-node.d.ts +1 -1
  106. package/dist-lib/lib/no-redirect-fetch-node.js +9 -9
  107. package/dist-lib/lib/office/index.d.ts +3 -2
  108. package/dist-lib/lib/office/python.d.ts +3 -2
  109. package/dist-lib/lib/office/python.js +2 -1
  110. package/dist-lib/lib/prompt.d.ts +5 -4
  111. package/dist-lib/lib/prompt.js +8 -4
  112. package/dist-lib/lib/queue.js +10 -5
  113. package/dist-lib/lib/resolution-detector.js +21 -11
  114. package/dist-lib/lib/rpc-session.js +2 -1
  115. package/dist-lib/lib/sdk-loader.js +2 -1
  116. package/dist-lib/lib/sdk-storage.js +4 -2
  117. package/dist-lib/lib/serve.js +122 -66
  118. package/dist-lib/lib/spawn.js +7 -4
  119. package/dist-lib/lib/tmp-path.d.ts +7 -6
  120. package/dist-lib/lib/tool-call-display.d.ts +2 -2
  121. package/dist-lib/lib/tools/create-documents.js +18 -10
  122. package/dist-lib/lib/tools/edit-documents.js +23 -13
  123. package/dist-lib/lib/tools/edit-image.d.ts +2 -2
  124. package/dist-lib/lib/tools/edit-image.js +60 -36
  125. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +10 -10
  126. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +17 -11
  127. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +53 -40
  128. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +2 -2
  129. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +60 -32
  130. package/dist-lib/lib/tools/exec/adapters/python/guarded-fetch.d.ts +33 -22
  131. package/dist-lib/lib/tools/exec/adapters/python/guarded-fetch.js +58 -29
  132. package/dist-lib/lib/tools/exec/adapters/python/interrupt-timer.d.ts +2 -2
  133. package/dist-lib/lib/tools/exec/adapters/python/loader.js +23 -12
  134. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +13 -11
  135. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +10 -5
  136. package/dist-lib/lib/tools/exec/adapters/python/net-shim.js +3 -1
  137. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +6 -4
  138. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +20 -10
  139. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +2 -2
  140. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +14 -7
  141. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +41 -34
  142. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +316 -166
  143. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +9 -8
  144. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +56 -28
  145. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +8 -10
  146. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +22 -11
  147. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +3 -2
  148. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +41 -26
  149. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +27 -18
  150. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +2 -2
  151. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +14 -13
  152. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +4 -4
  153. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +10 -5
  154. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +4 -4
  155. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +2 -1
  156. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +6 -1
  157. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +8 -5
  158. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +6 -6
  159. package/dist-lib/lib/tools/exec/obsidian/cli.js +4 -4
  160. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +3 -2
  161. package/dist-lib/lib/tools/exec/obsidian/command.js +6 -3
  162. package/dist-lib/lib/tools/exec/obsidian/output.js +2 -1
  163. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +4 -6
  164. package/dist-lib/lib/tools/exec/obsidian/route.js +17 -11
  165. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +2 -1
  166. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +15 -7
  167. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +2 -2
  168. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +20 -10
  169. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +20 -13
  170. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +24 -12
  171. package/dist-lib/lib/tools/exec/runner.d.ts +14 -14
  172. package/dist-lib/lib/tools/exec/runner.js +5 -3
  173. package/dist-lib/lib/tools/exec/scope.js +52 -28
  174. package/dist-lib/lib/tools/exec/shell-argv.js +31 -18
  175. package/dist-lib/lib/tools/exec/shell-guidance.d.ts +6 -1
  176. package/dist-lib/lib/tools/exec/shell-guidance.js +35 -20
  177. package/dist-lib/lib/tools/exec/video-tools.js +2 -2
  178. package/dist-lib/lib/tools/exec.d.ts +6 -8
  179. package/dist-lib/lib/tools/exec.js +113 -54
  180. package/dist-lib/lib/tools/file-glob.d.ts +4 -5
  181. package/dist-lib/lib/tools/file-glob.js +16 -11
  182. package/dist-lib/lib/tools/fs/glob.js +13 -18
  183. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +10 -10
  184. package/dist-lib/lib/tools/fs/remote.d.ts +3 -2
  185. package/dist-lib/lib/tools/fs/remote.js +13 -7
  186. package/dist-lib/lib/tools/fs/scope.d.ts +8 -3
  187. package/dist-lib/lib/tools/fs/scope.js +20 -12
  188. package/dist-lib/lib/tools/fs/walk.js +6 -3
  189. package/dist-lib/lib/tools/fs/write.d.ts +3 -2
  190. package/dist-lib/lib/tools/generate-image.d.ts +11 -9
  191. package/dist-lib/lib/tools/generate-image.js +73 -37
  192. package/dist-lib/lib/tools/generate-music.d.ts +22 -11
  193. package/dist-lib/lib/tools/generate-music.js +79 -48
  194. package/dist-lib/lib/tools/grep.js +66 -41
  195. package/dist-lib/lib/tools/http-request/encode-fields.js +18 -9
  196. package/dist-lib/lib/tools/http-request/{utils.js → request.js} +20 -11
  197. package/dist-lib/lib/tools/http-request/truncate-response.js +57 -46
  198. package/dist-lib/lib/tools/http-request.d.ts +1 -1
  199. package/dist-lib/lib/tools/http-request.js +33 -18
  200. package/dist-lib/lib/tools/mcp/protocol.d.ts +53 -0
  201. package/dist-lib/lib/tools/mcp/{utils.js → protocol.js} +45 -23
  202. package/dist-lib/lib/tools/mcp-call.d.ts +1 -1
  203. package/dist-lib/lib/tools/mcp-call.js +37 -16
  204. package/dist-lib/lib/tools/operations/builders.js +10 -6
  205. package/dist-lib/lib/tools/operations/compile.js +20 -10
  206. package/dist-lib/lib/tools/operations/decoders.js +12 -6
  207. package/dist-lib/lib/tools/operations/gmail-message.js +3 -2
  208. package/dist-lib/lib/tools/outbound-guard.d.ts +4 -3
  209. package/dist-lib/lib/tools/outbound-guard.js +14 -8
  210. package/dist-lib/lib/tools/private-ip.js +8 -7
  211. package/dist-lib/lib/tools/rag-search.js +14 -7
  212. package/dist-lib/lib/tools/read-files.js +23 -20
  213. package/dist-lib/lib/tools/skill.js +19 -10
  214. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +11 -18
  215. package/dist-lib/lib/tools/skills/auth-resolver.js +30 -18
  216. package/dist-lib/lib/tools/skills/bin-check.d.ts +3 -2
  217. package/dist-lib/lib/tools/skills/bin-check.js +10 -3
  218. package/dist-lib/lib/tools/skills/bundled-dir.js +20 -10
  219. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +3 -2
  220. package/dist-lib/lib/tools/skills/bundled-hash.js +6 -1
  221. package/dist-lib/lib/tools/skills/catalog.d.ts +3 -2
  222. package/dist-lib/lib/tools/skills/catalog.js +33 -28
  223. package/dist-lib/lib/tools/skills/cli-argv.d.ts +3 -2
  224. package/dist-lib/lib/tools/skills/cli-argv.js +55 -52
  225. package/dist-lib/lib/tools/skills/cli-schema-check.js +21 -10
  226. package/dist-lib/lib/tools/skills/cli-schema-load.js +28 -20
  227. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +6 -6
  228. package/dist-lib/lib/tools/skills/cli-schema.js +2 -1
  229. package/dist-lib/lib/tools/skills/credential-check.d.ts +6 -3
  230. package/dist-lib/lib/tools/skills/credential-check.js +24 -12
  231. package/dist-lib/lib/tools/skills/credential-grants.js +1 -6
  232. package/dist-lib/lib/tools/skills/credential-health.d.ts +5 -1
  233. package/dist-lib/lib/tools/skills/credential-health.js +5 -3
  234. package/dist-lib/lib/tools/skills/frontmatter-parser.js +10 -5
  235. package/dist-lib/lib/tools/skills/manifest-parse.js +84 -64
  236. package/dist-lib/lib/tools/skills/mention.js +7 -6
  237. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +2 -2
  238. package/dist-lib/lib/tools/skills/obsidian-readiness.js +11 -3
  239. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +6 -4
  240. package/dist-lib/lib/tools/skills/overlay-crud.js +12 -6
  241. package/dist-lib/lib/tools/skills/overlay-dir.js +4 -2
  242. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +3 -2
  243. package/dist-lib/lib/tools/skills/overlay-watch.js +8 -4
  244. package/dist-lib/lib/tools/skills/setup-routes.js +1 -3
  245. package/dist-lib/lib/tools/skills/skill-settings.js +4 -1
  246. package/dist-lib/lib/tools/skills/skill-state.d.ts +6 -11
  247. package/dist-lib/lib/tools/skills/skill-state.js +48 -29
  248. package/dist-lib/lib/tools/skills/tool-grants.js +6 -3
  249. package/dist-lib/lib/tools/toolsets.js +2 -1
  250. package/dist-lib/lib/tools/translate.d.ts +4 -5
  251. package/dist-lib/lib/tools/translate.js +31 -14
  252. package/dist-lib/lib/tools/url-guard.js +2 -1
  253. package/dist-lib/lib/tools/weather-lookup/place.js +8 -4
  254. package/dist-lib/lib/tools/weather-lookup/report.d.ts +7 -1
  255. package/dist-lib/lib/tools/weather-lookup/report.js +46 -9
  256. package/dist-lib/lib/tools/weather-lookup.js +18 -12
  257. package/dist-lib/lib/tools/web-fetch.js +47 -24
  258. package/dist-lib/lib/tools/web-search.js +8 -3
  259. package/dist-lib/lib/validating-lookup.d.ts +4 -4
  260. package/dist-lib/lib/wav-encode.d.ts +1 -1
  261. package/dist-lib/lib/wav-encode.js +11 -10
  262. package/dist-lib/lib/web-fetch/embedded-state.js +24 -12
  263. package/dist-lib/lib/web-fetch/extract.js +4 -2
  264. package/dist-lib/lib/web-fetch/images.js +8 -4
  265. package/dist-lib/lib/web-fetch/video.d.ts +2 -2
  266. package/dist-lib/lib/web-fetch/video.js +8 -4
  267. package/dist-lib/lib/web-search/engine-registry.d.ts +2 -2
  268. package/dist-lib/lib/web-search/engines/aol.js +1 -1
  269. package/dist-lib/lib/web-search/engines/bing.js +1 -1
  270. package/dist-lib/lib/web-search/engines/brave.js +4 -1
  271. package/dist-lib/lib/web-search/engines/duckduckgo.js +3 -2
  272. package/dist-lib/lib/web-search/engines/google.js +7 -3
  273. package/dist-lib/lib/web-search/engines/wikipedia.js +5 -4
  274. package/dist-lib/lib/web-search/engines/yahoo.js +1 -1
  275. package/dist-lib/lib/web-search/fetch-html.d.ts +5 -4
  276. package/dist-lib/lib/web-search/fetch-html.js +13 -7
  277. package/dist-lib/lib/web-search/orchestrator.d.ts +9 -5
  278. package/dist-lib/lib/web-search/orchestrator.js +3 -3
  279. package/dist-lib/lib/wire.d.ts +3 -2
  280. package/dist-lib/lib/wire.js +23 -15
  281. package/dist-lib/schema/baseline.js +10 -5
  282. package/dist-lib/schema/build.js +2 -1
  283. package/dist-lib/schema/harness.d.ts +15 -2
  284. package/dist-lib/schema/harness.js +39 -2
  285. package/dist-lib/schema/release-tags.d.ts +3 -2
  286. package/dist-lib/schema/release-tags.js +6 -3
  287. package/dist-lib/spec/bind.js +9 -0
  288. package/dist-lib/spec/calls.js +3 -0
  289. package/dist-lib/spec/hrpc/hrpc.json +39 -0
  290. package/dist-lib/spec/hrpc/index.js +39 -3
  291. package/dist-lib/spec/hrpc/messages.js +105 -8
  292. package/dist-lib/spec/hyperschema/index.js +105 -8
  293. package/dist-lib/spec/hyperschema/schema.json +77 -1
  294. package/dist-lib/spec/hyperschema/types.d.ts +25 -1
  295. package/package.json +14 -14
  296. package/worker/harness-sidecar.mjs +15 -22
  297. package/worker/stow-entry.mjs +7 -4
  298. package/dist-lib/lib/tools/mcp/utils.d.ts +0 -47
  299. /package/dist-lib/lib/tools/http-request/{utils.d.ts → request.d.ts} +0 -0
@@ -1,6 +1,8 @@
1
1
  export function pythonReachesNetwork() {
2
+ const wasm = WebAssembly;
2
3
  return (typeof globalThis.Bare !== 'undefined' &&
3
- typeof WebAssembly.Suspending === 'function');
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 declare function checkOutputBytes(name: string, bytes: Uint8Array, runningTotal: number): {
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
- if (extension === 'png')
66
+ }
67
+ if (extension === 'png') {
66
68
  return matches(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
67
- if (extension === 'jpeg' || extension === 'jpg')
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
- if (bytes.length > MAX_OUTPUT_FILE_BYTES)
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 type RunPythonOptions = {
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: error instanceof Error ? error.message : String(error)
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 LoadPyodideFn } from './pyodide.ts';
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?: boolean): string;
11
- export declare function pipFromSourceHint(stderr: string, source: string, packages: readonly string[] | undefined, sandbox?: boolean): string | null;
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
- error: string;
40
- } | undefined;
41
- export declare function parseInputs(value: unknown): ExecInput[] | {
42
- error: string;
43
- } | undefined;
44
- export declare function parseOutputs(value: unknown): string[] | {
45
- error: string;
46
- } | undefined;
47
- export declare function parseWorkdir(value: unknown): string | {
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 declare function stagedImagesMissingFromDeck(result: {
67
- exitCode: number;
68
- files?: ReadonlyMap<string, Uint8Array>;
69
- }, inputs: readonly {
70
- path: string;
71
- }[] | undefined, outputs: readonly string[] | undefined, source: string): string | null;
72
- export declare function checkStagedImagesUsed(source: string, inputs: readonly {
73
- path: string;
74
- }[] | undefined, outputs: readonly string[] | undefined): string | null;
75
- export declare function checkTurnImagesStaged(source: string, inputs: readonly ExecInput[] | undefined, outputs: readonly string[] | undefined, turnImages: readonly {
76
- path: string;
77
- }[] | undefined): string | null;
78
- export declare function deckDeliveredStop(attachments: readonly {
79
- readonly fileName: string;
80
- }[] | undefined, exitCode: number, source?: string): string | null;
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;