diff --git a/docs/profiles.md b/docs/profiles.md index 508b259..af7e2c6 100644 --- a/docs/profiles.md +++ b/docs/profiles.md @@ -161,8 +161,11 @@ These two are the profiles an ordinary user gets. They exist to keep a household user inside the Navi server's own working directory and out of the rest of the owner's -infrastructure, while still being useful for everyday work. Both carry the **same -native tool set** — they differ in system prompt, model and MCP groups. +infrastructure, while still being useful for everyday work. Both carry the **same native tool +set, with one exception**: `weather` was dropped from `designer_3d` on 2026-10-12 as noise +for 3D work. Because `switch_profile` hands a session the union of the two, a user who wants +the weather still reaches it from `assistant` — the removal trims the 3D agent's schema, it +is not a boundary. Otherwise they differ in system prompt, model and MCP groups. Deliberate omissions, none of which appears in either (or in their `tools.subagent`, or in their MCP groups): @@ -196,6 +199,17 @@ The owner's monitoring surfaces (`synapse`, `hard-panel`) are not given to it at all, not even read-only. - `designer_3d` — `navi-3d` (`modeling`, `analysis`), `navi-web` (`search`, `browse`), `navi_ui` (`ui`). + Its sub-agents get `navi-web` (`search`, `browse`) alone. + +Sub-agents are narrower than the agent, and for `designer_3d` they are now exactly what its +prompt promises them — web search, page reading, filesystem reads, image viewing: +`scratchpad`, `reflect`, `filesystem`, `image_view`, `memory`, `list_tools`, `tool_manual` +plus `navi-web` (`search`, `browse`). Until 2026-10-12 that set was the general one: it +carried `terminal`, `code_exec`, `share_file`, `content_publish`, `todo` and the whole +`navi-3d` server — running commands, publishing and the modelling tools its prompt forbids — +while missing the `image_view` the prompt grants. `assistant`'s sub-agents still get the +general set. `get_current_datetime` and `gmail` ride into every sub-agent set from +`tools/enabled.json`, which no profile's `tools.subagent` can override. The `navi-web` `request` group (`http_request` — arbitrary method, headers and body, issued from the Navi host) is given to none of them, and `gnexus-creds` and `tgclient` are @@ -273,10 +287,11 @@ `"../../../../.."` resolved to `/`, after which every relative path was "inside" — and it left `..` in a relative path unresolved before the containment check (`is_relative_to` is lexical, so `..//x.scad` passed and only the OS collapsed it at open time). - `designer_3d` grants `navi-3d` to the agent *and* to its subagents, so this was host-wide - read and write for an ordinary user — `compile_scad` even creates the output's parent - directories. The id is now validated as a single segment and both branches resolve before - checking; any other server that takes a caller-supplied `session_id` must do the same. + `designer_3d` granted `navi-3d` to the agent, and to its sub-agents until 2026-10-12, so + this was host-wide read and write for an ordinary user — `compile_scad` even creates the + output's parent directories. The id is now validated as a single segment and both branches + resolve before checking; any other server that takes a caller-supplied `session_id` must do + the same. - **`content_publish` path traversal is closed — keep it closed.** `filename` and `source_filename` are cut to their basename (`content_publish.py:70`, `content_store.py:63`) and checked to exist inside the session directory, so diff --git a/docs/tools.md b/docs/tools.md index 49f4ac5..3500948 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -69,7 +69,12 @@ - `tools/enabled.json` — list of user tool names to include in all profiles automatically. - `tools/_template.py` — canonical format reference (not loaded). -Currently present: `get_current_datetime.py`, `gmail.py`, `weather.py`. +Currently present: `get_current_datetime.py`, `gmail.py`, `weather.py`. All three sit in the +same directory; `enabled.json` decides which of them every profile gets — it lists +`get_current_datetime` and `gmail` today, and `weather.py` is present but not enabled (the +3D designer dropped it on 2026-10-12). A profile that names one of these in its own +`tools.agent.native` keeps it regardless — `assistant` and `secretary` declare `weather` +that way. --- diff --git a/manuals/spawn_agent.md b/manuals/spawn_agent.md index 4b359d1..3f7c9ed 100644 --- a/manuals/spawn_agent.md +++ b/manuals/spawn_agent.md @@ -67,11 +67,18 @@ | Profile | Sub-agent tools | |---------|----------------| | `assistant` | todo, scratchpad, reflect, filesystem, code_exec, terminal, memory, list_tools, tool_manual, share_file, content_publish | -| `designer_3d` | todo, scratchpad, reflect, filesystem, code_exec, terminal, memory, list_tools, tool_manual, share_file, content_publish | +| `designer_3d` | scratchpad, reflect, filesystem, image_view, memory, list_tools, tool_manual | -The two restricted profiles deliberately share one sub-agent set. Among the admin -profiles the sets differ (`image_view`, `ssh_exec`, `reload_tools` and the rest appear in -some of them) — read the config rather than assuming. +`assistant`'s set is the general one. `designer_3d`'s is narrower on purpose: its system +prompt allows a sub-agent web search, page reading, filesystem reads and image viewing and +nothing else, so it has no way to run commands (`code_exec`, `terminal`), write or publish +(`share_file`, `content_publish`), call the modelling server (`navi-3d`) or touch the todo +list — and it gained the `image_view` the prompt promises. `designer_3d`'s set was aligned +with its prompt on 2026-10-12; before that the two restricted profiles shared one set. Among +the admin profiles the sets differ (`image_view`, `ssh_exec`, `reload_tools` and the rest +appear in some of them) — read the config rather than assuming. Whatever +`tools/enabled.json` lists (`get_current_datetime`, `gmail`) is merged into every set here +too. `spawn_agent` is always excluded — recursion is impossible. diff --git a/navi/profiles/designer_3d/config.json b/navi/profiles/designer_3d/config.json index 06af59b..95e580a 100644 --- a/navi/profiles/designer_3d/config.json +++ b/navi/profiles/designer_3d/config.json @@ -54,7 +54,6 @@ "image_view", "schedule_recall", "manage_recall", - "weather", "get_current_datetime", "gmail", "notify" @@ -75,23 +74,15 @@ }, "subagent": { "native": [ - "todo", "scratchpad", "reflect", "filesystem", - "code_exec", - "terminal", + "image_view", "memory", "list_tools", - "tool_manual", - "share_file", - "content_publish" + "tool_manual" ], "mcp": { - "navi-3d": [ - "modeling", - "analysis" - ], "navi-web": [ "search", "browse" diff --git a/tools/enabled.json b/tools/enabled.json index 14d4075..0e6400a 100644 --- a/tools/enabled.json +++ b/tools/enabled.json @@ -1,5 +1,4 @@ [ "get_current_datetime", - "gmail", - "weather" + "gmail" ]