From 0a23c9946317867fcb78fb8d50bac2cf1ee703c1 Mon Sep 17 00:00:00 2001 From: archipelago Date: Fri, 7 Aug 2026 03:33:43 -0400 Subject: [PATCH] fix(mesh): view crashed with a temporal-dead-zone error on load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "[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) --- .../pending/2026-08-07-open-task-list.md | 87 +++++++++++++++++++ neode-ui/src/views/Mesh.vue | 22 +++-- 2 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 .planning/todos/pending/2026-08-07-open-task-list.md diff --git a/.planning/todos/pending/2026-08-07-open-task-list.md b/.planning/todos/pending/2026-08-07-open-task-list.md new file mode 100644 index 00000000..bc17e33d --- /dev/null +++ b/.planning/todos/pending/2026-08-07-open-task-list.md @@ -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. diff --git a/neode-ui/src/views/Mesh.vue b/neode-ui/src/views/Mesh.vue index 36c3237f..2749a269 100644 --- a/neode-ui/src/views/Mesh.vue +++ b/neode-ui/src/views/Mesh.vue @@ -1656,9 +1656,18 @@ const fetchedUrls = ref>(new Map()) // `immediate: true` so already-loaded history gets the same treatment as // newly-arriving messages. const autoFetchedCids = new Set() -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;