|
2 | 2 |
|
3 | 3 | ## Unreleased |
4 | 4 |
|
| 5 | +- Security (MCP/AI-SDK tool surface): the operator-owned endpoint and path inputs — `daemonBaseUrl`, |
| 6 | + the Metro `proxyBaseUrl`, `stateDir`, `cwd`, `iosSimulatorDeviceSet`, `iosXctestrunFile`, |
| 7 | + `iosXctestDerivedDataPath`, `iosXctestEnvDir` — follow the credential inputs off the |
| 8 | + model-writable tool surface: no longer advertised, refused as explicit input with guidance, and |
| 9 | + resolved from env/config only (a model-writable `daemonBaseUrl`/`proxyBaseUrl` would redirect the |
| 10 | + env-resolved token to an arbitrary server). Dropping these plus the credential fields shrinks |
| 11 | + `tools/list` by roughly half. CLI flags and the SDK client options are unchanged. |
| 12 | +- MCP tool descriptions now declare their enforced client timeout envelope (90s default, 180s |
| 13 | + install, 300s+ lease allocation, unbounded only for the streaming `test` runner), sourced from |
| 14 | + the descriptor registry's timeout policy so the declared number cannot drift from the enforced |
| 15 | + one. |
| 16 | +- Security (MCP/AI-SDK tool surface): the shared command-tool executor now enforces the advertised |
| 17 | + tool schema as an admission boundary — every raw `tools/call` argument must appear in the tool's |
| 18 | + advertised (`additionalProperties: false`) schema, or it is refused before config/env resolution. |
| 19 | + Hiding a key from `tools/list` alone was insufficient: the router forwards raw arguments verbatim |
| 20 | + and the MCP config resolver read `config`/`remoteConfig` as CLI flags, so a model-supplied config |
| 21 | + file could load `daemonBaseUrl`/`daemonAuthToken` and redirect the operator's token to an |
| 22 | + arbitrary endpoint. Deny-by-default closes that, the operator keys, and any unknown key at once; |
| 23 | + operator env/config defaults still resolve (they never arrive as tool input). Retired keys are |
| 24 | + still admitted so their migration guidance answers. |
| 25 | +- Security (MCP/AI-SDK tool surface): `daemonAuthToken` and the Metro `bearerToken` are no longer |
| 26 | + advertised as tool input properties, and an explicit value is refused with guidance instead of |
| 27 | + being forwarded. Credentials are operator-owned: set `AGENT_DEVICE_DAEMON_AUTH_TOKEN` (or |
| 28 | + `daemonAuthToken` in `~/.agent-device/config.json`) and `AGENT_DEVICE_METRO_BEARER_TOKEN` on the |
| 29 | + process serving the tools. The model both reads untrusted app UI text and picks tool arguments, |
| 30 | + so a model-writable credential parameter was a prompt-injection exfiltration path. CLI flags |
| 31 | + (`--daemon-auth-token`, `--bearer-token`) and env/config resolution are unchanged. |
| 32 | +- Release hygiene: after `npm publish`, `release:mark-dev` moves `main` to the next patch with a |
| 33 | + `-dev` prerelease marker so the version on `main` never equals a published version (registry |
| 34 | + scanners diff the tool surface per version string, and a moving surface under a released number |
| 35 | + reads as a republish). `release:prepare` refuses to publish while the `-dev` marker is in place. |
5 | 36 | - Windows `--platform web` works again. `agent-device web setup` no longer fails with |
6 | 37 | `npm not found in PATH`, and every web command — including `web doctor` — no longer fails with |
7 | 38 | `spawn EINVAL`. npm and the managed `agent-browser` backend are now both launched as |
|
0 commit comments