v0.7.1: Streaming + Markdown + URLs + Interrupt — TDD
Some checks failed
Deploy (Gitea) / deploy (push) Failing after 2s

Stream-chunk protocol: SSE streaming via provider-openai-stream,
cascade-stream with fboundp guard in think(). TUI renders live.

Stream interrupt: Esc during streaming marks [interrupted], finalizes msg.
SSE cancel infrastructure: *stream-cancel* check in read loop.

Markdown inline: **bold**, *italic*, `code` via parse-markdown-spans.
Code blocks: parse-markdown-blocks + syntax-highlight (keywords/strings/fns).
URL detection + Tab-to-activate: https:// URLs in dim, Tab opens.

Watchdog: 30s stall detection via Dexador read-timeout.
[streaming] indicator in status bar.

Pre-existing TUI test fixes (7): first→aref, nil→zerop, add-msg arg.

Core: 65/65  Neuro: 13/13  TUI View: 22/22  TUI Main: 65/65
Total: 165 tests, 0 failures.
This commit is contained in:
2026-05-08 14:29:53 -04:00
parent fa95e7fb62
commit e3e62140ff
14 changed files with 1044 additions and 70 deletions

View File

@@ -1110,6 +1110,9 @@ Rationale: Passepartout already has the infrastructure for time awareness — ti
** v0.7.0: TUI Essentials — Terminal Parity
:LOGBOOK:
- State "DONE" from "TODO" [2026-05-08 Fri]
:END:
The TUI is the main UI for v1.0.0. Competitive analysis of Claude Code, OpenCode, Hermes, and OpenClaw revealed that Passepartout's TUI is architecturally sound but missing table-stakes terminal UX features. These are the things every terminal application since the 1980s does that Passepartout doesn't. No design philosophy would argue against them.
@@ -1169,7 +1172,7 @@ The TUI is the main UI for v1.0.0. Competitive analysis of Claude Code, OpenCode
- ~@path<Tab>~ file path completion from ~memex/projects/~ (Org + Lisp files)
- 3 TDD tests, all pass
*** TODO External editor integration (Ctrl+X+E) — done, pending test
*** DONE External editor integration (Ctrl+X+E)
:PROPERTIES:
:ID: id-v070-external-editor
:CREATED: [2026-05-08 Fri]
@@ -1183,29 +1186,23 @@ The TUI is the main UI for v1.0.0. Competitive analysis of Claude Code, OpenCode
*** TODO TUI-based setup wizard — deferred to v0.8.0
*** TODO Pads for chat scrolling — deferred to v0.7.1 (needs Croatoan terminal for testing)
*** TODO Deeper autocomplete (frecency + subcommand)
:PROPERTIES:
:ID: id-v070-autocomplete
:CREATED: [2026-05-08 Fri]
:END:
Extend Tab completion beyond the 8 command names:
- File attachment autocomplete: ~@passe<Tab>~~@passepartout/org/core-reason.org~ with frecency ranking (frequency × recency decay, OpenCode pattern). Scans ~/memex/projects/~ for Org and Lisp files.
- Subcommand completion: ~/theme <Tab>~ → lists theme names. ~/focus <Tab>~ → lists project directories. ~/skin <Tab>~ → lists installed skins.
- Context-aware: argument-aware completion registered per command in a completion-function alist.
~50 lines. No daemon changes — pure TUI string matching against memex directory tree.
*** TODO Pads for chat scrolling — deferred to v0.7.2 (needs Croatoan terminal for testing)
** v0.7.1: TUI — Streaming + Markdown Rendering
:LOGBOOK:
- State "DONE" from "TODO" [2026-05-08 Fri]
:END:
Every competitor streams text as the LLM produces it. Passepartout shows a "…thinking" spinner then dumps a wall of text. This is v0.1-era UX. Also: LLM output contains ~**bold**~, ~```code blocks```~, and ~*italic*~ that are currently rendered as literal markdown characters. Both issues are daemon protocol + TUI rendering changes.
*** TODO Stream-chunk protocol
*** DONE Stream-chunk protocol
:PROPERTIES:
:ID: id-v061-streaming
:CREATED: [2026-05-08 Fri]
:END:
:LOGBOOK:
- State "DONE" from "TODO" [2026-05-08 Fri]
:END:
- New frame type ~(:type :stream-chunk :payload (:text "partial..."))~ in ~core-transport.lisp~. Final chunk is an empty string, signalling end-of-stream.
- ~neuro-provider~: for providers supporting streaming (OpenRouter, OpenAI, Anthropic, Groq), send ~"stream": true~. Read SSE stream, extract ~delta.content~ from each chunk, call new ~*stream-callback*~ with partial text.
@@ -1214,19 +1211,25 @@ Every competitor streams text as the LLM produces it. Passepartout shows a "…t
- ~[streaming]~ indicator on current message; changes to timestamp on completion; ~[interrupted]~ if cancelled mid-stream.
- ~50 lines daemon + ~80 lines TUI rendering.
*** TODO Streaming watchdog
*** DONE Streaming watchdog
:PROPERTIES:
:ID: id-v061-watchdog
:CREATED: [2026-05-08 Fri]
:END:
:LOGBOOK:
- State "DONE" from "TODO" [2026-05-08 Fri]
:END:
When the LLM stalls for 30+ seconds without new deltas, auto-reset the stream and inject a system message: "Response stalled — the model may be overloaded. Send another message to retry." Claude Code and OpenClaw both implement this pattern. ~25 lines.
*** TODO Markdown rendering — code blocks + bold + italic
*** DONE Markdown rendering — code blocks + bold + italic
:PROPERTIES:
:ID: id-v061-markdown
:CREATED: [2026-05-08 Fri]
:END:
:LOGBOOK:
- State "DONE" from "TODO" [2026-05-08 Fri]
:END:
Replace literal markdown syntax with styled text using Croatoan attributes:
@@ -1893,6 +1896,34 @@ After N HITL approvals of the same pattern, the dispatcher auto-approves it. But
- This is the operational realization of "the more you use it, the cheaper it gets" — each certification represents a category of actions that will never cost another HITL prompt
~60 lines in ~security-dispatcher.lisp~ + sidebar rendering reuse.
*** TODO Autonomous certification progress bar — visible "learning" indicator
:PROPERTIES:
:ID: id-v090-cert-progress
:CREATED: [2026-05-08 Fri]
:END:
The certification badge grants permanent auto-approval. Users need to see this happening — "the cheaper over time" thesis must be visible.
- Sidebar Rules panel expanded to show progress bars: ~Rules: 12/47~~██████████░░ 12/47~ and ~Certified: 3/12~~██████░░░░░░ 3/12~
- Milestone notifications: when a rule reaches certification, TUI injects: ~"🎖 Rule certified: shell commands in ~/memex/projects/* are now autonomous. 47 approvals, 0 denials. /certifications to review."~
- Certification velocity: ~"+2 certified this week"~ trend indicator in sidebar
~30 lines on top of existing sidebar rendering.
*** TODO Update mechanism + migrations
:PROPERTIES:
:ID: id-v090-update
:CREATED: [2026-05-08 Fri]
:END:
No update mechanism exists. Users must manually ~git pull~ and re-run ~passepartout setup~ (which reinstalls Quicklisp, retangles everything from scratch). Claude Code has ~claude update~, Hermes has ~hermes update~. Passepartout needs an incremental update path.
- ~passepartout update --check~ — query GitHub API ~GET /repos/amrgharbeia/passepartout/releases/latest~, compare with version stored in ~make-hello-message~. Report: "v0.5.1 available. 47 changes."
- ~passepartout update~ (git-based) — ~git fetch --tags && git checkout v0.5.1~, incremental tangle (only org files changed since previous tag, via ~git diff --name-only v0.5.0..v0.5.1 -- org/*.org~), recompile changed lisp files, restart daemon
- Migration hooks: ~~/memex/system/migrations/~ — ordered Lisp scripts run after tangle, before daemon restart. ~migrate-v051.lisp~ upgrades memory format, config schema, package names. Tracked by ~*migration-version*~ in ~~/.config/passepartout/version.lisp~
- Post-update verification: run internal eval suite, verify skill count ≥ 10, smoke test daemon port 9105. On failure: ~passepartout update --rollback~~git checkout v0.5.0~ → re-tangle → restart
- Binary update path (when v0.14.0 ships): download binary from GitHub Releases, verify SHA-256, replace, restart
~80 lines bash + ~50 lines Lisp.
** v0.10.0: Tool Ecosystem (MCP-Native) + Voice Gateway
*(Renumbered from old v0.8.0.)*