Compare commits

..

4 Commits

Author SHA1 Message Date
archipelago
0cfb4dc81c chore: release v1.7.88-alpha 2026-06-12 05:12:52 -04:00
archipelago
b8ac68d844 fix: restore aiui and bitcoin receive before release 2026-06-12 05:10:03 -04:00
archipelago
eaf13effd5 fix: restore fast AIUI launch 2026-06-12 05:04:42 -04:00
archipelago
0339268c43 chore: sync cargo lock for v1.7.87-alpha 2026-06-12 04:55:09 -04:00
9 changed files with 70 additions and 75 deletions

View File

@ -1,5 +1,11 @@
# Changelog
## v1.7.88-alpha (2026-06-12)
- AIUI now loads immediately again instead of waiting on a production availability probe and cache-busted iframe URL, restoring the lighter launch behavior from before the regression.
- Bitcoin receive now uses LND's GET-based newaddress flow with the native SegWit address type, fixing the `501 Method Not Allowed` response from the previous POST attempt.
- Validation pending on the AIUI rollback; the rest of the release train remains unchanged.
## v1.7.87-alpha (2026-06-12)
- Bitcoin receive now calls LND's on-chain address endpoint with the correct REST method, and backend failures keep the specific address-generation error instead of collapsing into the generic operation-failed message.

2
core/Cargo.lock generated
View File

