Files

202 lines
11 KiB
Markdown
Raw Permalink Normal View History

2026-08-12 10:55:49 +00:00
# Phase 13: AIUI — Conversational Node Control & Content Surfaces - Discussion Log
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
**Date:** 2026-08-03
**Phase:** 13-aiui-functional-conversational-node-control-and-content-surf
**Areas discussed:** Where the tool-calling loop lives, How much authority the chat gets, Content scope and what "music" means, Two-repo split and delivery
---
## Where the tool-calling loop lives
| Option | Description | Selected |
|--------|-------------|----------|
| Node-side in Rust | Binary owns loop, tool registry and key; AIUI is a thin client | ✓ |
| Node proxies the model, AIUI runs the loop | Key stays server-side but tools execute through the ContextBroker | |
| Browser-side in AIUI | AIUI calls the model directly; key lives in the browser | |
**User's choice:** Node-side in Rust
**Notes:** Chosen with the tradeoff stated — this makes the RPC surface a contract AIUI and the later voice pipeline are written against.
| Option | Description | Selected |
|--------|-------------|----------|
| One assistant, many front doors | Extend the existing mesh assistant into a shared service | ✓ |
| Separate subsystem for AIUI | Leave the radio-shaped mesh assistant alone, build beside it | |
| Shared backend, separate authority | Share the key/plumbing, keep tool registries strictly separate | |
**User's choice:** One assistant, many front doors
**Notes:** Directly realizes the user's Phase 2 wording — "the same command surface as Pine".
| Option | Description | Selected |
|--------|-------------|----------|
| Split by nature: node does data+control, broker does UI | Node owns node-touching tools; broker keeps navigate/open-app/theme + consent | ✓ |
| Broker becomes consent-only | Strip back to permissions and theme | |
| Keep the broker as the single front door | Everything forwards through the broker | |
**User's choice:** Split by nature
| Option | Description | Selected |
|--------|-------------|----------|
| Local Ollama when present, Claude as fallback | Node data stays local when a local model exists | ✓ (amended) |
| Claude by default, Ollama opt-in | Best tool-calling reliability, context leaves the node | |
| User picks at setup, no default | Explicit choice, no implicit default | |
**User's choice:** Option 1, **amended by the user** — "but we also want to integrate this as part of it, please plan that too `https://github.com/routstr` so it would be local Ollama or Claude/Routstr as fallback"
**Notes:** Routstr was researched during the discussion rather than assumed: OpenAI-compatible endpoint, Cashu ecash per request, Nostr provider/model/price discovery. All three substrates already exist in-tree, which is why it is a smaller lift here than elsewhere.
| Option | Description | Selected |
|--------|-------------|----------|
| Prepaid budget, auto-spend within it | Hard ceiling a prompt-injected model cannot exceed | ✓ |
| Confirm every paid request | Maximum control, unusable with a multi-call tool loop | |
| Routstr only when explicitly selected | No automatic fallback to a paid path | |
**User's choice:** Prepaid budget the user sets
| Option | Description | Selected |
|--------|-------------|----------|
| Curated allowlist of hand-written tools | Every capability is a deliberate decision | ✓ |
| Auto-generate from the RPC dispatcher | Fast coverage, blast radius = whatever the allowlist forgets | |
| Tiered: curated for writes, generated for reads | Broad reads, hand-written mutations | |
**User's choice:** Curated allowlist of hand-written tools
| Option | Description | Selected |
|--------|-------------|----------|
| Local model gets tools, writes confirmed anyway | Confirm gate does the safety work | ✓ |
| Reads local, writes escalate to the strong model | Undercuts the privacy default at the sensitive moment | |
| Require a tool-capable local model | Honest but costs weak-hardware users the feature | |
**User's choice:** Local model gets tools; every write needs confirmation regardless
**Notes:** Consequence recorded in CONTEXT.md — backend choice becomes a privacy decision, not a safety one.
| Option | Description | Selected |
|--------|-------------|----------|
| Node-side, in the existing per-node data dir | Inherits backup, factory-reset, future LUKS | ✓ |
| Browser-only, never persisted server-side | Nothing accumulates on disk | |
| Ephemeral — no history at all | Strongest privacy, no memory | |
**User's choice:** Node-side in the per-node data dir
---
## How much authority the chat gets
| Option | Description | Selected |
|--------|-------------|----------|
| Reads + app lifecycle + settings writes | Keys, seeds, wallet spends, federation trust, factory reset excluded | ✓ |
| Read-only first | Prove the sandbox before granting power | |
| Full control including wallet and payments | An LLM adjacent to spending authority | |
**User's choice:** Reads within granted categories + app lifecycle + settings writes
| Option | Description | Selected |
|--------|-------------|----------|
| Authority never derives from content; untrusted text fenced and labelled | Injected instructions still face a human confirm | ✓ |
| Keep peer content out of the model entirely | Removes the injection path and much of the appeal | |
| Sanitize and strip suspicious patterns | Rejected as an arms race that reads as a guarantee | |
**User's choice:** Fenced and labelled; authority never derives from content
| Option | Description | Selected |
|--------|-------------|----------|
| In neode-ui's trusted chrome, outside the iframe | Iframe cannot spoof, restyle or pre-click it | ✓ |
| Inside AIUI, styled as part of the conversation | Better feel, drawn by the influenced context | |
| Node-issued confirmation token, UI-agnostic | Strongest and works for voice; more protocol to build | |
**User's choice:** neode-ui's trusted chrome, outside the iframe
| Option | Description | Selected |
|--------|-------------|----------|
| All closed; user opens what they want | Matches the sandbox promise literally | ✓ |
| Low-sensitivity open, sensitive closed | Immediately useful, harder claim to defend | |
| Open on first grant, per-category prompts in context | Just-in-time consent, more moving parts | |
**User's choice:** All 10 categories default closed
---
## Content scope — and what "music" means
Presented alongside verified research findings: AIUI's grids are fed by regex-parsing the model's own reply text against fixture catalogs injected into the system prompt; every "real" data path is Vite dev middleware absent from a static `dist/` deploy; `vite-fs.ts:7` hardcodes `/Users/dorian/Projects`; `ContentPanel.vue` is dead code taking `ArchyAppsGrid`, `FavoritesGrid`, `DiscoverPanel`, `RecipeDetail` and `AppDetail` with it.
| Option | Description | Selected |
|--------|-------------|----------|
| Feed the existing grids from Archy | Keep the design, replace the LLM-synth source | ✓ |
| New Archy-native surfaces alongside | Doubles surface area, splits the design language | |
| Revive ContentPanel and the Archy bridge path | Risks investing in an abandoned architecture | |
**User's choice:** Feed the existing grids from Archy
| Option | Description | Selected |
|--------|-------------|----------|
| Audio files from the two transports you already have | MIME-filtered files, no new entities; folds in the m4a/aac/opus mime bug | |
| Build a real library — albums, artists, metadata | A substantial backend domain | ✓ |
| Leave music to wavlake, wire only files and video | Music already works in prod against wavlake | |
**User's choice:** Build a real library
**Notes:** Chosen after being told explicitly that no library domain exists today and that it deserves its own phase. Concern raised once, user decided, proceeded — sequencing handled by the follow-up below.
| Option | Description | Selected |
|--------|-------------|----------|
| Its own plans inside Phase 13, not blocking the rest | Phase still delivers if the library runs long | ✓ |
| Library first — the rest follows | Cleanest data model, delays everything visible | |
| Split it into its own phase | Its own discussion round | |
**User's choice:** Its own non-blocking wave inside Phase 13
| Option | Description | Selected |
|--------|-------------|----------|
| Surface this node's + peers' existing content; no new payment rail | Uses the invoice/X-Payment-Token/Range flow that exists | ✓ |
| Include the cross-node content source with payments | The full Phase 2 vision; a federation distribution feature | |
| Movies out of scope this phase | Narrowest cut | |
**User's choice:** Surface existing content through the existing paid-unlock subsystem
---
## Two-repo split and delivery
| Option | Description | Selected |
|--------|-------------|----------|
| Built and shipped with the frontend, versioned and verified | Pin the commit, enforce the base path, fetch a live asset to verify | ✓ |
| Make AIUI a real catalog app | Architecturally right; changes a platform rule mid-phase | |
| Vendor AIUI's build output into this repo | One artifact, loses source separation | |
**User's choice:** Built and shipped with the frontend, versioned and verified
| Option | Description | Selected |
|--------|-------------|----------|
| Keep standalone; embedded mode delegates to the node | Dev loop stays fast, no node needed to work on the UI | ✓ |
| Embedded-only from here | Less surface, loses AIUI's independent life | |
| Standalone with the node as an optional backend | "Optional" risks the secure path being the forgotten one | |
**User's choice:** Keep standalone; embedded mode delegates
| Option | Description | Selected |
|--------|-------------|----------|
| Confirm push access before planning starts | Treats it as a prerequisite, not a mid-plan discovery | ✓ |
| Work on a branch, hand merges to a maintainer | Human gate mid-phase, same inert-until-merged risk | |
| Plan the archy side to degrade gracefully | Robust, but designs for a half-landed state throughout | |
**User's choice:** Confirm push access before planning starts
---
## Claude's Discretion
- What the music library indexes over, the tag-extraction library, and where the index lives.
- Streaming/token delivery for chat responses; context-window budgeting over node data.
- Which specific tools make the first curated allowlist, within the authority ceiling.
- Routstr provider selection among Nostr-advertised providers.
- Per-category mapping of the 10 permission categories onto individual tools.
## Deferred Ideas
- Cross-node "archipelago content source" with payments (federation distribution feature).
- AIUI Nostr integration polish (carried from Phase 2's deferred list).
- Reviving `ContentPanel.vue` and the plugin-renderer path — cleanup, not architecture.
- A production answer for AIUI's dev-only Vite middleware beyond what this phase replaces.
- Wiring Pine's voice pipeline to the shared tool registry.