Commit Graph
71 Commits
Author SHA1 Message Date
archipelago 152ac785b3 Merge ngit external-access PR 79ca68c1 into combined UAT candidate
Preserve current maintenance/session guards, Firewall UI and existing catalogs.
Retain scoped guest access, publishing journeys and local Blossom integration.
Normalize Blossom/router memory units to supported quadlet suffixes.

Validation: 108 dashboard tests, 10 gateway policy tests, strict source catalog
check. Integrated isolated backend qualification remains required before main.
2026-10-08 18:59:24 -04:00
yaya 94899e69d3 feat: integrate Just Works app and native business setup
Preserve hosted website UX inside Archipelago, add isolated Business and owner-authorized native wallet setup, and include deployment handoff. Based on main with native signer import already accepted.
2026-10-08 19:39:38 +01:00
archipelago 39ad3144f1 fix: show saved AI credentials as ready for provider selection 2026-10-08 13:33:45 -04:00
archipelago 79437d73e8 fix: keep AI funding panel handoffs in one modal history entry 2026-10-08 13:21:04 -04:00
archipelago 0ff95251f5 fix: connect AI funding scan to the wallet scanner 2026-10-08 12:47:40 -04:00
archipelago 82367dc1d5 feat: prioritize Routstr and expose website AI funding setup 2026-10-08 12:35:07 -04:00
archipelago 02691b7d0f merge: reuse accepted AI provider setup in publishing worktree 2026-10-08 12:24:43 -04:00
archipelago e5d77916d4 feat: share reviewed website archives and repair companion setup flows 2026-10-08 12:18:45 -04:00
archipelago 0df423a84f fix(ui): support secure UUIDs on LAN HTTP
Avoid eager consent component crashes and registration approval failures where crypto.randomUUID is unavailable. Share the companion audio CSPRNG fallback, preserve UUIDv4/session semantics and fail closed without secure randomness.

