diff --git a/apps/electron/electron.vite.config.ts b/apps/electron/electron.vite.config.ts index f3f46fd2f..a039fe53b 100644 --- a/apps/electron/electron.vite.config.ts +++ b/apps/electron/electron.vite.config.ts @@ -102,7 +102,13 @@ export default defineConfig({ input: resolve(__dirname, 'src/renderer/index.html'), external: [ 'web-worker', - 'mermaid' // Optional peer dependency - dynamically imported in @xnetjs/canvas + 'mermaid', // Optional peer dependency - dynamically imported in @xnetjs/canvas + // Native Node HNSW addon (imports node:fs / node-gyp-build) — reached + // via @xnetjs/workbench/ai → @xnetjs/vectors, which dynamically + // imports it and falls back to the pure-JS LinearVectorIndex when + // absent. Same exclusion apps/web ships; the renderer must not try + // to bundle it. + 'usearch' ] } }, diff --git a/apps/electron/package.json b/apps/electron/package.json index ba6a07473..9050aef9e 100644 --- a/apps/electron/package.json +++ b/apps/electron/package.json @@ -47,6 +47,7 @@ "@xnetjs/telemetry": "workspace:*", "@xnetjs/ui": "workspace:*", "@xnetjs/views": "workspace:*", + "@xnetjs/workbench": "workspace:*", "better-sqlite3": "^11.0.0", "electron-updater": "^6.3.0", "lucide-react": "^0.400.0", diff --git a/apps/electron/src/renderer/App.tsx b/apps/electron/src/renderer/App.tsx index fa3144f44..fc306d506 100644 --- a/apps/electron/src/renderer/App.tsx +++ b/apps/electron/src/renderer/App.tsx @@ -10,6 +10,7 @@ import type { ConnectHubRequest } from './components/ConnectHubDialog' import { useCommandPalette, CommandPalette } from '@xnetjs/ui' +import { AiChatPanel } from '@xnetjs/workbench/ai' import React, { useCallback, useEffect, useState } from 'react' import { ActionDock } from './components/ActionDock' import { AddSharedDialog } from './components/AddSharedDialog' @@ -55,6 +56,7 @@ export function App(): React.ReactElement { handleOpenDataWorkspace, handleOpenMeetings, handleOpenStories, + handleOpenAssistant, handleInsertSavedLensAsCanvasFrame, handleCommandStateChange, handlePendingInsertConsumed @@ -102,7 +104,8 @@ export function App(): React.ReactElement { handleOpenSettings, handleOpenSocialImport, handleOpenDataWorkspace, - handleOpenStories + handleOpenStories, + handleOpenAssistant }) const renderOverlay = () => { @@ -135,6 +138,21 @@ export function App(): React.ReactElement { ) } + if (shellState.kind === 'assistant') { + // The web workbench's AI chat, unchanged (0406): it detects the agent + // bridge through window.xnetAgentBridge (#638) and auto-pairs over IPC, + // so on desktop Claude Code arrives with the workspace tools attached. + return ( +