@aexhq/sdk 0.46.4-canary → 0.50.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 (337) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +38 -0
  3. package/README.md +23 -31
  4. package/dist/client/aex.d.ts +33 -0
  5. package/dist/client/aex.js +98 -0
  6. package/dist/client/aex.js.map +1 -0
  7. package/dist/client/credentials.d.ts +25 -0
  8. package/dist/client/credentials.js +97 -0
  9. package/dist/client/credentials.js.map +1 -0
  10. package/dist/client/routing.d.ts +7 -0
  11. package/dist/client/routing.js +29 -0
  12. package/dist/client/routing.js.map +1 -0
  13. package/dist/downloads/download.d.ts +25 -0
  14. package/dist/downloads/download.js +53 -0
  15. package/dist/downloads/download.js.map +1 -0
  16. package/dist/generated/errors.d.ts +12 -0
  17. package/dist/generated/errors.js +81 -0
  18. package/dist/generated/errors.js.map +1 -0
  19. package/dist/generated/resources.d.ts +730 -0
  20. package/dist/generated/resources.js +606 -0
  21. package/dist/generated/resources.js.map +1 -0
  22. package/dist/generated/routes.d.ts +42 -0
  23. package/dist/generated/routes.js +2101 -0
  24. package/dist/generated/routes.js.map +1 -0
  25. package/dist/index.d.ts +20 -50
  26. package/dist/index.js +11 -62
  27. package/dist/index.js.map +1 -1
  28. package/dist/observations/stream.d.ts +1 -0
  29. package/dist/observations/stream.js +18 -0
  30. package/dist/observations/stream.js.map +1 -0
  31. package/dist/transport/errors.d.ts +60 -0
  32. package/dist/transport/errors.js +107 -0
  33. package/dist/transport/errors.js.map +1 -0
  34. package/dist/transport/pagination.d.ts +8 -0
  35. package/dist/transport/pagination.js +34 -0
  36. package/dist/transport/pagination.js.map +1 -0
  37. package/dist/transport/retry.d.ts +21 -0
  38. package/dist/transport/retry.js +37 -0
  39. package/dist/transport/retry.js.map +1 -0
  40. package/dist/transport/transport.d.ts +25 -0
  41. package/dist/transport/transport.js +28 -0
  42. package/dist/transport/transport.js.map +1 -0
  43. package/package.json +63 -30
  44. package/dist/_contracts/account-operations.d.ts +0 -101
  45. package/dist/_contracts/account-operations.js +0 -242
  46. package/dist/_contracts/account-types.d.ts +0 -461
  47. package/dist/_contracts/account-types.js +0 -1
  48. package/dist/_contracts/api-key.d.ts +0 -61
  49. package/dist/_contracts/api-key.js +0 -101
  50. package/dist/_contracts/api-routes.d.ts +0 -20
  51. package/dist/_contracts/api-routes.js +0 -109
  52. package/dist/_contracts/archive-limits.d.ts +0 -3
  53. package/dist/_contracts/archive-limits.js +0 -23
  54. package/dist/_contracts/asset-authoring.d.ts +0 -22
  55. package/dist/_contracts/asset-authoring.js +0 -106
  56. package/dist/_contracts/asset-bundle.d.ts +0 -64
  57. package/dist/_contracts/asset-bundle.js +0 -263
  58. package/dist/_contracts/asset-upload-helper.d.ts +0 -31
  59. package/dist/_contracts/asset-upload-helper.js +0 -84
  60. package/dist/_contracts/billing-admission.d.ts +0 -29
  61. package/dist/_contracts/billing-admission.js +0 -28
  62. package/dist/_contracts/bundle-manifest.d.ts +0 -89
  63. package/dist/_contracts/bundle-manifest.js +0 -158
  64. package/dist/_contracts/canonical-sha256.d.ts +0 -8
  65. package/dist/_contracts/canonical-sha256.js +0 -8
  66. package/dist/_contracts/connection-ticket.d.ts +0 -22
  67. package/dist/_contracts/connection-ticket.js +0 -54
  68. package/dist/_contracts/continuation-event.d.ts +0 -31
  69. package/dist/_contracts/continuation-event.js +0 -6
  70. package/dist/_contracts/contract-parse-error.d.ts +0 -12
  71. package/dist/_contracts/contract-parse-error.js +0 -51
  72. package/dist/_contracts/error-codes.d.ts +0 -26
  73. package/dist/_contracts/error-codes.js +0 -116
  74. package/dist/_contracts/error-factory.d.ts +0 -32
  75. package/dist/_contracts/error-factory.js +0 -174
  76. package/dist/_contracts/event-envelope.d.ts +0 -471
  77. package/dist/_contracts/event-envelope.js +0 -501
  78. package/dist/_contracts/event-stream-client.d.ts +0 -122
  79. package/dist/_contracts/event-stream-client.js +0 -445
  80. package/dist/_contracts/event-view.d.ts +0 -44
  81. package/dist/_contracts/event-view.js +0 -69
  82. package/dist/_contracts/failure-class.d.ts +0 -29
  83. package/dist/_contracts/failure-class.js +0 -73
  84. package/dist/_contracts/http.d.ts +0 -135
  85. package/dist/_contracts/http.js +0 -434
  86. package/dist/_contracts/ids.d.ts +0 -66
  87. package/dist/_contracts/ids.js +0 -119
  88. package/dist/_contracts/index.d.ts +0 -42
  89. package/dist/_contracts/index.js +0 -52
  90. package/dist/_contracts/internal.d.ts +0 -55
  91. package/dist/_contracts/internal.js +0 -113
  92. package/dist/_contracts/models.d.ts +0 -30
  93. package/dist/_contracts/models.js +0 -28
  94. package/dist/_contracts/operation-core.d.ts +0 -36
  95. package/dist/_contracts/operation-core.js +0 -70
  96. package/dist/_contracts/operations.d.ts +0 -218
  97. package/dist/_contracts/operations.js +0 -1496
  98. package/dist/_contracts/otlp-projection.d.ts +0 -78
  99. package/dist/_contracts/otlp-projection.js +0 -171
  100. package/dist/_contracts/post-hook.d.ts +0 -31
  101. package/dist/_contracts/post-hook.js +0 -61
  102. package/dist/_contracts/provider-fault.d.ts +0 -34
  103. package/dist/_contracts/provider-fault.js +0 -68
  104. package/dist/_contracts/retry-core.d.ts +0 -29
  105. package/dist/_contracts/retry-core.js +0 -79
  106. package/dist/_contracts/runner-event.d.ts +0 -117
  107. package/dist/_contracts/runner-event.js +0 -172
  108. package/dist/_contracts/runtime-kind.d.ts +0 -60
  109. package/dist/_contracts/runtime-kind.js +0 -70
  110. package/dist/_contracts/runtime-manifest.d.ts +0 -121
  111. package/dist/_contracts/runtime-manifest.js +0 -83
  112. package/dist/_contracts/runtime-security-profile.d.ts +0 -26
  113. package/dist/_contracts/runtime-security-profile.js +0 -73
  114. package/dist/_contracts/runtime-sizes.d.ts +0 -104
  115. package/dist/_contracts/runtime-sizes.js +0 -111
  116. package/dist/_contracts/runtime-types.d.ts +0 -618
  117. package/dist/_contracts/runtime-types.js +0 -58
  118. package/dist/_contracts/schemas/asset-bundle.d.ts +0 -70
  119. package/dist/_contracts/schemas/asset-bundle.js +0 -107
  120. package/dist/_contracts/schemas/asset-ref.d.ts +0 -61
  121. package/dist/_contracts/schemas/asset-ref.js +0 -118
  122. package/dist/_contracts/schemas/bundle-manifest.d.ts +0 -66
  123. package/dist/_contracts/schemas/bundle-manifest.js +0 -77
  124. package/dist/_contracts/schemas/index.d.ts +0 -32
  125. package/dist/_contracts/schemas/index.js +0 -30
  126. package/dist/_contracts/schemas/mcp-server.d.ts +0 -99
  127. package/dist/_contracts/schemas/mcp-server.js +0 -209
  128. package/dist/_contracts/schemas/models.d.ts +0 -29
  129. package/dist/_contracts/schemas/models.js +0 -51
  130. package/dist/_contracts/schemas/numeric.d.ts +0 -18
  131. package/dist/_contracts/schemas/numeric.js +0 -28
  132. package/dist/_contracts/schemas/post-hook.d.ts +0 -45
  133. package/dist/_contracts/schemas/post-hook.js +0 -68
  134. package/dist/_contracts/schemas/response-assets.d.ts +0 -75
  135. package/dist/_contracts/schemas/response-assets.js +0 -81
  136. package/dist/_contracts/schemas/response-billing.d.ts +0 -208
  137. package/dist/_contracts/schemas/response-billing.js +0 -139
  138. package/dist/_contracts/schemas/response-common.d.ts +0 -132
  139. package/dist/_contracts/schemas/response-common.js +0 -162
  140. package/dist/_contracts/schemas/response-identity.d.ts +0 -648
  141. package/dist/_contracts/schemas/response-identity.js +0 -131
  142. package/dist/_contracts/schemas/response-mcp-servers.d.ts +0 -51
  143. package/dist/_contracts/schemas/response-mcp-servers.js +0 -32
  144. package/dist/_contracts/schemas/response-secrets.d.ts +0 -50
  145. package/dist/_contracts/schemas/response-secrets.js +0 -32
  146. package/dist/_contracts/schemas/response-sessions-internal.d.ts +0 -200
  147. package/dist/_contracts/schemas/response-sessions-internal.js +0 -142
  148. package/dist/_contracts/schemas/response-sessions.d.ts +0 -1598
  149. package/dist/_contracts/schemas/response-sessions.js +0 -377
  150. package/dist/_contracts/schemas/response-webhooks.d.ts +0 -76
  151. package/dist/_contracts/schemas/response-webhooks.js +0 -42
  152. package/dist/_contracts/schemas/response-workspace.d.ts +0 -225
  153. package/dist/_contracts/schemas/response-workspace.js +0 -99
  154. package/dist/_contracts/schemas/runtime-kind.d.ts +0 -31
  155. package/dist/_contracts/schemas/runtime-kind.js +0 -29
  156. package/dist/_contracts/schemas/runtime-security-profile.d.ts +0 -28
  157. package/dist/_contracts/schemas/runtime-security-profile.js +0 -26
  158. package/dist/_contracts/schemas/runtime-sizes.d.ts +0 -70
  159. package/dist/_contracts/schemas/runtime-sizes.js +0 -127
  160. package/dist/_contracts/schemas/session-limits.d.ts +0 -34
  161. package/dist/_contracts/schemas/session-limits.js +0 -39
  162. package/dist/_contracts/schemas/session-machine.d.ts +0 -23
  163. package/dist/_contracts/schemas/session-machine.js +0 -24
  164. package/dist/_contracts/schemas/session-request-config.d.ts +0 -58
  165. package/dist/_contracts/schemas/session-request-config.js +0 -134
  166. package/dist/_contracts/schemas/session-webhook.d.ts +0 -11
  167. package/dist/_contracts/schemas/session-webhook.js +0 -38
  168. package/dist/_contracts/schemas/side-effect-audit.d.ts +0 -98
  169. package/dist/_contracts/schemas/side-effect-audit.js +0 -102
  170. package/dist/_contracts/schemas/submission-assets.d.ts +0 -117
  171. package/dist/_contracts/schemas/submission-assets.js +0 -147
  172. package/dist/_contracts/schemas/submission-body.d.ts +0 -251
  173. package/dist/_contracts/schemas/submission-body.js +0 -378
  174. package/dist/_contracts/schemas/submission-environment.d.ts +0 -79
  175. package/dist/_contracts/schemas/submission-environment.js +0 -179
  176. package/dist/_contracts/schemas/submission-request.d.ts +0 -158
  177. package/dist/_contracts/schemas/submission-request.js +0 -49
  178. package/dist/_contracts/schemas/submission-secrets.d.ts +0 -47
  179. package/dist/_contracts/schemas/submission-secrets.js +0 -108
  180. package/dist/_contracts/schemas/wire.d.ts +0 -118
  181. package/dist/_contracts/schemas/wire.js +0 -171
  182. package/dist/_contracts/schemas/workspace-resources.d.ts +0 -50
  183. package/dist/_contracts/schemas/workspace-resources.js +0 -87
  184. package/dist/_contracts/sdk-errors.d.ts +0 -212
  185. package/dist/_contracts/sdk-errors.js +0 -313
  186. package/dist/_contracts/sdk-secrets.d.ts +0 -67
  187. package/dist/_contracts/sdk-secrets.js +0 -427
  188. package/dist/_contracts/session-archive.d.ts +0 -16
  189. package/dist/_contracts/session-archive.js +0 -92
  190. package/dist/_contracts/session-artifacts.d.ts +0 -189
  191. package/dist/_contracts/session-artifacts.js +0 -264
  192. package/dist/_contracts/session-config.d.ts +0 -373
  193. package/dist/_contracts/session-config.js +0 -562
  194. package/dist/_contracts/session-cost-types.d.ts +0 -211
  195. package/dist/_contracts/session-cost-types.js +0 -69
  196. package/dist/_contracts/session-cost.d.ts +0 -8
  197. package/dist/_contracts/session-cost.js +0 -582
  198. package/dist/_contracts/session-custody.d.ts +0 -165
  199. package/dist/_contracts/session-custody.js +0 -345
  200. package/dist/_contracts/session-file-query.d.ts +0 -14
  201. package/dist/_contracts/session-file-query.js +0 -178
  202. package/dist/_contracts/session-record.d.ts +0 -112
  203. package/dist/_contracts/session-record.js +0 -165
  204. package/dist/_contracts/session-retention.d.ts +0 -201
  205. package/dist/_contracts/session-retention.js +0 -450
  206. package/dist/_contracts/side-effect-audit.d.ts +0 -126
  207. package/dist/_contracts/side-effect-audit.js +0 -520
  208. package/dist/_contracts/sse.d.ts +0 -74
  209. package/dist/_contracts/sse.js +0 -227
  210. package/dist/_contracts/stable.d.ts +0 -45
  211. package/dist/_contracts/stable.js +0 -62
  212. package/dist/_contracts/status.d.ts +0 -25
  213. package/dist/_contracts/status.js +0 -57
  214. package/dist/_contracts/submission-limits.d.ts +0 -61
  215. package/dist/_contracts/submission-limits.js +0 -60
  216. package/dist/_contracts/submission.d.ts +0 -547
  217. package/dist/_contracts/submission.js +0 -812
  218. package/dist/_contracts/suggest.d.ts +0 -15
  219. package/dist/_contracts/suggest.js +0 -53
  220. package/dist/_contracts/testing/response-bindings.d.ts +0 -45
  221. package/dist/_contracts/testing/response-bindings.js +0 -256
  222. package/dist/_contracts/testing/wire-conformance-entry.d.ts +0 -10
  223. package/dist/_contracts/testing/wire-conformance-entry.js +0 -8
  224. package/dist/_contracts/testing/wire-conformance.d.ts +0 -169
  225. package/dist/_contracts/testing/wire-conformance.js +0 -276
  226. package/dist/_contracts/turn-trace.d.ts +0 -28
  227. package/dist/_contracts/turn-trace.js +0 -1
  228. package/dist/_contracts/unknown-field-error.d.ts +0 -13
  229. package/dist/_contracts/unknown-field-error.js +0 -21
  230. package/dist/_contracts/value-guards.d.ts +0 -20
  231. package/dist/_contracts/value-guards.js +0 -34
  232. package/dist/_contracts/webhook-verify.d.ts +0 -34
  233. package/dist/_contracts/webhook-verify.js +0 -93
  234. package/dist/_contracts/wire-observer.d.ts +0 -49
  235. package/dist/_contracts/wire-observer.js +0 -34
  236. package/dist/_contracts/workflow-status.d.ts +0 -7
  237. package/dist/_contracts/workflow-status.js +0 -43
  238. package/dist/_contracts/workspace-resources.d.ts +0 -98
  239. package/dist/_contracts/workspace-resources.js +0 -39
  240. package/dist/archive-limits.d.ts +0 -1
  241. package/dist/archive-limits.js +0 -2
  242. package/dist/archive-limits.js.map +0 -1
  243. package/dist/asset-upload.d.ts +0 -47
  244. package/dist/asset-upload.js +0 -269
  245. package/dist/asset-upload.js.map +0 -1
  246. package/dist/bundle.d.ts +0 -9
  247. package/dist/bundle.js +0 -20
  248. package/dist/bundle.js.map +0 -1
  249. package/dist/canonical-zip.d.ts +0 -68
  250. package/dist/canonical-zip.js +0 -355
  251. package/dist/canonical-zip.js.map +0 -1
  252. package/dist/cli.mjs +0 -12048
  253. package/dist/cli.mjs.sha256 +0 -1
  254. package/dist/client-types.d.ts +0 -192
  255. package/dist/client-types.js +0 -2
  256. package/dist/client-types.js.map +0 -1
  257. package/dist/client.d.ts +0 -464
  258. package/dist/client.js +0 -1207
  259. package/dist/client.js.map +0 -1
  260. package/dist/event-projection.d.ts +0 -22
  261. package/dist/event-projection.js +0 -380
  262. package/dist/event-projection.js.map +0 -1
  263. package/dist/fetch-archive.d.ts +0 -16
  264. package/dist/fetch-archive.js +0 -252
  265. package/dist/fetch-archive.js.map +0 -1
  266. package/dist/file.d.ts +0 -96
  267. package/dist/file.js +0 -272
  268. package/dist/file.js.map +0 -1
  269. package/dist/instructions.d.ts +0 -20
  270. package/dist/instructions.js +0 -40
  271. package/dist/instructions.js.map +0 -1
  272. package/dist/legacy-session-provider-fault.d.ts +0 -7
  273. package/dist/legacy-session-provider-fault.js +0 -38
  274. package/dist/legacy-session-provider-fault.js.map +0 -1
  275. package/dist/mcp-server.d.ts +0 -84
  276. package/dist/mcp-server.js +0 -117
  277. package/dist/mcp-server.js.map +0 -1
  278. package/dist/node-fs.d.ts +0 -29
  279. package/dist/node-fs.js +0 -19
  280. package/dist/node-fs.js.map +0 -1
  281. package/dist/node-walk.d.ts +0 -69
  282. package/dist/node-walk.js +0 -151
  283. package/dist/node-walk.js.map +0 -1
  284. package/dist/path-basename.d.ts +0 -5
  285. package/dist/path-basename.js +0 -9
  286. package/dist/path-basename.js.map +0 -1
  287. package/dist/retry.d.ts +0 -70
  288. package/dist/retry.js +0 -155
  289. package/dist/retry.js.map +0 -1
  290. package/dist/secret.d.ts +0 -65
  291. package/dist/secret.js +0 -110
  292. package/dist/secret.js.map +0 -1
  293. package/dist/session-validate.d.ts +0 -100
  294. package/dist/session-validate.js +0 -303
  295. package/dist/session-validate.js.map +0 -1
  296. package/dist/skill.d.ts +0 -99
  297. package/dist/skill.js +0 -169
  298. package/dist/skill.js.map +0 -1
  299. package/dist/submission-wire.d.ts +0 -13
  300. package/dist/submission-wire.js +0 -69
  301. package/dist/submission-wire.js.map +0 -1
  302. package/dist/tool.d.ts +0 -41
  303. package/dist/tool.js +0 -76
  304. package/dist/tool.js.map +0 -1
  305. package/dist/version.d.ts +0 -9
  306. package/dist/version.js +0 -10
  307. package/dist/version.js.map +0 -1
  308. package/docs/authentication.md +0 -125
  309. package/docs/billing.md +0 -164
  310. package/docs/cleanup.md +0 -27
  311. package/docs/concepts/agent-tools.md +0 -47
  312. package/docs/concepts/composition.md +0 -60
  313. package/docs/concepts/providers-and-runtimes.md +0 -121
  314. package/docs/concepts/sessions.md +0 -51
  315. package/docs/concepts/subagents.md +0 -35
  316. package/docs/credentials.md +0 -116
  317. package/docs/defaults.md +0 -51
  318. package/docs/errors.md +0 -258
  319. package/docs/events.md +0 -143
  320. package/docs/files.md +0 -130
  321. package/docs/limits-and-quotas.md +0 -114
  322. package/docs/limits.md +0 -51
  323. package/docs/mcp.md +0 -47
  324. package/docs/networking.md +0 -114
  325. package/docs/provider-runtime-capabilities.md +0 -32
  326. package/docs/public-surface.json +0 -73
  327. package/docs/quickstart.md +0 -135
  328. package/docs/release.md +0 -44
  329. package/docs/retries.md +0 -108
  330. package/docs/secrets.md +0 -141
  331. package/docs/session-config.md +0 -51
  332. package/docs/session-record.md +0 -58
  333. package/docs/skills.md +0 -65
  334. package/docs/telemetry.md +0 -66
  335. package/docs/testing.md +0 -35
  336. package/docs/vision-skills.md +0 -94
  337. package/docs/webhooks.md +0 -143
