fix(mesh): view crashed with a temporal-dead-zone error on load

"[Vue Error] ReferenceError: Cannot access 'b' before initialization" from
Ye.immediate, taking the whole Mesh view down.

A watcher with `immediate: true` runs DURING setup. This one calls
handleFetchContent, whose body touches consts declared further down the setup
block — so on any session where history already contained an inline
content_ref, it dereferenced a binding that did not exist yet. handleFetchContent
itself is a hoisted `function`, which is why the call site looked innocent.

The initial pass moves to onMounted, which runs after setup completes: every
binding is initialized, and already-loaded history still gets the same
treatment as new messages, which is what `immediate` was there for.

Also adds .planning/todos/pending/2026-08-07-open-task-list.md — one flat list
of everything open, including the app-lifecycle reports (fedimint guardian
installs but does not work, BTCPay wipe not wiping, Bitcoin Knots vanishing,
fedimint gateway dying at 88%), the missing app_install tool behind
"!ai install bitcoin knots", and the LND UI 401s.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-07 03:33:43 -04:00
co-authored by Claude Opus 5
parent 58c759c149
commit 0a23c99463
2 changed files with 103 additions and 6 deletions
@@ -0,0 +1,87 @@
# Open task list — 2026-08-07
Single flat list. Everything open, from operator reports and on-device evidence.
`[x]` = fixed AND deployed AND verified on archi-dev-box.
## GSD Phase 13 (14/15 — 13-15 is the only plan left)
- [x] 13-15 check 4 — CSP boundary: BLOCKED in AIUI frame, GOT 200 at top
- [x] 13-15 check 1 — AIUI renders (operator: "it's fine")
- [x] 13-15 check 3 — share video + document (operator: "seems fine")
- [ ] 13-15 check 2 — content grid: BLOCKED, no film content exists on this node
- [ ] Write 13-UAT.md, fill 13-VALIDATION.md, close 13-15 + the phase
- [ ] Record-not-fix: music view (D-13), Routstr live paid request, E-09 study
- [ ] Pre-existing: 01-05..01-10, 02-12 have PLAN without SUMMARY
## Fixed + deployed today
- [x] Gate deleted apps' `Authorization` header — broke every Nostr signer everywhere
- [x] Gate 401'd credential-less PWA manifest fetches
- [x] AI Data Access grants → node-side (per-origin localStorage was the cause)
- [x] Content cards carried the PREVIOUS item's description
- [x] IndeeHub relay 502 (root-owned volume vs uid-1000 container user)
- [x] `content_list` scope: own | peers | purchased | films + 2 new RPCs
- [x] Content loads progressively (peers no longer block the grid)
- [x] Mesh view crash: `Cannot access 'b' before initialization` — an
`immediate: true` watcher ran during setup and touched consts declared later
## Assistant / AI capability
- [ ] **No `app_install` tool**`!ai please install bitcoin knots` correctly said it
can't. Add install/uninstall behind the 13-08 confirm gate.
- [ ] **`!archy` / `!ai` over mesh must action commands** — restart/stop/install and
everything else sensible, with text responses. Same tool surface as embedded.
- [ ] **Prose instead of surfaces** — only 1 of 10 transcript turns used a grid/card/
viewer. Apps, bitcoin status, LN balance, files, configs, logs all rendered as prose.
- [ ] Audit all ten `AIContextCategory` values for real coverage, not stubs
- [ ] `files` context request times out
- [ ] Cmd/Ctrl+K → "search with AIUI" must carry the query into the expanded chat
- [ ] More mock content types
## App lifecycle (operator-reported, serious)
- [ ] **Fedimint guardian installs but does not work**
- [ ] **BTCPay Server: uninstall-with-wipe reinstalls with an account still enabled**
wipe is not wiping; must come back genuinely fresh
- [ ] **Bitcoin Knots disappeared again**, plus other apps
- [ ] **Fedimint gateway disappeared at 88% install**
- [ ] Volume-ownership bug family: reconciler logs `chown /var/lib/archipelago/
postgres-btcpay failed` — same shape as the relay fix. Sweep rootless volumes.
## Node / app-gate
- [ ] **LND UI: every `:18083/proxy/lnd/*` call 401s** — the node's own `*-ui` apps need
session passthrough; memory says that rides DISK manifests (catalog refuses
build-source). Check whether it regressed or was never applied on that node.
- [ ] `/app/filebrowser/api/resources/` 401 — same family
- [ ] Gate `Authorization` fix touches 27 gated apps — only IndeeHub retested
(Vaultwarden, Jellyfin, Nextcloud/WebDAV, Gitea, Grafana still unverified)
- [ ] `/api/app-catalog` → 502, repeatedly
## Content / IndeeHub
- [ ] `content.browse-all-peers` needs an OVERALL time budget — >45s is unusable
- [ ] IndeeHub adapter wired but unverifiable here: catalogue is empty (`count: 0`)
- [ ] IndeeHub `wss://relay.nostr.band` closes before established
## AIUI polish
- [ ] **Background image takes ages to load** — likely unoptimised/uncompressed asset;
check size and preload/lazy strategy
- [ ] Web-search blocked by CSP on EVERY query (13-09: the web-search setting must
drive the CSP node-side — allowlist, not wildcard)
- [ ] `strfry.png` / `strfry.svg` 404 — icon missing from
`neode-ui/public/assets/img/app-icons/` (44 icons present, strfry not among them)
- [ ] ChatWindow `Failed to scroll to index N after 10 attempts`
## Bigger pieces
- [ ] **Node-side Nostr signer** — collapses IndeeHub private auth, the app-auth half of
the gate work, and Phase C zaps into one design. Keys stay out of browser + model.
- [ ] Research pass from AIUI's seed/history + Nostr-first ethos before designing
## Note
Console logs supplied 2026-08-07 came from **framework-pt (100.65.115.109)**, not
archi-dev-box — Jellyfin on :8096 and :9100 are that node. Today's fixes are deployed to
archi-dev-box ONLY.
+16 -6
View File
@@ -1656,9 +1656,18 @@ const fetchedUrls = ref<Map<string, string>>(new Map())
// `immediate: true` so already-loaded history gets the same treatment as
// newly-arriving messages.
const autoFetchedCids = new Set<string>()
watch(
() => chatMessages.value.length,
() => {
// NOT `immediate: true`. This watcher calls handleFetchContent, whose body
// touches consts declared further down the setup block — and an immediate
// watcher runs DURING setup, before those exist. Vue surfaced it as
// "ReferenceError: Cannot access 'b' before initialization" from
// Ye.immediate, and it fired whenever history already contained an inline
// content_ref, taking the whole Mesh view down with it.
//
// onMounted runs after setup completes, so every binding is initialized and
// already-loaded history still gets the same treatment as new messages —
// which is what `immediate` was there for.
function autoFetchInlineContent() {
for (const msg of chatMessages.value) {
const payload = msg.typed_payload as { cid?: string; inline?: boolean } | undefined
if (
@@ -1673,9 +1682,10 @@ watch(
void handleFetchContent(msg.typed_payload as any)
}
}
},
{ immediate: true },
)
}
watch(() => chatMessages.value.length, autoFetchInlineContent)
onMounted(autoFetchInlineContent)
// Transport chooser modal state — populated when advice comes back as
// "choose" (size fits both inline-over-mesh AND Tor). User picks a path;