@neuralnomads/codenomad-dev 0.20.0-dev-20260911-ea37f97b → 0.20.0-dev-20260917-aa51cbb9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/api-types.js.map +1 -1
- package/dist/opencode/automation-plugin.test.js +32 -38
- package/dist/opencode/automation-plugin.test.js.map +1 -1
- package/dist/opencode/compatibility/contract-fixture.js +15 -0
- package/dist/opencode/compatibility/contract-fixture.js.map +1 -0
- package/dist/opencode/compatibility/events.js +9 -0
- package/dist/opencode/compatibility/events.js.map +1 -0
- package/dist/opencode/compatibility/location.js +89 -0
- package/dist/opencode/compatibility/location.js.map +1 -0
- package/dist/opencode/compatibility/location.test.js +92 -0
- package/dist/opencode/compatibility/location.test.js.map +1 -0
- package/dist/opencode/compatibility/negotiate.js +73 -0
- package/dist/opencode/compatibility/negotiate.js.map +1 -0
- package/dist/opencode/compatibility/negotiate.test.js +61 -0
- package/dist/opencode/compatibility/negotiate.test.js.map +1 -0
- package/dist/opencode/compatibility/proxy-locations.js +137 -0
- package/dist/opencode/compatibility/proxy-locations.js.map +1 -0
- package/dist/opencode/compatibility/proxy-locations.test.js +42 -0
- package/dist/opencode/compatibility/proxy-locations.test.js.map +1 -0
- package/dist/opencode/compatibility/proxy.js +60 -0
- package/dist/opencode/compatibility/proxy.js.map +1 -0
- package/dist/opencode/compatibility/proxy.test.js +47 -0
- package/dist/opencode/compatibility/proxy.test.js.map +1 -0
- package/dist/opencode/compatibility/requests.js +54 -0
- package/dist/opencode/compatibility/requests.js.map +1 -0
- package/dist/opencode/compatibility/runtime.js +26 -0
- package/dist/opencode/compatibility/runtime.js.map +1 -0
- package/dist/opencode/compatibility/transport.js +112 -0
- package/dist/opencode/compatibility/transport.js.map +1 -0
- package/dist/opencode/compatibility/transport.test.js +83 -0
- package/dist/opencode/compatibility/transport.test.js.map +1 -0
- package/dist/opencode/session-pruning/location.js +16 -0
- package/dist/opencode/session-pruning/location.js.map +1 -0
- package/dist/opencode/session-pruning/package.test.js +37 -0
- package/dist/opencode/session-pruning/package.test.js.map +1 -0
- package/dist/opencode/session-pruning/plugin.js +5 -2
- package/dist/opencode/session-pruning/plugin.js.map +1 -1
- package/dist/opencode/session-pruning/preview-store.js +3 -2
- package/dist/opencode/session-pruning/preview-store.js.map +1 -1
- package/dist/opencode/session-pruning/pruning.test.js +7 -5
- package/dist/opencode/session-pruning/pruning.test.js.map +1 -1
- package/dist/opencode/session-pruning/service.js +5 -4
- package/dist/opencode/session-pruning/service.js.map +1 -1
- package/dist/opencode/session-pruning/service.test.js +65 -53
- package/dist/opencode/session-pruning/service.test.js.map +1 -1
- package/dist/permissions/opencode-replier.js +2 -2
- package/dist/permissions/opencode-replier.js.map +1 -1
- package/dist/permissions/opencode-replier.test.js +1 -1
- package/dist/permissions/opencode-replier.test.js.map +1 -1
- package/dist/permissions/opencode-yolo-metadata.js.map +1 -1
- package/dist/permissions/opencode-yolo-metadata.test.js.map +1 -1
- package/dist/plugins/session-pruning/plugin.mjs +422 -271
- package/dist/server/__tests__/instance-proxy-legacy.test.js +111 -0
- package/dist/server/__tests__/instance-proxy-legacy.test.js.map +1 -0
- package/dist/server/__tests__/instance-proxy.test.js +95 -34
- package/dist/server/__tests__/instance-proxy.test.js.map +1 -1
- package/dist/server/http-server.js +147 -237
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/routes/session-pruning.js +4 -2
- package/dist/server/routes/session-pruning.js.map +1 -1
- package/dist/server/routes/session-pruning.test.js +16 -2
- package/dist/server/routes/session-pruning.test.js.map +1 -1
- package/dist/server/routes/worktrees.js +1 -0
- package/dist/server/routes/worktrees.js.map +1 -1
- package/dist/server/routes/worktrees.test.js +54 -1
- package/dist/server/routes/worktrees.test.js.map +1 -1
- package/dist/workspaces/host-opencode-service.test.js +56 -7
- package/dist/workspaces/host-opencode-service.test.js.map +1 -1
- package/dist/workspaces/instance-client.js.map +1 -1
- package/dist/workspaces/instance-events.js +71 -57
- package/dist/workspaces/instance-events.js.map +1 -1
- package/dist/workspaces/instance-events.test.js +122 -9
- package/dist/workspaces/instance-events.test.js.map +1 -1
- package/dist/workspaces/manager.js +24 -39
- package/dist/workspaces/manager.js.map +1 -1
- package/dist/workspaces/manager.test.js +43 -7
- package/dist/workspaces/manager.test.js.map +1 -1
- package/dist/workspaces/opencode-cli-service.js +56 -29
- package/dist/workspaces/opencode-cli-service.js.map +1 -1
- package/dist/workspaces/opencode-connection-generation.test.js +57 -0
- package/dist/workspaces/opencode-connection-generation.test.js.map +1 -0
- package/dist/workspaces/opencode-service.js +70 -16
- package/dist/workspaces/opencode-service.js.map +1 -1
- package/dist/workspaces/opencode-service.test.js +3 -4
- package/dist/workspaces/opencode-service.test.js.map +1 -1
- package/dist/workspaces/worktree-session-evacuation.js +31 -11
- package/dist/workspaces/worktree-session-evacuation.js.map +1 -1
- package/dist/workspaces/worktree-session-evacuation.test.js +211 -0
- package/dist/workspaces/worktree-session-evacuation.test.js.map +1 -1
- package/dist/workspaces/wsl-opencode-service.test.js +64 -24
- package/dist/workspaces/wsl-opencode-service.test.js.map +1 -1
- package/package.json +3 -3
- package/public/assets/App-BROhwPo9.js +54 -0
- package/public/assets/App-BROhwPo9.js.map +1 -0
- package/public/assets/{FilesTab-CRpGDs1B.js → FilesTab-DY3Vr-3r.js} +3 -3
- package/public/assets/{FilesTab-CRpGDs1B.js.map → FilesTab-DY3Vr-3r.js.map} +1 -1
- package/public/assets/{GitChangesTab-DxFebTiq.js → GitChangesTab-BD6CJngE.js} +3 -3
- package/public/assets/{GitChangesTab-DxFebTiq.js.map → GitChangesTab-BD6CJngE.js.map} +1 -1
- package/public/assets/{SplitFilePanel-DgTMrrO-.js → SplitFilePanel-BdY6d_6m.js} +2 -2
- package/public/assets/{SplitFilePanel-DgTMrrO-.js.map → SplitFilePanel-BdY6d_6m.js.map} +1 -1
- package/public/assets/StatusTab-C-_2yaPa.js +2 -0
- package/public/assets/StatusTab-C-_2yaPa.js.map +1 -0
- package/public/assets/{align-justify-v_yPXSys.js → align-justify-DI8VTZ4G.js} +2 -2
- package/public/assets/{align-justify-v_yPXSys.js.map → align-justify-DI8VTZ4G.js.map} +1 -1
- package/public/assets/{bundle-full-HzL_Jtqk.js → bundle-full-D_M65Eb_.js} +2 -2
- package/public/assets/{bundle-full-HzL_Jtqk.js.map → bundle-full-D_M65Eb_.js.map} +1 -1
- package/public/assets/{client-state-CF-PJ0GG.js → client-state-CWCzCOz6.js} +2 -2
- package/public/assets/{client-state-CF-PJ0GG.js.map → client-state-CWCzCOz6.js.map} +1 -1
- package/public/assets/{diff-viewer-BFDQBDVy.js → diff-viewer-CGPsYEr3.js} +2 -2
- package/public/assets/{diff-viewer-BFDQBDVy.js.map → diff-viewer-CGPsYEr3.js.map} +1 -1
- package/public/assets/index-B8-lAqjr.js +2 -0
- package/public/assets/index-B8-lAqjr.js.map +1 -0
- package/public/assets/index-BeUewQym.js +2 -0
- package/public/assets/index-BeUewQym.js.map +1 -0
- package/public/assets/index-BxRFHpJd.js +2 -0
- package/public/assets/{index-D2UHSOG5.js.map → index-BxRFHpJd.js.map} +1 -1
- package/public/assets/index-Bzv1kU-S.js +2 -0
- package/public/assets/{index-CTKYD_VJ.js.map → index-Bzv1kU-S.js.map} +1 -1
- package/public/assets/index-C9tI4CRG.js +2 -0
- package/public/assets/index-C9tI4CRG.js.map +1 -0
- package/public/assets/index-CGYHFZ6F.js +2 -0
- package/public/assets/index-CGYHFZ6F.js.map +1 -0
- package/public/assets/{index-CHYmKl10.js → index-CMEAjBFp.js} +2 -2
- package/public/assets/index-CMEAjBFp.js.map +1 -0
- package/public/assets/index-Cazypvyc.js +2 -0
- package/public/assets/index-Cazypvyc.js.map +1 -0
- package/public/assets/index-CwqzofWP.js +2 -0
- package/public/assets/index-CwqzofWP.js.map +1 -0
- package/public/assets/index-Da9yOa6q.js +2 -0
- package/public/assets/index-Da9yOa6q.js.map +1 -0
- package/public/assets/{index-RK9gf0uk.js → index-Ddjkirek.js} +2 -2
- package/public/assets/{index-RK9gf0uk.js.map → index-Ddjkirek.js.map} +1 -1
- package/public/assets/index-HHgvEOAH.js +3 -0
- package/public/assets/index-HHgvEOAH.js.map +1 -0
- package/public/assets/index-MeFffHqb.css +1 -0
- package/public/assets/loading-CdhHiSED.css +1 -0
- package/public/assets/{loading-BSB82snY.js → loading-Gqh6NPUr.js} +2 -2
- package/public/assets/{loading-BSB82snY.js.map → loading-Gqh6NPUr.js.map} +1 -1
- package/public/assets/main-Cbx7KdTr.js +38 -0
- package/public/assets/main-Cbx7KdTr.js.map +1 -0
- package/public/assets/{markdown-DtidoL2Z.js → markdown-BWnjyvnX.js} +4 -4
- package/public/assets/{markdown-DtidoL2Z.js.map → markdown-BWnjyvnX.js.map} +1 -1
- package/public/assets/monaco-viewer-BEJIiZWL.js +27 -0
- package/public/assets/monaco-viewer-BEJIiZWL.js.map +1 -0
- package/public/assets/{startup-state-settings-card-BY741Rt0.js → startup-state-settings-card-C4E2Itop.js} +2 -2
- package/public/assets/{startup-state-settings-card-BY741Rt0.js.map → startup-state-settings-card-C4E2Itop.js.map} +1 -1
- package/public/assets/{terminal-square-BdC_jwm3.js → terminal-square-C3wutdV0.js} +2 -2
- package/public/assets/{terminal-square-BdC_jwm3.js.map → terminal-square-C3wutdV0.js.map} +1 -1
- package/public/assets/tool-call-DNsAQ_m4.js +60 -0
- package/public/assets/tool-call-DNsAQ_m4.js.map +1 -0
- package/public/assets/{unified-picker-C0eo1chJ.js → unified-picker-tB7y17Qz.js} +2 -2
- package/public/assets/unified-picker-tB7y17Qz.js.map +1 -0
- package/public/assets/{wrap-text-BuMtdvMx.js → wrap-text-CkBxzt04.js} +2 -2
- package/public/assets/{wrap-text-BuMtdvMx.js.map → wrap-text-CkBxzt04.js.map} +1 -1
- package/public/index.html +4 -4
- package/public/loading.html +5 -5
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/public/assets/App-0-FcHzPS.js +0 -44
- package/public/assets/App-0-FcHzPS.js.map +0 -1
- package/public/assets/StatusTab-LKUA9cbH.js +0 -2
- package/public/assets/StatusTab-LKUA9cbH.js.map +0 -1
- package/public/assets/index-8iPlm2r0.js +0 -2
- package/public/assets/index-8iPlm2r0.js.map +0 -1
- package/public/assets/index-B185mC7m.js +0 -2
- package/public/assets/index-B185mC7m.js.map +0 -1
- package/public/assets/index-Bbj1xF8i.js +0 -2
- package/public/assets/index-Bbj1xF8i.js.map +0 -1
- package/public/assets/index-BsmFN3k1.js +0 -2
- package/public/assets/index-BsmFN3k1.js.map +0 -1
- package/public/assets/index-Bz_OQJYA.css +0 -1
- package/public/assets/index-C52CfqK3.js +0 -2
- package/public/assets/index-C52CfqK3.js.map +0 -1
- package/public/assets/index-CHYmKl10.js.map +0 -1
- package/public/assets/index-CTKYD_VJ.js +0 -2
- package/public/assets/index-D2UHSOG5.js +0 -2
- package/public/assets/index-DDoB_Z36.js +0 -2
- package/public/assets/index-DDoB_Z36.js.map +0 -1
- package/public/assets/index-DcwAtZw-.js +0 -3
- package/public/assets/index-DcwAtZw-.js.map +0 -1
- package/public/assets/index-DxUD3RYr.js +0 -2
- package/public/assets/index-DxUD3RYr.js.map +0 -1
- package/public/assets/loading-CmEVQgyj.css +0 -1
- package/public/assets/main-CZztwrfv.js +0 -48
- package/public/assets/main-CZztwrfv.js.map +0 -1
- package/public/assets/monaco-viewer-CpxDfB-6.js +0 -27
- package/public/assets/monaco-viewer-CpxDfB-6.js.map +0 -1
- package/public/assets/tool-call-DbtCsJ4x.js +0 -60
- package/public/assets/tool-call-DbtCsJ4x.js.map +0 -1
- package/public/assets/unified-picker-C0eo1chJ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unified-picker-C0eo1chJ.js","sources":["../../../components/unified-picker-path.ts","../../../components/unified-picker.tsx"],"sourcesContent":["export function splitDisplayPath(path: string) {\n const isDirectory = path.endsWith(\"/\")\n const parts = path.split(\"/\").filter(Boolean)\n const folders = parts.slice(0, -1)\n return {\n name: parts.length > 0 ? `${parts[parts.length - 1]}${isDirectory ? \"/\" : \"\"}` : path,\n parent: folders[folders.length - 1] ?? \"\",\n directory: folders.join(\"/\"),\n }\n}\n","import { Component, createSignal, createEffect, createMemo, For, Show, onCleanup } from \"solid-js\"\nimport type { Agent } from \"../types/session\"\nimport type { CommandInfo } from \"@opencode-ai/client\"\nimport { serverApi } from \"../lib/api-client\"\nimport { useI18n } from \"../lib/i18n\"\nimport { getLogger } from \"../lib/logger\"\nimport { splitDisplayPath } from \"./unified-picker-path\"\nconst log = getLogger(\"actions\")\n\n\nconst SEARCH_RESULT_LIMIT = 100\nconst SEARCH_DEBOUNCE_MS = 200\n\ntype LoadingState = \"idle\" | \"listing\" | \"search\"\n\ninterface FileItem {\n path: string\n relativePath: string\n added?: number\n removed?: number\n isGitFile: boolean\n isDirectory: boolean\n}\n\nfunction formatDisplayPath(basePath: string, isDirectory: boolean) {\n if (!isDirectory) {\n return basePath\n }\n const trimmed = basePath.replace(/\\/+$/, \"\")\n return trimmed.length > 0 ? `${trimmed}/` : \"./\"\n}\n\nfunction isRootPath(value: string) {\n return value === \".\" || value === \"./\" || value === \"/\"\n}\n\nfunction normalizeRelativePath(basePath: string, isDirectory: boolean) {\n if (isRootPath(basePath)) {\n return \".\"\n }\n const withoutPrefix = basePath.replace(/^\\.\\/+/, \"\")\n if (isDirectory) {\n const trimmed = withoutPrefix.replace(/\\/+$/, \"\")\n return trimmed || \".\"\n }\n return withoutPrefix\n}\n\nfunction normalizeQuery(rawQuery: string) {\n const trimmed = rawQuery.trim()\n if (!trimmed) {\n return \"\"\n }\n // Don't normalize \".\" - it's used for workspace root\n return trimmed.replace(/^(\\.\\/)+/, \"\").replace(/^\\/+/, \"\")\n}\n\nfunction mapEntriesToFileItems(entries: { path: string; type: \"file\" | \"directory\" }[]): FileItem[] {\n return entries.map((entry) => {\n const isDirectory = entry.type === \"directory\"\n return {\n path: formatDisplayPath(entry.path, isDirectory),\n relativePath: normalizeRelativePath(entry.path, isDirectory),\n isDirectory,\n isGitFile: false,\n }\n })\n}\n\ntype PickerItem =\n | { type: \"agent\"; agent: Agent }\n | { type: \"file\"; file: FileItem }\n | { type: \"command\"; command: CommandInfo }\n\nexport type PickerSelectAction = \"click\" | \"tab\" | \"enter\" | \"shiftEnter\"\n\ninterface UnifiedPickerProps {\n open: boolean\n mode?: \"mention\" | \"command\"\n onSelect: (item: PickerItem, action: PickerSelectAction) => void\n onClose: () => void\n onSubmitWithoutSelection?: () => void\n agents: Agent[]\n commands?: CommandInfo[]\n searchQuery: string\n textareaRef?: HTMLTextAreaElement\n workspaceId: string\n}\n\nconst UnifiedPicker: Component<UnifiedPickerProps> = (props) => {\n const { t } = useI18n()\n const mode = () => props.mode ?? \"mention\"\n\n const [files, setFiles] = createSignal<FileItem[]>([])\n const [filteredAgents, setFilteredAgents] = createSignal<Agent[]>([])\n const [selectedIndex, setSelectedIndex] = createSignal(0)\n const [loadingState, setLoadingState] = createSignal<LoadingState>(\"idle\")\n const [allFiles, setAllFiles] = createSignal<FileItem[]>([])\n const [isInitialized, setIsInitialized] = createSignal(false)\n const [cachedWorkspaceId, setCachedWorkspaceId] = createSignal<string | null>(null)\n \n let containerRef: HTMLDivElement | undefined\n let scrollContainerRef: HTMLDivElement | undefined\n let lastWorkspaceId: string | null = null\n let lastQuery = \"\"\n let lastCommandQuery = \"\"\n let inflightWorkspaceId: string | null = null\n let inflightSnapshotPromise: Promise<FileItem[]> | null = null\n let activeRequestId = 0\n let queryDebounceTimer: ReturnType<typeof setTimeout> | null = null\n \n function resetScrollPosition() {\n setTimeout(() => {\n if (scrollContainerRef) {\n scrollContainerRef.scrollTop = 0\n scrollContainerRef.scrollLeft = 0\n }\n }, 0)\n }\n \n function applyFileResults(nextFiles: FileItem[]) {\n setFiles(nextFiles)\n setSelectedIndex(0)\n resetScrollPosition()\n }\n \n async function fetchWorkspaceSnapshot(workspaceId: string): Promise<FileItem[]> {\n if (inflightWorkspaceId === workspaceId && inflightSnapshotPromise) {\n return inflightSnapshotPromise\n }\n \n inflightWorkspaceId = workspaceId\n inflightSnapshotPromise = serverApi\n .listWorkspaceFiles(workspaceId)\n .then((entries) => mapEntriesToFileItems(entries))\n .then((snapshot) => {\n setAllFiles(snapshot)\n setCachedWorkspaceId(workspaceId)\n return snapshot\n })\n .catch((error) => {\n log.error(`[UnifiedPicker] Failed to load workspace files:`, error)\n setAllFiles([])\n setCachedWorkspaceId(null)\n throw error\n })\n .finally(() => {\n if (inflightWorkspaceId === workspaceId) {\n inflightWorkspaceId = null\n inflightSnapshotPromise = null\n }\n })\n \n return inflightSnapshotPromise\n }\n \n async function ensureWorkspaceSnapshot(workspaceId: string) {\n if (cachedWorkspaceId() === workspaceId && allFiles().length > 0) {\n return allFiles()\n }\n \n return fetchWorkspaceSnapshot(workspaceId)\n }\n \n async function loadFilesForQuery(rawQuery: string, workspaceId: string) {\n const normalizedQuery = normalizeQuery(rawQuery)\n const requestId = ++activeRequestId\n const hasCachedSnapshot =\n !normalizedQuery && cachedWorkspaceId() === workspaceId && allFiles().length > 0\n const mode: LoadingState = normalizedQuery ? \"search\" : hasCachedSnapshot ? \"idle\" : \"listing\"\n if (mode !== \"idle\") {\n setLoadingState(mode)\n } else {\n setLoadingState(\"idle\")\n }\n\n try {\n if (!normalizedQuery) {\n const snapshot = await ensureWorkspaceSnapshot(workspaceId)\n if (!shouldApplyResults(requestId, workspaceId)) {\n return\n }\n applyFileResults(snapshot)\n return\n }\n\n const results = await serverApi.searchWorkspaceFiles(workspaceId, normalizedQuery, {\n limit: SEARCH_RESULT_LIMIT,\n })\n if (!shouldApplyResults(requestId, workspaceId)) {\n return\n }\n applyFileResults(mapEntriesToFileItems(results))\n } catch (error) {\n if (workspaceId === props.workspaceId) {\n log.error(`[UnifiedPicker] Failed to fetch files:`, error)\n if (shouldApplyResults(requestId, workspaceId)) {\n applyFileResults([])\n }\n }\n } finally {\n if (shouldFinalizeRequest(requestId, workspaceId)) {\n setLoadingState(\"idle\")\n }\n }\n }\n\n function clearQueryDebounce() {\n if (queryDebounceTimer) {\n clearTimeout(queryDebounceTimer)\n queryDebounceTimer = null\n }\n }\n\n function scheduleLoadFilesForQuery(rawQuery: string, workspaceId: string, immediate = false) {\n clearQueryDebounce()\n const normalizedQuery = normalizeQuery(rawQuery)\n const shouldDebounce = !immediate && normalizedQuery.length > 0\n if (shouldDebounce) {\n queryDebounceTimer = setTimeout(() => {\n queryDebounceTimer = null\n void loadFilesForQuery(rawQuery, workspaceId)\n }, SEARCH_DEBOUNCE_MS)\n return\n }\n void loadFilesForQuery(rawQuery, workspaceId)\n }\n\n function shouldApplyResults(requestId: number, workspaceId: string) {\n return props.open && workspaceId === props.workspaceId && requestId === activeRequestId\n }\n\n \n function shouldFinalizeRequest(requestId: number, workspaceId: string) {\n return workspaceId === props.workspaceId && requestId === activeRequestId\n }\n \n function resetPickerState() {\n clearQueryDebounce()\n setFiles([])\n setAllFiles([])\n setCachedWorkspaceId(null)\n setIsInitialized(false)\n setSelectedIndex(0)\n setLoadingState(\"idle\")\n lastWorkspaceId = null\n lastQuery = \"\"\n lastCommandQuery = \"\"\n activeRequestId = 0\n }\n\n onCleanup(() => {\n clearQueryDebounce()\n })\n\n createEffect(() => {\n if (!props.open) {\n resetPickerState()\n return\n }\n\n if (mode() !== \"mention\") {\n // Command mode doesn't use file snapshots.\n return\n }\n\n const workspaceChanged = lastWorkspaceId !== props.workspaceId\n const queryChanged = lastQuery !== props.searchQuery\n\n if (queryChanged) {\n // Reset selectedIndex to 0 when query changes to avoid ghost state\n // This ensures proper highlighting when navigating back to root or changing queries\n setSelectedIndex(0)\n resetScrollPosition()\n }\n\n if (!isInitialized() || workspaceChanged || queryChanged) {\n setIsInitialized(true)\n lastWorkspaceId = props.workspaceId\n lastQuery = props.searchQuery\n const shouldSkipDebounce = workspaceChanged || normalizeQuery(props.searchQuery).length === 0\n scheduleLoadFilesForQuery(props.searchQuery, props.workspaceId, shouldSkipDebounce)\n }\n })\n\n createEffect(() => {\n if (!props.open) return\n if (mode() !== \"mention\") return\n\n const query = props.searchQuery.toLowerCase()\n const visibleAgents = props.agents.filter((agent) => !agent.hidden)\n const filtered = query\n ? visibleAgents.filter(\n (agent) =>\n agent.name.toLowerCase().includes(query) ||\n (agent.description && agent.description.toLowerCase().includes(query)),\n )\n : visibleAgents\n\n setFilteredAgents(filtered)\n })\n\n const filteredCommands = createMemo(() => {\n if (mode() !== \"command\") return []\n const q = props.searchQuery.trim().toLowerCase()\n const source = props.commands ?? []\n if (!q) return source\n return source.filter((cmd) => {\n const nameMatch = cmd.name.toLowerCase().includes(q)\n const descMatch = (cmd.description ?? \"\").toLowerCase().includes(q)\n return nameMatch || descMatch\n })\n })\n\n createEffect(() => {\n if (!props.open) return\n if (mode() !== \"command\") return\n\n const query = props.searchQuery\n const count = filteredCommands().length\n\n if (query !== lastCommandQuery) {\n lastCommandQuery = query\n setSelectedIndex(0)\n resetScrollPosition()\n return\n }\n\n if (count <= 0) {\n if (selectedIndex() !== 0) {\n setSelectedIndex(0)\n }\n return\n }\n\n const current = selectedIndex()\n if (current < 0) {\n setSelectedIndex(0)\n return\n }\n if (current >= count) {\n setSelectedIndex(count - 1)\n }\n })\n\n const allItems = (): PickerItem[] => {\n const items: PickerItem[] = []\n if (mode() === \"command\") {\n filteredCommands().forEach((command) => items.push({ type: \"command\", command }))\n return items\n }\n\n // Add root directory as first item only when query is EXACTLY \".\" or \"./\" (not \"./docs/\")\n const isExactRootQuery = props.searchQuery === \".\" || props.searchQuery === \"./\"\n if (mode() === \"mention\" && isExactRootQuery) {\n const rootFile: FileItem = {\n path: \".\",\n relativePath: \".\",\n isDirectory: true,\n isGitFile: false,\n }\n items.push({ type: \"file\", file: rootFile })\n }\n\n // Don't show agents for exact root path queries\n if (!isExactRootQuery) {\n filteredAgents().forEach((agent) => items.push({ type: \"agent\", agent }))\n }\n files().forEach((file) => items.push({ type: \"file\", file }))\n return items\n }\n\n function scrollToSelected() {\n setTimeout(() => {\n const selectedElement = containerRef?.querySelector('[data-picker-selected=\"true\"]')\n if (selectedElement) {\n selectedElement.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" })\n }\n }, 0)\n }\n\n function handleSelect(item: PickerItem) {\n props.onSelect(item, \"click\")\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (!props.open) return\n\n const items = allItems()\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n e.stopPropagation()\n setSelectedIndex((prev) => Math.min(prev + 1, items.length - 1))\n scrollToSelected()\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n e.stopPropagation()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n scrollToSelected()\n } else if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault()\n e.stopPropagation()\n const selected = items[selectedIndex()]\n if (selected) {\n const action: PickerSelectAction = e.key === \"Tab\" ? \"tab\" : e.shiftKey ? \"shiftEnter\" : \"enter\"\n props.onSelect(selected, action)\n } else if (e.key === \"Enter\" && mode() === \"mention\") {\n props.onSubmitWithoutSelection?.()\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n e.stopPropagation()\n props.onClose()\n }\n }\n\n createEffect(() => {\n if (props.open) {\n document.addEventListener(\"keydown\", handleKeyDown)\n onCleanup(() => {\n document.removeEventListener(\"keydown\", handleKeyDown)\n })\n }\n })\n\n const commandCount = () => filteredCommands().length\n const agentCount = () => filteredAgents().length\n const fileCount = () => files().length\n const isLoading = () => mode() === \"mention\" && loadingState() !== \"idle\"\n const loadingMessage = () => {\n if (loadingState() === \"search\") {\n return t(\"unifiedPicker.loading.searching\")\n }\n if (loadingState() === \"listing\") {\n return t(\"unifiedPicker.loading.loadingWorkspace\")\n }\n return \"\"\n }\n \n return (\n\n <Show when={props.open}>\n <div\n ref={containerRef}\n class=\"dropdown-surface bottom-full left-0 mb-1\"\n >\n <div class=\"dropdown-header\">\n <div class=\"dropdown-header-title\">\n <Show when={mode() === \"command\"} fallback={t(\"unifiedPicker.title.mention\")}>\n {t(\"unifiedPicker.title.command\")}\n </Show>\n <Show when={isLoading()}>\n <span class=\"ml-2\">{loadingMessage()}</span>\n </Show>\n </div>\n </div>\n\n <div ref={scrollContainerRef} class=\"dropdown-content max-h-60 overflow-x-auto\">\n <Show when={(mode() === \"command\" ? commandCount() === 0 : agentCount() === 0 && fileCount() === 0)}>\n <div class=\"dropdown-empty\">{t(\"unifiedPicker.empty\")}</div>\n </Show>\n\n <Show when={mode() === \"command\" && commandCount() > 0}>\n <div class=\"dropdown-section-header\">{t(\"unifiedPicker.sections.commands\")}</div>\n <For each={filteredCommands()}>\n {(command, index) => {\n const isSelected = () => index() === selectedIndex()\n return (\n <div\n class={`dropdown-item ${isSelected() ? \"dropdown-item-highlight\" : \"\"}`}\n data-picker-selected={isSelected()}\n onClick={() => props.onSelect({ type: \"command\", command }, \"click\")}\n >\n <div class=\"flex items-start gap-2\">\n <svg class=\"dropdown-icon-accent h-4 w-4 mt-0.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n <div class=\"flex-1\">\n <div class=\"text-sm font-medium\">/{command.name}</div>\n <Show when={command.description}>\n <div class=\"mt-0.5 text-xs\" style=\"color: var(--text-muted)\">\n {(command.description ?? \"\").length > 80 ? (command.description ?? \"\").slice(0, 80) + \"...\" : command.description}\n </div>\n </Show>\n </div>\n </div>\n </div>\n )\n }}\n </For>\n </Show>\n\n <Show when={mode() === \"mention\" && agentCount() > 0 && !(props.searchQuery === \".\" || props.searchQuery === \"./\")}>\n <div class=\"dropdown-section-header\">\n {t(\"unifiedPicker.sections.agents\")}\n </div>\n <For each={filteredAgents()}>\n {(agent) => {\n const itemIndex = allItems().findIndex(\n (item) => item.type === \"agent\" && item.agent.name === agent.name,\n )\n return (\n <div\n class={`dropdown-item ${\n itemIndex === selectedIndex() ? \"dropdown-item-highlight\" : \"\"\n }`}\n data-picker-selected={itemIndex === selectedIndex()}\n onClick={() => props.onSelect({ type: \"agent\", agent }, \"click\")}\n >\n <div class=\"flex items-start gap-2\">\n <svg\n class=\"dropdown-icon-accent h-4 w-4 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\"\n />\n </svg>\n <div class=\"flex-1\">\n <div class=\"flex items-center gap-2\">\n <span class=\"text-sm font-medium\">{agent.name}</span>\n <Show when={agent.mode === \"subagent\"}>\n <span class=\"dropdown-badge\">\n {t(\"unifiedPicker.badge.subagent\")}\n </span>\n </Show>\n </div>\n <Show when={agent.description}>\n <div class=\"mt-0.5 text-xs\" style=\"color: var(--text-muted)\">\n {agent.description && agent.description.length > 80\n ? agent.description.slice(0, 80) + \"...\"\n : agent.description}\n </div>\n </Show>\n </div>\n </div>\n </div>\n )\n }}\n </For>\n </Show>\n\n <Show when={mode() === \"mention\" && (fileCount() > 0 || props.searchQuery === \".\" || props.searchQuery === \"./\")}>\n <div class=\"dropdown-section-header\">\n {t(\"unifiedPicker.sections.files\")}\n </div>\n <Show when={props.searchQuery === \".\" || props.searchQuery === \"./\"}>\n <div\n class={`dropdown-item py-1.5 ${\n selectedIndex() === 0 ? \"dropdown-item-highlight\" : \"\"\n }`}\n data-picker-selected={selectedIndex() === 0}\n onClick={() => {\n const rootFile: FileItem = {\n path: \".\",\n relativePath: \".\",\n isDirectory: true,\n isGitFile: false,\n }\n props.onSelect({ type: \"file\", file: rootFile }, \"click\")\n }}\n >\n <div class=\"flex items-center gap-2 text-sm\">\n <svg class=\"dropdown-icon h-4 w-4 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"\n />\n </svg>\n <span class=\"font-mono\">. {t(\"unifiedPicker.sections.workspaceRoot\")}</span>\n </div>\n </div>\n </Show>\n <For each={files()}>\n {(file) => {\n const itemIndex = allItems().findIndex(\n (item) => item.type === \"file\" && item.file.relativePath === file.relativePath,\n )\n const isFolder = file.isDirectory\n const displayPath = splitDisplayPath(file.path)\n return (\n <div\n class={`dropdown-item py-1.5 ${\n itemIndex === selectedIndex() ? \"dropdown-item-highlight\" : \"\"\n }`}\n data-picker-selected={itemIndex === selectedIndex()}\n onClick={() => props.onSelect({ type: \"file\", file }, \"click\")}\n >\n <div class=\"flex min-w-full w-max items-center gap-2 text-sm\">\n <Show\n when={isFolder}\n fallback={\n <svg class=\"dropdown-icon h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n }\n >\n <svg class=\"dropdown-icon-accent h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"\n />\n </svg>\n </Show>\n <span class=\"min-w-0 flex-1\" title={file.path}>\n <span class=\"sr-only\">{file.path}</span>\n <span aria-hidden=\"true\">\n <span class=\"block whitespace-nowrap\">\n {displayPath.name}\n </span>\n <Show when={displayPath.parent}>\n <span class=\"block whitespace-nowrap text-[11px]\" style=\"color: var(--text-muted)\">{displayPath.parent}/</span>\n </Show>\n <Show when={displayPath.directory && displayPath.directory !== displayPath.parent}>\n <span class=\"block whitespace-nowrap text-[10px]\" style=\"color: var(--text-muted)\">{displayPath.directory}</span>\n </Show>\n </span>\n </span>\n </div>\n </div>\n )\n }}\n </For>\n </Show>\n </div>\n\n <div class=\"dropdown-footer\">\n <div>\n <span class=\"font-medium\">↑↓</span> {t(\"unifiedPicker.footer.navigate\")} • <span class=\"font-medium\">Tab/Enter</span> {t(\"unifiedPicker.footer.select\")} •{\" \"}\n <span class=\"font-medium\">Esc</span> {t(\"unifiedPicker.footer.close\")}\n </div>\n </div>\n </div>\n </Show>\n )\n}\n\nexport default UnifiedPicker\n"],"names":["splitDisplayPath","path","isDirectory","parts","folders","log","getLogger","SEARCH_RESULT_LIMIT","SEARCH_DEBOUNCE_MS","formatDisplayPath","basePath","trimmed","replace","length","isRootPath","value","normalizeRelativePath","withoutPrefix","normalizeQuery","rawQuery","trim","mapEntriesToFileItems","entries","map","entry","type","relativePath","isGitFile","UnifiedPicker","props","t","useI18n","mode","files","setFiles","createSignal","filteredAgents","setFilteredAgents","selectedIndex","setSelectedIndex","loadingState","setLoadingState","allFiles","setAllFiles","isInitialized","setIsInitialized","cachedWorkspaceId","setCachedWorkspaceId","containerRef","scrollContainerRef","lastWorkspaceId","lastQuery","lastCommandQuery","inflightWorkspaceId","inflightSnapshotPromise","activeRequestId","queryDebounceTimer","resetScrollPosition","setTimeout","scrollTop","scrollLeft","applyFileResults","nextFiles","fetchWorkspaceSnapshot","workspaceId","serverApi","listWorkspaceFiles","then","snapshot","catch","error","finally","ensureWorkspaceSnapshot","loadFilesForQuery","normalizedQuery","requestId","hasCachedSnapshot","shouldApplyResults","results","searchWorkspaceFiles","limit","shouldFinalizeRequest","clearQueryDebounce","clearTimeout","scheduleLoadFilesForQuery","immediate","open","resetPickerState","onCleanup","createEffect","workspaceChanged","queryChanged","searchQuery","shouldSkipDebounce","query","toLowerCase","visibleAgents","agents","filter","agent","hidden","filtered","name","includes","description","filteredCommands","createMemo","q","source","commands","cmd","nameMatch","descMatch","count","current","allItems","items","forEach","command","push","isExactRootQuery","rootFile","file","scrollToSelected","selectedElement","querySelector","scrollIntoView","block","behavior","handleKeyDown","e","key","preventDefault","stopPropagation","prev","Math","min","max","selected","action","shiftKey","onSelect","onSubmitWithoutSelection","onClose","document","addEventListener","removeEventListener","commandCount","agentCount","fileCount","isLoading","loadingMessage","_$createComponent","Show","when","children","_el$","_tmpl$5","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$13","_el$14","_el$15","_el$16","_el$24","_el$17","_el$18","_el$19","_el$25","_el$20","_el$22","_ref$","_$use","_$insert","fallback","_el$4","_tmpl$","_ref$2","_$memo","_el$6","_tmpl$2","_el$7","_tmpl$3","For","each","index","isSelected","_el$26","_tmpl$7","_el$27","_el$28","_el$29","_el$30","$$click","_el$32","_tmpl$6","_c$","slice","_$effect","_p$","_v$3","_v$4","_$className","_$setAttribute","undefined","_el$8","itemIndex","findIndex","item","_el$33","_tmpl$9","_el$34","_el$35","_el$36","_el$37","_el$38","_el$39","_tmpl$8","_el$40","_c$2","_v$5","_v$6","_el$9","_el$0","_tmpl$4","_el$1","_el$10","_el$11","_v$","_v$2","isFolder","displayPath","_el$41","_tmpl$11","_el$42","_el$44","_el$45","_el$46","_el$47","_tmpl$12","_tmpl$0","parent","_el$48","_tmpl$1","_el$49","directory","_el$50","_tmpl$10","_v$7","_v$8","_v$9","a","_$delegateEvents"],"mappings":"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"}
|