28 Commits

Author SHA1 Message Date
Nico
d48612665b fix(toolbar): watch active ref for always-mounted views (AgentsView, ViewerView)
Views mounted via v-if+CSS-hide never unmount, so onMounted/onUnmounted only fire
once. When a RouterView (Tests) unmounts it clears _config, and the always-mounted
view never restores it. Fix: provideToolbar accepts optional active ref and uses
watch() instead of lifecycle hooks for those views.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 23:09:39 +02:00
Nico
9d0012edad fix(takeover): navigate uses full URL, viewport returns url not hash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 23:05:54 +02:00
Nico
571f04074a fix(toolbar): version counter prevents stale unmount clearing config
Vue Router can mount the incoming component before unmounting the outgoing one.
Without a version guard, the old component's onUnmounted would null out the config
that the new component just set — causing toolbar groups to disappear on back-nav.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 23:02:44 +02:00
Nico
8a6b1a533e feat(toolbar): make themes always visible, view groups conditional
Themes are a global preference — always shown when logged in.
Connection, quad-view, and panels remain view-specific via provideToolbar.
Fixes blank toolbar when navigating to views that don't call provideToolbar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 22:58:34 +02:00
Nico
4dbeea787a Fix toolbar: use module-level ref instead of provide/inject
AppToolbar is a sibling of RouterView, not a descendant — provide/inject
only flows down the tree. Module-level reactive ref works across boundaries:
views write on mount/unmount, toolbar reads reactively.
2026-04-03 22:54:33 +02:00
Nico
2df8071312 Fix stray closing brace in TestsView 2026-04-03 22:52:54 +02:00
Nico
409d873aa0 Toolbar is now view-provided via useToolbar composable
Each view declares its toolbar groups and connection via provideToolbar().
AppToolbar injects and renders only what the active view needs.

- AgentsView: quad-view + themes + panels + chat connection
- TestsView: themes + test SSE connection (replaces raw EventSource)
- ViewerView: themes only
- Home/Login: no provide → toolbar hidden

useConnection() manages any SSE endpoint: connect, reconnect, state.
Tenant feature gating follows naturally — routes that don't exist
contribute no toolbar config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 22:52:28 +02:00
Nico
4abbe86963 Group toolbar items into visual pill containers
Four groups: connection, quad view, themes, panel config.
Each group shares one background pill. Bigger icons (w-6 h-6),
36px hit area with minimal padding.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 22:39:44 +02:00
Nico
f8ef8141f5 Simplify sidebar state: session storage, always start collapsed
Remove media query resize listener and responsive auto-expand/collapse logic.
Start collapsed by default, persist user choice in sessionStorage (cleared on
browser close). No width-based rules — same behavior on desktop and mobile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 22:31:41 +02:00
Nico
4dacde9ec1 Show timing stats (×N, p50, p95, pass%) on test dashboard
When test results include stats from --repeat mode, display inline
stat pills instead of raw duration. Adds TestStats interface.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:18:21 +02:00
Nico
2267cfb640 Fix screenshot message selector (.message not .chat-message)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:28:06 +02:00
Nico
dc1b120b4d Fix artifact reactivity + improve takeover debug channel
- DisplayPane/KonsolePane: use storeToRefs for computed refs (fixes
  displayArtifacts/konsoleArtifacts not reacting to store changes)
- useTakeover: remove eval confirm dialog (blocks automated testing)
- useTakeover: structured screenshot() returning pane states, artifact
  list and message count instead of raw body text
- main.ts: expose pinia on window.__pinia in DEV mode for test injection

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:18:00 +02:00
Nico
8996e553e1 Port artifact renderers from cog frontend into Display/Konsole panes
- Rename DashboardPane → DisplayPane, ArtifactsPane → KonsolePane
- Remove WorkspacePane (superseded by ContentLayout)
- DisplayPane: renders data_table, entity_detail, document_page artifacts
- KonsolePane: renders machine, action_bar, status artifacts
- chat store: add artifacts ref, displayArtifacts/konsoleArtifacts computed,
  setArtifacts(), clearArtifacts(), sendAction()
- useAgentSocket: wire artifacts event → chatStore.setArtifacts()
- AppToolbar: update labels to Chat/Display/Files/Konsole

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 23:44:02 +02:00
Nico
60029f1863 Add ContentLayout with auto-direction + Dashboard/Files/Artifacts panes
- ContentLayout: ResizeObserver-based row/col direction (flips at 1.5× aspect ratio),
  flex weights 40/40/10 for chat/dashboard/thin, files+artifacts share thin slot
- DashboardPane: placeholder page (agent artifacts will render here)
- FilesPane / ArtifactsPane: dummy panels with vertical/horizontal orientation toggle
- usePanels: replace 'workspace' PaneId with 'dashboard' | 'files' | 'artifacts'
- AgentsView: wire ContentLayout, remove WorkspacePane, clean up pane-layout styles
- AppToolbar: replace workspace toggle with dashboard/files/artifacts buttons

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 23:00:49 +02:00
Nico
4607a73d67 Refactor: naming, type safety, consistency across panel system
- AppToolbar: rename togglePanel→toggleDropdown to avoid collision with
  debug panel toggle from usePanels
