@aexhq/sdk 0.24.0 → 0.25.1

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 (64) hide show
  1. package/README.md +36 -125
  2. package/dist/_contracts/index.d.ts +0 -1
  3. package/dist/_contracts/index.js +0 -1
  4. package/dist/_contracts/models.js +1 -2
  5. package/dist/_contracts/operations.d.ts +13 -5
  6. package/dist/_contracts/operations.js +220 -10
  7. package/dist/_contracts/provider-support.d.ts +18 -29
  8. package/dist/_contracts/provider-support.js +3 -22
  9. package/dist/_contracts/proxy-protocol.d.ts +4 -2
  10. package/dist/_contracts/proxy-protocol.js +10 -3
  11. package/dist/_contracts/run-config.d.ts +28 -4
  12. package/dist/_contracts/run-config.js +10 -5
  13. package/dist/_contracts/run-cost.d.ts +3 -11
  14. package/dist/_contracts/run-cost.js +2 -57
  15. package/dist/_contracts/run-custody.d.ts +1 -52
  16. package/dist/_contracts/run-custody.js +3 -87
  17. package/dist/_contracts/run-retention.d.ts +1 -5
  18. package/dist/_contracts/run-retention.js +2 -14
  19. package/dist/_contracts/run-unit.d.ts +2 -2
  20. package/dist/_contracts/run-unit.js +3 -1
  21. package/dist/_contracts/runtime-security-profile.js +1 -1
  22. package/dist/_contracts/runtime-types.d.ts +38 -12
  23. package/dist/_contracts/side-effect-audit.d.ts +4 -5
  24. package/dist/_contracts/side-effect-audit.js +1 -4
  25. package/dist/_contracts/status.d.ts +3 -4
  26. package/dist/_contracts/status.js +3 -8
  27. package/dist/_contracts/submission.d.ts +68 -42
  28. package/dist/_contracts/submission.js +144 -30
  29. package/dist/bundle.d.ts +13 -0
  30. package/dist/bundle.js +51 -0
  31. package/dist/bundle.js.map +1 -1
  32. package/dist/cli.mjs +232 -58
  33. package/dist/cli.mjs.sha256 +1 -1
  34. package/dist/client.d.ts +25 -21
  35. package/dist/client.js +59 -15
  36. package/dist/client.js.map +1 -1
  37. package/dist/index.d.ts +6 -5
  38. package/dist/index.js +4 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/tool.d.ts +41 -0
  41. package/dist/tool.js +138 -0
  42. package/dist/tool.js.map +1 -0
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/docs/concepts/agent-tools.md +53 -0
  46. package/docs/concepts/composition.md +43 -0
  47. package/docs/concepts/providers-and-runtimes.md +53 -0
  48. package/docs/concepts/runs.md +40 -0
  49. package/docs/credentials.md +8 -4
  50. package/docs/events.md +12 -0
  51. package/docs/limits.md +53 -0
  52. package/docs/outputs.md +58 -0
  53. package/docs/provider-runtime-capabilities.md +53 -55
  54. package/docs/public-surface.json +81 -0
  55. package/docs/quickstart.md +28 -105
  56. package/docs/release.md +1 -1
  57. package/docs/run-config.md +2 -2
  58. package/docs/secrets.md +123 -0
  59. package/docs/skills.md +3 -3
  60. package/docs/vision-skills.md +14 -19
  61. package/package.json +2 -2
  62. package/dist/_contracts/managed-key.d.ts +0 -101
  63. package/dist/_contracts/managed-key.js +0 -181
  64. package/docs/product-boundaries.md +0 -57
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: Composition
3
+ description: The primitives used to assemble each run.
4
+ icon: Blocks
5
+ ---
6
+
7
+ aex composes an agent from explicit per-run inputs. The SDK materializes local
8
+ bytes before submission and the platform mounts them into the managed runtime
9
+ before the first agent turn.
10
+
11
+ | Need | Primitive |
12
+ | --- | --- |
13
+ | Executable or instructional bundles | `Skill.fromPath`, `Skill.fromFiles`, `Skill.fromUrl`, `Skill.fromCatalog` |
14
+ | Agent instructions | `AgentsMd.fromPath`, `AgentsMd.fromContent` |
15
+ | Reference files and folders | `File.fromPath`, `File.fromBytes` |
16
+ | Remote tools | `McpServer.remote`, `McpServer.fromId` |
17
+ | Credentialed HTTP APIs | `ProxyEndpoint.none`, `bearer`, `basic`, `header`, `query` |
18
+ | Non-secret runtime settings | `environment.envVars`, `environment.packages`, `environment.networking` |
19
+
20
+ ```ts
21
+ import { AgentsMd, File, McpServer, Models, ProxyEndpoint, Skill } from "@aexhq/sdk";
22
+
23
+ await aex.submit({
24
+ model: Models.CLAUDE_HAIKU_4_5,
25
+ prompt: "Use the attached docs and tools to produce a report.",
26
+ agentsMd: [AgentsMd.fromContent("Follow the repo conventions.")],
27
+ files: [await File.fromPath("./input")],
28
+ skills: [await Skill.fromPath("./skills/report-writer", { name: "report-writer" })],
29
+ mcpServers: [McpServer.remote({ name: "github", url: "https://example.com/mcp" })],
30
+ proxyEndpoints: [
31
+ ProxyEndpoint.bearer({
32
+ name: "internal-api",
33
+ baseUrl: "https://api.example.com",
34
+ allowMethods: ["GET"],
35
+ allowPathPrefixes: ["/v1/"]
36
+ })
37
+ ],
38
+ secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }
39
+ });
40
+ ```
41
+
42
+ Secrets stay out of reusable configs. Put provider keys, MCP auth, and proxy
43
+ auth in the `secrets` bundle on the concrete submit call.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: Providers & runtimes
3
+ description: How provider selection maps to managed runtime execution.
4
+ icon: Network
5
+ ---
6
+
7
+ aex exposes one submission shape across supported providers:
8
+
9
+ | Provider | Selector |
10
+ | --- | --- |
11
+ | Anthropic | `Providers.ANTHROPIC` |
12
+ | DeepSeek | `Providers.DEEPSEEK` |
13
+ | OpenAI | `Providers.OPENAI` |
14
+ | Gemini | `Providers.GEMINI` |
15
+ | Mistral | `Providers.MISTRAL` |
16
+ | OpenRouter | `Providers.OPENROUTER` |
17
+ | Doubao | `Providers.DOUBAO` |
18
+ | Doubao China | `Providers.DOUBAO_CN` |
19
+
20
+ All submissions run on the managed runtime. Omit `runtime` or pass
21
+ `runtime: "managed"`; `runtime: "native"` is rejected before any runtime side
22
+ effect.
23
+
24
+ ## Selection
25
+
26
+ ### TypeScript
27
+
28
+ ```ts
29
+ import { Models, Providers } from "@aexhq/sdk";
30
+
31
+ await aex.submit({
32
+ provider: Providers.OPENAI,
33
+ model: Models.GPT_4_1,
34
+ prompt: "Summarise the attached files.",
35
+ secrets: { apiKey: process.env.OPENAI_API_KEY! }
36
+ });
37
+ ```
38
+
39
+ ### CLI
40
+
41
+ ```bash
42
+ aex run \
43
+ --api-token "$AEX_API_TOKEN" \
44
+ --provider openai \
45
+ --openai-api-key "$OPENAI_API_KEY" \
46
+ --model gpt-4.1 \
47
+ --prompt "Summarise the attached files." \
48
+ --follow
49
+ ```
50
+
51
+ Events, outputs, cleanup, and downloads use the same SDK and CLI surface for
52
+ every provider. For the exact supported model list, use the generated
53
+ [provider/runtime capability matrix](../provider-runtime-capabilities.md).
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Runs
3
+ description: The durable unit aex submits, observes, and archives.
4
+ icon: Play
5
+ ---
6
+
7
+ A run is an immutable request to execute an autonomous agent task. The caller
8
+ submits the model, prompt, optional system message, composition primitives,
9
+ output policy, and one inline secrets bundle. aex snapshots the non-secret
10
+ inputs, holds secrets for the run lifecycle, dispatches through the managed
11
+ runtime, and records status, typed events, and outputs.
12
+
13
+ ```ts
14
+ import { AgentExecutor, Models } from "@aexhq/sdk";
15
+
16
+ const aex = new AgentExecutor({ apiToken: process.env.AEX_API_TOKEN! });
17
+
18
+ const runId = await aex.submit({
19
+ provider: "anthropic",
20
+ model: Models.CLAUDE_HAIKU_4_5,
21
+ prompt: "Write the report and save it as a file.",
22
+ secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }
23
+ });
24
+
25
+ for await (const event of aex.stream(runId)) {
26
+ console.log(event.type);
27
+ }
28
+
29
+ await aex.wait(runId);
30
+ await aex.download(runId, { to: "./run.zip" });
31
+ ```
32
+
33
+ The same durable record backs SDK and CLI reads. Use `getRun`/`get`, `events`,
34
+ `stream`, `streamEnvelopes`, `wait`, `outputs`, and `download` to inspect the
35
+ run live or after completion.
36
+
37
+ Use `idempotencyKey` when retrying a submit from your own workflow. aex hashes
38
+ the normalized non-secret submission, so a retry with the same key and same body
39
+ returns the existing run while a mismatched body fails with an idempotency
40
+ conflict.
@@ -4,7 +4,9 @@ title: Credentials
4
4
 