Validation: 24 focused UUID, consent mount, registration recovery and companion audio tests passed. Independent review passed; full UI typecheck/build qualification remains in progress.
2026-10-08 12:00:17 -04:00
archipelago 4660a81d51 fix: align publishing guides and simplify app selection 2026-10-08 11:18:42 -04:00
archipelago d63c90cb5f feat: polish publishing guides around existing setup patterns 2026-10-08 10:48:50 -04:00
archipelago 779d4d66e1 fix: use setup walkthroughs and exclude legacy node signers 2026-10-08 10:02:26 -04:00
archipelago 8d70d0312c Reconcile local main history and retain qualified dashboard fixes 2026-10-08 07:53:33 -04:00
archipelago 63e21bb102 Preserve Cloud and Fleet connection journeys and retry context 2026-10-08 06:36:13 -04:00
archipelago 05e999b117 feat: add isolated static website setup with FIPS and Tor publishing 2026-10-08 06:25:16 -04:00
archipelago 0c1d1b5796 Allow notification thumbnails from admitted LAN app origins 2026-10-07 18:41:06 -04:00
archipelago 235f6d04d5 feat(companion): retain audio with native media controls 2026-10-07 16:10:10 -04:00
archipelago 0d8decb366 Draft retained Cloud video picture-in-picture for companion 2026-10-07 11:31:10 -04:00
archipelago b50bf6159a Explain unaffordable fee bump quotes 2026-10-07 09:12:41 -04:00
archipelago c57119e9a7 Explain unaffordable fee bump quotes 2026-10-07 08:42:08 -04:00
archipelago 6e38d0c093 Enable companion Cloud video picture-in-picture 2026-10-07 08:05:56 -04:00
archipelago ed96df0ac3 Draft explicit rental readiness and start with verified chunk delivery 2026-10-07 00:23:43 -04:00
archipelago 49703d7e88 Integrate recoverable native purchases, registered rentals and explicit payment consent 2026-10-06 22:44:06 -04:00
archipelago 07de8de380 Add native music queue controls, artwork and settled V4V banner 2026-10-06 17:52:33 -04:00
archipelago e8683aa5b1 Preserve slow custom-app overlays through their loading deadline 2026-10-06 13:01:44 -04:00
archipelago a49d4d7128 Keep slow app sessions alive and defer automatic companion prompts 2026-10-06 12:55:47 -04:00
archipelago 08c93f4aad Unify legacy overlay signing with the queued iframe consent bridge 2026-10-06 11:43:33 -04:00
archipelago f3264c8de5 Test fail-closed sharing against older backends 2026-10-06 07:56:44 -04:00
archipelago 19207282f9 Publish content with an atomic price and visibility policy 2026-10-06 07:51:00 -04:00
archipelago 7946ef8636 fix: restore mobile navigation clearance when closing app playback 2026-10-06 03:07:38 -04:00
archipelago e54f83df8f Add signed node-scoped demo catalogs and retained app media sessions 2026-10-06 00:53:34 -04:00
archipelago 83ba98ab42 Guide AI connection setup with private node credentials and explicit providers 2026-10-05 23:41:29 -04:00
archipelago 0c25449566 Show durable connection requests and timestamped node availability 2026-10-05 23:10:34 -04:00
archipelago 5aa74d0513 fix: qualify mobile Cloud viewer and companion downloads 2026-10-05 14:41:08 -04:00
archipelago daac47cac4 fix: harden node upgrades and prepare 1.9.0-alpha 2026-10-05 12:43:49 -04:00
archipelago 19c49c6605 Remove remaining blur from transaction filter container 2026-10-01 14:48:51 -04:00
archipelago f4d3455496 Fix paid-file recovery, app lifecycle regressions and wallet controls
Demo images / Build & push demo images (push) Failing after 1m10s
2026-10-01 10:31:55 -04:00
archipelago eb39391223 fix(ui): keep Bitcoin version choices readable in kiosk 2026-09-30 09:09:21 -04:00
archipelago 0f85f588fb Fix Cashu file redemption and Bitcoin-dependent wallet readiness 2026-09-29 14:42:44 -04:00
archipelago 8212049f57 Shorten ecash backup copy and stack card actions 2026-09-15 16:03:52 -04:00
archipelago a3b6467047 fix(ecash): guide unseeded wallets through Lightning address setup 2026-09-15 15:45:32 -04:00
archipelago d35474f774 fix: defensively hide legacy node identity
Demo images / Build & push demo images (push) Successful in 3m31s
2026-09-12 10:24:01 -04:00
archipelago a03f340bd1 fix: keep node key out of profile signer picker
Demo images / Build & push demo images (push) Successful in 3m26s
2026-09-12 10:06:41 -04:00
archipelago dac29baf97 fix(release): surface companion build and secure GitWorkshop deps 2026-09-11 06:10:59 -04:00
archipelago f5c0ba85cd feat(release): stage GitWorkshop and next node updates 2026-09-09 18:15:21 -04:00
archipelago 973356df16 fix(ecash): harden Minibits claim persistence 2026-09-08 21:16:57 -04:00
6fe9c5f81b fix(ui): escape the literal @ in the Minibits address label
Root cause of "click Receive, click Ecash, the modal disappears" (in
both the browser and the Android companion's WebView, since both host
the same neode-ui bundle): vue-i18n treats a bare @ as the start of
"linked message" syntax. receiveBitcoin.lnAddressLabel ("Your
@minibits.cash address:") isn't valid linked-message syntax, so
*compiling* that message throws a SyntaxError the instant it's first
rendered — i.e. the moment wallet.ecash-lnaddress resolves and the
address section becomes visible. The uncaught render-function error
blanks the whole teleported modal, which is indistinguishable from it
just closing.

Confirmed with a real (non-mocked) Vue app + real vue-i18n compiler in
a headless Chromium — a Vitest run with `t` mocked to a no-op, which is
how the existing component test suite covers this file, cannot catch a
bad message string at all. Fixed by escaping the @ as {'@'} — the same
pattern the codebase already uses for settings.domainNamePlaceholder
("user{'@'}example.com"). Added a regression test using the real
vue-i18n instance instead of the mocked one; verified it fails on the
old string and passes on the fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EawZPP9iidXj6Tvg3EpG3a
2026-09-08 21:16:57 -04:00
28454264ac test(ui): guard the ecash-tab-click path in ReceiveBitcoinModal
Operator report (2026-09-08): clicking the Ecash tab appeared to close
the whole Receive modal. Added a regression test simulating the exact
click, both for wallet.ecash-lnaddress succeeding and failing — the
tab switch alone never emits `close` or unmounts the dialog in either
case, so this isn't reproduced by a plain component-level click; the
investigation continues with the reporter for a browser-console repro.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EawZPP9iidXj6Tvg3EpG3a
2026-09-08 21:16:57 -04:00
ce5c04d49d fix(ecash): stop Minibits LN-address claims from being silently lost
A Minibits /claim response consumes the payment server-side the instant
it's returned — it can never be re-fetched. claim_and_redeem previously
decrypted/redeemed each claim inline and just warn!-logged any failure,
so a mint-unreachable blip, a stale cached server key, or an operator
who'd edited their accepted-mints list to drop the default mint (via
streaming.configure-mints) could make a real payment vanish with
nothing but a log line to show for it — claimed_count/received_sats
still came back as a clean 0, identical to "nothing arrived."

