* feat(core): lazy-load deferred tools in Code Mode
* refactor(core): drop unreachable Code Mode scope check in tool_search
In Code Mode, returnSchemas resolves names only against the binding keys,
so a resolved name is always a binding and the follow-up bindings.has()
check could never fail. Note where the scope is actually enforced instead.
* docs: align older Code Mode docs and comments with lazy discovery
Mark the CodeModeOnly MVP and context-tools designs as partly superseded
now that tool_search is a top-level direct control, scope the sub-agent
bridge paragraph to Direct mode, and correct two test comments that still
said both bridge tools are hidden in Code Mode.
---------
Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
* feat(core): add CodeModeOnly tool execution
* fix(core): preserve CodeModeOnly execution semantics
* fix(core): drop the tool_search reminder in CodeModeOnly
CodeModeOnly hides `tool_search` and binds every deferred tool — schema
included — into the `exec` description, so progressive discovery has
nothing left to do. The session prelude still announced those tools as
"reachable via `tool_search`", pointing the model at a tool that is
never declared and re-billing the text on every cached prefix. Worse,
tools already callable as `tools.web_fetch(...)` looked gated behind a
lookup step that does not exist.
The subagent and fork-resume callers already opted out, but the
main-session prelude sites did not, so the gate now lives where the
prelude is built rather than in each caller.
* chore: refresh settings schema
* chore: refresh companion notices
* fix: register exec tool metadata
* fix(cli): localize exec tool display name
* fix(core): stop offering ToolSearch lookups in CodeModeOnly
CodeModeOnly hides tool_search and binds every deferred schema into the
exec description, so text that tells the model to look a tool up
describes a surface it cannot reach. Return an empty deferred summary
from the registry itself - this also covers the fork-resume reminder
that bypassed the earlier call-site gate - and point the image zoom
hint at tools.zoom_image.
* feat(core): teach the system prompt CodeModeOnly's tool surface
In CodeModeOnly the model can only call exec, so the tool guidance and the
worked examples described a surface it does not have: bare tool names it
cannot call, an instruction to issue several tool calls in one response, and
examples in a direct tool-call syntax that does not exist there.
Give "Using Your Tools" a code-mode branch that routes every tool through
tools.<name>, states which tools are direct controls instead, and replaces
multi-call parallelism with batching inside one exec program. Swap the four
model-family example sets for one shared exec set, since the syntax
differences they exist for do not apply. The mechanics of exec itself stay in
its tool description; the prompt carries only policy.
* test: include code mode host in standalone fixture
* fix(core): return code mode media as multimodal output
* feat(core): support image tool results in code mode
* fix(core): carry deferred tool schemas in the exec description
CodeModeOnly hides tool_search and never surfaces a nested call as a history
functionCall, so a signature collapsed to Record<string, unknown> could never
be filled in later: parameter names were reachable only by guessing, or by
reading them off validation errors one at a time. Deferred tools keep their
registry state; only the generated signature gains the schema.
* fix(node-repl): restore the bin exec bit after rebuild
npm chmods dist/index.js when it links the bin at install time, but the
build deletes that exact file and tsc re-emits it as 0644. After any
rebuild node_modules/.bin/node-repl-mcp therefore points at a
non-executable target and spawning it fails with EACCES (exit 126)
before the shebang is ever read.
OR the exec bits into the emitted mode instead of setting 0o755, so a
restrictive umask is preserved rather than widened.
* fix(cli): pin patched Ink version
* feat(cli): add collapsible tool call details
* fix(dev): use CLI tsconfig outside repository
* fix(cli): preserve expanded tool details after completion
* fix(cli): fail headless runs on model API errors
* fix(core): expose shell timeout bounds in code mode
* feat(core): add code mode timeout helpers
* feat(cli): expose code mode in settings
* fix(mcp): preserve structured results for model and exec consumers
* fix(core): preserve code mode output and truncate inline
* feat(core): port scoped context tools to code mode
* fix(build): synchronize pnpm lockfile and capability docs
* fix(core): recover from rejected Responses encrypted reasoning