5
5
  # Credentials
6
6
 
7
- aex does not store provider keys or MCP credential values across runs.
7
+ aex treats provider keys, MCP credentials, and proxy endpoint auth as per-run
8
+ credentials. Reusable env secrets are documented separately in
9
+ [Secrets](secrets.md).
8
10
 
9
11
  The caller passes a workspace-scoped SDK token and the provider key inline on every `submit` call. aex holds the bundle in run-scoped custody for the run lifecycle and attempts terminal cleanup/revocation for the aex-controlled references. MCP credentials and proxy endpoint auth values travel the same way.
10
12
 
@@ -100,7 +102,7 @@ node /mnt/session/uploads/aex/aex proxy stripe \
100
102
  --response-mode headers_only
101
103
  ```
102
104
 
103
- The CLI reads the per-run bearer from `/mnt/session/uploads/aex/run-token`, attaches the `X-Aex-Proxy-Protocol` header, and the BFF injects the bearer/header/query/basic credential before dispatching the outbound call. Only the response (subject to `responseMode` and `maxResponseBytes`) reaches the container. `--response-mode` can only narrow below the policy ceiling.
105
+ The CLI reads the per-run bearer from `/mnt/session/uploads/aex/run-token`, attaches the `X-Aex-Proxy-Protocol` header, and the hosted proxy injects the bearer/header/query/basic credential before dispatching the outbound call. Only the response (subject to `responseMode` and `maxResponseBytes`) reaches the container. `--response-mode` can only narrow below the policy ceiling.
104
106
 
105
107
  Retries are declaration-based. Add `retry` to the endpoint policy when safe for that upstream; runs without `retry` keep single-attempt behavior. `maxAttempts` counts the initial request, and defaults apply only when `retry` is present: `maxAttempts: 3`, `initialDelayMs: 250`, `maxDelayMs: 5000`, `jitter: "full"`, `retryOnStatuses: [408, 425, 429, 500, 502, 503, 504]`, `retryOnMethods: ["GET", "HEAD"]`, and `respectRetryAfter: true`. There are no per-call `aex proxy` retry flags.
106
108
 
@@ -127,7 +129,7 @@ const runId = await aex.submit({
127
129
  });
128
130
  ```
