@aexhq/sdk 0.40.6 → 0.40.7

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.
@@ -1,144 +1,144 @@
1
- ---
2
- title: Limits & quotas
3
- ---
4
-
5
- # Limits & quotas
6
-
7
- These are the hard ceilings and caps that bound a run, a workspace, and a single
8
- request. Every value is mirrored from a single source-of-truth constant in the
9
- platform's limits module; this page is hand-maintained against those constants.
10
- If a value here ever disagrees with the constant, the constant wins.
11
-
12
- Each row is named by its source-of-truth constant. For the values that apply
13
- when you omit an option, see
14
- [Defaults](defaults.md). For product/policy boundaries (what aex does and does
15
- not promise), see [Limits](limits.md).
16
-
17
- Each row is tagged with its **source**:
18
-
19
- - **aex policy** — an aex platform ceiling, the same for every workspace.
20
- - **Workspace default** — a per-workspace value with a configurable override.
21
-
22
- And whether you can **raise** it: per-run option, per-plan, or no.
23
-
24
- ## Run scope
25
-
26
- | Limit | Value | Source | Raisable? | Constant |
27
- | --- | --- | --- | --- | --- |
28
- | Maximum run timeout | 8 hours (also the default when `timeout` is omitted) | aex policy | Per plan (billing-driven) | `RUN_MAX_TIMEOUT_MS` |
29
- | Minimum run timeout | 1 minute | aex policy | No (floor) | `RUN_MIN_TIMEOUT_MS` |
30
- | Per-call exec timeout (default) | 30 minutes | aex policy | Per-call via the tool call's `timeoutMs` | `RUN_DEFAULT_EXEC_TIMEOUT_MS` |
31
- | MCP connect timeout (default) | 30 seconds | aex policy | Per-port via `connectTimeoutMs` | `RUN_DEFAULT_MCP_CONNECT_TIMEOUT_MS` |
32
- | MCP call timeout (default) | 30 minutes | aex policy | Per-port via `callTimeoutMs` | `RUN_DEFAULT_MCP_CALL_TIMEOUT_MS` |
33
- | Per-session spend cap | None by default; when set, the session is stopped once its spend would exceed the cap | aex policy | Per-session via `overrides.maxSpendUsd` (a positive USD amount) | — |
34
- | Max agent iterations (turns) per run | 20 by default; hard ceiling 200 | aex policy | Per-session via `overrides.maxTurns` (a positive integer, clamped to the ceiling) | `RUN_DEFAULT_MAX_TURNS` / `RUN_MAX_TURNS_CEILING` |
35
-
36
- ### Output capture (per run)
37
-
38
- Files stream from the container to object storage one at a time. When a cap is
39
- reached, remaining files are **dropped and counted in the summary**, never
40
- silently lost.
41
-
42
- | Limit | Value | Source | Raisable? | Constant |
43
- | --- | --- | --- | --- | --- |
44
- | Capture wall-clock budget | 1 hour | aex policy | No (hard ceiling) | `RUN_CAPTURE_DEFAULT_TIMEOUT_MS` |
45
- | Max files captured | 50,000 | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILES` |
46
- | Max bytes per captured file | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILE_BYTES` |
47
- | Max total captured bytes | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_TOTAL_BYTES` |
48
-
49
- ### Tool output caps (per run)
50
-
51
- | Limit | Value | Source | Raisable? | Constant |
52
- | --- | --- | --- | --- | --- |
53
- | `web_fetch` returned body | 500 KB (UTF-8) | aex policy | Per-call via `max_bytes` | `REQUEST_WEB_FETCH_DEFAULT_MAX_BYTES` |
54
- | `bash_output` per-read body | 1 MB (UTF-8) | aex policy | No (hard ceiling) | `RUN_BASH_BG_OUTPUT_MAX_BYTES` |
55
- | `grep` max file size (larger files skipped — use `bash grep`) | 25 MB | aex policy | No (hard ceiling) | `RUN_TOOL_GREP_MAX_FILE_BYTES` |
56
- | `head`/`tail` max file size (larger files rejected — use `bash head`/`tail`) | 100 MB | aex policy | No (hard ceiling) | `RUN_TOOL_HEAD_TAIL_MAX_FILE_BYTES` |
57
- | `grep`/`glob` files visited per recursive walk (then truncates with a notice) | 100,000 | aex policy | No (hard ceiling) | `RUN_TOOL_WALK_MAX_FILES` |
58
-
59
- ### Subagents (per run lineage)
60
-
61
- | Limit | Value | Source | Raisable? | Constant |
62
- | --- | --- | --- | --- | --- |
63
- | Max subagent depth (`subagent` tool) | 5 (a depth-5 lineage may not spawn deeper) | aex policy | No public per-run override (subagents run in-process) | `RUN_MAX_PUBLIC_SUBAGENT_DEPTH` |
64
- | Concurrent child runs per lineage root | 1000 live (non-terminal); hard ceiling 4096 | aex policy | No public per-run override (subagents run in-process) | `RUN_DEFAULT_MAX_CONCURRENT_CHILD_RUNS` |
65
-
66
- ### Retention (per run)
67
-
68
- | Limit | Value | Source | Raisable? | Constant |
69
- | --- | --- | --- | --- | --- |
70
- | Per-run metadata record TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_RECORD_TTL_SECONDS` |
71
- | Per-run secret-envelope TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_SECRET_TTL_SECONDS` |
72
-
73
- ## Sandbox (managed runtime)
74
-
75
- Each run executes in an ephemeral Linux container sized by the `runtime` preset.
76
- A few behaviours are worth knowing before you rely on the filesystem or RAM:
77
-
78
- - **Only `/workspace` persists across turns** of the same session. Everything
79
- outside `/workspace` is reset between turns and is gone when the session ends —
80
- write deliverables and any state you want to survive a turn under `/workspace`.
81
- - **The image is minimal.** Declare OS/language packages with
82
- `environment.packages` so they are present deterministically at boot. A runtime
83
- install inside the agent (`pip install`, `apt-get`) is best-effort and
84
- **non-persistent** (reset next turn), and `pip` is subject to PEP 668
85
- (`externally-managed-environment`) — prefer `environment.packages`, or a
86
- virtualenv you create under `/workspace`.
87
- - **`/proc/meminfo` reports the HOST's RAM, not your preset's.** Your actual
88
- memory ceiling is the preset's `memoryMb` (e.g. `shared-0.25x-1gb` = 1 GB, the
89
- default; `shared-4x-12gb` = 12 GB). The presets are the SSoT in
90
- [`packages/contracts/src/runtime-sizes.ts`](https://github.com/aexhq/aex/blob/main/packages/contracts/src/runtime-sizes.ts);
91
- see [Defaults](defaults.md).
92
- - **The agent loop is bounded** by `maxTurns` (default 20, ceiling 200) — a
93
- documented, per-run-overridable limit (see the Run scope table above and
94
- `overrides.maxTurns`), not a silent cutoff.
95
-
96
- ## Workspace scope
97
-
98
- | Limit | Value | Source | Raisable? | Constant |
99
- | --- | --- | --- | --- | --- |
100
- | Workspace storage cap | 500 GB (decimal; admins uncapped — not a customer entitlement) | Workspace default | Per-plane via env `AEX_WORKSPACE_STORAGE_CAP_BYTES` | `WORKSPACE_DEFAULT_STORAGE_CAP_BYTES` |
101
- | Max concurrent runs per workspace | Plan-based: **5** live (non-terminal) root runs on the free plan, **50** on Pro, **200** on Team; hard platform ceiling **200**. One more submit past the cap fails with `429 workspace_concurrency_exceeded` (see [Errors](errors.md)). Subagent children are governed separately by the per-lineage caps below. Read your effective cap from `aex.whoami().limits.maxConcurrentRuns`. | Workspace default (per plan) | Per-plan (upgrade) or per-workspace override (contact support), clamped to the 200 ceiling | `PLANS[planKey].maxConcurrentRuns` / `WORKSPACE_MAX_CONCURRENT_RUNS_CEILING` |
102
- | Monthly workspace spend cap | **$250** per rolling UTC calendar month by default; `0` = unlimited. A submit past the cap fails with `402 workspace_spend_cap_exceeded` (see [Errors](errors.md)). | Workspace default | Per-workspace override (contact support) | `WORKSPACE_DEFAULT_SPEND_CAP_USD` |
103
- | Skill bundle max compressed size (`.zip`) | 10 GiB (enforced at upload by the SDK and re-enforced server-side) | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxCompressedBytes` |
104
- | Skill bundle max decompressed size (sum of uncompressed file sizes) | 50 MB | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxDecompressedBytes` |
105
- | Skill bundle max file entries | 1,000 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_FILES` |
106
- | Skill bundle max directory depth (`a/b/c/d` = 4) | 16 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_DEPTH` |
107
- | Skill bundle max entry path length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_SKILL_BUNDLE_MAX_PATH_LENGTH` |
108
- | `File.mountPath` max length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_MOUNT_PATH_MAX_LENGTH` |
109
-
110
- ### Rate limits (per workspace, per minute)
111
-
112
- Run submission has its own platform-enforced velocity cap: **120 submits per
113
- minute** per workspace by default (`0` = disabled). Past it, `POST /runs` fails
114
- with `429 workspace_submit_rate_exceeded` (see [Errors](errors.md)). It is
115
- overridable per-plane via `AEX_WORKSPACE_SUBMIT_RATE_PER_MIN` or per-workspace
116
- via support.
117
-
118
- The dashboard mutation actions below default as listed; each is overridable
119
- per-plane via the matching `AEX_RATE_LIMIT_<ACTION>_PER_MINUTE` env var.
120
-
121
- | Action | Default per minute | Source | Constant |
122
- | --- | --- | --- | --- |
123
- | Run cancel | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
124
- | Run delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
125
- | Signed output link | 120 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
126
- | API key create | 10 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
127
- | API key delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
128
-
129
- ### Introspecting your effective caps
130
-
131
- `aex.whoami()` (CLI: `aex whoami`) returns a `limits` object carrying the
132
- workspace's *effective* values for the caps above — `maxConcurrentRuns`,
133
- `submitRatePerMinute`, `spendCapUsd`, plus the live `monthSpendUsd`,
134
- `balanceUsd`, `balanceGraceFloorUsd`, and `paymentMethodStatus` — resolved by
135
- the same code the admission gates use, so you can anticipate a `429`/`402`
136
- before submitting. See [Authentication](authentication.md) and
137
- [Errors](errors.md).
138
-
139
- ## Request Scope
140
-
141
- | Limit | Value | Source | Raisable? | Constant |
142
- | --- | --- | --- | --- | --- |
143
- | Signed output URL TTL | 300 seconds | aex policy | Per-call via `expiresSeconds` | `REQUEST_PRESIGN_URL_DEFAULT_TTL_SECONDS` |
144
- | Event-stream connection ticket TTL | 60 seconds | aex policy | Per-mint via `ttlMs` | `REQUEST_TICKET_DEFAULT_TTL_MS` |
1
+ ---
2
+ title: Limits & quotas
3
+ ---
4
+
5
+ # Limits & quotas
6
+
7
+ These are the hard ceilings and caps that bound a run, a workspace, and a single
8
+ request. Every value is mirrored from a single source-of-truth constant in the
9
+ platform's limits module; this page is hand-maintained against those constants.
10
+ If a value here ever disagrees with the constant, the constant wins.
11
+
12
+ Each row is named by its source-of-truth constant. For the values that apply
13
+ when you omit an option, see
14
+ [Defaults](defaults.md). For product/policy boundaries (what aex does and does
15
+ not promise), see [Limits](limits.md).
16
+
17
+ Each row is tagged with its **source**:
18
+
19
+ - **aex policy** — an aex platform ceiling, the same for every workspace.
20
+ - **Workspace default** — a per-workspace value with a configurable override.
21
+
22
+ And whether you can **raise** it: per-run option, per-plan, or no.
23
+
24
+ ## Run scope
25
+
26
+ | Limit | Value | Source | Raisable? | Constant |
27
+ | --- | --- | --- | --- | --- |
28
+ | Maximum run timeout | 8 hours (also the default when `timeout` is omitted) | aex policy | Per plan (billing-driven) | `RUN_MAX_TIMEOUT_MS` |
29
+ | Minimum run timeout | 1 minute | aex policy | No (floor) | `RUN_MIN_TIMEOUT_MS` |
30
+ | Per-call exec timeout (default) | 30 minutes | aex policy | Per-call via the tool call's `timeoutMs` | `RUN_DEFAULT_EXEC_TIMEOUT_MS` |
31
+ | MCP connect timeout (default) | 30 seconds | aex policy | Per-port via `connectTimeoutMs` | `RUN_DEFAULT_MCP_CONNECT_TIMEOUT_MS` |
32
+ | MCP call timeout (default) | 30 minutes | aex policy | Per-port via `callTimeoutMs` | `RUN_DEFAULT_MCP_CALL_TIMEOUT_MS` |
33
+ | Per-session spend cap | None by default; when set, the session is stopped once its spend would exceed the cap | aex policy | Per-session via `overrides.maxSpendUsd` (a positive USD amount) | — |
34
+ | Max agent iterations (turns) per run | 20 by default; hard ceiling 200 | aex policy | Per-session via `overrides.maxTurns` (a positive integer, clamped to the ceiling) | `RUN_DEFAULT_MAX_TURNS` / `RUN_MAX_TURNS_CEILING` |
35
+
36
+ ### Output capture (per run)
37
+
38
+ Files stream from the container to object storage one at a time. When a cap is
39
+ reached, remaining files are **dropped and counted in the summary**, never
40
+ silently lost.
41
+
42
+ | Limit | Value | Source | Raisable? | Constant |
43
+ | --- | --- | --- | --- | --- |
44
+ | Capture wall-clock budget | 1 hour | aex policy | No (hard ceiling) | `RUN_CAPTURE_DEFAULT_TIMEOUT_MS` |
45
+ | Max files captured | 50,000 | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILES` |
46
+ | Max bytes per captured file | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_FILE_BYTES` |
47
+ | Max total captured bytes | 500 GB (decimal) | aex policy | No (hard ceiling) | `RUN_CAPTURE_MAX_TOTAL_BYTES` |
48
+
49
+ ### Tool output caps (per run)
50
+
51
+ | Limit | Value | Source | Raisable? | Constant |
52
+ | --- | --- | --- | --- | --- |
53
+ | `web_fetch` returned body | 500 KB (UTF-8) | aex policy | Per-call via `max_bytes` | `REQUEST_WEB_FETCH_DEFAULT_MAX_BYTES` |
54
+ | `bash_output` per-read body | 1 MB (UTF-8) | aex policy | No (hard ceiling) | `RUN_BASH_BG_OUTPUT_MAX_BYTES` |
55
+ | `grep` max file size (larger files skipped — use `bash grep`) | 25 MB | aex policy | No (hard ceiling) | `RUN_TOOL_GREP_MAX_FILE_BYTES` |
56
+ | `head`/`tail` max file size (larger files rejected — use `bash head`/`tail`) | 100 MB | aex policy | No (hard ceiling) | `RUN_TOOL_HEAD_TAIL_MAX_FILE_BYTES` |
57
+ | `grep`/`glob` files visited per recursive walk (then truncates with a notice) | 100,000 | aex policy | No (hard ceiling) | `RUN_TOOL_WALK_MAX_FILES` |
58
+
59
+ ### Subagents (per run lineage)
60
+
61
+ | Limit | Value | Source | Raisable? | Constant |
62
+ | --- | --- | --- | --- | --- |
63
+ | Max subagent depth (`subagent` tool) | 5 (a depth-5 lineage may not spawn deeper) | aex policy | No public per-run override (subagents run in-process) | `RUN_MAX_PUBLIC_SUBAGENT_DEPTH` |
64
+ | Concurrent child runs per lineage root | 1000 live (non-terminal); hard ceiling 4096 | aex policy | No public per-run override (subagents run in-process) | `RUN_DEFAULT_MAX_CONCURRENT_CHILD_RUNS` |
65
+
66
+ ### Retention (per run)
67
+
68
+ | Limit | Value | Source | Raisable? | Constant |
69
+ | --- | --- | --- | --- | --- |
70
+ | Per-run metadata record TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_RECORD_TTL_SECONDS` |
71
+ | Per-run secret-envelope TTL | 24 hours | aex policy | No (hard ceiling) | `RUN_KV_SECRET_TTL_SECONDS` |
72
+
73
+ ## Sandbox (managed runtime)
74
+
75
+ Each run executes in an ephemeral Linux container sized by the `runtime` preset.
76
+ A few behaviours are worth knowing before you rely on the filesystem or RAM:
77
+
78
+ - **Only `/workspace` persists across turns** of the same session. Everything
79
+ outside `/workspace` is reset between turns and is gone when the session ends —
80
+ write deliverables and any state you want to survive a turn under `/workspace`.
81
+ - **The image is minimal.** Declare OS/language packages with
82
+ `environment.packages` so they are present deterministically at boot. A runtime
83
+ install inside the agent (`pip install`, `apt-get`) is best-effort and
84
+ **non-persistent** (reset next turn), and `pip` is subject to PEP 668
85
+ (`externally-managed-environment`) — prefer `environment.packages`, or a
86
+ virtualenv you create under `/workspace`.
87
+ - **`/proc/meminfo` reports the HOST's RAM, not your preset's.** Your actual
88
+ memory ceiling is the preset's `memoryMb` (e.g. `shared-0.25x-1gb` = 1 GB, the
89
+ default; `shared-4x-12gb` = 12 GB). The presets are the SSoT in
90
+ [`packages/contracts/src/runtime-sizes.ts`](https://github.com/aexhq/aex/blob/main/packages/contracts/src/runtime-sizes.ts);
91
+ see [Defaults](defaults.md).
92
+ - **The agent loop is bounded** by `maxTurns` (default 20, ceiling 200) — a
93
+ documented, per-run-overridable limit (see the Run scope table above and
94
+ `overrides.maxTurns`), not a silent cutoff.
95
+
96
+ ## Workspace scope
97
+
98
+ | Limit | Value | Source | Raisable? | Constant |
99
+ | --- | --- | --- | --- | --- |
100
+ | Workspace storage cap | 500 GB (decimal; admins uncapped — not a customer entitlement) | Workspace default | Per-plane via env `AEX_WORKSPACE_STORAGE_CAP_BYTES` | `WORKSPACE_DEFAULT_STORAGE_CAP_BYTES` |
101
+ | Max concurrent runs per workspace | Plan-based: **5** live (non-terminal) root runs on the free plan, **50** on Pro, **200** on Team; hard platform ceiling **200**. One more submit past the cap fails with `429 workspace_concurrency_exceeded` (see [Errors](errors.md)). Subagent children are governed separately by the per-lineage caps below. Read your effective cap from `aex.whoami().limits.maxConcurrentRuns`. | Workspace default (per plan) | Per-plan (upgrade) or per-workspace override (contact support), clamped to the 200 ceiling | `PLANS[planKey].maxConcurrentRuns` / `WORKSPACE_MAX_CONCURRENT_RUNS_CEILING` |
102
+ | Monthly workspace spend cap | **$250** per rolling UTC calendar month by default; `0` = unlimited. A submit past the cap fails with `402 workspace_spend_cap_exceeded` (see [Errors](errors.md)). | Workspace default | Per-workspace override (contact support) | `WORKSPACE_DEFAULT_SPEND_CAP_USD` |
103
+ | Skill bundle max compressed size (`.zip`) | 10 GiB (enforced at upload by the SDK and re-enforced server-side) | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxCompressedBytes` |
104
+ | Skill bundle max decompressed size (sum of uncompressed file sizes) | 50 MB | aex policy | No (hard ceiling) | `SKILL_BUNDLE_LIMITS.maxDecompressedBytes` |
105
+ | Skill bundle max file entries | 1,000 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_FILES` |
106
+ | Skill bundle max directory depth (`a/b/c/d` = 4) | 16 | Workspace default | Per-workspace (plan/env) | `WORKSPACE_SKILL_BUNDLE_MAX_DEPTH` |
107
+ | Skill bundle max entry path length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_SKILL_BUNDLE_MAX_PATH_LENGTH` |
108
+ | `File.mountPath` max length | 512 characters | Workspace default | No (hard ceiling) | `WORKSPACE_MOUNT_PATH_MAX_LENGTH` |
109
+
110
+ ### Rate limits (per workspace, per minute)
111
+
112
+ Run submission has its own platform-enforced velocity cap: **120 submits per
113
+ minute** per workspace by default (`0` = disabled). Past it, `POST /runs` fails
114
+ with `429 workspace_submit_rate_exceeded` (see [Errors](errors.md)). It is
115
+ overridable per-plane via `AEX_WORKSPACE_SUBMIT_RATE_PER_MIN` or per-workspace
116
+ via support.
117
+
118
+ The dashboard mutation actions below default as listed; each is overridable
119
+ per-plane via the matching `AEX_RATE_LIMIT_<ACTION>_PER_MINUTE` env var.
120
+
121
+ | Action | Default per minute | Source | Constant |
122
+ | --- | --- | --- | --- |
123
+ | Run cancel | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
124
+ | Run delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
125
+ | Signed output link | 120 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
126
+ | API key create | 10 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
127
+ | API key delete | 30 | Workspace default | `WORKSPACE_RATE_LIMIT_DEFAULTS` |
128
+
129
+ ### Introspecting your effective caps
130
+
131
+ `aex.whoami()` (CLI: `aex whoami`) returns a `limits` object carrying the
132
+ workspace's *effective* values for the caps above — `maxConcurrentRuns`,
133
+ `submitRatePerMinute`, `spendCapUsd`, plus the live `monthSpendUsd`,
134
+ `balanceUsd`, `balanceGraceFloorUsd`, and `paymentMethodStatus` — resolved by
135
+ the same code the admission gates use, so you can anticipate a `429`/`402`
136
+ before submitting. See [Authentication](authentication.md) and
137
+ [Errors](errors.md).
138
+
139
+ ## Request Scope
140
+
141
+ | Limit | Value | Source | Raisable? | Constant |
142
+ | --- | --- | --- | --- | --- |
143
+ | Signed output URL TTL | 300 seconds | aex policy | Per-call via `expiresSeconds` | `REQUEST_PRESIGN_URL_DEFAULT_TTL_SECONDS` |
144
+ | Event-stream connection ticket TTL | 60 seconds | aex policy | Per-mint via `ttlMs` | `REQUEST_TICKET_DEFAULT_TTL_MS` |
package/docs/limits.md CHANGED
@@ -1,50 +1,50 @@
1
- ---
2
- title: Limits
3
- ---
4
-
5
- # Limits
6
-
7
- aex runs autonomous agents on the hosted managed runtime. The SDK opens durable
8
- sessions, sends turns, streams events, captures outputs, and exposes auth-gated
9
- reads and downloads.
10
-
11
- For what the product supports, see [Features](https://aex.dev/docs/features/).
12
- For the current provider/model set, see the generated
13
- [provider/runtime capability matrix](provider-runtime-capabilities.md).
14
-
15
- ## Current Defaults
16
-
17
- | Area | Default |
18
- | --- | --- |
19
- | Workspace storage | 500 GB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
20
-
21
- ## Product Boundaries
22
-
23
- | Area | Boundary |
24
- | --- | --- |
25
- | Runtime | New submissions run on the managed runtime. The `runtime` option selects a managed machine-size preset (`Sizes.*`); there is no alternative runtime backend. |
26
- | Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
27
- | Secrets | Provider keys, MCP credentials, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
28
- | MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
29
- | Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
30
- | Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
31
- | Sessions | The durable product primitive is the session/run record. Sessions can be resumed by id and auto-suspend after the configured idle window; persistent named agent profiles and saved agent definitions are out of scope. |
32
- | 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. |
33
- | Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime and storage usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
34
-
35
- ## Provider Policy Links
36
-
37
- These links are starting points for provider-owned policy areas; they do not
38
- create aex guarantees.
39
-
40
- - Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
41
- - OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
42
- - Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
43
- - Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
44
-
45
- ## Unsupported Claims
46
-
47
- Do not describe aex as providing true self-host or customer-cloud deployment
48
- support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
49
- trials, a general-purpose sandbox for every downstream service, human-in-the-loop
50
- approval checkpoints, or persistent agent identity.
1
+ ---
2
+ title: Limits
3
+ ---
4
+
5
+ # Limits
6
+
7
+ aex runs autonomous agents on the hosted managed runtime. The SDK opens durable
8
+ sessions, sends turns, streams events, captures outputs, and exposes auth-gated
9
+ reads and downloads.
10
+
11
+ For what the product supports, see [Features](https://aex.dev/docs/features/).
12
+ For the current provider/model set, see the generated
13
+ [provider/runtime capability matrix](provider-runtime-capabilities.md).
14
+
15
+ ## Current Defaults
16
+
17
+ | Area | Default |
18
+ | --- | --- |
19
+ | Workspace storage | 500 GB per workspace for captured outputs and workspace artifacts. aex-maintainer admin workspaces may be unlimited for internal dogfooding; this is not a customer entitlement. |
20
+
21
+ ## Product Boundaries
22
+
23
+ | Area | Boundary |
24
+ | --- | --- |
25
+ | Runtime | New submissions run on the managed runtime. The `runtime` option selects a managed machine-size preset (`Sizes.*`); there is no alternative runtime backend. |
26
+ | Provider policy | Provider retention, training exclusion, HIPAA/BAA, data residency, abuse policy, and pricing belong to the selected provider account, endpoint, and contract. |
27
+ | Secrets | Provider keys, MCP credentials, and env secrets are caller-owned. aex excludes secret values from idempotency and uses the explicit secret surfaces described in [Secrets](secrets.md). |
28
+ | MCP servers | Remote MCP servers are customer-trusted systems. aex validates declarations and routes credentials; it does not make an untrusted MCP server safe. |
29
+ | Outputs | Captured outputs, events, and metadata are stored under the run record and downloaded through auth-gated routes. Output content is customer content. |
30
+ | Human review | Runs execute after submission. Cancellation is available, but aex does not pause a run for platform-mediated approval or interactive clarification. |
31
+ | Sessions | The durable product primitive is the session/run record. Sessions can be resumed by id and auto-suspend after the configured idle window; persistent named agent profiles and saved agent definitions are out of scope. |
32
+ | 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. |
33
+ | Cost | BYOK provider-token charges accrue to the customer's provider account. aex records report-only telemetry for runtime and storage usage; free trials, billing-grade invoices, and public pricing documents are not shipped unless documented later. |
34
+
35
+ ## Provider Policy Links
36
+
37
+ These links are starting points for provider-owned policy areas; they do not
38
+ create aex guarantees.
39
+
40
+ - Anthropic API data retention policy: <https://platform.claude.com/docs/en/manage-claude/api-and-data-retention>
41
+ - OpenAI API data controls: <https://platform.openai.com/docs/guides/your-data>
42
+ - Mistral privacy and API data handling: <https://docs.mistral.ai/admin/security-access/privacy>
43
+ - Gemini API data handling: <https://ai.google.dev/gemini-api/docs/logs-policy>
44
+
45
+ ## Unsupported Claims
46
+
47
+ Do not describe aex as providing true self-host or customer-cloud deployment
48
+ support, provider-wide retention, HIPAA/BAA or data-residency guarantees, free
49
+ trials, a general-purpose sandbox for every downstream service, human-in-the-loop
50
+ approval checkpoints, or persistent agent identity.
package/docs/mcp.md CHANGED
@@ -1,47 +1,47 @@
1
- ---
2
- title: MCP
3
- ---
4
-
5
- # MCP
6
-
7
- MCP support is remote HTTPS/SSE only. Stdio MCP servers are rejected because aex is a remote session dispatcher, not a local process supervisor.
8
-
9
- Rules:
10
-
11
- - MCP servers are declared in the run request config (`mcpServers`).
12
- - Runtime HITL is disabled.
13
- - Tool policy must be configured before session start.
14
- - Enabled MCP tools use `always_allow` provider permissions.
15
- - `always_ask` is not used by aex MVP.
16
- - Bearer/OAuth-style auth is carried by the `McpServer` instance (its `headers`); the SDK splits it into the vaulted secrets channel server-side.
17
-
18
- Use allowlists for sensitive servers whenever possible.
19
-
20
- ## Large-payload responses
21
-
22
- aex is a session dispatcher, not an MCP runtime. We intentionally do
23
- **not** interpose on the transport between the model and an upstream MCP
24
- server, so we cannot elide MCP responses or write them to the session
25
- filesystem on the user's behalf. Anything an MCP tool returns lands
26
- directly in the model's context.
27
-
28
- For ingestion-style MCP servers that return large JSON blobs (search results,
29
- catalogue dumps, bulk reads), prefer a skill that writes files instead of
30
- putting the whole response in model context:
31
-
1
+ ---
2
+ title: MCP
3
+ ---
4
+
5
+ # MCP
6
+
7
+ MCP support is remote HTTPS/SSE only. Stdio MCP servers are rejected because aex is a remote session dispatcher, not a local process supervisor.
8
+
9
+ Rules:
10
+
11
+ - MCP servers are declared in the run request config (`mcpServers`).
12
+ - Runtime HITL is disabled.
13
+ - Tool policy must be configured before session start.
14
+ - Enabled MCP tools use `always_allow` provider permissions.
15
+ - `always_ask` is not used by aex MVP.
16
+ - Bearer/OAuth-style auth is carried by the `McpServer` instance (its `headers`); the SDK splits it into the vaulted secrets channel server-side.
17
+
18
+ Use allowlists for sensitive servers whenever possible.
19
+
20
+ ## Large-payload responses
21
+
22
+ aex is a session dispatcher, not an MCP runtime. We intentionally do
23
+ **not** interpose on the transport between the model and an upstream MCP
24
+ server, so we cannot elide MCP responses or write them to the session
25
+ filesystem on the user's behalf. Anything an MCP tool returns lands
26
+ directly in the model's context.
27
+
28
+ For ingestion-style MCP servers that return large JSON blobs (search results,
29
+ catalogue dumps, bulk reads), prefer a skill that writes files instead of
30
+ putting the whole response in model context:
31
+
32
32
  1. Package the upstream helper as a Skill (`Skill.fromDir` / `Skill.fromUrl`)
33
33
  and pass it via the top-level `skills` option. The skill can include a CLI
34
34
  binary or script that the agent invokes with its bash tool.
35
- 2. Keep any upstream HTTPS credentials in `environment.secrets`.
36
- 3. Have the CLI write the full payload to the session filesystem. By default,
37
- files it creates or modifies are captured automatically; pass
38
- `outputs.allowedDirs` only when you want to narrow capture to specific roots.
39
- Return only a small handle (path, item count, summary) to the model.
40
-
41
- The agent sees the handle in context; the bytes ride out through
42
- `download()` as a normal captured output.
43
-
44
- If you genuinely want everything in context (small responses, code
45
- search, etc.), use MCP. If the payload would blow your context budget,
46
- the CLI-as-skill pattern is the supported answer — there is no platform
47
- flag to elide MCP responses.
35
+ 2. Keep any upstream HTTPS credentials in `environment.secrets`.
36
+ 3. Have the CLI write the full payload to the session filesystem. By default,
37
+ files it creates or modifies are captured automatically; pass
38
+ `outputs.allowedDirs` only when you want to narrow capture to specific roots.
39
+ Return only a small handle (path, item count, summary) to the model.
40
+
41
+ The agent sees the handle in context; the bytes ride out through
42
+ `download()` as a normal captured output.
43
+
44
+ If you genuinely want everything in context (small responses, code
45
+ search, etc.), use MCP. If the payload would blow your context budget,
46
+ the CLI-as-skill pattern is the supported answer — there is no platform
47
+ flag to elide MCP responses.