feat: pct_create action, ToolCallGroup collapse+animation, inline chat approval
- Add pct_create to request_execution (MCP) and executeApprovedAction (httpapi) Parses JSON config: vmid, hostname, cores, memory, disk_gb, ip, gw, storage, template, privileged, nesting, mounts, nameserver, searchdomain. Creates entity (state=provisioning), hosts relationship, entity_status on success. Fixes action string parsing to use Index instead of SplitN (colons in JSON). - Rewrite ToolCallGroup.svelte: bits-ui Collapsible replaces native <details>. Collapsed by default. Animated header shows live tool count + running tool name while streaming. Auto-expands during streaming, auto-collapses on done. - Add InlineApproval component: parses 'execution UUID queued' from agent response, renders Approve/Deny buttons inline in chat, calls decideApproval. - Document pct_create in nomos/SOUL.md with params, risk class, and approval flow. - Add session-review skill at .agents/skills/session-review/SKILL.md. - Add plan: 2026-07-09-session-execution-and-ux-fixes.md.
This commit is contained in:
82
.agents/skills/session-review/SKILL.md
Normal file
82
.agents/skills/session-review/SKILL.md
Normal file
@@ -0,0 +1,82 @@
|
||||
---
|
||||
name: session-review
|
||||
description: "Examine a Nomos chat session, compare the user's objective with the actual outcome, identify causes of failure (missing tools, excessive tool calls, blocked actions, model behavior), and propose concrete fixes."
|
||||
risk_class: reversible_low
|
||||
inputs: [session_id]
|
||||
---
|
||||
# Session review
|
||||
|
||||
Analyze Nomos chat sessions from the live database, diff objectives
|
||||
against outcomes, and propose fixes.
|
||||
|
||||
## 1. Retrieve session data
|
||||
|
||||
```bash
|
||||
# List recent sessions
|
||||
curl -s http://localhost:8092/sessions | jq '.sessions[:5]'
|
||||
|
||||
# Fetch one session with messages
|
||||
curl -s http://localhost:8092/sessions/{session_id} | jq .
|
||||
```
|
||||
|
||||
## 2. Classify the session
|
||||
|
||||
For each session determine:
|
||||
|
||||
| Dimension | Check |
|
||||
|-----------|-------|
|
||||
| Objective | What was the user trying to accomplish? |
|
||||
| Outcome | Was it achieved? (read final assistant text) |
|
||||
| Tool calls | Count, unique tools, redundancy (e.g., N+1 fan-out) |
|
||||
| Blockers | Missing action? Missing tool? Model refusal? Empty response? |
|
||||
| User frustration | Did the user need to clarify/correct/repeat? |
|
||||
| Message sizes | Content blob sizes — truncation needed? |
|
||||
|
||||
## 3. Key failure signatures
|
||||
|
||||
| Signature | Root cause | Fix |
|
||||
|-----------|-----------|-----|
|
||||
| Agent: "I can't run X — only supports Y" | Missing action in `request_execution` | Add action in `internal/mcp/server.go` |
|
||||
| Agent: "No local knowledge on that" + no web tool | Missing `http_get` / web fetch MCP tool | Add MCP tool |
|
||||
| Empty assistant bubble (text="", no tools) | Model returned blank completion | Retry + error surfacing |
|
||||
| Non-English boilerplate refusal | Flash-tier model degradation | Response quality guard |
|
||||
| >30 tool calls per turn, same tool repeated | N+1 fan-out instead of bulk tool | Enrich bulk tools + tighten SOUL.md |
|
||||
| Message >50KB in DB | Raw tool results persisted verbatim | Truncation in `store.go` |
|
||||
|
||||
## 4. Extract patterns across sessions
|
||||
|
||||
```bash
|
||||
# All sessions summary
|
||||
curl -s http://localhost:8092/sessions | jq -r '.sessions[] | "\(.id[:8]) \(.title[:80]) \(.created_at[:16])"'
|
||||
|
||||
# Message count + tool count per session
|
||||
for id in $(curl -s http://localhost:8092/sessions | jq -r '.sessions[].id'); do
|
||||
msgs=$(curl -s "http://localhost:8092/sessions/$id" | jq '.messages | length')
|
||||
tools=$(curl -s "http://localhost:8092/sessions/$id" | jq '[.messages[].content.tool_calls | length] | add')
|
||||
echo "$id $msgs msgs $tools tools"
|
||||
done
|
||||
```
|
||||
|
||||
## 5. Output format
|
||||
|
||||
```
|
||||
Session: {id[:8]} — "{title[:60]}"
|
||||
Messages: {N} ({user}/{assistant})
|
||||
Tool calls: {total} across {turns} turns
|
||||
Top tools: {name:count, name:count, ...}
|
||||
Objective: {one-line summary}
|
||||
Outcome: ✅ / ❌ / ⚠️
|
||||
Blockers: {list or "none"}
|
||||
Fixes needed: {concrete actions}
|
||||
Severity: blocker | friction | cosmetic
|
||||
```
|
||||
|
||||
## Related files
|
||||
|
||||
- `cmd/nomos/agent.go` — agent loop, tool building, response guards
|
||||
- `cmd/nomos/store.go` — session + message persistence
|
||||
- `internal/mcp/server.go` — all tool implementations including `request_execution`
|
||||
- `web/src/lib/components/ToolCallGroup.svelte` — tool result display
|
||||
- `nomos/SOUL.md` — agent persona and tool selection rules
|
||||
- `plans/2026-07-09-chat-sessions-improvements.md` — prior session findings
|
||||
- `plans/2026-07-09-session-execution-and-ux-fixes.md` — latest plan
|
||||
Reference in New Issue
Block a user