fix: resolve did:dht compilation errors

- Simplify DHT encoding: use JSON instead of DNS packets (drop simple-dns)
- Fix mainline crate API: SigningKey takes 32 bytes, get_mutable returns Result
- Add missing dht_did field to IdentityRecord constructor
- Store DID Document as JSON in DHT (DNS encoding deferred)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-14 04:14:04 +00:00
co-authored by Claude Opus 4.6
parent 0e9df969f1
commit 4a3611f3b4
26 changed files with 451 additions and 590 deletions
+20 -7
View File
@@ -82,7 +82,8 @@
:key="item.path"
:to="item.path"
class="sidebar-nav-item flex items-center gap-3 px-4 py-3 rounded-lg text-white/80 hover:bg-white/10 hover:text-white transition-colors"
exact-active-class="nav-tab-active"
:class="{ 'nav-tab-active': item.isCombined && (route.path.includes('/apps') || route.path.includes('/marketplace')) }"
:exact-active-class="item.isCombined ? undefined : 'nav-tab-active'"
:style="{ '--nav-stagger': idx }"
>
<svg class="w-5 h-5" aria-hidden="true" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -278,8 +279,8 @@
:class="[
'px-4 pt-4 md:pt-8 md:px-8 overflow-y-auto h-full',
needsMobileBackButtonSpace
? 'pb-[calc(var(--mobile-tab-bar-height,_72px)+96px)] md:pb-8'
: 'pb-4 md:pb-8'
? 'pb-[calc(var(--mobile-tab-bar-height,_72px)+96px)] md:pb-24'
: 'pb-[calc(var(--mobile-tab-bar-height,_72px)+48px)] md:pb-24'
]"
:style="mobileTabPaddingTop ? { paddingTop: (mobileTabPaddingTop + 16) + 'px' } : undefined"
>
@@ -649,8 +650,7 @@ interface NavItem {
const gamerDesktopNav: NavItem[] = [
{ path: '/dashboard', label: 'Home', icon: 'home' },
{ path: '/dashboard/apps', label: 'My Apps', icon: 'apps' },
{ path: '/dashboard/marketplace', label: 'App Store', icon: 'marketplace' },
{ path: '/dashboard/apps', label: 'Apps', icon: 'apps', isCombined: true },
{ path: '/dashboard/cloud', label: 'Cloud', icon: 'cloud' },
{ path: '/dashboard/server', label: 'Network', icon: 'server' },
{ path: '/dashboard/web5', label: 'Web5', icon: 'web5' },
@@ -869,15 +869,28 @@ function getTransitionName(currentRoute: RouteLocationNormalizedLoaded) {
return transitionName
}
// Health notifications from WebSocket data
// Health notifications from WebSocket data — deduplicated by container name
const dismissedNotifications = ref<Set<string>>(new Set())
const healthNotifications = computed(() => {
const notifs = store.data?.notifications ?? []
return notifs.filter(n => !dismissedNotifications.value.has(n.id)).slice(-5)
const visible = notifs.filter(n => !dismissedNotifications.value.has(n.id))
// Deduplicate: keep only the latest notification per container/title
const seen = new Map<string, typeof visible[0]>()
for (const n of visible) {
seen.set(n.title, n)
}
return [...seen.values()].slice(-3)
})
function dismissNotification(id: string) {
// Dismiss all notifications with the same title (container name)
const notif = (store.data?.notifications ?? []).find(n => n.id === id)
if (notif) {
for (const n of store.data?.notifications ?? []) {
if (n.title === notif.title) dismissedNotifications.value.add(n.id)
}
}
dismissedNotifications.value.add(id)
}
</script>