skills: agent-written skills and protocol proposals with chat buttons
A skill the agent writes now lands in the catalog on its own; a protocol
never does. `skills(op="propose")` stores the document in `skill_proposals`
and returns a card through the tool result's `ui_component` metadata — no
`render_component` call, so profiles without `navi_ui` get the card too.

The decision is the server's: the browser sends `skill_proposal` over the
WebSocket, `SkillStore.decide_proposal` writes the catalog row from the
*stored* document, names the clicking user as the author, and answers with
`skill_proposal_decided`. The agent learns the outcome as a hidden user
message, the same path a `navi_ui` form submission takes.

`create`/`update` refuse protocol documents and point at `propose` with
`replaces_id`, so the version history of a protocol always starts from a
user's yes. The chat store now renders `ui_component` from any tool whose
result carries one, not only from `mcp__navi_ui__render_component`.
1 parent 8fd2a23 commit 6efd8de25f8f8fa129a9dc59395c82f64b3addce
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 1 day ago
Showing 24 changed files
View
docs/skills.md
View
manuals/skills.md
View
navi/api/routes/skills.py
View
navi/api/websocket.py
View
navi/skills/__init__.py
View
navi/skills/store.py
View
navi/tools/skills.py
View
tests/unit/skills/test_skill_store.py
View
tests/unit/tools/test_skills.py
View
webclient/dist/assets/index-Blo-O92P.css 100644 → 0
View
webclient/dist/assets/index-ChK6n5aK.js 0 → 100644
Not supported
View
webclient/dist/assets/index-SW1nQB25.css 0 → 100644
View
webclient/dist/assets/index-Yyi3-5xJ.js 100644 → 0
Not supported
View
webclient/dist/index.html
View
webclient/dist/sw.js
View
webclient/src/api/index.js
View
webclient/src/components/ui/SkillProposal.vue 0 → 100644
View
webclient/src/composables/useWebSocket.js
View
webclient/src/i18n/messages/en.js
View
webclient/src/i18n/messages/ru.js
View
webclient/src/i18n/messages/uk.js
View
webclient/src/stores/chat.js
View
webclient/tests/unit/components/ui/skillProposal.test.js 0 → 100644
View
webclient/tests/unit/stores/chat.test.js