129
131
 
130
- The keyless endpoint still routes through the aex managed proxy: every call is allow-listed, audited, and redacted. The BFF injects no `Authorization` header and no query-string credential. Shipping a `proxyEndpointAuth` entry for a `none`-shape endpoint is rejected at submission time. Equivalent class-based form:
132
+ The keyless endpoint still routes through the aex managed proxy: every call is allow-listed, audited, and redacted. The hosted proxy injects no `Authorization` header and no query-string credential. Shipping a `proxyEndpointAuth` entry for a `none`-shape endpoint is rejected at submission time. Equivalent class-based form:
131
133
 
132
134
  ```ts
133
135
  import { ProxyEndpoint } from "@aexhq/sdk";
@@ -144,7 +146,9 @@ ProxyEndpoint.none({
144
146
 
145
147
  ### Networking
146
148
 
147
- When a run uses `limited` networking, the platform host must appear in `allowed_hosts`. The worker injects it automatically; for advance validation use:
149
+ Networking is open by default. When a run explicitly uses `limited` networking,
150
+ the platform host must appear in `allowed_hosts`. aex injects it
151
+ automatically; for advance validation use:
148
152
 
149
153
  ```ts
150
154
  const allowedHosts = buildPlatformAllowedHosts({
package/docs/events.md CHANGED
@@ -88,6 +88,18 @@ run's last stream event, immediately after the durable record commits.
88
88
  `settleConsistent` ends the stream on it; on a raw stream, detect it with
89
89
  `isRunSettled(event)`.
90
90
 
91
+ ## Temporary event archive links
92
+
93
+ For terminal runs, `eventArchiveLink(runId, options?)` returns a temporary direct URL to `events.jsonl`, the same redacted customer-visible event export used by `downloadEvents(runId)`.
94
+
95
+ ```ts
96
+ const link = await aex.eventArchiveLink(runId, { expiresIn: "1h" });
97
+ const response = await fetch(link.url);
98
+ const jsonl = await response.text();
99
+ ```
100
+
101
+ `expiresIn` accepts seconds or `"15m"`, `"1h"`, or `"1d"`; the default is `"1h"`. The URL is a reusable bearer URL until it expires, so treat it like a short-lived secret. Internal runtime, host, and provider diagnostics are not included in this export.
102
+
91
103
  ## Event shape
92
104
 
93
105
  Events are typed as the discriminated `RunEvent` union for compatibility and as the versioned coordinator envelope for live consumers. aex records raw runtime/provider payloads **after** secret redaction and structural sanitization, so the bytes you see never contain the provider key, MCP credentials, or proxy bearer that were supplied to `submit`.
package/docs/limits.md ADDED
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: Limits
3
+ ---
4
+
5
+ # Limits
6
+
7
+ aex runs autonomous agents on the hosted managed runtime. The SDK and CLI submit
8
+ runs, stream events, capture outputs, and expose auth-gated reads and downloads.
9
+
10
+ For what the product supports, see [Features](https://aex.dev/docs/features/).
11
+ For the current provider/model set, see the generated
12
+ [provider/runtime capability matrix](provider-runtime-capabilities.md).
13
+
14
+ ## Current Defaults
15
+
16
+ | Area | Default |
17
+ | --- | --- |
18
+ | Workspace storage | 50 GiB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
19
+ | Proxy request body | 10 MiB per proxy endpoint unless the endpoint declares a different `maxRequestBytes`. |
20
+ | Proxy timeout | 5 minutes per proxy endpoint unless the endpoint declares a different `timeoutMs`. |
21
+ | Proxy telemetry | Proxy calls emit report-only usage telemetry for call count, failed calls, request bytes, response bytes when known, and duration. Public proxy pricing is not shipped unless documented later. |
22
+
23
+ ## Product Boundaries
24
+
25
+ | Area | Boundary |
26
+ | --- | --- |
27
+ | Runtime | New submissions run on the managed runtime. `runtime: "native"` is rejected. |
28
+ | Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
29
+ | Secrets | Provider keys, MCP credentials, proxy auth, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
30
+ | MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
31
+ | Proxy endpoints | The proxy enforces declared host/path/method/auth policy for calls routed through it. Upstream side effects and data handling remain with the upstream service and customer. |
32
+ | Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
33
+ | Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
34
+ | Agent identity | The durable product primitive is the run record. Persistent agent profiles, stateful memory, reusable sessions, and saved agent definitions are out of scope. |
35
+ | Deployment | The supported product is the hosted aex service plus the SDK and CLI. Alternate `baseUrl` values are for local, staging, or hosted aex API planes, not a self-host product promise. |
36
+ | Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime, storage, and proxy usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
37
+
38
+ ## Provider Policy Links
39
+
40
+ These links are starting points for provider-owned policy areas; they do not
41
+ create aex guarantees.
42
+
43
+ - Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
44
+ - OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
45
+ - Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
46
+ - Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
47
+
48
+ ## Unsupported Claims
49
+
50
+ Do not describe aex as providing true self-host or customer-cloud deployment
51
+ support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
52
+ trials, a general-purpose sandbox for every downstream service, human-in-the-loop
53
+ approval checkpoints, or persistent agent identity.
package/docs/outputs.md CHANGED
@@ -77,6 +77,64 @@ const looseReport = await aex.downloadOutput(runId, { path: "report.txt", match:
77
77
  console.log(looseReport.byteLength);
78
78
  ```
79
79
 
80
+ ## Finding outputs
81
+
82
+ `listOutputs(runId, query?)` and its alias `outputs(runId, query?)` can filter the captured output list client-side. Use `findOutputs` when you want discovery to be explicit, or `findOutput` when exactly one file is expected:
83
+
84
+ ```ts
85
+ const images = await aex.findOutputs(runId, { type: "image" });
86
+ const jsonReports = await aex.outputs(runId, {
87
+ dir: "reports",
88
+ extension: ".json"
89
+ });
90
+
91
+ const report = await aex.findOutput(runId, {
92
+ filename: "summary.json",
93
+ contentType: "application/json"
94
+ });
95
+ if (report) {
96
+ const bytes = await aex.downloadOutput(runId, report);
97
+ }
98
+ ```
99
+
100
+ Query fields compose with AND semantics:
101
+
102
+ | Field | Match |
103
+ | --- | --- |
104
+ | `path` | Exact normalized output path. Leading `/` and `outputs/` are ignored. |
105
+ | `filename` | Basename match, as a string or `RegExp`. |
106
+ | `dir` / `recursive` | Directory prefix. `recursive` defaults to `true`; set `false` for direct children only. |
107
+ | `extension` | Case-insensitive extension, with or without a leading dot. |
108
+ | `contentType` | Exact content type or a prefix wildcard such as `image/*`. |
109
+ | `type` | High-level type: `text`, `json`, `image`, `audio`, `video`, `pdf`, `archive`, `binary`, or `unknown`. |
110
+
111
+ `findOutput` returns `null` when nothing matches and throws `RunStateError` when the query matches more than one output.
112
+
113
+ ## Temporary output links
114
+
115
+ Use `outputLink(runId, selectorOrQuery, options?)` when another process, browser, media tag, or downloader needs a direct artifact URL instead of bytes buffered through the SDK. `createOutputLink` remains as the compatibility name.
116
+
117
+ ```ts
118
+ const link = await aex.outputLink(
119
+ runId,
120
+ { path: "reports/summary.json" },
121
+ { expiresIn: "15m" }
122
+ );
123
+
124
+ console.log(link.url, link.expiresAt);
125
+ ```
126
+
127
+ Selectors can be an output id, an `Output` object, a path selector, or an `OutputQuery`. `expiresIn` accepts seconds or `"15m"`, `"1h"`, or `"1d"`; the default is `"1h"`.
128
+
129
+ The returned URL is a reusable bearer URL until it expires. Anyone who has it can read that artifact during the TTL. aex does not promise one-time use or early revocation for these direct artifact URLs.
130
+
131
+ For large files, `fetchOutput` mints the same temporary URL and returns the `Response` from fetching it directly, without adding the SDK API token to that second request:
132
+
133
+ ```ts
134
+ const response = await aex.fetchOutput(runId, { type: "video", filename: /clip\.mp4$/ });
135
+ const stream = response.body;
136
+ ```
137
+
80
138
  ## Lifecycle behaviour
81
139
 
82
140
  `download()` works at any run state — it reads whatever the public endpoints currently expose, so the zip reflects the run as of the call:
@@ -4,54 +4,52 @@ title: Provider runtime capabilities
4
4
 
5
5
  # Provider runtime capabilities
6
6
 
7
- Generated from `packages/contracts/src/provider-support.ts`; runtime cells are derived through `checkRuntimeSupported` and `selectRuntime` in `packages/contracts/src/submission.ts`.
7
+ Generated from `packages/contracts/src/provider-support.ts` and `packages/contracts/src/models.ts`; runtime routing is derived through `checkRuntimeSupported` and `selectRuntime` in `packages/contracts/src/submission.ts`.
8
8
 
9
9
  Regenerate with `pnpm capabilities:generate`; check with `pnpm capabilities:check`.
10
10
 
11
11
  Providers: [Anthropic](#anthropic) (`anthropic`), [DeepSeek](#deepseek) (`deepseek`), [OpenAI](#openai) (`openai`), [Gemini](#gemini) (`gemini`), [Mistral](#mistral) (`mistral`), [OpenRouter](#openrouter) (`openrouter`), [Doubao](#doubao) (`doubao`), [Doubao (China)](#doubao-cn) (`doubao-cn`). Runtime selectors: `managed`.
12
12
 
13
- All new submissions run on the managed runtime. Public support facts are listed separately from runtime dispatch facts.
13
+ All new submissions run on the managed runtime. Public support is expressed as supported providers and supported model ids.
14
14
 
15
- Status vocabulary: `supported`, `live-unverified`, `rejected`.
15
+ ## Supported models
16
16
 
17
- ## Public support
18
-
19
- | Provider | Wire value | Status | Docs | Evidence |
17
+ | Provider | Selector | Supported models | Docs | Evidence |
20
18
  | --- | --- | --- | --- | --- |
21
- | [Anthropic](#anthropic) | `anthropic` | supported | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
22
- | [DeepSeek](#deepseek) | `deepseek` | supported | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
23
- | [OpenAI](#openai) | `openai` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
24
- | [Gemini](#gemini) | `gemini` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
25
- | [Mistral](#mistral) | `mistral` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
26
- | [OpenRouter](#openrouter) | `openrouter` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
27
- | [Doubao](#doubao) | `doubao` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
28
- | [Doubao (China)](#doubao-cn) | `doubao-cn` | live-unverified | [Credentials](credentials.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
19
+ | [Anthropic](#anthropic) | `anthropic` | `claude-haiku-4-5`, `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest`, `claude-sonnet-4-6` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
20
+ | [DeepSeek](#deepseek) | `deepseek` | `deepseek-v4-flash`, `deepseek-v4-pro`, `deepseek-chat`, `deepseek-reasoner` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
21
+ | [OpenAI](#openai) | `openai` | `gpt-4.1`, `gpt-4o-mini` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
22
+ | [Gemini](#gemini) | `gemini` | `gemini-2.0-flash`, `gemini-2.5-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
23
+ | [Mistral](#mistral) | `mistral` | `mistral-large-latest`, `mistral-small-latest` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
24
+ | [OpenRouter](#openrouter) | `openrouter` | `gpt-4o-mini`, `gpt-4o`, `gemini-2.0-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
25
+ | [Doubao](#doubao) | `doubao` | `doubao-seed-pro`, `doubao-seed-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
26
+ | [Doubao (China)](#doubao-cn) | `doubao-cn` | `doubao-seed-pro`, `doubao-seed-flash` | [Secrets](secrets.md); [Events](events.md) | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
29
27
 
30
28
  ## Runtime routing
31
29
 
32
- | Provider | Default provider | Auto route | `runtime: "managed"` |
30
+ | Provider | Default provider | Auto route | Runtime selector |
31
+ | --- | --- | --- | --- |
32
+ | `anthropic` | yes | `managed` | [managed](#anthropic) |
33
+ | `deepseek` | no | `managed` | [managed](#deepseek) |
34
+ | `openai` | no | `managed` | [managed](#openai) |
35
+ | `gemini` | no | `managed` | [managed](#gemini) |
36
+ | `mistral` | no | `managed` | [managed](#mistral) |
37
+ | `openrouter` | no | `managed` | [managed](#openrouter) |
38
+ | `doubao` | no | `managed` | [managed](#doubao) |
39
+ | `doubao-cn` | no | `managed` | [managed](#doubao-cn) |
40
+
41
+ ## Runtime evidence
42
+
43
+ | Provider | Runtime | Enforcement path | Evidence |
33
44
  | --- | --- | --- | --- |
34
- | `anthropic` | yes | `managed` | [supported](#anthropic) |
35
- | `deepseek` | no | `managed` | [supported](#deepseek) |
36
- | `openai` | no | `managed` | [live-unverified](#openai) |
37
- | `gemini` | no | `managed` | [live-unverified](#gemini) |
38
- | `mistral` | no | `managed` | [live-unverified](#mistral) |
39
- | `openrouter` | no | `managed` | [live-unverified](#openrouter) |
40
- | `doubao` | no | `managed` | [live-unverified](#doubao) |
41
- | `doubao-cn` | no | `managed` | [live-unverified](#doubao-cn) |
42
-
43
- ## Runtime cell evidence
44
-
45
- | Provider | Runtime | Status | Ownership | Enforcement path | Evidence |
46
- | --- | --- | --- | --- | --- | --- |
47
- | `anthropic` | `managed` | supported | supported | submission parser + managed dispatch | [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
48
- | `deepseek` | `managed` | supported | supported | submission parser + managed dispatch | [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
49
- | `openai` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
50
- | `gemini` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
51
- | `mistral` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
52
- | `openrouter` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
53
- | `doubao` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
54
- | `doubao-cn` | `managed` | live-unverified | live-unverified | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
45
+ | `anthropic` | `managed` | submission parser + managed dispatch | [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
46
+ | `deepseek` | `managed` | submission parser + managed dispatch | [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts) |
47
+ | `openai` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
48
+ | `gemini` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
49
+ | `mistral` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
50
+ | `openrouter` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
51
+ | `doubao` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
52
+ | `doubao-cn` | `managed` | submission parser + managed dispatch | [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts) |
55
53
 
56
54
  ## Validation errors
57
55
 
@@ -61,76 +59,76 @@ Status vocabulary: `supported`, `live-unverified`, `rejected`.
61
59
 
62
60
  ### Managed unsupported features
63
61
 
64
- Provider-hosted skill refs (a `kind:"provider"` skill ref) are rejected because new runs dispatch to the managed runtime. Supply skill bytes through `Skill.fromFiles`, `Skill.fromPath`, `Skill.fromUrl`, or `Skill.fromCatalog`; each path normalizes to an asset that the platform snapshots into the run's object-storage directory.
62
+ Provider-hosted skill refs (a `kind:"provider"` skill ref) are rejected because new runs dispatch to the managed runtime. Supply skill bytes through `Skill.fromFiles`, `Skill.fromPath`, `Skill.fromUrl`, or `Skill.fromCatalog`; each path normalizes to an asset that the platform snapshots into durable run asset storage.
65
63
 
66
64
  Notes:
67
65
 
68
- - Public status describes provider availability on the SDK surface. Runtime routing describes how a validated submission is dispatched.
66
+ - Supported models are the public SDK model ids accepted for each provider.
67
+ - Runtime routing describes how a validated submission is dispatched.
69
68
  - `runtime: "native"` is not a runtime selector; the submission parser rejects it as an invalid enum value.
70
- - `live-unverified` means the shape is accepted by code but does not yet have equal live user-test evidence.
71
69
 
72
70
  ## Provider anchors
73
71
 
74
72
  ### Anthropic
75
73
 
76
74
  - Wire provider: `anthropic`
77
- - Public status: supported
75
+ - Supported models: `claude-haiku-4-5`, `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest`, `claude-sonnet-4-6`
78
76
  - Auto route: `managed`
79
- - Docs: [Credentials](credentials.md); [Events](events.md)
77
+ - Docs: [Secrets](secrets.md); [Events](events.md)
80
78
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK Anthropic live user test](../../../apps/user-tests/test/live/live-sdk-anthropic-managed.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts)
81
79
 
82
80
  ### DeepSeek
83
81
 
84
82
  - Wire provider: `deepseek`
85
- - Public status: supported
83
+ - Supported models: `deepseek-v4-flash`, `deepseek-v4-pro`, `deepseek-chat`, `deepseek-reasoner`
86
84
  - Auto route: `managed`
87
- - Docs: [Credentials](credentials.md); [Events](events.md)
85
+ - Docs: [Secrets](secrets.md); [Events](events.md)
88
86
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts); [Installed-SDK DeepSeek live user test](../../../apps/user-tests/test/live/live-sdk-deepseek.test.ts); [Installed-SDK DeepSeek comprehensive live user matrix](../../../apps/user-tests/test/live/live-sdk-comprehensive.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts)
89
87
 
90
88
  ### OpenAI
91
89
 
92
90
  - Wire provider: `openai`
93
- - Public status: live-unverified
91
+ - Supported models: `gpt-4.1`, `gpt-4o-mini`
94
92
  - Auto route: `managed`
95
- - Docs: [Credentials](credentials.md); [Events](events.md)
93
+ - Docs: [Secrets](secrets.md); [Events](events.md)
96
94
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
97
95
 
98
96
  ### Gemini
99
97
 
100
98
  - Wire provider: `gemini`
101
- - Public status: live-unverified
99
+ - Supported models: `gemini-2.0-flash`, `gemini-2.5-flash`
102
100
  - Auto route: `managed`
103
- - Docs: [Credentials](credentials.md); [Events](events.md)
101
+ - Docs: [Secrets](secrets.md); [Events](events.md)
104
102
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
105
103
 
106
104
  ### Mistral
107
105
 
108
106
  - Wire provider: `mistral`
109
- - Public status: live-unverified
107
+ - Supported models: `mistral-large-latest`, `mistral-small-latest`
110
108
  - Auto route: `managed`
111
- - Docs: [Credentials](credentials.md); [Events](events.md)
109
+ - Docs: [Secrets](secrets.md); [Events](events.md)
112
110
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
113
111
 
114
112
  ### OpenRouter
115
113
 
116
114
  - Wire provider: `openrouter`
117
- - Public status: live-unverified
115
+ - Supported models: `gpt-4o-mini`, `gpt-4o`, `gemini-2.0-flash`
118
116
  - Auto route: `managed`
119
- - Docs: [Credentials](credentials.md); [Events](events.md)
117
+ - Docs: [Secrets](secrets.md); [Events](events.md)
120
118
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
121
119
 
122
120
  ### Doubao
123
121
 
124
122
  - Wire provider: `doubao`
125
- - Public status: live-unverified
123
+ - Supported models: `doubao-seed-pro`, `doubao-seed-flash`
126
124
  - Auto route: `managed`
127
- - Docs: [Credentials](credentials.md); [Events](events.md)
125
+ - Docs: [Secrets](secrets.md); [Events](events.md)
128
126
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
129
127
 
130
128
  ### Doubao (China)
131
129
 
132
130
  - Wire provider: `doubao-cn`
133
- - Public status: live-unverified
131
+ - Supported models: `doubao-seed-pro`, `doubao-seed-flash`
134
132
  - Auto route: `managed`
135
- - Docs: [Credentials](credentials.md); [Events](events.md)
133
+ - Docs: [Secrets](secrets.md); [Events](events.md)
136
134
  - Evidence: [Submission parser and routing parity](../../contracts/test/submission.test.ts); [Runtime support validator](../../contracts/test/runtime-support.test.ts); [Generated matrix freshness](../../../scripts/validate/capability-matrix.test.ts)
@@ -0,0 +1,81 @@
1
+ {
2
+ "brand": "aex",
3
+ "productName": "Agent Executor",
4
+ "oneLine": "aex is an agent execution platform for launching autonomous agents from a simple TypeScript SDK and CLI.",
5
+ "description": "Submit typed runs, stream durable events, capture outputs, and compose agents with skills, files, MCP, proxy endpoints, and subagents across the managed runtime.",
6
+ "installCommand": "npm install @aexhq/sdk",
7
+ "examples": {
8
+ "typescriptLines": [
9
+ "import { AgentExecutor, Models, Providers } from \"@aexhq/sdk\";",
10
+ "",
11
+ "const aex = new AgentExecutor({ apiToken: process.env.AEX_API_TOKEN! });",
12
+ "",
13
+ "const runId = await aex.submit({",
14
+ " provider: Providers.ANTHROPIC,",
15
+ " model: Models.CLAUDE_HAIKU_4_5,",
16
+ " prompt: \"Write the report and save outputs.\",",
17
+ " secrets: { apiKey: process.env.ANTHROPIC_API_KEY! }",
18
+ "});",
19
+ "",
20
+ "for await (const event of aex.stream(runId)) console.log(event.type);",
21
+ "await aex.wait(runId);",
22
+ "await aex.download(runId, { to: \"./run.zip\" });"
23
+ ],
24
+ "cliLines": [
25
+ "aex run \\",
26
+ " --api-token \"$AEX_API_TOKEN\" \\",
27
+ " --anthropic-api-key \"$ANTHROPIC_API_KEY\" \\",
28
+ " --model claude-haiku-4-5 \\",
29
+ " --prompt \"Write the report and save outputs.\" \\",
30
+ " --follow"
31
+ ]
32
+ },
33
+ "providers": [
34
+ { "id": "anthropic", "name": "Anthropic" },
35
+ { "id": "deepseek", "name": "DeepSeek" },
36
+ { "id": "openai", "name": "OpenAI" },
37
+ { "id": "gemini", "name": "Gemini" },
38
+ { "id": "mistral", "name": "Mistral" },
39
+ { "id": "openrouter", "name": "OpenRouter" },
40
+ { "id": "doubao", "name": "Doubao" },
41
+ { "id": "doubao-cn", "name": "Doubao China" }
42
+ ],
43
+ "featureAreas": [
44
+ {
45
+ "slug": "agent-runtime",
46
+ "href": "/docs/features/#agent-runtime",
47
+ "title": "Agent runtime",
48
+ "description": "Managed autonomous runs with filesystem read/edit, grep/glob/head/tail, open web fetch/search defaults, optional notebook tools, and post-hook repair."
49
+ },
50
+ {
51
+ "slug": "durable-infrastructure",
52
+ "href": "/docs/features/#durable-infrastructure",
53
+ "title": "Durable infrastructure",
54
+ "description": "Run records, status, wait/cancel/delete, idempotency, typed events, output capture, downloads, timeouts, and runtime sizes."
55
+ },
56
+ {
57
+ "slug": "agent-composition",
58
+ "href": "/docs/features/#agent-composition",
59
+ "title": "Agent composition",
60
+ "description": "Skills, files, AGENTS.md, remote MCP servers, proxy endpoints, environment variables, packages, and networking controls."
61
+ },
62
+ {
63
+ "slug": "subagents",
64
+ "href": "/docs/features/#subagents",
65
+ "title": "Subagents",
66
+ "description": "Typed parent/child lineage for async child runs, output handoff, and bounded agent delegation."
67
+ },
68
+ {
69
+ "slug": "models-and-providers",
70
+ "href": "/docs/features/#models-and-providers",
71
+ "title": "Models and providers",
72
+ "description": "Anthropic, DeepSeek, OpenAI, Gemini, Mistral, OpenRouter, Doubao, and Doubao China behind one submission shape."
73
+ },
74
+ {
75
+ "slug": "typed-control-surface",
76
+ "href": "/docs/features/#typed-control-surface",
77
+ "title": "Typed control surface",
78
+ "description": "Strongly typed SDK inputs, CLI parity, BYOK secrets, scoped proxy auth, redaction, and output modes."
79
+ }
80
+ ]
81
+ }