diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7f2c10aa6c..2ee59752f4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -51,6 +51,7 @@ "jszip": "^3.10.1", "lru-cache": "^11.1.0", "lucide-svelte": "^0.540.0", + "mdast-util-find-and-replace": "^3.0.2", "minimatch": "^10.0.1", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@=25.0.0", "monaco-languageclient": "10.6.0", @@ -71,6 +72,7 @@ "svelte-exmarkdown": "^5.0.0", "svelte-infinite-loading": "^1.4.0", "tailwind-merge": "^1.13.2", + "unist-util-visit": "^5.0.0", "vscode": "npm:@codingame/monaco-vscode-extension-api@=25.0.0", "vscode-languageclient": "~9.0.1", "vscode-uri": "~3.1.0", diff --git a/frontend/package.json b/frontend/package.json index c379388fd6..c7f0c548e0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -124,6 +124,8 @@ "jszip": "^3.10.1", "lru-cache": "^11.1.0", "lucide-svelte": "^0.540.0", + "mdast-util-find-and-replace": "^3.0.2", + "unist-util-visit": "^5.0.0", "minimatch": "^10.0.1", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@=25.0.0", "monaco-languageclient": "10.6.0", diff --git a/frontend/src/lib/components/copilot/chat/AssistantMessage.svelte b/frontend/src/lib/components/copilot/chat/AssistantMessage.svelte index 7d39f97274..186306fa23 100644 --- a/frontend/src/lib/components/copilot/chat/AssistantMessage.svelte +++ b/frontend/src/lib/components/copilot/chat/AssistantMessage.svelte @@ -4,12 +4,56 @@ import type { DisplayMessage } from './shared' import CodeDisplay from './script/CodeDisplay.svelte' import LinkRenderer from './LinkRenderer.svelte' + import { workspaceStore } from '$lib/stores' + import { + extractCandidatePaths, + remarkWindmillPaths, + workspaceItemRegistry + } from './workspaceItems.svelte' interface Props { message: DisplayMessage } let { message }: Props = $props() + + const candidatePaths = $derived(extractCandidatePaths(message.content)) + const rendererPlugin = { + renderer: { + pre: CodeDisplay, + a: LinkRenderer + } + } + + // Only populate the registry for messages that contain path-shaped tokens. The + // registry still dedups concurrent calls across messages and workspaces. + $effect(() => { + const ws = $workspaceStore + if (ws && candidatePaths.length > 0) workspaceItemRegistry.ensureLoaded(ws) + }) + + const plugins = $derived.by(() => { + const ws = $workspaceStore ?? '' + if (!ws || candidatePaths.length === 0) { + return [gfmPlugin(), rendererPlugin] + } + + if (!workspaceItemRegistry.isLoaded(ws)) { + return [gfmPlugin(), rendererPlugin] + } + + return [ + gfmPlugin(), + { + remarkPlugin: remarkWindmillPaths({ + resolve: (path) => workspaceItemRegistry.resolve(ws, path), + workspace: ws || undefined + }), + renderer: {} + }, + rendererPlugin + ] + })
- +
diff --git a/frontend/src/lib/components/copilot/chat/CreatedResourceActionDrawers.svelte b/frontend/src/lib/components/copilot/chat/CreatedResourceActionDrawers.svelte index 7d3b8a950c..b73c8dc6bc 100644 --- a/frontend/src/lib/components/copilot/chat/CreatedResourceActionDrawers.svelte +++ b/frontend/src/lib/components/copilot/chat/CreatedResourceActionDrawers.svelte @@ -81,6 +81,10 @@ azure: { label: 'Azure Event Grid trigger', load: () => import('$lib/components/triggers/azure/AzureTriggerEditorInner.svelte') + }, + email: { + label: 'Email trigger', + load: () => import('$lib/components/triggers/email/EmailTriggerEditorInner.svelte') } } @@ -139,13 +143,25 @@ throw new Error('Missing trigger kind') } + if (activeDrawer?.key === key && activeDrawer.path === action.path && drawer?.isOpen()) { + activeDrawer = undefined + editor = undefined + drawer.closeDrawer() + return + } + const config = drawerConfigs[key] const promise = activeDrawer?.key === key ? activeDrawer.promise : config.load() if (activeDrawer?.key !== key) { editor = undefined } - const request: ActiveDrawerState = { id: nextActiveDrawerId++, key, path: action.path, promise } + const request: ActiveDrawerState = { + id: nextActiveDrawerId++, + key, + path: action.path, + promise + } activeDrawer = request drawer?.openDrawer() diff --git a/frontend/src/lib/components/copilot/chat/LinkRenderer.svelte b/frontend/src/lib/components/copilot/chat/LinkRenderer.svelte index 87d131e03e..5d79251fd2 100644 --- a/frontend/src/lib/components/copilot/chat/LinkRenderer.svelte +++ b/frontend/src/lib/components/copilot/chat/LinkRenderer.svelte @@ -1,15 +1,81 @@ {#if href} - - {@render children?.()} - + {#if wmKind} + + + + + + {@render children?.()} + + + + + {#if drawerAction} +