New sessions/session_export tools plus a sessions_block vault map in the system prompt (tai.py, ported to detz); recall/search carry a session footer instead of letting the model grep sealed bytes. write_file refuses new markdown at working/repo roots, and the blanket *.md gitignore is gone so docs stay visible. One LineInput owns fd 0 for every prompt (ask, approvals, shell_ask, secrets), ending phantom-empty answers; Ctrl-C re-prompts (double exits), Ctrl-D exits, Ctrl-Z suspends; mid-turn Ctrl-C announces itself and kills foreground shell children via RunInterrupted. Covered by SessionsTests, repl_keys.py pty checks, agent_diff sessions_block cases.
4.6 KiB
4.6 KiB
glue issues and gaps
Found while wiring src/glue. Each entry names the file and the smallest repro. Nothing here was patched
around silently; items marked "glue side" are limits the glue itself has.
Open
- No vault seal.
src/sealis empty (another agent portsSeal).repl::Bootusesstore::NullSealwhenTAI_PASSPHRASEis unset: the banner saysseal: off, python sayson (default key). An explicitTAI_PASSPHRASE=xis refused:seal error: TAI_PASSPHRASE is set but this build links no vault seal(exit 2). Repro:TAI_PASSPHRASE=x build/detz --versionworks (before boot),TAI_PASSPHRASE=x build/detz hiexits 2. Closes with astore::SealPortimplementation passed asBootOptions::seal_factoryinsrc/glue/app_bundle.cpp(one line). SysInfo.collect_sysinfowas ported by no module (tai.py8978-9008).src/comms/comms.cpponly has a stubsys_info(). The glue carriesSysInfoProbe(sequential, each check timed, 10 s ceiling); the python runs the checks on threads.pythonandvenvchecks report the native binary instead of an interpreter.releasetool cannot work natively.do_releaserewrites theVERSION =line of the running script. The binary has no script.OpsAdapter::do_releasethrows and the tool reports the error; the native flow ismake release PART=... MSG=...intaicpp/.ensure_self_backupat boot is not called for the same reason.- Ctrl-C does not kill the model call in flight (glue side, narrowed).
AgentReplHostexpiresagent.deadline, the loop stops at the next step, and a foreground shell/run_livechild is killed within 50 ms (RunInterrupted, workers excluded). A running HTTP call or sandbox exec still finishes first.agent::Agenthas no cancellation point insideChatClient::complete. - MCP port is bound to the main agent (glue side).
McpHostAdapterasks approvals, names the audit actor and runs the resolver subagent through the primary agent, and uses the primary store connection. A worker agent on its own thread that calls an MCP tool therefore shares the primary sqlite connection. tai.py passes the calling agent (app) instead. Needs the port to carry the caller, i.e.McpPort::call(..., Agent&). docs/wiring/capmcp.mddoes not exist. The task listed it;cap/mcpwere wired from the headers (cap_agent_port.h,mcp_serve_main.h,mcp_host.h) andcap.md/mcp.md.src/cli:Command::run()is still the stub (--help/--versiononly) andParser::parsemapsargc <= 1to--help, whereas tai.py starts the REPL.main.cpptherefore callsParser::parseOptsandGlueApp::run(which prints help only for an explicit--help). The other agent that rewritessrc/clishould dropCommandor keepparseOptsand theOptionsfields stable.Makefile:-I../../moloapp/srcresolves fromtaicpp/of the main checkout only. From a git worktree (.claude/worktrees/*/taicpp) it needsCXXFLAGS=... -I/home/retoor/projects/moloapp/src.make testbuildstests/test_main.cpp, which still calls the removed placeholder API (llm::ChatClient("openai", ...),ModelHealth,Opencode,feed_sse,provider_info; docs/wiring/agent.md); not touched here.probe_backendin the REPL banner runs sequentially with a 6 s timeout per backend, like python: a dead backend delays the prompt. Not changed.- Not covered by a committed test:
--tui-local(driven once over a pty by a throwaway script: it drew, ran a real model turn whose answer reached the vault session, and/quitexited 0),--tui(grr client; without a tty it exits 2 withtui unavailable, no grr server was started),--mplexand--plexer-wrap(without a tty they answerno server running on .../open terminal failed: not a terminal, exit 1; the multiplexer session itself was not started),--install(run once against a throwawayHOME: binary copy, bash hook, venv and six bundled skills written, exit 0),--update-models(read-only discovery ran),--eval-retrievaland--stats-rag(empty vault only). --cap-speakstring content. A{"type":"user","message":{"role":"user","content":"text"}}frame (content a plain string) is split into one character per line before it reaches the model. This is the literal tai.py behavior (cap_stream_json.cppmirrorsfor block in message.get("content")); real clients send a block list, whichtests/glue_flags.pyuses. Noted so nobody files it as a port bug.
Fixed in the glue (one-line integration errors)
- None needed in other modules: every compile error was on the glue side.