v0.2.21 - Fix markdown context assembly and logging: add Anvil DM trigger skill config, preserve H1 title on fallback, convert full-mode turn snapshots to readable markdown, and sync Anvil service restart/deploy behavior

This commit is contained in:
Didactyl User
2026-04-04 14:30:02 -04:00
parent 38fc0b10a1
commit a51c4d6114
42 changed files with 4821 additions and 181 deletions

View File

@@ -79,7 +79,7 @@ Trigger event occurs (DM, cron, subscription, webhook, chain)
│ ├─ Skill has trigger matching this event?
│ │ ├─ YES → add to context (layer 1)
│ │ │ └─ Resolve {{...}} references (layer 2)
│ │ │ ├─ Known tool? → execute tool, insert result
│ │ │ ├─ Known tool? → execute tool, convert JSON to markdown, insert
│ │ │ ├─ Adopted skill d-tag? → insert skill content
│ │ │ └─ Unknown? → resolve to empty
│ │ │
@@ -87,8 +87,13 @@ Trigger event occurs (DM, cron, subscription, webhook, chain)
│ │
│ └─ Continue to next skill in list
├─ Append triggering event payload
For DM triggers: always append raw message content
├─ Format Document
Add `# Agent Name` title
│ ├─ Bump all skill headings down one level (# -> ##)
│ └─ Concatenate skills with `---` separators
├─ Split Roles
│ └─ Parse `system:` and `user:` markers to build API messages array
├─ Attach tool schemas (filtered by skill requires_tool tags)
@@ -100,35 +105,27 @@ Trigger event occurs (DM, cron, subscription, webhook, chain)
### Visualization
```
╔══════════════════════════════════════════╗
║ CONTEXT WINDOW ║
║ ║
║ ┌────────────────────────────────────┐ ║
║ │ Layer 1: personality (dm trigger) │ ║
║ │ │ ║
║ │ ┌──────────────────────────────┐ │ ║
║ │ │ Layer 2: {{identity}} │ │ ║
║ │ │ You are Didactyl. npub1... │ │ ║
║ │ └──────────────────────────────┘ │ ║
║ │ │ ║
║ │ You speak concisely and directly. │ ║
║ └────────────────────────────────────┘ ║
║ ┌────────────────────────────────────┐ ║
║ │ Layer 1: chat (dm trigger) │ ║
║ │ │ ║
║ │ Respond helpfully to the admin. │ ║
║ │ Use tools as needed. │ ║
║ │ │ ║
║ │ tools: [nostr_query, nostr_dm] │ ║
║ └────────────────────────────────────┘ ║
║ ┌────────────────────────────────────┐ ║
║ │ DM content (always last) │ ║
║ │ │ ║
║ │ "Who mentioned me today?" │ ║
║ └────────────────────────────────────┘ ║
║ ║
╚══════════════════════════════════════════╝
The assembled context is a single, coherent markdown document before being split into API messages:
```markdown
system:
# Didactyl Agent
- **npub**: `npub1...`
## Personality
You speak concisely and directly.
---
## Chat
Respond helpfully to the admin.
Use tools as needed.
user:
Who mentioned me today?
```
### Why Order Matters
@@ -157,11 +154,11 @@ Trigger event occurs (DM, cron, subscription, webhook, chain)
When the engine encounters `{{variable_name}}` in a skill template:
1. **Check known tools** — if it matches a tool name, execute the tool and insert the result
1. **Check known tools** — if it matches a tool name, execute the tool. The tool returns JSON, which the template engine automatically converts into readable markdown (bullet lists, bold keys) before inserting it into the document.
2. **Check adopted skills** — if it matches an adopted skill's d-tag, insert that skill's content (layer 2)
3. **Neither** — resolve to empty (for portability)
This means `{{admin_profile}}` calls the `nostr_admin_profile` tool, while `{{identity}}` inserts the adopted "identity" skill's content. The skill author doesn't need to know which is which — the resolution is transparent.
This means `{{admin_profile}}` calls the `nostr_admin_profile` tool and formats its JSON output as markdown, while `{{identity}}` inserts the adopted "identity" skill's content. The skill author doesn't need to know which is which — the resolution is transparent.
See [SKILLS.md — Template Variables](SKILLS.md#template-variables) for the full variable table.