@@ -1,252 +0,0 @@
1
- import { unzipSync } from "fflate";
2
- import { SKILL_BUNDLE_LIMITS } from "./_contracts/index.js";
3
- import { splitSkillBundleMetadata } from "./bundle.js";
4
- /**
5
- * Fetch a zip-archived skill from a URL and reduce it to the same in-memory
6
- * `SkillFiles` map that `Skill.fromDir` consumes.
7
- *
8
- * This runs in the SDK process (the caller's own app), so the URL is
9
- * caller-controlled — there is no SSRF surface here. Host the skill yourself
10
- * and hand the SDK a temporary signed URL (e.g. an S3 presigned URL); it only
11
- * needs to be valid for this fetch, because the workspace publisher snapshots
12
- * the bytes afterwards.
13
- *
14
- * Signed URLs carry secrets in their query string, so the query is never echoed
15
- * in error messages.
16
- */
17
- const DEFAULT_TIMEOUT_MS = 30_000;
18
- const MAX_SKILL_ARCHIVE_DOWNLOAD_BYTES = SKILL_BUNDLE_LIMITS.maxCompressedBytes;
19
- class SkillArchiveDownloadError extends Error {
20
- }
21
- export async function fetchSkillArchive(url, opts = {}) {
22
- if (typeof url !== "string" || url.length === 0) {
23
- throw new Error("Skill.fromUrl: url is required");
24
- }
25
- const fetchImpl = opts.fetch ?? globalThis.fetch;
26
- if (typeof fetchImpl !== "function") {
27
- throw new Error("Skill.fromUrl: global fetch is unavailable; pass args.fetch " +
28
- "(Bun, Node 18+, or a fetch-capable runtime is required)");
29
- }
30
- const bytes = await download(url, fetchImpl, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
31
- if (opts.sha256) {
32
- await verifySha256(bytes, opts.sha256, url);
33
- }
34
- const entries = unzip(bytes, url);
35
- return splitSkillBundleMetadata(resolveSkillRoot(entries, url), "Skill.fromUrl");
36
- }
37
- // ---------------------------------------------------------------------------
38
- // Download + integrity
39
- // ---------------------------------------------------------------------------
40
- async function download(url, fetchImpl, timeoutMs) {
41
- const controller = new AbortController();
42
- const timer = setTimeout(() => controller.abort(), timeoutMs);
43
- try {
44
- const res = await fetchImpl(url, { signal: controller.signal });
45
- if (!res.ok) {
46
- throw new SkillArchiveDownloadError(`Skill.fromUrl: fetch for ${redactUrl(url)} returned HTTP ${res.status}`);
47
- }
48
- // Early guard on a declared size so a clearly-too-big archive fails before
49
- // we buffer it. The authoritative caps are re-checked by bundleSkillFiles.
50
- const declaredRaw = res.headers.get("content-length");
51
- const declared = declaredRaw !== null && /^\d+$/.test(declaredRaw) ? Number(declaredRaw) : undefined;
52
- if (declared !== undefined && declared > MAX_SKILL_ARCHIVE_DOWNLOAD_BYTES) {
53
- throw new SkillArchiveDownloadError(`Skill.fromUrl: archive at ${redactUrl(url)} declares ${declared} bytes, ` +
54
- `exceeding the ${MAX_SKILL_ARCHIVE_DOWNLOAD_BYTES}-byte compressed cap`);
55
- }
56
- const bytes = await readResponseBytes(res, url, controller.signal);
57
- if (bytes.byteLength === 0) {
58
- throw new SkillArchiveDownloadError(`Skill.fromUrl: archive at ${redactUrl(url)} is empty`);
59
- }
60
- return bytes;
61
- }
62
- catch (err) {
63
- if (err instanceof SkillArchiveDownloadError)
64
- throw err;
65
- throw new Error(`Skill.fromUrl: fetch failed for ${redactUrl(url)}: ${errMessage(err)}`);
66
- }
67
- finally {
68
- clearTimeout(timer);
69
- }
70
- }
71
- async function readResponseBytes(res, url, signal) {
72
- if (!res.body) {
73
- const bytes = new Uint8Array(await withAbort(res.arrayBuffer(), signal));
74
- ensureWithinCompressedCap(bytes.byteLength, url);
75
- return bytes;
76
- }
77
- const reader = res.body.getReader();
78
- const chunks = [];
79
- let total = 0;
80
- try {
81
- while (true) {
82
- const { done, value } = await withAbort(reader.read(), signal);
83
- if (done)
84
- break;
85
- if (!value || value.byteLength === 0)
86
- continue;
87
- total += value.byteLength;
88
- ensureWithinCompressedCap(total, url);
89
- chunks.push(value);
90
- }
91
- }
92
- finally {
93
- await reader.cancel().catch(() => { });
94
- }
95
- return concatBytes(chunks, total);
96
- }
97
- function ensureWithinCompressedCap(bytes, url) {
98
- if (bytes > MAX_SKILL_ARCHIVE_DOWNLOAD_BYTES) {
99
- throw new SkillArchiveDownloadError(`Skill.fromUrl: archive at ${redactUrl(url)} is ${bytes} bytes, ` +
100
- `exceeding the ${MAX_SKILL_ARCHIVE_DOWNLOAD_BYTES}-byte compressed cap`);
101
- }
102
- }
103
- function concatBytes(chunks, total) {
104
- if (chunks.length === 1)
105
- return chunks[0];
106
- const out = new Uint8Array(total);
107
- let offset = 0;
108
- for (const chunk of chunks) {
109
- out.set(chunk, offset);
110
- offset += chunk.byteLength;
111
- }
112
- return out;
113
- }
114
- function withAbort(promise, signal) {
115
- if (signal.aborted)
116
- return Promise.reject(abortError());
117
- return new Promise((resolve, reject) => {
118
- const onAbort = () => reject(abortError());
119
- signal.addEventListener("abort", onAbort, { once: true });
120
- promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
121
- });
122
- }
123
- function abortError() {
124
- if (typeof DOMException === "function") {
125
- return new DOMException("The operation was aborted", "AbortError");
126
- }
127
- const err = new Error("The operation was aborted");
128
- err.name = "AbortError";
129
- return err;
130
- }
131
- async function verifySha256(bytes, expected, url) {
132
- const want = (expected.startsWith("sha256:") ? expected.slice("sha256:".length) : expected).toLowerCase();
133
- if (!/^[0-9a-f]{64}$/.test(want)) {
134
- throw new Error(`Skill.fromUrl: sha256 must be 64 hex chars (optionally prefixed "sha256:"), ` +
135
- `got ${JSON.stringify(expected)}`);
136
- }
137
- const got = await sha256Hex(bytes);
138
- if (got !== want) {
139
- throw new Error(`Skill.fromUrl: archive integrity check failed for ${redactUrl(url)}: ` +
140
- `expected sha256:${want} but downloaded bytes hash to sha256:${got}`);
141
- }
142
- }
143
- // ---------------------------------------------------------------------------
144
- // Unzip + skill-root resolution
145
- // ---------------------------------------------------------------------------
146
- function unzip(bytes, url) {
147
- let fileCount = 0;
148
- let declaredTotal = 0;
149
- try {
150
- return unzipSync(bytes, {
151
- filter: (file) => {
152
- if (/[\\/]$/.test(file.name))
153
- return false;
154
- fileCount += 1;
155
- if (fileCount > SKILL_BUNDLE_LIMITS.maxFiles + 1) {
156
- throw new SkillArchiveDownloadError(`Skill.fromUrl: archive at ${redactUrl(url)} exceeds the ` +
157
- `${SKILL_BUNDLE_LIMITS.maxFiles}-entry cap plus one control record`);
158
- }
159
- declaredTotal += file.originalSize;
160
- if (declaredTotal > SKILL_BUNDLE_LIMITS.maxDecompressedBytes) {
161
- throw new SkillArchiveDownloadError(`Skill.fromUrl: archive at ${redactUrl(url)} declares more than ` +
162
- `${SKILL_BUNDLE_LIMITS.maxDecompressedBytes} decompressed bytes`);
163
- }
164
- return true;
165
- }
166
- });
167
- }
168
- catch (err) {
169
- if (err instanceof SkillArchiveDownloadError)
170
- throw err;
171
- throw new Error(`Skill.fromUrl: could not unzip the archive at ${redactUrl(url)} ` +
172
- `(expected a .zip): ${errMessage(err)}`);
173
- }
174
- }
175
- /**
176
- * Resolve the skill root from unzipped entries:
177
- *
178
- * 1. drop directory entries,
179
- * 2. if `SKILL.md` is already at root, use entries as-is,
180
- * 3. else if there is exactly one common top-level directory AND it contains
181
- * `SKILL.md`, strip that single prefix,
182
- * 4. otherwise throw, listing the archive's actual top-level entries.
183
- *
184
- * We only ever strip a single level, and only when it demonstrably exposes a
185
- * root `SKILL.md` — never speculatively. `bundleSkillFiles` re-asserts the
186
- * SKILL.md-at-root invariant as the authoritative check.
187
- */
188
- function resolveSkillRoot(entries, url) {
189
- const files = {};
190
- for (const [rawPath, bytes] of Object.entries(entries)) {
191
- const path = rawPath.replace(/\\/g, "/");
192
- if (path.endsWith("/")) {
193
- continue; // directory entry
194
- }
195
- files[path] = bytes;
196
- }
197
- const paths = Object.keys(files);
198
- if (paths.length === 0) {
199
- throw new Error(`Skill.fromUrl: archive at ${redactUrl(url)} contains no files`);
200
- }
201
- if (Object.prototype.hasOwnProperty.call(files, "SKILL.md")) {
202
- return files;
203
- }
204
- const topSegments = new Set(paths.map((p) => p.split("/")[0]));
205
- if (topSegments.size === 1) {
206
- const prefix = `${[...topSegments][0]}/`;
207
- if (Object.prototype.hasOwnProperty.call(files, `${prefix}SKILL.md`)) {
208
- const stripped = {};
209
- for (const [p, b] of Object.entries(files)) {
210
- stripped[p.slice(prefix.length)] = b;
211
- }
212
- return stripped;
213
- }
214
- }
215
- const roots = [...new Set(paths.map((p) => (p.includes("/") ? `${p.split("/")[0]}/` : p)))].sort();
216
- throw new Error(`Skill.fromUrl: fetched archive at ${redactUrl(url)} must contain SKILL.md at its root, ` +
217
- `or inside a single top-level folder. Found top-level entries: ${roots.join(", ")}`);
218
- }
219
- // ---------------------------------------------------------------------------
220
- // Helpers
221
- // ---------------------------------------------------------------------------
222
- /** Strip the query string so signed-URL secrets never reach error text/logs. */
223
- function redactUrl(url) {
224
- try {
225
- const u = new URL(url);
226
- return u.search ? `${u.origin}${u.pathname}?…` : `${u.origin}${u.pathname}`;
227
- }
228
- catch {
229
- const q = url.indexOf("?");
230
- return q >= 0 ? `${url.slice(0, q)}?…` : url;
231
- }
232
- }
233
- function errMessage(err) {
234
- return err instanceof Error ? err.message : String(err);
235
- }
236
- async function sha256Hex(bytes) {
237
- const subtle = globalThis.crypto?.subtle;
238
- if (!subtle) {
239
- throw new Error("Skill.fromUrl: globalThis.crypto.subtle is unavailable; " +
240
- "Bun, Node 18+, or a Web-Crypto-capable runtime is required");
241
- }
242
- const copy = new Uint8Array(bytes.byteLength);
243
- copy.set(bytes);
244
- const digest = await subtle.digest("SHA-256", copy.buffer);
245
- const view = new Uint8Array(digest);
246
- let out = "";
247
- for (let i = 0; i < view.length; i++) {
248
- out += view[i].toString(16).padStart(2, "0");
249
- }
250
- return out;
251
- }
252
- //# sourceMappingURL=fetch-archive.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-archive.js","sourceRoot":"","sources":["../src/fetch-archive.ts"],"names":[],"mappings":"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"}
package/dist/file.d.ts DELETED
@@ -1,96 +0,0 @@
1
- import { type ByteSink } from "./canonical-zip.js";
2
- import { type IgnoreOptions } from "./node-walk.js";
3
- /**
4
- * File — arbitrary bytes (single file or zipped folder) delivered to
5
- * the agent as a mounted runtime resource. The managed runtime UNZIPS the
6
- * snapshotted bytes into the `mountPath` DIRECTORY during workspace
7
- * materialization, preserving the real filename + extension.
8
- *
9
- * const settings = await File.fromPath("./settings.json");
10
- * const dataset = await File.fromPath("./data/");
11
- * const input = await client.workspace.files.publish(settings);
12
- * await client.start({ assets: { files: [input] }, message: "..." });
13
- *
14
- * `mountPath` is the absolute container directory the file unzips into; it
15
- * defaults to `/workspace` (the agent's default working directory), so a file
16
- * handed with no `mountPath` lands directly in the agent's cwd — a single file
17
- * `subtitles.srt` becomes `/workspace/subtitles.srt`, a folder lands its entries
18
- * under `/workspace/`. The resolved path is surfaced back on the Session record.
19
- *
20
- * FIDELITY: a directory walk captures executable bits and symlinks into a
21
- * `.aexmeta.json` sidecar (emitted only when such metadata exists, so a
22
- * pure-content bundle stays byte-identical → dedup continuity), and honors
23
- * `.aexignore` (gitignore-compatible) plus always-on defaults (`.git/`,
24
- * `node_modules/`). SCALE: a large input (total raw size over the streaming
25
- * threshold, `File.fromPath` only) is uploaded via a streaming two-pass
26
- * multipart flow that holds only one entry + one part in memory within the
27
- * runtime asset archive envelope.
28
- *
29
- * Publish drafts through `aex.workspace.files.publish(file)`, then pin the
30
- * returned immutable ref in `assets.files`.
31
- */
32
- export declare class File {
33
- #private;
34
- private constructor();
35
- get ref(): DraftFileRef;
36
- get isDraft(): boolean;
37
- /**
38
- * Build a draft File from raw bytes. `name` is the REAL filename (with its
39
- * extension, e.g. `"subtitles.srt"`) — it is preserved as the single zip
40
- * entry so the agent finds it at `<mountPath>/<name>` after unzip. The bytes
41
- * are wrapped in a single-entry canonical zip so storage stays uniform across
42
- * all file uploads. `mountPath` is the absolute container directory the file
43
- * unzips into; it defaults to `/workspace`.
44
- */
45
- static fromBytes(args: {
46
- readonly name: string;
47
- readonly bytes: Uint8Array;
48
- readonly mountPath?: string;
49
- }): Promise<File>;
50
- /**
51
- * Read a local file or directory and build a draft File. A single file
52
- * preserves its real basename (with extension) as the sole zip entry, so the
53
- * agent finds it at `<mountPath>/<basename>` after unzip. Directories walk
54
- * recursively into a canonical zip (sorted relative paths, deterministic
55
- * mtime), landing each entry under `<mountPath>/`. Executable bits + symlinks
56
- * are captured into a `.aexmeta.json` sidecar; `.aexignore` (+ defaults) prune
57
- * the walk. `mountPath` defaults to `/workspace`. The optional `name` is only
58
- * the storage slug (dedup label); it never affects the on-disk filename.
59
- */
60
- static fromPath(path: string, args?: {
61
- readonly name?: string;
62
- readonly mountPath?: string;
63
- readonly ignore?: IgnoreOptions;
64
- }): Promise<File>;
65
- /**
66
- * Internal: yield the draft's zipped bytes and metadata to the workspace publisher.
67
- * Returns undefined for a streaming (large) draft — use {@link _takeDraftStream}.
68
- */
69
- _takeDraftBundle(): {
70
- name: string;
71
- contentHash: string;
72
- bytes: Uint8Array;
73
- mountPath: string;
74
- } | undefined;
75
- /**
76
- * Internal: yield the draft's canonical-zip stream driver so `client.start` can
77
- * upload it via the streaming multipart flow. Returns undefined for the small
78
- * (in-memory) draft — use {@link _takeDraftBundle}.
79
- */
80
- _takeDraftStream(): {
81
- name: string;
82
- mountPath: string;
83
- drive: ZipStreamDriver;
84
- } | undefined;
85
- toJSON(): never;
86
- }
87
- export interface DraftFileRef {
88
- readonly kind: "draft";
89
- readonly name: string;
90
- /** sha256 of the canonical zip (small path only); undefined for a streaming draft (hashed at upload). */
91
- readonly contentHash?: string;
92
- /** Absolute container directory the file unzips into (always set; defaults to /workspace). */
93
- readonly mountPath: string;
94
- }
95
- /** A retryable driver that frames the canonical zip into `sink` (one call per upload pass). */
96
- export type ZipStreamDriver = (sink: ByteSink) => Promise<void>;
package/dist/file.js DELETED
@@ -1,272 +0,0 @@
1
- import { createReadStream } from "node:fs";
2
- import { readFile, stat } from "node:fs/promises";
3
- import { ASSET_ARCHIVE_LIMITS, DEFAULT_FILE_MOUNT_PATH, RESERVED_META_ENTRY, assertValidMountPath, bundleManifestIsEmpty, serializeBundleManifest } from "./_contracts/index.js";
4
- import { bundleSingleFile, hashSkillBundle } from "./_contracts/internal.js";
5
- import { frameCanonicalZipSync, streamBundleZip } from "./canonical-zip.js";
6
- import { walkDirectory } from "./node-walk.js";
7
- import { assertArchiveCompressedSize, assertArchiveEntryCount, assertArchiveExpandedSize } from "./archive-limits.js";
8
- import { crossPlatformBasename } from "./path-basename.js";
9
- /**
10
- * File — arbitrary bytes (single file or zipped folder) delivered to
11
- * the agent as a mounted runtime resource. The managed runtime UNZIPS the
12
- * snapshotted bytes into the `mountPath` DIRECTORY during workspace
13
- * materialization, preserving the real filename + extension.
14
- *
15
- * const settings = await File.fromPath("./settings.json");
16
- * const dataset = await File.fromPath("./data/");
17
- * const input = await client.workspace.files.publish(settings);
18
- * await client.start({ assets: { files: [input] }, message: "..." });
19
- *
20
- * `mountPath` is the absolute container directory the file unzips into; it
21
- * defaults to `/workspace` (the agent's default working directory), so a file
22
- * handed with no `mountPath` lands directly in the agent's cwd — a single file
23
- * `subtitles.srt` becomes `/workspace/subtitles.srt`, a folder lands its entries
24
- * under `/workspace/`. The resolved path is surfaced back on the Session record.
25
- *
26
- * FIDELITY: a directory walk captures executable bits and symlinks into a
27
- * `.aexmeta.json` sidecar (emitted only when such metadata exists, so a
28
- * pure-content bundle stays byte-identical → dedup continuity), and honors
29
- * `.aexignore` (gitignore-compatible) plus always-on defaults (`.git/`,
30
- * `node_modules/`). SCALE: a large input (total raw size over the streaming
31
- * threshold, `File.fromPath` only) is uploaded via a streaming two-pass
32
- * multipart flow that holds only one entry + one part in memory within the
33
- * runtime asset archive envelope.
34
- *
35
- * Publish drafts through `aex.workspace.files.publish(file)`, then pin the
36
- * returned immutable ref in `assets.files`.
37
- */
38
- export class File {
39
- #ref;
40
- #bytes;
41
- /** Large-input streaming driver — re-runs the deterministic canonical-zip framer per pass. */
42
- #drive;
43
- constructor(ref, bytes, drive) {
44
- this.#ref = ref;
45
- this.#bytes = bytes;
46
- this.#drive = drive;
47
- }
48
- get ref() {
49
- return this.#ref;
50
- }
51
- get isDraft() {
52
- return true;
53
- }
54
- /**
55
- * Build a draft File from raw bytes. `name` is the REAL filename (with its
56
- * extension, e.g. `"subtitles.srt"`) — it is preserved as the single zip
57
- * entry so the agent finds it at `<mountPath>/<name>` after unzip. The bytes
58
- * are wrapped in a single-entry canonical zip so storage stays uniform across
59
- * all file uploads. `mountPath` is the absolute container directory the file
60
- * unzips into; it defaults to `/workspace`.
61
- */
62
- static async fromBytes(args) {
63
- if (!args || typeof args.name !== "string") {
64
- throw new Error("File.fromBytes: name must be a string");
65
- }
66
- const filename = sanitiseFilename(args.name);
67
- if (filename === undefined) {
68
- throw new Error(`File.fromBytes: name ${JSON.stringify(args.name)} is not a valid filename ` +
69
- "(no '/', '\\\\', NUL, or path traversal; 1..255 chars)");
70
- }
71
- if (!(args.bytes instanceof Uint8Array) || args.bytes.byteLength === 0) {
72
- throw new Error("File.fromBytes: bytes must be a non-empty Uint8Array");
73
- }
74
- const mountPath = resolveMountPath(args.mountPath, "File.fromBytes");
75
- const zip = bundleSingleFile(filename, args.bytes, "File.fromBytes");
76
- const contentHash = await hashSkillBundle(zip);
77
- const ref = {
78
- kind: "draft",
79
- name: slugFromFilename(filename),
80
- contentHash,
81
- mountPath
82
- };
83
- return new File(ref, zip);
84
- }
85
- /**
86
- * Read a local file or directory and build a draft File. A single file
87
- * preserves its real basename (with extension) as the sole zip entry, so the
88
- * agent finds it at `<mountPath>/<basename>` after unzip. Directories walk
89
- * recursively into a canonical zip (sorted relative paths, deterministic
90
- * mtime), landing each entry under `<mountPath>/`. Executable bits + symlinks
91
- * are captured into a `.aexmeta.json` sidecar; `.aexignore` (+ defaults) prune
92
- * the walk. `mountPath` defaults to `/workspace`. The optional `name` is only
93
- * the storage slug (dedup label); it never affects the on-disk filename.
94
- */
95
- static async fromPath(path, args) {
96
- const stats = await stat(path);
97
- const mountPath = resolveMountPath(args?.mountPath, "File.fromPath");
98
- // `name` is only the storage slug (dedup label), never the on-disk filename.
99
- const slug = args?.name !== undefined ? slugFromFilename(args.name) : inferNameFromPath(path);
100
- return stats.isDirectory()
101
- ? File.#fromDirectory(path, slug, mountPath, args?.ignore)
102
- : File.#fromSingleFile(path, slug, mountPath, stats.size, (stats.mode & 0o111) !== 0);
103
- }
104
- /** Directory branch: walk + fidelity sidecar + small/streaming path selection. */
105
- static async #fromDirectory(path, slug, mountPath, ignore) {
106
- const walk = await walkDirectory(path, ignore);
107
- if (walk.entries.length === 0 && walk.symlinks.length === 0) {
108
- throw new Error(`File.fromPath: directory ${JSON.stringify(path)} is empty (no regular files or symlinks)`);
109
- }
110
- const meta = { exec: walk.exec, symlinks: walk.symlinks };
111
- const sidecar = bundleManifestIsEmpty(meta)
112
- ? undefined
113
- : serializeBundleManifest({ v: 1, exec: walk.exec, symlinks: walk.symlinks });
114
- assertArchiveExpandedSize(walk.totalSize + (sidecar?.byteLength ?? 0), "File.fromPath");
115
- assertArchiveEntryCount(walk.entries.length + walk.symlinks.length, "File.fromPath");
116
- if (walk.totalSize <= SMALL_UPLOAD_THRESHOLD_BYTES) {
117
- // Small: read all bytes and build the canonical zip in memory (single PUT).
118
- const ordered = [];
119
- for (const entry of walk.entries) {
120
- ordered.push([entry.rel, new Uint8Array(await readFile(entry.absPath))]);
121
- }
122
- if (sidecar)
123
- ordered.push([RESERVED_META_ENTRY, sidecar]);
124
- const zip = frameCanonicalZipSync(ordered);
125
- assertArchiveCompressedSize(zip.byteLength, "File.fromPath");
126
- const contentHash = await hashSkillBundle(zip);
127
- return new File({ kind: "draft", name: slug, contentHash, mountPath }, zip);
128
- }
129
- // Large: stream the canonical zip (never materialize the whole bundle).
130
- const sources = buildEntrySources(walk.entries, sidecar);
131
- const drive = (sink) => streamBundleZip(sources, sink);
132
- return new File({ kind: "draft", name: slug, mountPath }, undefined, drive);
133
- }
134
- /** Single-file branch: preserve the basename; capture the +x bit; small/streaming by size. */
135
- static async #fromSingleFile(path, slug, mountPath, size, isExecutable) {
136
- const basename = crossPlatformBasename(path);
137
- const filename = sanitiseFilename(basename) ?? `${slug}`;
138
- const sidecar = isExecutable
139
- ? serializeBundleManifest({ v: 1, exec: [filename], symlinks: [] })
140
- : undefined;
141
- assertArchiveExpandedSize(size + (sidecar?.byteLength ?? 0), "File.fromPath");
142
- if (size <= SMALL_UPLOAD_THRESHOLD_BYTES) {
143
- const bytes = new Uint8Array(await readFile(path));
144
- const ordered = [[filename, bytes]];
145
- if (sidecar)
146
- ordered.push([RESERVED_META_ENTRY, sidecar]);
147
- const zip = frameCanonicalZipSync(ordered);
148
- assertArchiveCompressedSize(zip.byteLength, "File.fromPath");
149
- const contentHash = await hashSkillBundle(zip);
150
- return new File({ kind: "draft", name: slug, contentHash, mountPath }, zip);
151
- }
152
- const sources = [
153
- {
154
- name: filename,
155
- size,
156
- read: async () => new Uint8Array(await readFile(path)),
157
- openStream: () => fileByteStream(path)
158
- }
159
- ];
160
- if (sidecar)
161
- sources.push({ name: RESERVED_META_ENTRY, size: sidecar.length, read: () => sidecar });
162
- const drive = (sink) => streamBundleZip(sources, sink);
163
- return new File({ kind: "draft", name: slug, mountPath }, undefined, drive);
164
- }
165
- /**
166
- * Internal: yield the draft's zipped bytes and metadata to the workspace publisher.
167
- * Returns undefined for a streaming (large) draft — use {@link _takeDraftStream}.
168
- */
169
- _takeDraftBundle() {
170
- if (this.#ref.kind !== "draft" || !this.#bytes || this.#ref.contentHash === undefined) {
171
- return undefined;
172
- }
173
- return {
174
- name: this.#ref.name,
175
- contentHash: this.#ref.contentHash,
176
- bytes: this.#bytes,
177
- mountPath: this.#ref.mountPath
178
- };
179
- }
180
- /**
181
- * Internal: yield the draft's canonical-zip stream driver so `client.start` can
182
- * upload it via the streaming multipart flow. Returns undefined for the small
183
- * (in-memory) draft — use {@link _takeDraftBundle}.
184
- */
185
- _takeDraftStream() {
186
- if (this.#ref.kind !== "draft" || !this.#drive)
187
- return undefined;
188
- return { name: this.#ref.name, mountPath: this.#ref.mountPath, drive: this.#drive };
189
- }
190
- toJSON() {
191
- throw new Error("File drafts cannot be submitted directly; publish with aex.workspace.files.publish(...)");
192
- }
193
- }
194
- const ZIP_EPOCH = new Date(Date.UTC(1980, 0, 1));
195
- // Private compatibility rule for a filename-derived storage slug. This is not
196
- // the persisted workspace file/instruction resource-name admission contract.
197
- const DERIVED_FILE_STORAGE_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]$/;
198
- /**
199
- * Total raw input size (via `stat`, before reading bytes) above which
200
- * `File.fromPath` streams the upload instead of building the whole zip in
201
- * memory. A pure performance/simplicity switch, NOT a correctness boundary — the
202
- * streaming framer is byte-identical to the in-memory `zipSync` for Canonical A,
203
- * so a bundle at the threshold dedups either way.
204
- */
205
- const SMALL_UPLOAD_THRESHOLD_BYTES = ASSET_ARCHIVE_LIMITS.maxCompressedBytes;
206
- /** Build lazy zip entry sources from walked descriptors, appending the sidecar LAST. */
207
- function buildEntrySources(entries, sidecar) {
208
- const sources = entries.map((entry) => ({
209
- name: entry.rel,
210
- size: entry.size,
211
- read: async () => new Uint8Array(await readFile(entry.absPath)),
212
- openStream: () => fileByteStream(entry.absPath)
213
- }));
214
- if (sidecar) {
215
- sources.push({ name: RESERVED_META_ENTRY, size: sidecar.length, read: () => sidecar });
216
- }
217
- return sources;
218
- }
219
- /** Async-iterate a file's bytes in native stream chunks (for Canonical-B giant entries). */
220
- async function* fileByteStream(absPath) {
221
- const stream = createReadStream(absPath);
222
- for await (const chunk of stream) {
223
- yield chunk;
224
- }
225
- }
226
- /**
227
- * Resolve + validate a caller-supplied `mountPath`, defaulting to `/workspace`.
228
- * Shares {@link assertValidMountPath} with the contracts parser so the SDK and
229
- * the BFF reject the same malformed paths.
230
- */
231
- function resolveMountPath(mountPath, fn) {
232
- if (mountPath === undefined)
233
- return DEFAULT_FILE_MOUNT_PATH;
234
- if (typeof mountPath !== "string") {
235
- throw new Error(`${fn}: mountPath must be a string`);
236
- }
237
- assertValidMountPath(mountPath, `${fn}: mountPath`);
238
- return mountPath;
239
- }
240
- /**
241
- * Validate a real on-disk filename (a single path SEGMENT — no separators,
242
- * traversal, NUL, or control chars; 1..255 bytes). Returns the trimmed name, or
243
- * `undefined` when it cannot be a filename. Used to preserve the real filename +
244
- * extension inside the single-entry zip.
245
- */
246
- function sanitiseFilename(name) {
247
- const trimmed = name.trim();
248
- if (trimmed.length === 0 || trimmed.length > 255)
249
- return undefined;
250
- if (trimmed === "." || trimmed === "..")
251
- return undefined;
252
- if (/[/\\]/.test(trimmed))
253
- return undefined;
254
- // Reject NUL + C0/C1/DEL control chars (filename must stay a printable segment).
255
- // eslint-disable-next-line no-control-regex
256
- if (/[\u0000-\u001f\u007f]/.test(trimmed))
257
- return undefined;
258
- return trimmed;
259
- }
260
- function slugFromFilename(filename) {
261
- const stem = filename.replace(/\.[^.]+$/, "").toLowerCase();
262
- const slug = stem.replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
263
- if (slug.length >= 2 && DERIVED_FILE_STORAGE_SLUG_PATTERN.test(slug))
264
- return slug;
265
- if (slug.length === 1)
266
- return `f-${slug}`;
267
- return `file-${Date.now().toString(36)}`;
268
- }
269
- function inferNameFromPath(path) {
270
- return slugFromFilename(crossPlatformBasename(path));
271
- }
272
- //# sourceMappingURL=file.js.map
package/dist/file.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}