- ChatPane: computed()→toRef() for props passed to composables (consistent)
- ChatPane: add console.warn on session history fetch failure
- DebugColumn: skip object spread when no new panels resolved (perf)
- AgentsView: remove unused wsSwitchAgent, annotate disabled picker

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 20:21:20 +02:00
Nico
e948caf132 3-column layout: extract ChatPane, add WorkspacePane + DebugColumn
- Extract ChatPane.vue from AgentsView (messages, input, scroll, attachments, audio)
- Create WorkspacePane.vue placeholder (dashboard, files, artifacts)
- Create DebugColumn.vue (replaces PanelShell side panels)
- AgentsView.vue reduced from 1062 to ~140 lines (thin orchestrator)
- usePanels: add pane toggles (chat, workspace) alongside debug panel toggles
- AppToolbar: chat + workspace toggle buttons with divider
- Delete PanelShell.vue (replaced by DebugColumn)
- Any combo of columns works: chat|workspace|debug, all toggleable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 20:12:59 +02:00
Nico
4d4e1e198c Panel system: replace quad DevPanel with composable panel architecture
- PanelShell layout: main content + stacked side panels (320px)
- usePanels composable: role-based registry, localStorage persistence
- Lazy-loaded panels: Graph (Cytoscape+Cola), Trace, Nodes, State
- Fix HUD protocol: map assay node-level events to nyx tree format
- Graph: edge filtering for missing nodes, Tailwind canvas opacity fix
- Remove FramesPanel and TaskPanel (data merged into State panel)
- Toolbar panel toggles with heroicon badges

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 19:08:50 +02:00
Nico
323bb0113f Remove dead code: DevView, dev.css, unused formatUsage, gate viewer init
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 17:44:52 +02:00
Nico
d6337c1ece Tenant-specific OIDC: separate Zitadel projects per tenant
Each tenant config now includes oidcClientId. Auth composable reads
client ID from tenant config instead of hardcoded fallback. Dev tenant
uses restricted Zitadel project (role-check enabled, developer grant).
Added NODE_ENV=production to env files to fix --mode dev builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 17:37:16 +02:00
Nico
42c6079755 Multi-tenant build system with K8s namespace separation
Build-time tenant config via VITE_TENANT env var (--mode loop42/dev).
Content pages moved to tenants/{name}/pages/ with dynamic imports and
loop42 fallback. Feature-gated routing (viewer/devTools per tenant).
Dockerfile parameterized with TENANT build arg. Deployed to separate
K8s namespaces: loop42.de → ns/loop42, loop42.dev → ns/dev.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 17:09:22 +02:00
Nico
db10ab93fd Production-ready sidebar, toolbar, auth, and routing for loop42.de
Slim sidebar (Home, nyx, Impressum, Datenschutz, Sign-in/User), global
AppToolbar for system features, /agents→/nyx rename, agent auto-select,
OIDC user name extraction from id_token, theme-consistent content pages,
removed DevView and old system panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 16:14:24 +02:00
Nico
4718feb773 Remove vite-ssg temp from tracking 2026-04-01 00:17:51 +02:00
Nico
bf047d1292 Add company pages + HTML5 history mode
- CompanyView.vue: hero, plattform, produkte, nyx CTA, footer
- ImpressumView.vue + DatenschutzView.vue: legal pages
- Router: HTML5 history mode (no # URLs), company routes
- Reverted vite-ssg (SSR compat needs proper refactor, planned)
- Removed ssr-shim.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:17:37 +02:00
Nico
743eddfbd1 Fix agent selection + SM state for chat UI
- agents.ts: fallback agent list when server sends none, auto-select default
- useAgentSocket.ts: set connectionState=SYNCED + channelState=READY on
  assay ready signal, unlocks chat input

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 21:34:24 +02:00
Nico
e47cc89b75 Fix .gitignore, remove node_modules from tracking 2026-03-31 21:16:50 +02:00
Nico
a0fee6c121 Connect nyx to assay backend end-to-end
- ws.ts: auth via query params (token + session), store session_id
  from assay session_info, mark connected on ready signal
- useAgentSocket.ts: handlers for session_info, controls, artifacts, cleared
- auth.ts: auto-set dev service token for instant login
- Dockerfile + nginx.conf for K3s deployment
- .env.production: wss://assay.loop42.de/ws

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 21:16:28 +02:00
Nico
026c01a8b4 Remove dist from tracking 2026-03-31 20:23:44 +02:00
Nico
e2667f8e12 Initial nyx project — fork of hermes-frontend
Forked from hermes-frontend, stripped openclaw/bun specifics:
- Auth tokens: openclaw_session -> nyx_session
- Vite proxy: localhost:3003 -> localhost:8000 (assay)
- Prod WS: wss://assay.loop42.de/ws
- Workspace paths: removed openclaw-specific paths
- Added missing deps: @heroicons/vue, overlayscrollbars-vue
- Branding: title -> nyx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 20:23:27 +02:00