@aexhq/sdk 0.33.1 → 0.35.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/README.md +19 -27
- package/dist/_contracts/operations.d.ts +2 -54
- package/dist/_contracts/operations.js +2 -87
- package/dist/_contracts/run-config.d.ts +19 -13
- package/dist/_contracts/run-config.js +6 -33
- package/dist/_contracts/run-unit.d.ts +1 -33
- package/dist/_contracts/run-unit.js +2 -21
- package/dist/_contracts/runtime-sizes.d.ts +2 -2
- package/dist/_contracts/runtime-sizes.js +2 -2
- package/dist/_contracts/status.d.ts +2 -2
- package/dist/_contracts/status.js +3 -0
- package/dist/_contracts/submission.d.ts +80 -41
- package/dist/_contracts/submission.js +114 -52
- package/dist/agents-md.d.ts +5 -5
- package/dist/agents-md.js +7 -7
- package/dist/agents-md.js.map +1 -1
- package/dist/asset-upload.d.ts +4 -4
- package/dist/asset-upload.js +4 -4
- package/dist/bundle.d.ts +2 -2
- package/dist/bundle.js +2 -2
- package/dist/cli.mjs +369 -12918
- package/dist/cli.mjs.sha256 +1 -1
- package/dist/client.d.ts +234 -383
- package/dist/client.js +436 -648
- package/dist/client.js.map +1 -1
- package/dist/data-tools.d.ts +25 -22
- package/dist/data-tools.js +75 -62
- package/dist/data-tools.js.map +1 -1
- package/dist/fetch-archive.js +16 -16
- package/dist/fetch-archive.js.map +1 -1
- package/dist/file.d.ts +5 -5
- package/dist/file.js +7 -7
- package/dist/file.js.map +1 -1
- package/dist/index.d.ts +11 -9
- package/dist/index.js +20 -13
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +4 -4
- package/dist/mcp-server.js +4 -4
- package/dist/proxy-endpoint.d.ts +4 -4
- package/dist/proxy-endpoint.js +1 -1
- package/dist/retry.d.ts +162 -0
- package/dist/retry.js +320 -0
- package/dist/retry.js.map +1 -0
- package/dist/secret.d.ts +8 -8
- package/dist/secret.js +8 -8
- package/dist/secret.js.map +1 -1
- package/dist/skill-tool.d.ts +102 -0
- package/dist/skill-tool.js +190 -0
- package/dist/skill-tool.js.map +1 -0
- package/dist/tool.d.ts +1 -1
- package/dist/tool.js +3 -3
- package/dist/tool.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/cleanup.md +3 -3
- package/docs/concepts/agent-tools.md +6 -25
- package/docs/concepts/composition.md +15 -12
- package/docs/concepts/providers-and-runtimes.md +3 -3
- package/docs/concepts/runs.md +27 -22
- package/docs/credentials.md +52 -84
- package/docs/defaults.md +6 -6
- package/docs/events.md +65 -44
- package/docs/limits-and-quotas.md +3 -4
- package/docs/mcp.md +3 -3
- package/docs/networking.md +8 -8
- package/docs/outputs.md +44 -40
- package/docs/provider-runtime-capabilities.md +1 -1
- package/docs/public-surface.json +2 -2
- package/docs/quickstart.md +20 -10
- package/docs/retries.md +129 -0
- package/docs/run-config.md +12 -14
- package/docs/run-record.md +8 -8
- package/docs/secrets.md +16 -26
- package/docs/skills.md +55 -110
- package/docs/vision-skills.md +29 -40
- package/examples/chat-corpus.ts +8 -9
- package/examples/feature-tour.ts +301 -0
- package/package.json +1 -1
- package/dist/skill.d.ts +0 -149
- package/dist/skill.js +0 -198
- package/dist/skill.js.map +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type FetchLike, type SkillToolRef } from "./_contracts/index.js";
|
|
2
|
+
import { type SkillFiles } from "./bundle.js";
|
|
3
|
+
/**
|
|
4
|
+
* A skill re-expressed as a TOOL. `Tools.fromSkillDir` / `Tools.fromSkillUrl`
|
|
5
|
+
* read a skill folder/zip, lift the tool `name` + `description` from the
|
|
6
|
+
* `SKILL.md` YAML frontmatter, and canonically bundle+hash the bytes. The
|
|
7
|
+
* result rides in the session's `tools` array (next to builtin names and custom
|
|
8
|
+
* {@link Tool} bundles); `client.run` / `openSession` uploads the bundle as an
|
|
9
|
+
* asset before the run lands, and the wire ref becomes a
|
|
10
|
+
* `{ kind:"skill", assetId, name, description }` {@link SkillToolRef}.
|
|
11
|
+
*
|
|
12
|
+
* At run time the model calls the no-arg load-tool to pull the skill's
|
|
13
|
+
* `SKILL.md` body into context; the bundle's files are eagerly staged to
|
|
14
|
+
* `/workspace/skills/<name>/`.
|
|
15
|
+
*
|
|
16
|
+
* Asset deduplication makes the same bytes a no-op upload on subsequent runs.
|
|
17
|
+
* A URL is an ingestion source, not a persistent reference.
|
|
18
|
+
*/
|
|
19
|
+
export declare class SkillTool {
|
|
20
|
+
#private;
|
|
21
|
+
/** Internal constructor. Use the `Tools.fromSkill*` factories. */
|
|
22
|
+
private constructor();
|
|
23
|
+
/**
|
|
24
|
+
* The wire-level reference. Returns the SDK-private draft shape for
|
|
25
|
+
* un-uploaded skill-tools (kind:"draft", with name + description +
|
|
26
|
+
* contentHash). `client.run` / `openSession` walks these and uploads them
|
|
27
|
+
* before the run lands.
|
|
28
|
+
*/
|
|
29
|
+
get ref(): SkillToolRef | DraftSkillToolRef;
|
|
30
|
+
/** True for local-bytes skill-tools that haven't been uploaded yet. */
|
|
31
|
+
get isDraft(): boolean;
|
|
32
|
+
/** Internal: the asset id resolved on a prior use, or undefined. */
|
|
33
|
+
get _cachedAssetId(): string | undefined;
|
|
34
|
+
/** Internal: remember the asset id resolved for this draft's bytes. */
|
|
35
|
+
_rememberAsset(assetId: string): void;
|
|
36
|
+
/** Internal: build a draft from an already-loaded skill files map. */
|
|
37
|
+
static _fromFiles(source: string, files: SkillFiles, nameOverride: string | undefined): Promise<SkillTool>;
|
|
38
|
+
/**
|
|
39
|
+
* Internal: yield the draft's bytes + metadata so `client.run` / `openSession`
|
|
40
|
+
* can upload the asset. Idempotent (non-consuming): a SkillTool is reusable
|
|
41
|
+
* across sessions — the first use caches the resolved asset id (see
|
|
42
|
+
* `_rememberAsset`) so later uses reuse it instead of re-uploading.
|
|
43
|
+
*
|
|
44
|
+
* Returns undefined for already-uploaded skill-tools.
|
|
45
|
+
*/
|
|
46
|
+
_takeDraftBundle(): {
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
contentHash: string;
|
|
50
|
+
bytes: Uint8Array;
|
|
51
|
+
} | undefined;
|
|
52
|
+
toJSON(): SkillToolRef;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* SDK-internal draft skill-tool marker. Never reaches the wire; the
|
|
56
|
+
* materialize step inside `client.run` / `openSession` converts these to
|
|
57
|
+
* `kind:"skill"` refs once the bundle is uploaded.
|
|
58
|
+
*/
|
|
59
|
+
export interface DraftSkillToolRef {
|
|
60
|
+
readonly kind: "draft";
|
|
61
|
+
readonly name: string;
|
|
62
|
+
readonly description: string;
|
|
63
|
+
readonly contentHash: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Factory namespace for skill-tools. Each factory reads a skill bundle, lifts
|
|
67
|
+
* `name` + `description` from the `SKILL.md` frontmatter (an explicit `name`
|
|
68
|
+
* argument overrides the frontmatter), and produces a {@link SkillTool} to pass
|
|
69
|
+
* in the session's `tools` array.
|
|
70
|
+
*/
|
|
71
|
+
export declare const Tools: {
|
|
72
|
+
/**
|
|
73
|
+
* Read a local skill directory and build a skill-tool. The directory must
|
|
74
|
+
* contain `SKILL.md` at its root, whose YAML frontmatter provides the tool
|
|
75
|
+
* `name` (unless overridden via `args.name`) and `description`. Symlinks and
|
|
76
|
+
* non-regular files are skipped. Bun/Node filesystem runtimes only.
|
|
77
|
+
*/
|
|
78
|
+
readonly fromSkillDir: (rootDir: string, args?: {
|
|
79
|
+
readonly name?: string;
|
|
80
|
+
}) => Promise<SkillTool>;
|
|
81
|
+
/**
|
|
82
|
+
* Fetch a zip-archived skill from a URL and build a skill-tool. The archive is
|
|
83
|
+
* downloaded in the SDK process, so the URL is caller-controlled — host the
|
|
84
|
+
* skill yourself and pass a temporary signed URL (e.g. an S3 presigned URL).
|
|
85
|
+
* Its bytes are optionally integrity-checked against `sha256`, unzipped, and
|
|
86
|
+
* reduced to the same files map as `Tools.fromSkillDir`, so a URL-sourced
|
|
87
|
+
* skill and the identical local skill produce the same canonical asset and
|
|
88
|
+
* dedup against each other.
|
|
89
|
+
*
|
|
90
|
+
* The archive must contain `SKILL.md` at its root, or inside a single
|
|
91
|
+
* top-level folder (which is stripped). The signed URL only needs to be valid
|
|
92
|
+
* for this call; `client.run` / `openSession` snapshots the bytes into the run.
|
|
93
|
+
*
|
|
94
|
+
* Universal (Bun / Node 18+ / browser): requires a global `fetch`, or pass one.
|
|
95
|
+
*/
|
|
96
|
+
readonly fromSkillUrl: (url: string, args?: {
|
|
97
|
+
readonly name?: string;
|
|
98
|
+
readonly sha256?: string;
|
|
99
|
+
readonly timeoutMs?: number;
|
|
100
|
+
readonly fetch?: FetchLike;
|
|
101
|
+
}) => Promise<SkillTool>;
|
|
102
|
+
};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { TOOL_NAME_PATTERN } from "./_contracts/index.js";
|
|
2
|
+
import { bundleSkillFiles, hashSkillBundle } from "./bundle.js";
|
|
3
|
+
import { fetchSkillArchive } from "./fetch-archive.js";
|
|
4
|
+
import { readDirectoryAsFiles } from "./node-fs.js";
|
|
5
|
+
/**
|
|
6
|
+
* A skill re-expressed as a TOOL. `Tools.fromSkillDir` / `Tools.fromSkillUrl`
|
|
7
|
+
* read a skill folder/zip, lift the tool `name` + `description` from the
|
|
8
|
+
* `SKILL.md` YAML frontmatter, and canonically bundle+hash the bytes. The
|
|
9
|
+
* result rides in the session's `tools` array (next to builtin names and custom
|
|
10
|
+
* {@link Tool} bundles); `client.run` / `openSession` uploads the bundle as an
|
|
11
|
+
* asset before the run lands, and the wire ref becomes a
|
|
12
|
+
* `{ kind:"skill", assetId, name, description }` {@link SkillToolRef}.
|
|
13
|
+
*
|
|
14
|
+
* At run time the model calls the no-arg load-tool to pull the skill's
|
|
15
|
+
* `SKILL.md` body into context; the bundle's files are eagerly staged to
|
|
16
|
+
* `/workspace/skills/<name>/`.
|
|
17
|
+
*
|
|
18
|
+
* Asset deduplication makes the same bytes a no-op upload on subsequent runs.
|
|
19
|
+
* A URL is an ingestion source, not a persistent reference.
|
|
20
|
+
*/
|
|
21
|
+
export class SkillTool {
|
|
22
|
+
#ref;
|
|
23
|
+
#inlineBytes;
|
|
24
|
+
/** Asset id cached after the first use, so reuse skips a re-upload. */
|
|
25
|
+
#assetId;
|
|
26
|
+
/** Internal constructor. Use the `Tools.fromSkill*` factories. */
|
|
27
|
+
constructor(ref, inlineBytes) {
|
|
28
|
+
this.#ref = ref;
|
|
29
|
+
this.#inlineBytes = inlineBytes;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The wire-level reference. Returns the SDK-private draft shape for
|
|
33
|
+
* un-uploaded skill-tools (kind:"draft", with name + description +
|
|
34
|
+
* contentHash). `client.run` / `openSession` walks these and uploads them
|
|
35
|
+
* before the run lands.
|
|
36
|
+
*/
|
|
37
|
+
get ref() {
|
|
38
|
+
return this.#ref;
|
|
39
|
+
}
|
|
40
|
+
/** True for local-bytes skill-tools that haven't been uploaded yet. */
|
|
41
|
+
get isDraft() {
|
|
42
|
+
return this.#ref.kind === "draft";
|
|
43
|
+
}
|
|
44
|
+
/** Internal: the asset id resolved on a prior use, or undefined. */
|
|
45
|
+
get _cachedAssetId() {
|
|
46
|
+
return this.#assetId;
|
|
47
|
+
}
|
|
48
|
+
/** Internal: remember the asset id resolved for this draft's bytes. */
|
|
49
|
+
_rememberAsset(assetId) {
|
|
50
|
+
this.#assetId = assetId;
|
|
51
|
+
}
|
|
52
|
+
/** Internal: build a draft from an already-loaded skill files map. */
|
|
53
|
+
static async _fromFiles(source, files, nameOverride) {
|
|
54
|
+
const front = extractSkillFrontmatter(source, files);
|
|
55
|
+
const name = nameOverride ?? front.name;
|
|
56
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
57
|
+
throw new Error(`${source}: a skill name is required — pass { name } or add a \`name:\` field to the SKILL.md YAML frontmatter`);
|
|
58
|
+
}
|
|
59
|
+
if (!TOOL_NAME_PATTERN.test(name)) {
|
|
60
|
+
throw new Error(`${source}: name must match ${TOOL_NAME_PATTERN.source}`);
|
|
61
|
+
}
|
|
62
|
+
if (name.includes("__")) {
|
|
63
|
+
throw new Error(`${source}: name must not contain "__"; that separator is reserved for MCP tools`);
|
|
64
|
+
}
|
|
65
|
+
const description = front.description;
|
|
66
|
+
if (typeof description !== "string" || description.trim().length === 0) {
|
|
67
|
+
throw new Error(`${source}: a skill description is required — add a \`description:\` field to the SKILL.md YAML frontmatter`);
|
|
68
|
+
}
|
|
69
|
+
if (description.length > 2048) {
|
|
70
|
+
throw new Error(`${source}: description must be <= 2048 chars`);
|
|
71
|
+
}
|
|
72
|
+
const bundled = bundleSkillFiles(files);
|
|
73
|
+
const contentHash = await hashSkillBundle(bundled.zip);
|
|
74
|
+
const ref = { kind: "draft", name, description, contentHash };
|
|
75
|
+
return new SkillTool(ref, bundled.zip);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Internal: yield the draft's bytes + metadata so `client.run` / `openSession`
|
|
79
|
+
* can upload the asset. Idempotent (non-consuming): a SkillTool is reusable
|
|
80
|
+
* across sessions — the first use caches the resolved asset id (see
|
|
81
|
+
* `_rememberAsset`) so later uses reuse it instead of re-uploading.
|
|
82
|
+
*
|
|
83
|
+
* Returns undefined for already-uploaded skill-tools.
|
|
84
|
+
*/
|
|
85
|
+
_takeDraftBundle() {
|
|
86
|
+
if (this.#ref.kind !== "draft" || !this.#inlineBytes) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
name: this.#ref.name,
|
|
91
|
+
description: this.#ref.description,
|
|
92
|
+
contentHash: this.#ref.contentHash,
|
|
93
|
+
bytes: this.#inlineBytes
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
toJSON() {
|
|
97
|
+
if (this.#ref.kind === "draft") {
|
|
98
|
+
throw new Error("SkillTool: draft skill-tools cannot be JSON-serialised — they only become wire refs when " +
|
|
99
|
+
"aex.run / openSession uploads the bytes as an asset.");
|
|
100
|
+
}
|
|
101
|
+
return this.#ref;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Factory namespace for skill-tools. Each factory reads a skill bundle, lifts
|
|
106
|
+
* `name` + `description` from the `SKILL.md` frontmatter (an explicit `name`
|
|
107
|
+
* argument overrides the frontmatter), and produces a {@link SkillTool} to pass
|
|
108
|
+
* in the session's `tools` array.
|
|
109
|
+
*/
|
|
110
|
+
export const Tools = {
|
|
111
|
+
/**
|
|
112
|
+
* Read a local skill directory and build a skill-tool. The directory must
|
|
113
|
+
* contain `SKILL.md` at its root, whose YAML frontmatter provides the tool
|
|
114
|
+
* `name` (unless overridden via `args.name`) and `description`. Symlinks and
|
|
115
|
+
* non-regular files are skipped. Bun/Node filesystem runtimes only.
|
|
116
|
+
*/
|
|
117
|
+
async fromSkillDir(rootDir, args = {}) {
|
|
118
|
+
const files = await readDirectoryAsFiles(rootDir);
|
|
119
|
+
return SkillTool._fromFiles("Tools.fromSkillDir", files, args.name);
|
|
120
|
+
},
|
|
121
|
+
/**
|
|
122
|
+
* Fetch a zip-archived skill from a URL and build a skill-tool. The archive is
|
|
123
|
+
* downloaded in the SDK process, so the URL is caller-controlled — host the
|
|
124
|
+
* skill yourself and pass a temporary signed URL (e.g. an S3 presigned URL).
|
|
125
|
+
* Its bytes are optionally integrity-checked against `sha256`, unzipped, and
|
|
126
|
+
* reduced to the same files map as `Tools.fromSkillDir`, so a URL-sourced
|
|
127
|
+
* skill and the identical local skill produce the same canonical asset and
|
|
128
|
+
* dedup against each other.
|
|
129
|
+
*
|
|
130
|
+
* The archive must contain `SKILL.md` at its root, or inside a single
|
|
131
|
+
* top-level folder (which is stripped). The signed URL only needs to be valid
|
|
132
|
+
* for this call; `client.run` / `openSession` snapshots the bytes into the run.
|
|
133
|
+
*
|
|
134
|
+
* Universal (Bun / Node 18+ / browser): requires a global `fetch`, or pass one.
|
|
135
|
+
*/
|
|
136
|
+
async fromSkillUrl(url, args = {}) {
|
|
137
|
+
const files = await fetchSkillArchive(url, {
|
|
138
|
+
...(args.sha256 !== undefined ? { sha256: args.sha256 } : {}),
|
|
139
|
+
...(args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}),
|
|
140
|
+
...(args.fetch !== undefined ? { fetch: args.fetch } : {})
|
|
141
|
+
});
|
|
142
|
+
return SkillTool._fromFiles("Tools.fromSkillUrl", files, args.name);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Read `SKILL.md` from a bundle files map and parse its YAML frontmatter for
|
|
147
|
+
* the `name` + `description` fields. Throws when the bundle has no root
|
|
148
|
+
* `SKILL.md` (that is what makes a bundle a skill).
|
|
149
|
+
*/
|
|
150
|
+
function extractSkillFrontmatter(source, files) {
|
|
151
|
+
const raw = files["SKILL.md"];
|
|
152
|
+
if (raw === undefined) {
|
|
153
|
+
throw new Error(`${source}: the skill bundle must contain a SKILL.md at its root`);
|
|
154
|
+
}
|
|
155
|
+
const text = typeof raw === "string" ? raw : new TextDecoder().decode(raw);
|
|
156
|
+
return parseSkillFrontmatter(text);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Minimal YAML-frontmatter reader: pulls the `name` and `description` scalar
|
|
160
|
+
* values out of the leading `--- … ---` block. Only simple single-line
|
|
161
|
+
* `key: value` entries are supported (surrounding single/double quotes are
|
|
162
|
+
* stripped); anything else is ignored. A skill with no frontmatter yields an
|
|
163
|
+
* empty result and the caller reports the missing field.
|
|
164
|
+
*/
|
|
165
|
+
function parseSkillFrontmatter(text) {
|
|
166
|
+
const src = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
167
|
+
const match = /^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/.exec(src);
|
|
168
|
+
if (!match) {
|
|
169
|
+
return {};
|
|
170
|
+
}
|
|
171
|
+
const out = {};
|
|
172
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
173
|
+
const kv = /^([A-Za-z0-9_-]+)[ \t]*:[ \t]*(.*)$/.exec(line);
|
|
174
|
+
if (!kv)
|
|
175
|
+
continue;
|
|
176
|
+
const key = kv[1].toLowerCase();
|
|
177
|
+
if (key !== "name" && key !== "description")
|
|
178
|
+
continue;
|
|
179
|
+
let value = kv[2].trim();
|
|
180
|
+
if (value.length >= 2 &&
|
|
181
|
+
((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'")))) {
|
|
182
|
+
value = value.slice(1, -1);
|
|
183
|
+
}
|
|
184
|
+
if (value.length > 0) {
|
|
185
|
+
out[key] = value;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=skill-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-tool.js","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class Tool {
|
|
|
12
12
|
private constructor();
|
|
13
13
|
get ref(): ToolRef | DraftToolRef;
|
|
14
14
|
get isDraft(): boolean;
|
|
15
|
-
/** Internal: the asset id resolved on a prior
|
|
15
|
+
/** Internal: the asset id resolved on a prior use, or undefined. */
|
|
16
16
|
get _cachedAssetId(): string | undefined;
|
|
17
17
|
/** Internal: remember the asset id resolved for this draft's bytes. */
|
|
18
18
|
_rememberAsset(assetId: string): void;
|
package/dist/tool.js
CHANGED
|
@@ -4,7 +4,7 @@ import { readDirectoryAsFiles } from "./node-fs.js";
|
|
|
4
4
|
export class Tool {
|
|
5
5
|
#ref;
|
|
6
6
|
#inlineBytes;
|
|
7
|
-
/** Asset id cached after the first
|
|
7
|
+
/** Asset id cached after the first use, so reuse skips a re-upload. */
|
|
8
8
|
#assetId;
|
|
9
9
|
constructor(ref, inlineBytes) {
|
|
10
10
|
this.#ref = ref;
|
|
@@ -16,7 +16,7 @@ export class Tool {
|
|
|
16
16
|
get isDraft() {
|
|
17
17
|
return this.#ref.kind === "draft";
|
|
18
18
|
}
|
|
19
|
-
/** Internal: the asset id resolved on a prior
|
|
19
|
+
/** Internal: the asset id resolved on a prior use, or undefined. */
|
|
20
20
|
get _cachedAssetId() {
|
|
21
21
|
return this.#assetId;
|
|
22
22
|
}
|
|
@@ -90,7 +90,7 @@ export class Tool {
|
|
|
90
90
|
}
|
|
91
91
|
toJSON() {
|
|
92
92
|
if (this.#ref.kind === "draft") {
|
|
93
|
-
throw new Error("Tool: draft Tools cannot be JSON-serialised — they only become wire refs when
|
|
93
|
+
throw new Error("Tool: draft Tools cannot be JSON-serialised — they only become wire refs when aex.run / openSession uploads the bytes as an asset.");
|
|
94
94
|
}
|
|
95
95
|
return this.#ref;
|
|
96
96
|
}
|
package/dist/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EAIzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,eAAe,EAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAUpD,MAAM,OAAO,IAAI;IACN,IAAI,CAAyB;IAC7B,YAAY,CAAyB;IAC9C,
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/docs/cleanup.md
CHANGED
|
@@ -17,10 +17,10 @@ retention field is rejected if supplied.
|
|
|
17
17
|
```ts
|
|
18
18
|
import { Models } from "@aexhq/sdk";
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
await aex.run({
|
|
21
21
|
model: Models.CLAUDE_HAIKU_4_5,
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
message: "...",
|
|
23
|
+
apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! }
|
|
24
24
|
});
|
|
25
25
|
```
|
|
26
26
|
|
|
@@ -4,9 +4,7 @@ description: The default builtin tools available inside managed runs.
|
|
|
4
4
|
icon: TerminalSquare
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Managed runs inject
|
|
8
|
-
default set is every builtin tool EXCEPT `notebook_edit` (notebook editing is
|
|
9
|
-
opt-in). It includes:
|
|
7
|
+
Managed runs inject the complete builtin tool set into the agent by default:
|
|
10
8
|
|
|
11
9
|
- `bash`, `code_execution` — run shell commands / model-written snippets
|
|
12
10
|
- `read_file`, `write_file`, `edit_file` — file read/create/patch
|
|
@@ -28,29 +26,12 @@ or pure-custom run where every tool comes from `mcpServers` or `tools`.
|
|
|
28
26
|
## Cherry-picking builtins
|
|
29
27
|
|
|
30
28
|
The `tools` list accepts both custom tool bundles and BUILTIN tool references
|
|
31
|
-
(bare name strings, preferably `BuiltinTools.<name>`). Use
|
|
32
|
-
to
|
|
33
|
-
subset alongside `includeBuiltinTools: false`.
|
|
29
|
+
(bare name strings, preferably `BuiltinTools.<name>`). Use builtin references
|
|
30
|
+
to pick a narrow subset alongside `includeBuiltinTools: false`.
|
|
34
31
|
|
|
35
32
|
The final tool list is ordered: resolved builtin tools, then custom tools, then
|
|
36
33
|
MCP tools.
|
|
37
34
|
|
|
38
|
-
## Optional notebook support
|
|
39
|
-
|
|
40
|
-
`notebook_edit` edits Jupyter `.ipynb` cells as JSON. It is NOT in the default
|
|
41
|
-
builtin set; add it via `tools`:
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
import { BuiltinTools, Models } from "@aexhq/sdk";
|
|
45
|
-
|
|
46
|
-
await aex.submit({
|
|
47
|
-
model: Models.CLAUDE_HAIKU_4_5,
|
|
48
|
-
prompt: "Edit the analysis notebook.",
|
|
49
|
-
tools: [BuiltinTools.notebook_edit],
|
|
50
|
-
secrets: { apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! } }
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
35
|
Networking is open by default: the agent may reach any public host, subject to a
|
|
55
36
|
fixed SSRF deny-list. `web_fetch` and `web_search` reach the network over a
|
|
56
37
|
managed, SSRF-guarded path that is **not** governed by `environment.networking`,
|
|
@@ -64,11 +45,11 @@ See [Networking](../networking.md).
|
|
|
64
45
|
```ts
|
|
65
46
|
import { Models } from "@aexhq/sdk";
|
|
66
47
|
|
|
67
|
-
await aex.
|
|
48
|
+
await aex.run({
|
|
68
49
|
model: Models.CLAUDE_HAIKU_4_5,
|
|
69
|
-
|
|
50
|
+
message: "Use only the declared MCP tools.",
|
|
70
51
|
mcpServers,
|
|
71
52
|
includeBuiltinTools: false,
|
|
72
|
-
|
|
53
|
+
apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! }
|
|
73
54
|
});
|
|
74
55
|
```
|
|
@@ -4,40 +4,43 @@ description: The primitives used to assemble each run.
|
|
|
4
4
|
icon: Blocks
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
aex composes an agent from explicit per-
|
|
8
|
-
bytes before
|
|
9
|
-
before the first agent turn.
|
|
7
|
+
aex composes an agent from explicit per-session inputs. The SDK materializes local
|
|
8
|
+
bytes before the session lands and the platform mounts them into the managed
|
|
9
|
+
runtime before the first agent turn.
|
|
10
10
|
|
|
11
11
|
| Need | Primitive |
|
|
12
12
|
| --- | --- |
|
|
13
|
-
| Executable or instructional bundles | `
|
|
13
|
+
| Executable or instructional skill bundles (load-tools) | `Tools.fromSkillDir`, `Tools.fromSkillUrl` |
|
|
14
14
|
| Agent instructions | `AgentsMd.fromPath`, `AgentsMd.fromContent` |
|
|
15
15
|
| Reference files and folders | `File.fromPath`, `File.fromBytes` |
|
|
16
16
|
| Remote tools | `McpServer.remote`, `McpServer.fromId` |
|
|
17
17
|
| Credentialed HTTP APIs | `ProxyEndpoint.none`, `bearer`, `basic`, `header`, `query` |
|
|
18
|
-
| Non-secret runtime settings | `environment.
|
|
18
|
+
| Non-secret runtime settings | `environment.variables`, `environment.packages`, `environment.networking` |
|
|
19
19
|
|
|
20
20
|
```ts
|
|
21
|
-
import { AgentsMd, File, McpServer, Models, ProxyEndpoint,
|
|
21
|
+
import { AgentsMd, File, McpServer, Models, ProxyEndpoint, Tools } from "@aexhq/sdk";
|
|
22
22
|
|
|
23
|
-
await aex.
|
|
23
|
+
await aex.run({
|
|
24
24
|
model: Models.CLAUDE_HAIKU_4_5,
|
|
25
|
-
|
|
25
|
+
message: "Use the attached docs and tools to produce a report.",
|
|
26
26
|
agentsMd: [AgentsMd.fromContent("Follow the repo conventions.")],
|
|
27
27
|
files: [await File.fromPath("./input")],
|
|
28
|
-
|
|
28
|
+
tools: [await Tools.fromSkillDir("./skills/report-writer", { name: "report-writer" })],
|
|
29
29
|
mcpServers: [McpServer.remote({ name: "github", url: "https://example.com/mcp" })],
|
|
30
30
|
proxyEndpoints: [
|
|
31
31
|
ProxyEndpoint.bearer({
|
|
32
32
|
name: "internal-api",
|
|
33
33
|
baseUrl: "https://api.example.com",
|
|
34
|
+
token: process.env.INTERNAL_API_TOKEN!,
|
|
34
35
|
allowMethods: ["GET"],
|
|
35
36
|
allowPathPrefixes: ["/v1/"]
|
|
36
37
|
})
|
|
37
38
|
],
|
|
38
|
-
|
|
39
|
+
apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! }
|
|
39
40
|
});
|
|
40
41
|
```
|
|
41
42
|
|
|
42
|
-
Secrets stay out of reusable configs.
|
|
43
|
-
auth
|
|
43
|
+
Secrets stay out of reusable configs. Provider keys go in the top-level `apiKeys`
|
|
44
|
+
map; MCP auth rides on each `McpServer` instance and proxy auth on each
|
|
45
|
+
`ProxyEndpoint` instance — the SDK splits them into the vaulted secrets channel
|
|
46
|
+
server-side, so they never live in a shareable config object.
|
|
@@ -26,11 +26,11 @@ All submissions run on the managed runtime. There is no public runtime selector;
|
|
|
26
26
|
```ts
|
|
27
27
|
import { Models, Providers } from "@aexhq/sdk";
|
|
28
28
|
|
|
29
|
-
await aex.
|
|
29
|
+
await aex.run({
|
|
30
30
|
provider: Providers.OPENAI,
|
|
31
31
|
model: Models.GPT_4_1,
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
message: "Summarise the attached files.",
|
|
33
|
+
apiKeys: { openai: process.env.OPENAI_API_KEY! }
|
|
34
34
|
});
|
|
35
35
|
```
|
|
36
36
|
|
package/docs/concepts/runs.md
CHANGED
|
@@ -4,40 +4,45 @@ description: The durable unit aex submits, observes, and archives.
|
|
|
4
4
|
icon: Play
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
A run is
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
A run is a durable, resumable **session**: the model, system message, composition
|
|
8
|
+
primitives, output policy, and per-provider keys you open it with, plus every
|
|
9
|
+
turn you send to it. aex snapshots the non-secret inputs, holds secrets for the
|
|
10
|
+
session lifecycle, dispatches each turn through the managed runtime, and records
|
|
11
|
+
status, typed events, and outputs. Sessions are the low-level API; `run()` is the
|
|
12
|
+
one-shot convenience wrapper over them.
|
|
12
13
|
|
|
13
14
|
```ts
|
|
14
|
-
import {
|
|
15
|
+
import { Aex, Models } from "@aexhq/sdk";
|
|
15
16
|
|
|
16
|
-
const aex = new
|
|
17
|
+
const aex = new Aex({ apiToken: process.env.AEX_API_TOKEN! });
|
|
17
18
|
|
|
18
|
-
const
|
|
19
|
+
const session = await aex.openSession({
|
|
19
20
|
provider: "anthropic",
|
|
20
21
|
model: Models.CLAUDE_HAIKU_4_5,
|
|
21
|
-
|
|
22
|
-
secrets: { apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! } }
|
|
22
|
+
apiKeys: { anthropic: process.env.ANTHROPIC_API_KEY! }
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const turn = session.send("Write the report and save it as a file.");
|
|
26
|
+
for await (const event of turn) {
|
|
26
27
|
console.log(event.type);
|
|
27
28
|
}
|
|
29
|
+
await turn.done();
|
|
28
30
|
|
|
29
|
-
await
|
|
30
|
-
await
|
|
31
|
+
await session.wait();
|
|
32
|
+
await session.download({ to: "./session.zip" });
|
|
31
33
|
```
|
|
32
34
|
|
|
33
|
-
The same durable record backs SDK and CLI reads.
|
|
34
|
-
`
|
|
35
|
-
|
|
35
|
+
The same durable record backs SDK and CLI reads. From the handle use `refresh`,
|
|
36
|
+
`unit`, `wait`, and `download` for lifecycle, plus the grouped read accessors —
|
|
37
|
+
`messages()`, `events()`, and `outputs()` (each with `list()`/`last()`/`first()`,
|
|
38
|
+
and `events().stream()` / `events().streamEnvelopes()` / `outputs().read(...)` for
|
|
39
|
+
streaming and byte-capped reads) — to inspect the session live or after it parks;
|
|
40
|
+
from the client, `aex.sessions.list()` / `aex.sessions.get(id)` read across the
|
|
41
|
+
workspace.
|
|
36
42
|
|
|
37
|
-
Use `idempotencyKey` when retrying
|
|
38
|
-
the normalized non-secret submission, so a retry with the
|
|
39
|
-
returns the existing
|
|
40
|
-
conflict.
|
|
43
|
+
Use `idempotencyKey` when retrying `openSession` or `send` from your own
|
|
44
|
+
workflow. aex hashes the normalized non-secret submission, so a retry with the
|
|
45
|
+
same key and same body returns the existing session while a mismatched body fails
|
|
46
|
+
with an idempotency conflict.
|
|
41
47
|
|
|
42
|
-
aex selects product placement server-side. There is no
|
|
43
|
-
selector.
|
|
48
|
+
aex selects product placement server-side. There is no region selector.
|