repl: tool-call sub-loop + :mcp meta + system-prompt augmentation
Phase 2 commit #6 per docs/PHASE2.md §12. End-to-end wiring of the MCP tool-call flow on top of broker/safety/context/renderer/mcp. repl.lua additions: - mcp_sessions table populated from config.mcp.servers at startup. connect_mcp() helper does initialize + caches tools/list. Failures status-logged once; absent from mcp_sessions until manual reconnect (C4 — no auto-retry). - tools_schema() flattens connected sessions' tools into the OpenAI {type:"function", function:{name,description,parameters}} shape with "<alias>.<name>" namespacing. - flatten_content() concatenates content[type="text"] blocks; one-shot status warning when non-text blocks (image/resource) are dropped (§4 normative spec, v1 only handles text). - dispatch_tool_call(name, args_table) splits alias.tool, looks up session, calls. Returns (content_string, is_error). Errors of every flavor (missing alias, no session, rpc_error, transport_error) yield a synthesized "[aish] ..." string so callers always have a body for the role:"tool" turn — alternation preserved per C5/C7. - ask_ai rewritten as a sub-loop that re-issues the broker request until the model returns pure text or max_tool_depth (default 8) is hit. Each iteration: stream response → if tool_calls present, confirm-gate each → dispatch → append role:"tool" turn → continue. Argument-JSON parse failure produces a synthesized tool turn (C7). Decline at confirm produces "[aish] tool call declined by user" tool turn (alternation guarantee). - :mcp meta with sub-commands: list / tools / tool <a.n> / connect <url> [alias] / disconnect <alias>. HELP block extended. context.lua: DEFAULT_SYSTEM_PROMPT grows by ~4 lines per PHASE2.md §8 (hybrid prompt: static frame about MCP + dynamic tools list in the request body). Block is always present even when no MCP servers configured — ~60 tokens for clarity that 'CMD:' remains the fallback. CMD: extraction unchanged — runs on the FINAL pure-text response only (not on intermediate iterations of the tool sub-loop). Substrate §3 invariant preserved. End-to-end verified two ways: (1) Direct broker probe: aish's tools_schema fed through broker.chat_stream against hossenfelder → qwen-1.5b emits one tool_call payload with correct id + name="boltzmann.list_dir" + args='{"path":"/tmp"}'. Accumulator stitched the JSON-string across fragmented deltas. (2) Mocked-broker sub-loop test: ask_ai feeds 'list /tmp', mock emits text + tool_call, sub-loop dispatches against LIVE boltzmann lmcp (auto_approve via policy), 80+ files rendered inside the tool_call frame, broker re-invoked with the extended context, mock returns pure text, sub-loop terminates. Total broker invocations: 2. Known: the loaded fast model (qwen-1.5b) tends to emit "CMD: ..." suggestions even when an MCP tool is the better path; the small model's system-prompt compliance is weak. Larger models and the analyze-time direct probe confirm the tools_schema and tool_calls flow is wire-correct — Phase 7 verify will exercise this against qwen3-30b or cloud models when available. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+11
-1
@@ -10,12 +10,22 @@ local M = {}
|
||||
|
||||
-- The §6 default system prompt. The `CMD: ` (exact prefix, single space)
|
||||
-- contract is locked per §3 invariants — do not edit without amending PHASE0.
|
||||
-- Phase 2 appends ~4 lines about MCP tools per PHASE2.md §8 (hybrid:
|
||||
-- static frame here + dynamic tools list in the request body). The block
|
||||
-- is always present even when no MCP servers are configured — the cost
|
||||
-- is ~60 tokens and the model just sees instructions that don't apply.
|
||||
local DEFAULT_SYSTEM_PROMPT = [[
|
||||
You are aish, an AI-augmented shell assistant. You help the user execute shell
|
||||
commands, write and debug code, and re-engineer software. When suggesting shell
|
||||
commands, output them on a line beginning with exactly "CMD: " so aish can
|
||||
identify and optionally execute them. Be concise. Prefer concrete actions over
|
||||
explanations unless asked.]]
|
||||
explanations unless asked.
|
||||
|
||||
You may have access to MCP tools — they appear in this request's `tools` field.
|
||||
Call a tool by emitting a tool_call; the result will be supplied in the next
|
||||
turn. Use tools for structured operations (file reads, queries, etc.) and
|
||||
`CMD:` lines for local shell commands. Prefer tools when available; fall back
|
||||
to `CMD:` for anything not exposed as a tool.]]
|
||||
|
||||
local Context = {}
|
||||
Context.__index = Context
|
||||
|
||||
Reference in New Issue
Block a user