@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.
- package/LICENSE +201 -0
- package/NOTICE +38 -0
- package/README.md +23 -31
- package/dist/client/aex.d.ts +33 -0
- package/dist/client/aex.js +98 -0
- package/dist/client/aex.js.map +1 -0
- package/dist/client/credentials.d.ts +25 -0
- package/dist/client/credentials.js +97 -0
- package/dist/client/credentials.js.map +1 -0
- package/dist/client/routing.d.ts +7 -0
- package/dist/client/routing.js +29 -0
- package/dist/client/routing.js.map +1 -0
- package/dist/downloads/download.d.ts +25 -0
- package/dist/downloads/download.js +53 -0
- package/dist/downloads/download.js.map +1 -0
- package/dist/generated/errors.d.ts +12 -0
- package/dist/generated/errors.js +81 -0
- package/dist/generated/errors.js.map +1 -0
- package/dist/generated/resources.d.ts +730 -0
- package/dist/generated/resources.js +606 -0
- package/dist/generated/resources.js.map +1 -0
- package/dist/generated/routes.d.ts +42 -0
- package/dist/generated/routes.js +2101 -0
- package/dist/generated/routes.js.map +1 -0
- package/dist/index.d.ts +20 -50
- package/dist/index.js +11 -62
- package/dist/index.js.map +1 -1
- package/dist/observations/stream.d.ts +1 -0
- package/dist/observations/stream.js +18 -0
- package/dist/observations/stream.js.map +1 -0
- package/dist/transport/errors.d.ts +60 -0
- package/dist/transport/errors.js +107 -0
- package/dist/transport/errors.js.map +1 -0
- package/dist/transport/pagination.d.ts +8 -0
- package/dist/transport/pagination.js +34 -0
- package/dist/transport/pagination.js.map +1 -0
- package/dist/transport/retry.d.ts +21 -0
- package/dist/transport/retry.js +37 -0
- package/dist/transport/retry.js.map +1 -0
- package/dist/transport/transport.d.ts +25 -0
- package/dist/transport/transport.js +28 -0
- package/dist/transport/transport.js.map +1 -0
- package/package.json +63 -30
- package/dist/_contracts/account-operations.d.ts +0 -101
- package/dist/_contracts/account-operations.js +0 -242
- package/dist/_contracts/account-types.d.ts +0 -461
- package/dist/_contracts/account-types.js +0 -1
- package/dist/_contracts/api-key.d.ts +0 -61
- package/dist/_contracts/api-key.js +0 -101
- package/dist/_contracts/api-routes.d.ts +0 -20
- package/dist/_contracts/api-routes.js +0 -109
- package/dist/_contracts/archive-limits.d.ts +0 -3
- package/dist/_contracts/archive-limits.js +0 -23
- package/dist/_contracts/asset-authoring.d.ts +0 -22
- package/dist/_contracts/asset-authoring.js +0 -106
- package/dist/_contracts/asset-bundle.d.ts +0 -64
- package/dist/_contracts/asset-bundle.js +0 -263
- package/dist/_contracts/asset-upload-helper.d.ts +0 -31
- package/dist/_contracts/asset-upload-helper.js +0 -84
- package/dist/_contracts/billing-admission.d.ts +0 -29
- package/dist/_contracts/billing-admission.js +0 -28
- package/dist/_contracts/bundle-manifest.d.ts +0 -89
- package/dist/_contracts/bundle-manifest.js +0 -158
- package/dist/_contracts/canonical-sha256.d.ts +0 -8
- package/dist/_contracts/canonical-sha256.js +0 -8
- package/dist/_contracts/connection-ticket.d.ts +0 -22
- package/dist/_contracts/connection-ticket.js +0 -54
- package/dist/_contracts/continuation-event.d.ts +0 -31
- package/dist/_contracts/continuation-event.js +0 -6
- package/dist/_contracts/contract-parse-error.d.ts +0 -12
- package/dist/_contracts/contract-parse-error.js +0 -51
- package/dist/_contracts/error-codes.d.ts +0 -26
- package/dist/_contracts/error-codes.js +0 -116
- package/dist/_contracts/error-factory.d.ts +0 -32
- package/dist/_contracts/error-factory.js +0 -174
- package/dist/_contracts/event-envelope.d.ts +0 -471
- package/dist/_contracts/event-envelope.js +0 -501
- package/dist/_contracts/event-stream-client.d.ts +0 -122
- package/dist/_contracts/event-stream-client.js +0 -445
- package/dist/_contracts/event-view.d.ts +0 -44
- package/dist/_contracts/event-view.js +0 -69
- package/dist/_contracts/failure-class.d.ts +0 -29
- package/dist/_contracts/failure-class.js +0 -73
- package/dist/_contracts/http.d.ts +0 -135
- package/dist/_contracts/http.js +0 -434
- package/dist/_contracts/ids.d.ts +0 -66
- package/dist/_contracts/ids.js +0 -119
- package/dist/_contracts/index.d.ts +0 -42
- package/dist/_contracts/index.js +0 -52
- package/dist/_contracts/internal.d.ts +0 -55
- package/dist/_contracts/internal.js +0 -113
- package/dist/_contracts/models.d.ts +0 -30
- package/dist/_contracts/models.js +0 -28
- package/dist/_contracts/operation-core.d.ts +0 -36
- package/dist/_contracts/operation-core.js +0 -70
- package/dist/_contracts/operations.d.ts +0 -218
- package/dist/_contracts/operations.js +0 -1496
- package/dist/_contracts/otlp-projection.d.ts +0 -78
- package/dist/_contracts/otlp-projection.js +0 -171
- package/dist/_contracts/post-hook.d.ts +0 -31
- package/dist/_contracts/post-hook.js +0 -61
- package/dist/_contracts/provider-fault.d.ts +0 -34
- package/dist/_contracts/provider-fault.js +0 -68
- package/dist/_contracts/retry-core.d.ts +0 -29
- package/dist/_contracts/retry-core.js +0 -79
- package/dist/_contracts/runner-event.d.ts +0 -117
- package/dist/_contracts/runner-event.js +0 -172
- package/dist/_contracts/runtime-kind.d.ts +0 -60
- package/dist/_contracts/runtime-kind.js +0 -70
- package/dist/_contracts/runtime-manifest.d.ts +0 -121
- package/dist/_contracts/runtime-manifest.js +0 -83
- package/dist/_contracts/runtime-security-profile.d.ts +0 -26
- package/dist/_contracts/runtime-security-profile.js +0 -73
- package/dist/_contracts/runtime-sizes.d.ts +0 -104
- package/dist/_contracts/runtime-sizes.js +0 -111
- package/dist/_contracts/runtime-types.d.ts +0 -618
- package/dist/_contracts/runtime-types.js +0 -58
- package/dist/_contracts/schemas/asset-bundle.d.ts +0 -70
- package/dist/_contracts/schemas/asset-bundle.js +0 -107
- package/dist/_contracts/schemas/asset-ref.d.ts +0 -61
- package/dist/_contracts/schemas/asset-ref.js +0 -118
- package/dist/_contracts/schemas/bundle-manifest.d.ts +0 -66
- package/dist/_contracts/schemas/bundle-manifest.js +0 -77
- package/dist/_contracts/schemas/index.d.ts +0 -32
- package/dist/_contracts/schemas/index.js +0 -30
- package/dist/_contracts/schemas/mcp-server.d.ts +0 -99
- package/dist/_contracts/schemas/mcp-server.js +0 -209
- package/dist/_contracts/schemas/models.d.ts +0 -29
- package/dist/_contracts/schemas/models.js +0 -51
- package/dist/_contracts/schemas/numeric.d.ts +0 -18
- package/dist/_contracts/schemas/numeric.js +0 -28
- package/dist/_contracts/schemas/post-hook.d.ts +0 -45
- package/dist/_contracts/schemas/post-hook.js +0 -68
- package/dist/_contracts/schemas/response-assets.d.ts +0 -75
- package/dist/_contracts/schemas/response-assets.js +0 -81
- package/dist/_contracts/schemas/response-billing.d.ts +0 -208
- package/dist/_contracts/schemas/response-billing.js +0 -139
- package/dist/_contracts/schemas/response-common.d.ts +0 -132
- package/dist/_contracts/schemas/response-common.js +0 -162
- package/dist/_contracts/schemas/response-identity.d.ts +0 -648
- package/dist/_contracts/schemas/response-identity.js +0 -131
- package/dist/_contracts/schemas/response-mcp-servers.d.ts +0 -51
- package/dist/_contracts/schemas/response-mcp-servers.js +0 -32
- package/dist/_contracts/schemas/response-secrets.d.ts +0 -50
- package/dist/_contracts/schemas/response-secrets.js +0 -32
- package/dist/_contracts/schemas/response-sessions-internal.d.ts +0 -200
- package/dist/_contracts/schemas/response-sessions-internal.js +0 -142
- package/dist/_contracts/schemas/response-sessions.d.ts +0 -1598
- package/dist/_contracts/schemas/response-sessions.js +0 -377
- package/dist/_contracts/schemas/response-webhooks.d.ts +0 -76
- package/dist/_contracts/schemas/response-webhooks.js +0 -42
- package/dist/_contracts/schemas/response-workspace.d.ts +0 -225
- package/dist/_contracts/schemas/response-workspace.js +0 -99
- package/dist/_contracts/schemas/runtime-kind.d.ts +0 -31
- package/dist/_contracts/schemas/runtime-kind.js +0 -29
- package/dist/_contracts/schemas/runtime-security-profile.d.ts +0 -28
- package/dist/_contracts/schemas/runtime-security-profile.js +0 -26
- package/dist/_contracts/schemas/runtime-sizes.d.ts +0 -70
- package/dist/_contracts/schemas/runtime-sizes.js +0 -127
- package/dist/_contracts/schemas/session-limits.d.ts +0 -34
- package/dist/_contracts/schemas/session-limits.js +0 -39
- package/dist/_contracts/schemas/session-machine.d.ts +0 -23
- package/dist/_contracts/schemas/session-machine.js +0 -24
- package/dist/_contracts/schemas/session-request-config.d.ts +0 -58
- package/dist/_contracts/schemas/session-request-config.js +0 -134
- package/dist/_contracts/schemas/session-webhook.d.ts +0 -11
- package/dist/_contracts/schemas/session-webhook.js +0 -38
- package/dist/_contracts/schemas/side-effect-audit.d.ts +0 -98
- package/dist/_contracts/schemas/side-effect-audit.js +0 -102
- package/dist/_contracts/schemas/submission-assets.d.ts +0 -117
- package/dist/_contracts/schemas/submission-assets.js +0 -147
- package/dist/_contracts/schemas/submission-body.d.ts +0 -251
- package/dist/_contracts/schemas/submission-body.js +0 -378
- package/dist/_contracts/schemas/submission-environment.d.ts +0 -79
- package/dist/_contracts/schemas/submission-environment.js +0 -179
- package/dist/_contracts/schemas/submission-request.d.ts +0 -158
- package/dist/_contracts/schemas/submission-request.js +0 -49
- package/dist/_contracts/schemas/submission-secrets.d.ts +0 -47
- package/dist/_contracts/schemas/submission-secrets.js +0 -108
- package/dist/_contracts/schemas/wire.d.ts +0 -118
- package/dist/_contracts/schemas/wire.js +0 -171
- package/dist/_contracts/schemas/workspace-resources.d.ts +0 -50
- package/dist/_contracts/schemas/workspace-resources.js +0 -87
- package/dist/_contracts/sdk-errors.d.ts +0 -212
- package/dist/_contracts/sdk-errors.js +0 -313
- package/dist/_contracts/sdk-secrets.d.ts +0 -67
- package/dist/_contracts/sdk-secrets.js +0 -427
- package/dist/_contracts/session-archive.d.ts +0 -16
- package/dist/_contracts/session-archive.js +0 -92
- package/dist/_contracts/session-artifacts.d.ts +0 -189
- package/dist/_contracts/session-artifacts.js +0 -264
- package/dist/_contracts/session-config.d.ts +0 -373
- package/dist/_contracts/session-config.js +0 -562
- package/dist/_contracts/session-cost-types.d.ts +0 -211
- package/dist/_contracts/session-cost-types.js +0 -69
- package/dist/_contracts/session-cost.d.ts +0 -8
- package/dist/_contracts/session-cost.js +0 -582
- package/dist/_contracts/session-custody.d.ts +0 -165
- package/dist/_contracts/session-custody.js +0 -345
- package/dist/_contracts/session-file-query.d.ts +0 -14
- package/dist/_contracts/session-file-query.js +0 -178
- package/dist/_contracts/session-record.d.ts +0 -112
- package/dist/_contracts/session-record.js +0 -165
- package/dist/_contracts/session-retention.d.ts +0 -201
- package/dist/_contracts/session-retention.js +0 -450
- package/dist/_contracts/side-effect-audit.d.ts +0 -126
- package/dist/_contracts/side-effect-audit.js +0 -520
- package/dist/_contracts/sse.d.ts +0 -74
- package/dist/_contracts/sse.js +0 -227
- package/dist/_contracts/stable.d.ts +0 -45
- package/dist/_contracts/stable.js +0 -62
- package/dist/_contracts/status.d.ts +0 -25
- package/dist/_contracts/status.js +0 -57
- package/dist/_contracts/submission-limits.d.ts +0 -61
- package/dist/_contracts/submission-limits.js +0 -60
- package/dist/_contracts/submission.d.ts +0 -547
- package/dist/_contracts/submission.js +0 -812
- package/dist/_contracts/suggest.d.ts +0 -15
- package/dist/_contracts/suggest.js +0 -53
- package/dist/_contracts/testing/response-bindings.d.ts +0 -45
- package/dist/_contracts/testing/response-bindings.js +0 -256
- package/dist/_contracts/testing/wire-conformance-entry.d.ts +0 -10
- package/dist/_contracts/testing/wire-conformance-entry.js +0 -8
- package/dist/_contracts/testing/wire-conformance.d.ts +0 -169
- package/dist/_contracts/testing/wire-conformance.js +0 -276
- package/dist/_contracts/turn-trace.d.ts +0 -28
- package/dist/_contracts/turn-trace.js +0 -1
- package/dist/_contracts/unknown-field-error.d.ts +0 -13
- package/dist/_contracts/unknown-field-error.js +0 -21
- package/dist/_contracts/value-guards.d.ts +0 -20
- package/dist/_contracts/value-guards.js +0 -34
- package/dist/_contracts/webhook-verify.d.ts +0 -34
- package/dist/_contracts/webhook-verify.js +0 -93
- package/dist/_contracts/wire-observer.d.ts +0 -49
- package/dist/_contracts/wire-observer.js +0 -34
- package/dist/_contracts/workflow-status.d.ts +0 -7
- package/dist/_contracts/workflow-status.js +0 -43
- package/dist/_contracts/workspace-resources.d.ts +0 -98
- package/dist/_contracts/workspace-resources.js +0 -39
- package/dist/archive-limits.d.ts +0 -1
- package/dist/archive-limits.js +0 -2
- package/dist/archive-limits.js.map +0 -1
- package/dist/asset-upload.d.ts +0 -47
- package/dist/asset-upload.js +0 -269
- package/dist/asset-upload.js.map +0 -1
- package/dist/bundle.d.ts +0 -9
- package/dist/bundle.js +0 -20
- package/dist/bundle.js.map +0 -1
- package/dist/canonical-zip.d.ts +0 -68
- package/dist/canonical-zip.js +0 -355
- package/dist/canonical-zip.js.map +0 -1
- package/dist/cli.mjs +0 -12048
- package/dist/cli.mjs.sha256 +0 -1
- package/dist/client-types.d.ts +0 -192
- package/dist/client-types.js +0 -2
- package/dist/client-types.js.map +0 -1
- package/dist/client.d.ts +0 -464
- package/dist/client.js +0 -1207
- package/dist/client.js.map +0 -1
- package/dist/event-projection.d.ts +0 -22
- package/dist/event-projection.js +0 -380
- package/dist/event-projection.js.map +0 -1
- package/dist/fetch-archive.d.ts +0 -16
- package/dist/fetch-archive.js +0 -252
- package/dist/fetch-archive.js.map +0 -1
- package/dist/file.d.ts +0 -96
- package/dist/file.js +0 -272
- package/dist/file.js.map +0 -1
- package/dist/instructions.d.ts +0 -20
- package/dist/instructions.js +0 -40
- package/dist/instructions.js.map +0 -1
- package/dist/legacy-session-provider-fault.d.ts +0 -7
- package/dist/legacy-session-provider-fault.js +0 -38
- package/dist/legacy-session-provider-fault.js.map +0 -1
- package/dist/mcp-server.d.ts +0 -84
- package/dist/mcp-server.js +0 -117
- package/dist/mcp-server.js.map +0 -1
- package/dist/node-fs.d.ts +0 -29
- package/dist/node-fs.js +0 -19
- package/dist/node-fs.js.map +0 -1
- package/dist/node-walk.d.ts +0 -69
- package/dist/node-walk.js +0 -151
- package/dist/node-walk.js.map +0 -1
- package/dist/path-basename.d.ts +0 -5
- package/dist/path-basename.js +0 -9
- package/dist/path-basename.js.map +0 -1
- package/dist/retry.d.ts +0 -70
- package/dist/retry.js +0 -155
- package/dist/retry.js.map +0 -1
- package/dist/secret.d.ts +0 -65
- package/dist/secret.js +0 -110
- package/dist/secret.js.map +0 -1
- package/dist/session-validate.d.ts +0 -100
- package/dist/session-validate.js +0 -303
- package/dist/session-validate.js.map +0 -1
- package/dist/skill.d.ts +0 -99
- package/dist/skill.js +0 -169
- package/dist/skill.js.map +0 -1
- package/dist/submission-wire.d.ts +0 -13
- package/dist/submission-wire.js +0 -69
- package/dist/submission-wire.js.map +0 -1
- package/dist/tool.d.ts +0 -41
- package/dist/tool.js +0 -76
- package/dist/tool.js.map +0 -1
- package/dist/version.d.ts +0 -9
- package/dist/version.js +0 -10
- package/dist/version.js.map +0 -1
- package/docs/authentication.md +0 -125
- package/docs/billing.md +0 -164
- package/docs/cleanup.md +0 -27
- package/docs/concepts/agent-tools.md +0 -47
- package/docs/concepts/composition.md +0 -60
- package/docs/concepts/providers-and-runtimes.md +0 -121
- package/docs/concepts/sessions.md +0 -51
- package/docs/concepts/subagents.md +0 -35
- package/docs/credentials.md +0 -116
- package/docs/defaults.md +0 -51
- package/docs/errors.md +0 -258
- package/docs/events.md +0 -143
- package/docs/files.md +0 -130
- package/docs/limits-and-quotas.md +0 -114
- package/docs/limits.md +0 -51
- package/docs/mcp.md +0 -47
- package/docs/networking.md +0 -114
- package/docs/provider-runtime-capabilities.md +0 -32
- package/docs/public-surface.json +0 -73
- package/docs/quickstart.md +0 -135
- package/docs/release.md +0 -44
- package/docs/retries.md +0 -108
- package/docs/secrets.md +0 -141
- package/docs/session-config.md +0 -51
- package/docs/session-record.md +0 -58
- package/docs/skills.md +0 -65
- package/docs/telemetry.md +0 -66
- package/docs/testing.md +0 -35
- package/docs/vision-skills.md +0 -94
- package/docs/webhooks.md +0 -143
package/dist/fetch-archive.js
DELETED
|
@@ -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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"}
|