Repository navigation
aish v1.0.0-rc1
Pre-release
Pre-release
Changed
temperaturevalues retain their configured decimal precision in provider requests instead of being rounded throughf32. (#616)max_tokensis no longer sent by default: when the config leaves it unset, the field is omitted from the request so the provider applies the model's own output limit (previously a global 4096/40960 constant, which truncated large-output models and was rejected outright by 16k-output ones). An explicitmax_tokensat or above 16384 is forwarded asmax_completion_tokensunchanged. The Anthropic Messages API requires the field, so that path sends a 64k fallback when unset (the lowest output ceiling among current Claude models). A value below 16384 is removed on load with one warning: older releases wrote their own default into the file (the Python shell's pydantic1000and thev0.3.0-v0.3.6wizard's4096were released; the40960floor of #619 never shipped), and any handwritten cap that small truncates a long reasoning turn into anincomplete response. 16384 is the smallest output ceiling among models in use (GPT-4o); current models sit far above it (GLM-5.3 65,536 default / 131,072 max, DeepSeek V4.1 64K default / 393,216 max, Kimi K3 131,072 default, Claude 5.5 and GPT-5.1-Codex-Max 128K, Gemini 3.1 Pro 65,536), so a cap at or above the minimum is a workable deliberate choice.nulland0(both already meaning "no cap") are dropped silently, and/setting max_tokensrejects a below-minimum value instead of writing one the next start would erase. (#627)
Added
- MCP client (
crates/aish-mcp, issue #564). Servers are declared undermcp.serversin~/.config/aish/config.yamlwith thestdioor Streamable HTTP transport,${VAR}expansion inenv/headers, and per-server/per-tooltrustandside_effectsdeclarations. Servers connect in the background;/mcp status|list|tools|reload|reconnectshows state, and/statuscarries a one-line summary. Credentials never reach status output, logs or audit records. - MCP tools are discovered on demand instead of being injected into every request: each server exposes one gateway tool (
mcp__<server>) with thelist/describe/callactions, so only the catalogue names that the model asks for enter the context. - Every MCP
callgoes through the normal preflight/approval path. It is auto-approved only when the user declared the server (or that tool)trust: allowand its effective side effects areread; undeclared, write and network tools ask,trust: blockrefuses, and server annotations can only narrow a declaration. An approval is bound to the exact argument set (mcp:<server>:<tool>#<digest>), so changed arguments need a new approval. - MCP calls honor the same timeout, cancellation, truncation and audit rules as built-in tools: a per-request deadline (default 30s,
0disables), cancellation through the session token, output capped bymax_output_bytesthen by the shared 4 KB message cap, andAiToolaudit events that now carryduration_msand anoutcome. Server exit, protocol errors and timeouts report a classified failure (connect/timeout/eof/malformed_response/json_rpc/http_status/cancelled) and child processes are reaped with SIGTERM then SIGKILL. /mcpmanages servers without hand-editing YAML:add(interactive wizard, or quick add with--transport/--trust/--side-effects/--timeout/--max-output/--env/--header/--url/--token/-- <command…>),remove|rm,enable,disable,trust <server> <tool|*>,test <server>,tool <server> <tool>andtools [server], plus/mcp help. Edits are written toconfig.yamlatomically (unknown keys preserved) and take effect immediately: the runtime connects or drops just that server and its tool is registered or unregistered in the session./mcp <sub> <Tab>completes server names, and/mcp testreports the server version, tool count and the first tools, with a hint for the common failure classes.mcp.servers[].expose: tools(opt-in) additionally exposes one tool per remote tool (mcp__<server>_<tool>) with its real schema, so the model can call it directly instead of discovering through the gateway; the default staysgatewayso a server's whole catalogue is never injected into the prompt./mcp statusnow also lists configured-but-disabled servers asdisabledinstead of hiding them.- Bare
/mcpprints the status block and then opens a nine-row interactive menu (every row is reachable by number 1-9): add a server (wizard), tools, test, trust, enable/disable, reconnect, reload, remove, help. Each row opens its own panel — pick the server (rows showname [transport] status · tools: N), then the tool or the trust level; the tools row's first entry lists the whole catalogue and its remaining entries print the per-tool detail, the trust row's first entry is*for the whole server, and enable/disable is one row that flips the server according to its current runtime state.Escleaves the menu and no action runs without a selection, so every MCP operation is reachable without recalling arguments or hand-editingconfig.yaml; with nothing configured the menu is theaddrow alone (the wizard). The explicit subcommands (/mcp status|list|tools|tool|add|remove|enable|disable|trust|test|reload|reconnect) are unchanged, and/mcp helpnow documents the menu.
Fixed
aish -cpreselects the session the user attached to most often instead of defaulting to "create new session" or to a single remembered id. Attach counts live in~/.cache/aish/session-usage.json(the previouslast-attach-sessionfile is imported once with that id and removed), the update is guarded by an advisory lock, and with no history the newest live session is preselected. "Create new session" stays selectable but is never the default row: with no live session the picker is skipped entirely and a session is spawned directly. Sessions whose daemon has exited are ignored.