@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "archipelago"
version = "1.7.86-alpha"
version = "1.7.88-alpha"
dependencies = [
"anyhow",
"archipelago-container",

View File

@ -1,6 +1,6 @@
[package]
name = "archipelago"
version = "1.7.87-alpha"
version = "1.7.88-alpha"
edition = "2021"
description = "Archipelago Bitcoin Node OS - Native backend"
authors = ["Archipelago Team"]

View File

@ -12,9 +12,9 @@ impl RpcHandler {
let (client, macaroon_hex) = self.lnd_client().await?;
let resp = client
.post(format!("{LND_REST_BASE_URL}/v1/newaddress"))
.get(format!("{LND_REST_BASE_URL}/v1/newaddress"))
.query(&[("type", "p2wkh")])
.header("Grpc-Metadata-macaroon", &macaroon_hex)
.json(&serde_json::json!({ "type": "WITNESS_PUBKEY_HASH" }))
.send()
.await
.context("LND REST connection failed")?;

View File

@ -1,12 +1,12 @@
{
"name": "neode-ui",
"version": "1.7.87-alpha",
"version": "1.7.88-alpha",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "neode-ui",
"version": "1.7.87-alpha",
"version": "1.7.88-alpha",
"dependencies": {
"@types/dompurify": "^3.0.5",
"@vue-leaflet/vue-leaflet": "^0.10.1",

View File

@ -1,7 +1,7 @@
{
"name": "neode-ui",
"private": true,
"version": "1.7.87-alpha",
"version": "1.7.88-alpha",
"type": "module",
"scripts": {
"start": "./start-dev.sh",

View File

@ -1,18 +1,30 @@
<template>
<div class="chat-fullscreen">
<!-- Close button (desktop: top-right pill) -->
<div class="chat-mode-pill hidden md:flex">
<!-- Close button + connection indicator (desktop: top-right pill) -->
<div class="chat-mode-pill flex">
<button class="chat-close-btn" :aria-label="t('chat.closeAssistant')" @click="closeChat">
<svg class="w-4 h-4" aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
<span class="text-xs font-medium">{{ t('chat.close') }}</span>
</button>
</div>
<div
v-if="aiuiConnected"
class="w-2 h-2 rounded-full bg-green-400 ml-2 shadow-[0_0_6px_rgba(74,222,128,0.5)]"
:title="t('chat.aiuiConnected')"
/>
</div>
<!-- Loading indicator while checking availability -->
<!-- Mobile back button -->
<button class="chat-mobile-back md:hidden" :aria-label="t('common.goBack')" @click="closeChat">
<svg class="w-5 h-5" aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<!-- Loading indicator while iframe loads -->
<Transition name="fade">
<div v-if="aiuiAvailable === null" class="chat-loading" role="status" aria-live="polite">
<div v-if="aiuiUrl && !aiuiConnected" class="chat-loading" role="status" aria-live="polite">
<div class="glass-card p-8 flex flex-col items-center gap-4">
<div class="chat-loading-spinner" aria-hidden="true" />
<p class="text-sm text-white/60">{{ t('chat.loadingAssistant') }}</p>
@ -27,24 +39,23 @@
:src="aiuiUrl"
:title="t('chat.aiAssistant')"
class="chat-iframe chat-iframe-mobile"
allow="microphone"
style="background: transparent"
/>
<!-- Fallback when AIUI is not deployed -->
<div v-else-if="aiuiAvailable === false" class="chat-placeholder">
<div class="chat-placeholder-inner glass-card p-8">
<!-- Fallback when no AIUI URL configured -->
<div v-else class="chat-placeholder">
<div class="chat-placeholder-inner">
<div class="chat-placeholder-icon">
<svg class="w-8 h-8 text-white/40" aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
</svg>
</div>
<h2 class="text-2xl font-semibold text-white mb-2">{{ t('chat.aiAssistant') }}</h2>
<p class="text-white/80 mb-4 leading-relaxed">
<p class="text-white/60 mb-4 leading-relaxed">
{{ t('chat.notConfigured') }}
</p>
<p class="text-sm text-white/50">
<p class="text-xs text-white/30">
{{ t('chat.deployCta') }}
</p>
</div>
@ -63,37 +74,16 @@ const { t } = useI18n()
const router = useRouter()
const aiuiFrame = ref<HTMLIFrameElement | null>(null)
const aiuiConnected = ref(false)
let broker: ContextBroker | null = null
const aiuiAvailable = ref<boolean | null>(null) // null = checking, true/false = result
const aiuiUrl = computed(() => {
const envUrl = import.meta.env.VITE_AIUI_URL
if (envUrl) return `${envUrl}?embedded=true&hideClose=true`
// In production, only return the URL if we've confirmed AIUI files exist
if (import.meta.env.PROD && aiuiAvailable.value === true) return `/aiui/?embedded=true&hideClose=true&v=${Date.now()}`
if (envUrl) return `${envUrl}?embedded=true`
if (import.meta.env.PROD) return '/aiui/?embedded=true'
return ''
})
/** Check if AIUI is actually deployed by fetching its index.html */
async function checkAiuiAvailable() {
if (import.meta.env.VITE_AIUI_URL) {
aiuiAvailable.value = true
return
}
if (!import.meta.env.PROD) {
aiuiAvailable.value = false
return
}
try {
const res = await fetch('/aiui/', { method: 'HEAD' })
// If we get HTML back (200), AIUI is deployed. If 404/403, it's not.
aiuiAvailable.value = res.ok
} catch {
aiuiAvailable.value = false
}
}
function closeChat() {
if (window.history.length > 1) {
router.back()
@ -111,13 +101,12 @@ function onAiuiMessage(event: MessageEvent) {
} catch { return }
// Listen for ready messages from AIUI iframe
if (event.data?.type === 'ready') {
// AIUI connected - could use for future features
aiuiConnected.value = true
}
}
onMounted(async () => {
onMounted(() => {
window.addEventListener('message', onAiuiMessage)
await checkAiuiAvailable()
if (aiuiUrl.value) {
broker = new ContextBroker(aiuiFrame, aiuiUrl.value)
broker.start()

View File

@ -1,27 +1,27 @@
{
"version": "1.7.87-alpha",
"version": "1.7.88-alpha",
"release_date": "2026-06-12",
"changelog": [
"Bitcoin receive now calls LND's on-chain address endpoint with the correct REST method, and backend failures keep the specific address-generation error instead of collapsing into the generic operation-failed message.",
"App launch credential interstitials now render as true full-screen overlays, and the launcher loading indicator uses the neutral brand palette instead of a blue spinner.",
"Validation passed with `git diff --check`, `npm run type-check`, and the focused frontend tests for `bitcoinReceive` and `AppIconGrid`."
"AIUI now loads immediately again instead of waiting on a production availability probe and cache-busted iframe URL, restoring the lighter launch behavior from before the regression.",
"Bitcoin receive now uses LND's GET-based newaddress flow with the native SegWit address type, fixing the `501 Method Not Allowed` response from the previous POST attempt.",
"Validation pending on the AIUI rollback; the rest of the release train remains unchanged."
],
"components": [
{
"name": "archipelago",
"current_version": "1.7.87-alpha",
"new_version": "1.7.87-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.87-alpha/archipelago",
"sha256": "a87bf3245e3ae67baf8c7018e89794e8bd43b18ee3858dda65364562f2927045",
"size_bytes": 44058416
"current_version": "1.7.88-alpha",
"new_version": "1.7.88-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.88-alpha/archipelago",
"sha256": "5948655918c76f7a3e53e2c61c3e5662b4035eb4692545546b17d7f2d4d782c3",
"size_bytes": 44057520
},
{
"name": "archipelago-frontend-1.7.87-alpha.tar.gz",
"current_version": "1.7.87-alpha",
"new_version": "1.7.87-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.87-alpha/archipelago-frontend-1.7.87-alpha.tar.gz",
"sha256": "df0834a4e9c45e608de2fa5f0031f939d49eec0b6b8d1fd9a422676ae96b3dbe",
"size_bytes": 184059938
"name": "archipelago-frontend-1.7.88-alpha.tar.gz",
"current_version": "1.7.88-alpha",
"new_version": "1.7.88-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.88-alpha/archipelago-frontend-1.7.88-alpha.tar.gz",
"sha256": "158be23c11d3a5d007e2a99d70eaafce2f287c5d3c240c4ab37945245f006a13",
"size_bytes": 184056182
}
]
}

View File

@ -1,27 +1,27 @@
{
"version": "1.7.87-alpha",
"version": "1.7.88-alpha",
"release_date": "2026-06-12",
"changelog": [
"Bitcoin receive now calls LND's on-chain address endpoint with the correct REST method, and backend failures keep the specific address-generation error instead of collapsing into the generic operation-failed message.",
"App launch credential interstitials now render as true full-screen overlays, and the launcher loading indicator uses the neutral brand palette instead of a blue spinner.",
"Validation passed with `git diff --check`, `npm run type-check`, and the focused frontend tests for `bitcoinReceive` and `AppIconGrid`."
"AIUI now loads immediately again instead of waiting on a production availability probe and cache-busted iframe URL, restoring the lighter launch behavior from before the regression.",
"Bitcoin receive now uses LND's GET-based newaddress flow with the native SegWit address type, fixing the `501 Method Not Allowed` response from the previous POST attempt.",
"Validation pending on the AIUI rollback; the rest of the release train remains unchanged."
],
"components": [
{
"name": "archipelago",
"current_version": "1.7.87-alpha",
"new_version": "1.7.87-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.87-alpha/archipelago",
"sha256": "a87bf3245e3ae67baf8c7018e89794e8bd43b18ee3858dda65364562f2927045",
"size_bytes": 44058416
"current_version": "1.7.88-alpha",
"new_version": "1.7.88-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.88-alpha/archipelago",
"sha256": "5948655918c76f7a3e53e2c61c3e5662b4035eb4692545546b17d7f2d4d782c3",
"size_bytes": 44057520
},
{
"name": "archipelago-frontend-1.7.87-alpha.tar.gz",
"current_version": "1.7.87-alpha",
"new_version": "1.7.87-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.87-alpha/archipelago-frontend-1.7.87-alpha.tar.gz",
"sha256": "df0834a4e9c45e608de2fa5f0031f939d49eec0b6b8d1fd9a422676ae96b3dbe",
"size_bytes": 184059938
"name": "archipelago-frontend-1.7.88-alpha.tar.gz",
"current_version": "1.7.88-alpha",
"new_version": "1.7.88-alpha",
"download_url": "http://146.59.87.168:3000/lfg2025/archy/releases/download/v1.7.88-alpha/archipelago-frontend-1.7.88-alpha.tar.gz",
"sha256": "158be23c11d3a5d007e2a99d70eaafce2f287c5d3c240c4ab37945245f006a13",
"size_bytes": 184056182
}
]
}