Now: every fetched claim is persisted to MinibitsState.pending_claims
before decrypt/redeem is attempted, survives failures across polls
instead of being dropped, and claim_and_redeem no longer bails out on a
fetch error without first retrying whatever was already pending.
ensure_mint_accepted self-heals the accepted-mints allow-list so the
Minibits mint (the address is inherently backed by it) can't be
excluded out from under a claim. ClaimOutcome gains failed_count,
threaded through wallet.ecash-lnaddress-claim and shown in
ReceiveBitcoinModal so a stuck claim is visible instead of silent.

Also fixes the server_nostur_pubkey field-name typo (no live state to
migrate — this feature hasn't shipped yet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EawZPP9iidXj6Tvg3EpG3a
2026-09-08 21:16:57 -04:00
ssmithxandarchipelago ce9fca1c38 feat(ecash): Minibits @minibits.cash Lightning address on Cashu receive
The wallet used Minibits only as a Cashu mint, so the node could hold and
swap ecash there but had no addressable name at it. This derives a LUD-16
Lightning address (name@minibits.cash) from the node's own ecash wallet and
surfaces it in the ecash Receive tab above the existing paste-token box.

Identity reuses the NUT-13 ecash phrase, so there is no second secret:
  - seedHash = sha256(mnemonic.to_seed("")) — the exact hash the Minibits app
    stores, so restoring the same phrase recovers the same address both ways;
  - Nostr keys via NIP-06 at m/44'/1237'/0'/0/0 (nostr-sdk Keys::from_mnemonic,
    pinned by a unit test against the NIP-06 vector so a bump cannot silently
    move the derivation and orphan the profile).

Backend (wallet/minibits.rs) implements the verified live /v3 flow: NIP-42
challenge/verify -> JWT, idempotent /profile registration with collision
retry, and /claim polling that NIP-04-decrypts each token (service pubkey read
from the address's own LUD-16 metadata, constant fallback) and redeems it
through ecash::receive_token. Mainnet-only; state cached 0600 in
wallet/minibits.json.

New RPC: wallet.ecash-lnaddress (register-or-read, idempotent) and
wallet.ecash-lnaddress-claim (sweep Lightning payments into ecash). The modal
fetches the address on tab open, renders QR + copy, and sweeps claims while
open; a registration failure is non-fatal so paste-token still works.

Verified end-to-end against production: registered a disposable
@minibits.cash address, confirmed it resolves via /.well-known/lnurlp, and the
claim poll returns cleanly.
2026-09-08 21:16:57 -04:00