You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wire exec tool_search promotion into the call gate
Exec installed the same advertised-set call gate as the TUI but left tool_search's promoter as a no-op, so MCP names the model was told to call were refused.
// Tools whose full schema is always advertised to the model. Everything else is
10
-
// registered and dispatchable but discovered on demand via tool_search, keeping
11
-
// the per-turn context small. Shared by the system prompt and the advertised-set
12
-
// gate so the two never drift.
10
+
// registered but discovered on demand via tool_search, which promotes matches
11
+
// onto the advertised set and the call gate. Shared by the system prompt and
12
+
// the advertised-set gate so the two never drift.
13
13
//
14
14
// `present` is deliberately absent: most sessions never render a view, and at
15
-
// 2,793 chars it is the second-largest schema on the wire. It stays fully
16
-
// dispatchable — the model finds it via tool_search when a session actually
17
-
// needs it.
15
+
// 2,793 chars it is the second-largest schema on the wire. It stays off the
16
+
// advertised prefix — the model finds it via tool_search when a session
17
+
// actually needs it.
18
18
//
19
19
// Product mutation tools (write_file / edit_file / delete_file) sit in CORE so
20
20
// the primary Skywalker session can DIY tiny/bounded edits without a
@@ -197,7 +197,7 @@ export function createActivatedToolTracker(): ActivatedToolTracker {
197
197
exportconsttoolSearchDefinition: ToolDefinition={
198
198
name: "tool_search",
199
199
description:
200
-
"Discover callable tools by capability. Most tools — MCP servers, present, and other integrations — are dispatchable but not advertised in the tools list. Core tools (read_file, run_shell, web_fetch, web_search, spawn_agent, wait_agents, …) are already on the wire — do not tool_search for them. Call this with a short description of what you need (e.g. 'issue tracker', 'render layout', 'granola notes') to get matching tools' names, descriptions, and input schemas. The returned tools are already callable — invoke them directly, no separate load step.",
200
+
"Discover callable tools by capability. Most tools — MCP servers, present, and other integrations — are not advertised until this search promotes them onto the wire. Core tools (read_file, run_shell, web_fetch, web_search, spawn_agent, wait_agents, …) are already on the wire — do not tool_search for them. Call this with a short description of what you need (e.g. 'issue tracker', 'render layout', 'granola notes') to get matching tools' names, descriptions, and input schemas. Matched tools are promoted and callable on return — invoke them directly, no separate load step.",
201
201
inputSchema: {
202
202
type: "object",
203
203
properties: {
@@ -267,9 +267,9 @@ export function createToolIndex(
267
267
exportinterfaceToolSearchDeps{
268
268
search: (query: string)=>string[];
269
269
lookup: (name: string)=>ToolDefinition|undefined;
270
-
// Make the matched tools' names part of the advertised wire set on the next
271
-
// inference. Every registered tool is already dispatchable via `run`, so this
272
-
// only affects what the model can see without an intervening tool_search.
270
+
// Promote matches onto the advertised set and the call gate so the model can
271
+
// invoke them this turn. The next inference also declares them on the wire
0 commit comments