From e625b29d9e3842df7123d0df5be2f31d221f1b81 Mon Sep 17 00:00:00 2001 From: archipelago Date: Sat, 12 Sep 2026 04:33:53 -0400 Subject: [PATCH] fix: route GitWorkshop installs through orchestrator --- .../src/api/rpc/package/install.rs | 6 ++++++ .../views/apps/__tests__/appsConfig.test.ts | 21 ++++++++++++++++++- neode-ui/src/views/apps/appsConfig.ts | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/archipelago/src/api/rpc/package/install.rs b/core/archipelago/src/api/rpc/package/install.rs index a787367a..bd460de3 100644 --- a/core/archipelago/src/api/rpc/package/install.rs +++ b/core/archipelago/src/api/rpc/package/install.rs @@ -2743,6 +2743,11 @@ fn uses_orchestrator_install_flow(package_id: &str) -> bool { | "gitea" | "portainer" | "meshtastic" + // Build-backed user-facing app. Route it through the production + // orchestrator so a fresh node builds its bundled image instead + // of treating localhost/archipelago-source:local as a registry + // image in the legacy installer. + | "archipelago-source" ) } @@ -2822,6 +2827,7 @@ mod tests { "gitea", "portainer", "meshtastic", + "archipelago-source", ] { assert!(uses_orchestrator_install_flow(app)); assert!(should_try_orchestrator_install(app, true)); diff --git a/neode-ui/src/views/apps/__tests__/appsConfig.test.ts b/neode-ui/src/views/apps/__tests__/appsConfig.test.ts index 46d4157b..ab000b36 100644 --- a/neode-ui/src/views/apps/__tests__/appsConfig.test.ts +++ b/neode-ui/src/views/apps/__tests__/appsConfig.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import { ref } from 'vue' import { PackageState, type PackageDataEntry } from '@/types/api' -import { canLaunch, filterEntriesForTab, hasFrontendUi, isServiceContainer, isServicePackage, isWebsitePackage, launchBlockedReason, resolveAppIcon, useCategoriesWithApps, DEFAULT_APP_ICON } from '../appsConfig' +import { APP_CATEGORY_MAP, canLaunch, filterEntriesForTab, hasFrontendUi, isServiceContainer, isServicePackage, isWebsitePackage, launchBlockedReason, resolveAppIcon, useCategoriesWithApps, DEFAULT_APP_ICON } from '../appsConfig' function makePkg(id: string, title: string, category: string): PackageDataEntry { return { @@ -105,6 +105,25 @@ describe('appsConfig service filtering', () => { expect(isWebsitePackage('some-ui-app', uiApp)).toBe(false) }) + it('keeps GitWorkshop in My Apps while installing metadata is minimal', () => { + const installing = makePkg('archipelago-source', 'GitWorkshop', 'development') + installing.state = PackageState.Installing + expect(isWebsitePackage('archipelago-source', installing)).toBe(false) + expect(filterEntriesForTab([['archipelago-source', installing]], 'apps', 'all')) + .toEqual([['archipelago-source', installing]]) + expect(filterEntriesForTab([['archipelago-source', installing]], 'services', 'all')) + .toEqual([]) + }) + + it('keeps every curated app placeholder out of Services during install', () => { + for (const id of Object.keys(APP_CATEGORY_MAP)) { + if (isServiceContainer(id)) continue + const placeholder = makePkg(id, id, APP_CATEGORY_MAP[id]) + placeholder.state = PackageState.Installing + expect(isWebsitePackage(id, placeholder), id).toBe(false) + } + }) + it('never offers Launch for an unknown container with a bare exposed port', () => { // A self-deployed compose stack (e.g. podsteadr) publishes a port, so it // has a runtime lan-address — but no manifest-declared or probed UI. It diff --git a/neode-ui/src/views/apps/appsConfig.ts b/neode-ui/src/views/apps/appsConfig.ts index ff8217da..21ab7b07 100644 --- a/neode-ui/src/views/apps/appsConfig.ts +++ b/neode-ui/src/views/apps/appsConfig.ts @@ -48,6 +48,9 @@ export const APP_CATEGORY_MAP: Record = { 'tailscale': 'networking', 'netbird': 'networking', 'nginx-proxy-manager': 'networking', 'portainer': 'networking', 'uptime-kuma': 'networking', 'botfights': 'community', + // User-facing app: keep the install placeholder in My Apps while its + // manifest (including interfaces.main.ui) is not available yet. + 'archipelago-source': 'development', } export function getAppCategory(id: string, pkg: PackageDataEntry): string {