skillmux 0.1.3 → 0.1.5
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/dist/{chunk-DBEVDI27.js → chunk-OY3C7VIL.js} +745 -225
- package/dist/chunk-OY3C7VIL.js.map +1 -0
- package/dist/{chunk-UMN3UJFN.js → chunk-R5V2WOZV.js} +15 -432
- package/dist/chunk-R5V2WOZV.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/launch-tui-4TJFQA3L.js +3189 -0
- package/dist/launch-tui-4TJFQA3L.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-DBEVDI27.js.map +0 -1
- package/dist/chunk-UMN3UJFN.js.map +0 -1
- package/dist/launch-tui-PHWJPIQZ.js +0 -1790
- package/dist/launch-tui-PHWJPIQZ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tui/launch-tui.tsx","../src/tui/app.tsx","../src/tui/load-dashboard-state.ts","../src/manifest/read-manifest-snapshot.ts","../src/tui/dashboard-model.ts","../src/tui/actions.ts","../src/tui/components/Dashboard.tsx","../src/tui/state.ts","../src/tui/components/AgentList.tsx","../src/tui/components/ConfirmDialog.tsx","../src/tui/components/DetailPane.tsx","../src/tui/components/Footer.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/components/SkillList.tsx","../src/tui/components/StatusLine.tsx"],"sourcesContent":["import React from \"react\";\nimport { render, type Instance } from \"ink\";\nimport { App } from \"./app\";\n\r\nexport type LaunchTuiOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n};\r\n\r\nconst alternateScreenEnter = \"\\u001B[?1049h\";\r\nconst alternateScreenExit = \"\\u001B[?1049l\";\r\nconst cursorHide = \"\\u001B[?25l\";\r\nconst cursorShow = \"\\u001B[?25h\";\r\nconst lifecycleTraceEnabled = process.env.SKILLMUX_TUI_PTY_TRACE === \"1\";\r\n\r\nexport async function launchTui(options: LaunchTuiOptions = {}): Promise<void> {\n let failure: unknown;\n let instance: Instance | null = null;\n let sigintRequested = false;\n\n const handleSigint = () => {\n sigintRequested = true;\n instance?.unmount();\n };\n\n try {\n process.once(\"SIGINT\", handleSigint);\n process.stdout.write(alternateScreenEnter);\n process.stdout.write(cursorHide);\n await writeLifecycleTrace(\"alt-screen-enter\");\n\n instance = render(<App {...options} />);\n if (sigintRequested) {\n instance.unmount();\n }\n await instance.waitUntilExit();\n await writeLifecycleTrace(\"session-exit-clean\");\n } catch (error) {\n failure = error;\n } finally {\n process.removeListener(\"SIGINT\", handleSigint);\n failure = await runCleanup(failure, () => writeLifecycleTrace(\"alt-screen-exit\"));\n failure = await runCleanup(failure, () => process.stdout.write(alternateScreenExit));\n failure = await runCleanup(failure, () => process.stdout.write(cursorShow));\n }\r\n\r\n if (failure !== undefined) {\r\n throw failure;\r\n }\r\n}\r\n\r\nfunction writeLifecycleTrace(\r\n stage: \"alt-screen-enter\" | \"session-exit-clean\" | \"alt-screen-exit\"\r\n): Promise<void> {\r\n if (!lifecycleTraceEnabled) {\r\n return Promise.resolve();\r\n }\r\n\r\n process.stderr.write(`[skillmux:${stage}]\\n`);\r\n return stage === \"session-exit-clean\" ? sleep(0) : Promise.resolve();\r\n}\r\n\r\nasync function runCleanup(\r\n failure: unknown | undefined,\r\n cleanup: () => unknown | Promise<unknown>\r\n): Promise<unknown | undefined> {\r\n try {\r\n await cleanup();\r\n return failure;\r\n } catch (error) {\r\n return failure === undefined ? error : failure;\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","import { readFileSync } from \"node:fs\";\r\nimport { Text, useApp, useInput } from \"ink\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n dispatchTuiAction,\r\n type DispatchTuiActionInput,\r\n type DispatchTuiActionResult,\r\n type TuiAction\r\n} from \"./actions\";\r\nimport { Dashboard } from \"./components/Dashboard\";\r\nimport type { DashboardModel } from \"./dashboard-model\";\r\nimport {\r\n loadDashboardState,\r\n type LoadDashboardStateOptions\r\n} from \"./load-dashboard-state\";\r\nimport {\r\n consumeActionIntent,\r\n consumeAgentSelectionIntent,\r\n createInitialTuiState,\r\n updateTuiState,\r\n type TuiState\r\n} from \"./state\";\r\n\r\nexport type AppServices = {\r\n loadDashboardState: (\r\n options: LoadDashboardStateOptions\r\n ) => Promise<DashboardModel>;\r\n dispatchTuiAction: (\r\n input: DispatchTuiActionInput\r\n ) => Promise<DispatchTuiActionResult>;\r\n};\r\n\r\nexport type AppProps = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n terminalWidth?: number;\r\n terminalHeight?: number;\r\n services?: Partial<AppServices>;\r\n};\r\n\r\nconst defaultServices: AppServices = {\r\n loadDashboardState,\r\n dispatchTuiAction\r\n};\r\n\r\nfunction errorReason(error: unknown): string {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const firstLine = message.split(/\\r?\\n/u)[0]?.trim();\r\n\r\n return firstLine === undefined || firstLine.length === 0\r\n ? \"Unknown error\"\r\n : firstLine;\r\n}\r\n\r\nfunction loadOptions(\r\n props: Pick<AppProps, \"homeDir\" | \"skillmuxHome\" | \"platform\">,\r\n selectedAgentId?: string,\r\n selectedSkillId?: string\r\n): LoadDashboardStateOptions {\r\n return {\r\n homeDir: props.homeDir,\r\n skillmuxHome: props.skillmuxHome,\r\n platform: props.platform,\r\n selectedAgentId,\r\n selectedSkillId\r\n };\r\n}\r\n\r\nfunction replaceStateModel(\r\n previous: TuiState,\r\n model: DashboardModel,\r\n statusMessage: string | null\r\n): TuiState {\r\n const next = createInitialTuiState(model);\r\n\r\n return {\r\n ...next,\r\n focus: previous.focus,\r\n search: previous.search,\r\n statusMessage,\r\n modal: null,\r\n busy: false\r\n };\r\n}\r\n\r\nfunction isTextInput(input: string): boolean {\r\n return input.length > 0 && !/[\\u0000-\\u001F\\u007F]/u.test(input);\r\n}\r\n\r\nfunction parseBridgedSize(value: string): { columns: number; rows: number } | null {\r\n try {\r\n const parsed = JSON.parse(value) as {\r\n columns?: unknown;\r\n rows?: unknown;\r\n };\r\n\r\n if (\r\n typeof parsed.columns === \"number\" &&\r\n typeof parsed.rows === \"number\" &&\r\n Number.isFinite(parsed.columns) &&\r\n Number.isFinite(parsed.rows)\r\n ) {\r\n return {\r\n columns: parsed.columns,\r\n rows: parsed.rows\r\n };\r\n }\r\n } catch {\r\n return null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction liveTerminalSize(): { columns: number; rows: number } {\r\n return {\r\n columns: process.stdout.columns ?? 80,\r\n rows: process.stdout.rows ?? 24\r\n };\r\n}\r\n\r\ntype AppViewportProps = {\r\n state: TuiState;\r\n terminalWidth?: number;\r\n terminalHeight?: number;\r\n};\r\n\r\ntype BridgedDashboardViewportProps = AppViewportProps & {\r\n bridgePath: string | null;\r\n};\r\n\r\nfunction readSizeFile(path: string): { columns: number; rows: number } | null {\r\n try {\r\n return parseBridgedSize(readFileSync(path, \"utf8\"));\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction useBridgedTerminalSize(path: string | null): { columns: number; rows: number } | null {\r\n const [size, setSize] = useState<{ columns: number; rows: number } | null>(() =>\r\n path === null ? null : readSizeFile(path)\r\n );\r\n\r\n useEffect(() => {\r\n if (path === null) {\r\n setSize(null);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n\r\n const refresh = () => {\r\n if (cancelled) {\r\n return;\r\n }\r\n\r\n const nextSize = readSizeFile(path);\r\n setSize((current) =>\r\n nextSize === null\r\n ? current\r\n : current !== null &&\r\n current.columns === nextSize.columns &&\r\n current.rows === nextSize.rows\r\n ? current\r\n : nextSize\r\n );\r\n };\r\n\r\n refresh();\r\n const timer = setInterval(refresh, 50);\r\n\r\n return () => {\r\n cancelled = true;\r\n clearInterval(timer);\r\n };\r\n }, [path]);\r\n\r\n return size;\r\n}\r\n\r\nfunction LiveDashboardViewport({\r\n state,\r\n terminalWidth,\r\n terminalHeight\r\n}: AppViewportProps) {\r\n return (\r\n <Dashboard\r\n state={state}\r\n width={terminalWidth ?? liveTerminalSize().columns}\r\n height={terminalHeight ?? liveTerminalSize().rows}\r\n />\r\n );\r\n}\r\n\r\nfunction BridgedDashboardViewport({\r\n state,\r\n terminalWidth,\r\n terminalHeight,\r\n bridgePath\r\n}: BridgedDashboardViewportProps) {\r\n const bridgedTerminalSize = useBridgedTerminalSize(bridgePath ?? null);\r\n const fallbackSize = liveTerminalSize();\r\n\r\n return (\r\n <Dashboard\r\n state={state}\r\n width={terminalWidth ?? bridgedTerminalSize?.columns ?? fallbackSize.columns}\r\n height={terminalHeight ?? bridgedTerminalSize?.rows ?? fallbackSize.rows}\r\n />\r\n );\r\n}\r\n\r\nexport function App({\r\n homeDir,\r\n skillmuxHome,\r\n platform,\r\n terminalWidth,\r\n terminalHeight,\r\n services: serviceOverrides\r\n}: AppProps) {\r\n const { exit } = useApp();\r\n const [state, setState] = useState<TuiState | null>(null);\r\n const [loadError, setLoadError] = useState<string | null>(null);\r\n const requestSequence = useRef(0);\r\n const latestRequest = useRef(0);\r\n const activeActionRequest = useRef<number | null>(null);\r\n const stableModel = useRef<DashboardModel | null>(null);\r\n const services = useMemo(\r\n () => ({ ...defaultServices, ...serviceOverrides }),\r\n [serviceOverrides]\r\n );\r\n const sizeBridgePath = process.env.SKILLMUX_TUI_PTY_SIZE_FILE?.trim() ?? null;\r\n const sizeBridgeEnabled = sizeBridgePath !== null && sizeBridgePath.length > 0;\r\n\r\n const beginRequest = useCallback((): number => {\r\n requestSequence.current += 1;\r\n latestRequest.current = requestSequence.current;\r\n\r\n return requestSequence.current;\r\n }, []);\r\n\r\n const isLatestRequest = useCallback((requestId: number): boolean => {\r\n return latestRequest.current === requestId;\r\n }, []);\r\n\r\n const startBusyState = useCallback(\r\n (baseState: TuiState, action: TuiAction): TuiState =>\r\n updateTuiState(\r\n updateTuiState(baseState, { type: \"set-busy\", busy: true }),\r\n {\r\n type: \"set-status\",\r\n message: action === \"scan\" ? \"scanning...\" : \"working...\"\r\n }\r\n ),\r\n []\r\n );\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n services\r\n .loadDashboardState(loadOptions({ homeDir, skillmuxHome, platform }))\r\n .then((model) => {\r\n if (!cancelled) {\r\n stableModel.current = model;\r\n setState(createInitialTuiState(model));\r\n setLoadError(null);\r\n }\r\n })\r\n .catch((error: unknown) => {\r\n if (!cancelled) {\r\n setLoadError(`Failed to load dashboard: ${errorReason(error)}`);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [homeDir, platform, services, skillmuxHome]);\r\n\r\n const runAction = useCallback(\r\n (action: TuiAction, model: DashboardModel, baseState?: TuiState) => {\r\n if (activeActionRequest.current !== null) {\r\n return;\r\n }\r\n\r\n const requestId = beginRequest();\r\n activeActionRequest.current = requestId;\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : startBusyState(baseState ?? current, action)\r\n );\r\n\r\n services\r\n .dispatchTuiAction({\r\n action,\r\n model,\r\n homeDir,\r\n skillmuxHome,\r\n platform\r\n })\r\n .then((result) => {\r\n if (!isLatestRequest(requestId)) {\r\n return;\r\n }\r\n\r\n stableModel.current = result.model;\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : replaceStateModel(current, result.model, result.statusMessage)\r\n );\r\n })\r\n .catch((error: unknown) => {\r\n if (!isLatestRequest(requestId)) {\r\n return;\r\n }\r\n\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : updateTuiState(\r\n updateTuiState(current, { type: \"set-busy\", busy: false }),\r\n {\r\n type: \"set-status\",\r\n message: `Action failed: ${errorReason(error)}`\r\n }\r\n )\r\n );\r\n })\r\n .finally(() => {\r\n if (activeActionRequest.current === requestId) {\r\n activeActionRequest.current = null;\r\n }\r\n });\r\n },\r\n [\r\n beginRequest,\r\n homeDir,\r\n isLatestRequest,\r\n platform,\r\n services,\r\n skillmuxHome,\r\n startBusyState\r\n ]\r\n );\r\n\r\n const reloadAgent = useCallback(\r\n (agentId: string) => {\r\n const requestId = beginRequest();\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : updateTuiState(\r\n updateTuiState(current, { type: \"set-busy\", busy: true }),\r\n { type: \"set-status\", message: \"loading agent...\" }\r\n )\r\n );\r\n\r\n services\r\n .loadDashboardState(loadOptions({ homeDir, skillmuxHome, platform }, agentId))\r\n .then((model) => {\r\n if (!isLatestRequest(requestId)) {\r\n return;\r\n }\r\n\r\n stableModel.current = model;\r\n setState((current) =>\r\n current === null ? current : replaceStateModel(current, model, null)\r\n );\r\n })\r\n .catch((error: unknown) => {\r\n if (!isLatestRequest(requestId)) {\r\n return;\r\n }\r\n\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : stableModel.current === null\r\n ? updateTuiState(\r\n updateTuiState(current, { type: \"set-busy\", busy: false }),\r\n {\r\n type: \"set-status\",\r\n message: `Load failed: ${errorReason(error)}`\r\n }\r\n )\r\n : replaceStateModel(\r\n current,\r\n stableModel.current,\r\n `Load failed: ${errorReason(error)}`\r\n )\r\n );\r\n });\r\n },\r\n [beginRequest, homeDir, isLatestRequest, platform, services, skillmuxHome]\r\n );\r\n\r\n useEffect(() => {\r\n if (state?.pendingAction === null || state?.pendingAction === undefined) {\r\n return;\r\n }\r\n\r\n const consumed = consumeActionIntent(state);\r\n setState(consumed.state);\r\n\r\n if (consumed.action !== null) {\r\n runAction(consumed.action, consumed.state.model);\r\n }\r\n }, [runAction, state]);\r\n\r\n useEffect(() => {\r\n if (state?.pendingAgentId === null || state?.pendingAgentId === undefined) {\r\n return;\r\n }\r\n\r\n const consumed = consumeAgentSelectionIntent(state);\r\n setState(consumed.state);\r\n\r\n if (consumed.agentId !== null) {\r\n reloadAgent(consumed.agentId);\r\n }\r\n }, [reloadAgent, state]);\r\n\r\n useInput((input, key) => {\r\n if (key.ctrl && input === \"c\") {\r\n exit();\r\n return;\r\n }\r\n\r\n if (state === null) {\r\n if (input === \"q\") {\r\n exit();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (state.search !== null) {\r\n if (key.escape) {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\r\n if (key.return) {\r\n setState(updateTuiState(state, { type: \"submit-search\" }));\r\n return;\r\n }\r\n\r\n if (key.backspace || key.delete) {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"search-query-changed\",\r\n query: state.search.query.slice(0, -1)\r\n })\r\n );\r\n return;\r\n }\r\n\r\n if (!key.ctrl && !key.meta && isTextInput(input)) {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"search-query-changed\",\r\n query: `${state.search.query}${input}`\r\n })\r\n );\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (state.modal !== null) {\r\n if (key.escape) {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\r\n if (input === \"q\") {\r\n exit();\r\n return;\r\n }\r\n\r\n if (activeActionRequest.current !== null) {\r\n return;\r\n }\r\n\r\n if (\r\n input.toLocaleLowerCase() === \"y\" &&\r\n state.modal.kind === \"confirm-adopt\"\r\n ) {\r\n const closedState = updateTuiState(state, { type: \"close\" });\r\n runAction(\"adopt\", closedState.model, closedState);\r\n return;\r\n }\r\n\r\n if (\r\n input.toLocaleLowerCase() === \"y\" &&\r\n state.modal.kind === \"confirm-adopt-all\"\r\n ) {\r\n const closedState = updateTuiState(state, { type: \"close\" });\r\n runAction(\"adopt-all\", closedState.model, closedState);\r\n return;\r\n }\r\n\r\n if (\r\n input.toLocaleLowerCase() === \"y\" &&\r\n state.modal.kind === \"confirm-remove\"\r\n ) {\r\n const closedState = updateTuiState(state, { type: \"close\" });\r\n runAction(\"remove\", closedState.model, closedState);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (input === \"q\") {\r\n exit();\r\n return;\r\n }\r\n\r\n if (activeActionRequest.current !== null) {\r\n return;\r\n }\r\n\r\n if (key.rightArrow) {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"focus-next\"\r\n })\r\n );\r\n return;\r\n }\r\n\r\n if (key.leftArrow) {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"focus-previous\"\r\n })\r\n );\r\n return;\r\n }\r\n\r\n if (key.downArrow || input === \"j\") {\r\n setState(updateTuiState(state, { type: \"next-row\" }));\r\n return;\r\n }\r\n\r\n if (key.upArrow || input === \"k\") {\r\n setState(updateTuiState(state, { type: \"previous-row\" }));\r\n return;\r\n }\r\n\r\n if (input === \"g\") {\r\n setState(updateTuiState(state, { type: \"first-row\" }));\r\n return;\r\n }\r\n\r\n if (input === \"G\") {\r\n setState(updateTuiState(state, { type: \"last-row\" }));\r\n return;\r\n }\r\n\r\n if (input === \"/\") {\r\n setState(updateTuiState(state, { type: \"open-search\" }));\r\n return;\r\n }\r\n\r\n if (input === \"?\") {\r\n setState(updateTuiState(state, { type: \"open-help\" }));\r\n return;\r\n }\r\n\r\n if (key.escape) {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\r\n if (input === \" \") {\r\n setState(updateTuiState(state, { type: \"request-toggle\" }));\r\n return;\r\n }\r\n\r\n if (input === \"A\" || (key.shift && input === \"a\")) {\r\n setState(updateTuiState(state, { type: \"request-adopt-all\" }));\r\n return;\r\n }\r\n\r\n if (input === \"a\") {\r\n setState(updateTuiState(state, { type: \"request-adopt\" }));\r\n return;\r\n }\r\n\r\n if (input === \"r\") {\r\n setState(updateTuiState(state, { type: \"request-remove\" }));\r\n return;\r\n }\r\n\r\n if (input === \"s\") {\r\n setState(updateTuiState(state, { type: \"request-scan\" }));\r\n }\r\n });\r\n\r\n if (loadError !== null) {\r\n return <Text color=\"red\">{loadError}</Text>;\r\n }\r\n\r\n if (state === null) {\r\n return <Text>loading dashboard...</Text>;\r\n }\r\n\r\n return sizeBridgeEnabled ? (\r\n <BridgedDashboardViewport\r\n state={state}\r\n terminalWidth={terminalWidth}\r\n terminalHeight={terminalHeight}\r\n bridgePath={sizeBridgePath}\r\n />\r\n ) : (\r\n <LiveDashboardViewport\r\n state={state}\r\n terminalWidth={terminalWidth}\r\n terminalHeight={terminalHeight}\r\n />\r\n );\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport {\r\n collectDoctorIssues,\r\n dedupeAndSortIssues\r\n} from \"../diagnostics/collect-doctor-issues\";\r\nimport { discoverAgents } from \"../discovery/discover-agents\";\r\nimport {\r\n scanAgentSkills,\r\n type ScanAgentSkillsResult\r\n} from \"../discovery/scan-agent-skills\";\r\nimport { readManifestSnapshot } from \"../manifest/read-manifest-snapshot\";\r\nimport {\r\n buildDashboardModel,\r\n type DashboardModel\r\n} from \"./dashboard-model\";\r\n\r\nexport type LoadDashboardStateOptions = {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n selectedAgentId?: string;\r\n selectedSkillId?: string;\r\n};\r\n\r\nexport async function loadDashboardState(\r\n options: LoadDashboardStateOptions = {}\r\n): Promise<DashboardModel> {\r\n const homeDir = options.homeDir ?? homedir();\r\n const resolvedSkillmuxHome = resolveSkillmuxHome(homeDir).skillmuxHome;\r\n const skillmuxHome = options.skillmuxHome ?? resolvedSkillmuxHome;\r\n const { manifest } = await readManifestSnapshot(skillmuxHome);\r\n const agents = await discoverAgents({\r\n homeDir,\r\n platform: options.platform,\r\n skillmuxHome\r\n });\r\n const scanResults: ScanAgentSkillsResult[] = [];\r\n\r\n for (const agent of agents) {\r\n scanResults.push(await scanAgentSkills(agent, skillmuxHome));\r\n }\r\n\r\n const entries = scanResults.flatMap((result) => result.entries);\r\n const scanIssues = scanResults.flatMap((result) => result.issues);\r\n const doctorIssues = await collectDoctorIssues({ manifest, agents, entries });\r\n const issues = dedupeAndSortIssues([...scanIssues, ...doctorIssues]);\r\n\r\n return buildDashboardModel({\r\n manifest,\r\n agents,\r\n entries,\r\n issues,\r\n selectedAgentId: options.selectedAgentId,\r\n selectedSkillId: options.selectedSkillId\r\n });\r\n}\r\n","import * as fs from \"node:fs/promises\";\r\nimport { join, resolve } from \"node:path\";\r\nimport { ManifestValidationError } from \"../core/errors\";\r\nimport type { Manifest } from \"../core/types\";\r\nimport { buildEmptyManifest } from \"./build-empty-manifest\";\r\nimport { manifestSchema } from \"./manifest-schema\";\r\nimport { formatValidationIssues } from \"./read-manifest\";\r\n\r\nexport type ManifestSnapshot = {\r\n manifest: Manifest;\r\n exists: boolean;\r\n};\r\n\r\nfunction normalizeHomePath(home: string): string {\r\n const resolvedHome = resolve(home);\r\n return process.platform === \"win32\"\r\n ? resolvedHome.toLowerCase()\r\n : resolvedHome;\r\n}\r\n\r\nexport async function readManifestSnapshot(\r\n home: string\r\n): Promise<ManifestSnapshot> {\r\n const manifestPath = join(home, \"manifest.json\");\r\n\r\n try {\r\n const contents = await fs.readFile(manifestPath, \"utf8\");\r\n const parsed = manifestSchema.safeParse(JSON.parse(contents) as unknown);\r\n\r\n if (!parsed.success) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: ${formatValidationIssues(parsed.error)}`\r\n );\r\n }\r\n\r\n if (normalizeHomePath(parsed.data.skillmuxHome) !== normalizeHomePath(home)) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: skillmuxHome must match ${home}`\r\n );\r\n }\r\n\r\n return { manifest: parsed.data, exists: true };\r\n } catch (error) {\r\n if (\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"code\" in error &&\r\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\r\n ) {\r\n return { manifest: buildEmptyManifest(home), exists: false };\r\n }\r\n\r\n if (error instanceof SyntaxError) {\r\n throw new ManifestValidationError(\r\n `Invalid manifest at ${manifestPath}: malformed JSON`\r\n );\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n","import type { Manifest, ManagedSkill, ScanIssue } from \"../core/types\";\nimport type { DiscoveredAgent } from \"../discovery/discover-agents\";\nimport type {\n ScannedSkillEntry,\n SkillEntryKind\n} from \"../discovery/infer-skill-entry\";\nimport { isPathInside } from \"../fs/path-utils\";\n\nexport type TuiAgentRow = {\n id: string;\n name: string;\n path: string;\n discovery: \"builtin\" | \"custom\";\n exists: boolean;\n supported: boolean;\n activationCount?: number;\n enabledCount: number;\n disabledCount: number;\n unmanagedCount: number;\n issueCount: number;\n};\n\nexport type TuiEnabledSkillRow = {\n id: string;\n kind: \"enabled\";\n marker: \"●\";\n skillId: string;\n name: string;\n path: string;\n agentId: string;\n activationLinkPath: string;\n};\n\nexport type TuiDisabledSkillRow = {\n id: string;\n kind: \"disabled\";\n marker: \"○\";\n skillId: string;\n name: string;\n path: string;\n agentId: string;\n activationLinkPath: string | null;\n};\n\nexport type TuiUnmanagedSkillRow = {\n id: string;\n kind: \"unmanaged\";\n marker: \"?\";\n skillName: string;\n name: string;\n path: string;\n agentId: string;\n entryKind: Extract<SkillEntryKind, \"unmanaged-directory\" | \"unmanaged-link\">;\n targetPath?: string;\n};\n\nexport type TuiIssueSkillRow = {\n id: string;\n kind: \"issue\";\n marker: \"!\";\n issueCode: string;\n severity: ScanIssue[\"severity\"];\n message: string;\n path: string | null;\n agentId: string;\n};\n\nexport type TuiSkillRow =\n | TuiEnabledSkillRow\n | TuiDisabledSkillRow\n | TuiUnmanagedSkillRow\n | TuiIssueSkillRow;\n\nexport type DashboardModel = {\n agents: TuiAgentRow[];\n skills: TuiSkillRow[];\n selectedAgentId: string | null;\n selectedSkillId: string | null;\n lastScanAt: string | null;\n issueCount: number;\n};\n\nexport type BuildDashboardModelInput = {\n manifest: Manifest;\n agents: DiscoveredAgent[];\n entries: ScannedSkillEntry[];\n issues: ScanIssue[];\n selectedAgentId?: string;\n selectedSkillId?: string;\n};\n\ntype RowCounts = {\n enabledCount: number;\n disabledCount: number;\n unmanagedCount: number;\n issueCount: number;\n};\n\nconst emptyCounts = (): RowCounts => ({\n enabledCount: 0,\n disabledCount: 0,\n unmanagedCount: 0,\n issueCount: 0\n});\n\nfunction sortById<T extends { id: string }>(values: T[]): T[] {\n return [...values].sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction getSelectedAgentId(\n agents: DiscoveredAgent[],\n requestedAgentId?: string\n): string | null {\n if (requestedAgentId !== undefined) {\n const requestedAgent = agents.find((agent) => agent.id === requestedAgentId);\n\n if (requestedAgent !== undefined) {\n return requestedAgent.id;\n }\n }\n\n const availableAgent = agents.find(\n (agent) => agent.exists && agent.supportedOnPlatform\n );\n\n return availableAgent?.id ?? agents[0]?.id ?? null;\n}\n\nfunction findEnabledActivation(\n manifest: Manifest,\n skillId: string,\n agentId: string\n) {\n return manifest.activations.find(\n (activation) =>\n activation.skillId === skillId &&\n activation.agentId === agentId &&\n activation.state === \"enabled\"\n );\n}\n\nfunction findAnyActivation(\n manifest: Manifest,\n skillId: string,\n agentId: string\n) {\n return manifest.activations.find(\n (activation) =>\n activation.skillId === skillId && activation.agentId === agentId\n );\n}\n\nfunction buildManagedSkillRow(\n manifest: Manifest,\n skill: ManagedSkill,\n agentId: string\n): TuiEnabledSkillRow | TuiDisabledSkillRow {\n const enabledActivation = findEnabledActivation(manifest, skill.id, agentId);\n\n if (enabledActivation !== undefined) {\n return {\n id: skill.id,\n kind: \"enabled\",\n marker: \"●\",\n skillId: skill.id,\n name: skill.name,\n path: skill.path,\n agentId,\n activationLinkPath: enabledActivation.linkPath\n };\n }\n\n return {\n id: skill.id,\n kind: \"disabled\",\n marker: \"○\",\n skillId: skill.id,\n name: skill.name,\n path: skill.path,\n agentId,\n activationLinkPath:\n findAnyActivation(manifest, skill.id, agentId)?.linkPath ?? null\n };\n}\n\nfunction isAdoptableEntry(\n entry: ScannedSkillEntry\n): entry is ScannedSkillEntry & {\n kind: \"unmanaged-directory\" | \"unmanaged-link\";\n} {\n return entry.kind === \"unmanaged-directory\" || entry.kind === \"unmanaged-link\";\n}\n\nfunction buildUnmanagedRows(\n entries: ScannedSkillEntry[],\n agentId: string\n): TuiUnmanagedSkillRow[] {\n return entries\n .filter((entry) => entry.agentId === agentId)\n .filter(isAdoptableEntry)\n .sort((left, right) =>\n `${left.skillName}:${left.path}`.localeCompare(\n `${right.skillName}:${right.path}`\n )\n )\n .map((entry) => ({\n id: `unmanaged:${entry.skillName}`,\n kind: \"unmanaged\",\n marker: \"?\",\n skillName: entry.skillName,\n name: entry.skillName,\n path: entry.path,\n agentId,\n entryKind: entry.kind,\n targetPath: entry.targetPath\n }));\n}\n\nfunction relatedAgentIdsForIssue(\n issue: ScanIssue,\n agents: DiscoveredAgent[]\n): string[] {\n if (issue.path === undefined) {\n return [];\n }\n\n const issuePath = issue.path;\n\n return agents\n .filter((agent) => isPathInside(agent.absoluteSkillsDirectoryPath, issuePath))\n .map((agent) => agent.id);\n}\n\nfunction buildIssueId(issue: ScanIssue, agentId: string): string {\n return `issue:${agentId}:${issue.code}:${issue.path ?? issue.message}`;\n}\n\nfunction buildIssueRows(\n issues: ScanIssue[],\n agents: DiscoveredAgent[],\n agentId: string\n): TuiIssueSkillRow[] {\n return issues\n .filter((issue) => {\n const relatedAgentIds = relatedAgentIdsForIssue(issue, agents);\n return relatedAgentIds.includes(agentId);\n })\n .map((issue) => ({\n id: buildIssueId(issue, agentId),\n kind: \"issue\",\n marker: \"!\",\n issueCode: issue.code,\n severity: issue.severity,\n message: issue.message,\n path: issue.path ?? null,\n agentId\n }));\n}\n\nfunction buildSkillRowsForAgent(\n input: BuildDashboardModelInput,\n agentId: string\n): TuiSkillRow[] {\n const managedRows = sortById(Object.values(input.manifest.skills)).map((skill) =>\n buildManagedSkillRow(input.manifest, skill, agentId)\n );\n const unmanagedRows = buildUnmanagedRows(input.entries, agentId);\n const issueRows = buildIssueRows(input.issues, input.agents, agentId);\n\n return [...managedRows, ...unmanagedRows, ...issueRows];\n}\n\nfunction countsForRows(rows: TuiSkillRow[]): RowCounts {\n const counts = emptyCounts();\n\n for (const row of rows) {\n if (row.kind === \"enabled\") {\n counts.enabledCount += 1;\n } else if (row.kind === \"disabled\") {\n counts.disabledCount += 1;\n } else if (row.kind === \"unmanaged\") {\n counts.unmanagedCount += 1;\n } else {\n counts.issueCount += 1;\n }\n }\n\n return counts;\n}\n\nfunction countActivationsForAgent(\n manifest: Manifest,\n agentId: string\n): number {\n return manifest.activations.filter((activation) => activation.agentId === agentId)\n .length;\n}\n\nfunction buildAgentRows(input: BuildDashboardModelInput): TuiAgentRow[] {\n return sortById(input.agents).map((agent) => {\n const counts = countsForRows(buildSkillRowsForAgent(input, agent.id));\n\n return {\n id: agent.id,\n name: agent.stableName,\n path: agent.absoluteSkillsDirectoryPath,\n discovery: agent.discovery,\n exists: agent.exists,\n supported: agent.supportedOnPlatform,\n activationCount: countActivationsForAgent(input.manifest, agent.id),\n ...counts\n };\n });\n}\n\nexport function buildDashboardModel(\n input: BuildDashboardModelInput\n): DashboardModel {\n const sortedAgents = sortById(input.agents);\n const selectedAgentId = getSelectedAgentId(\n sortedAgents,\n input.selectedAgentId\n );\n const skills =\n selectedAgentId === null\n ? []\n : buildSkillRowsForAgent({ ...input, agents: sortedAgents }, selectedAgentId);\n const selectedSkillId = skills.some((row) => row.id === input.selectedSkillId)\n ? (input.selectedSkillId as string)\n : skills[0]?.id ?? null;\n\n return {\n agents: buildAgentRows({ ...input, agents: sortedAgents }),\n skills,\n selectedAgentId,\n selectedSkillId,\n lastScanAt: input.manifest.lastScan.at,\n issueCount: input.issues.length\n };\n}\n","import { runAdopt as defaultRunAdopt } from \"../commands/adopt\";\r\nimport { runDisable as defaultRunDisable } from \"../commands/disable\";\r\nimport { runEnable as defaultRunEnable } from \"../commands/enable\";\r\nimport { runRemove as defaultRunRemove } from \"../commands/remove\";\r\nimport { runScan as defaultRunScan } from \"../commands/scan\";\r\nimport type { DashboardModel, TuiSkillRow } from \"./dashboard-model\";\r\nimport {\r\n loadDashboardState,\r\n type LoadDashboardStateOptions\r\n} from \"./load-dashboard-state\";\r\n\r\nexport type TuiAction = \"toggle\" | \"adopt\" | \"adopt-all\" | \"remove\" | \"scan\";\r\n\r\ntype CommandOutput = {\r\n output: string;\r\n};\r\n\r\nexport type TuiActionServices = {\r\n runEnable: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n }) => Promise<CommandOutput>;\r\n runDisable: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n agent: string;\r\n }) => Promise<CommandOutput>;\r\n runAdopt: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n agent: string;\r\n skill?: string;\r\n }) => Promise<CommandOutput>;\r\n runRemove: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n skill: string;\r\n }) => Promise<CommandOutput>;\r\n runScan: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n }) => Promise<CommandOutput>;\r\n reload: (options: LoadDashboardStateOptions) => Promise<DashboardModel>;\r\n};\r\n\r\nexport type DispatchTuiActionInput = {\r\n action: TuiAction;\r\n model: DashboardModel;\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n services?: Partial<TuiActionServices>;\r\n};\r\n\r\nexport type DispatchTuiActionResult = {\r\n model: DashboardModel;\r\n statusMessage: string;\r\n};\r\n\r\nconst defaultServices: TuiActionServices = {\r\n runEnable: defaultRunEnable,\r\n runDisable: defaultRunDisable,\r\n runAdopt: defaultRunAdopt,\r\n runRemove: defaultRunRemove,\r\n runScan: defaultRunScan,\r\n reload: loadDashboardState\r\n};\r\n\r\nfunction stripTrailingNewlines(output: string): string {\r\n return output.replace(/[\\r\\n]+$/u, \"\");\r\n}\r\n\r\nfunction actionLabel(action: TuiAction): string {\r\n return action.charAt(0).toUpperCase() + action.slice(1);\r\n}\r\n\r\nfunction errorReason(error: unknown): string {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const firstLine = message.split(/\\r?\\n/u)[0]?.trim();\r\n\r\n return firstLine === undefined || firstLine.length === 0\r\n ? \"Unknown error\"\r\n : firstLine;\r\n}\r\n\r\nfunction reloadOptions(input: DispatchTuiActionInput): LoadDashboardStateOptions {\r\n return {\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n platform: input.platform,\r\n selectedAgentId: input.model.selectedAgentId ?? undefined,\r\n selectedSkillId: input.model.selectedSkillId ?? undefined\r\n };\r\n}\r\n\r\nasync function reloadAfterCommand(\r\n input: DispatchTuiActionInput,\r\n services: TuiActionServices,\r\n output: string\r\n): Promise<DispatchTuiActionResult> {\r\n return {\r\n model: await services.reload(reloadOptions(input)),\r\n statusMessage: stripTrailingNewlines(output)\r\n };\r\n}\r\n\r\nfunction refusal(\r\n model: DashboardModel,\r\n statusMessage: string\r\n): DispatchTuiActionResult {\r\n return { model, statusMessage };\r\n}\r\n\r\nfunction resolveSelectedSkill(model: DashboardModel): TuiSkillRow | null {\r\n if (model.selectedSkillId === null) {\r\n return null;\r\n }\r\n\r\n return model.skills.find((row) => row.id === model.selectedSkillId) ?? null;\r\n}\r\n\r\nfunction resolveSelectedAgent(model: DashboardModel): {\r\n id: string;\r\n unmanagedCount: number;\r\n} | null {\r\n if (model.selectedAgentId === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n model.agents.find((row) => row.id === model.selectedAgentId) ?? null\r\n );\r\n}\r\n\r\nexport async function dispatchTuiAction(\r\n input: DispatchTuiActionInput\r\n): Promise<DispatchTuiActionResult> {\r\n const services = { ...defaultServices, ...input.services };\r\n\r\n try {\r\n if (input.action === \"scan\") {\r\n const result = await services.runScan({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n platform: input.platform\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n if (input.action === \"adopt-all\") {\r\n const selectedAgent = resolveSelectedAgent(input.model);\r\n\r\n if (selectedAgent === null) {\r\n return refusal(input.model, \"Select an agent first\");\r\n }\r\n\r\n if (selectedAgent.unmanagedCount <= 0) {\r\n return refusal(input.model, \"No unmanaged skills to adopt for this agent\");\r\n }\r\n\r\n const result = await services.runAdopt({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n agent: selectedAgent.id\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n const selectedSkill = resolveSelectedSkill(input.model);\r\n if (selectedSkill === null) {\r\n return refusal(input.model, \"Select a skill first\");\r\n }\r\n\r\n if (input.action === \"toggle\") {\r\n if (selectedSkill.kind === \"enabled\") {\r\n const result = await services.runDisable({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n skill: selectedSkill.skillId,\r\n agent: selectedSkill.agentId\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n if (selectedSkill.kind === \"disabled\") {\r\n const result = await services.runEnable({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n skill: selectedSkill.skillId,\r\n agent: selectedSkill.agentId\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n return refusal(input.model, \"Toggle is only available for managed rows\");\r\n }\r\n\r\n if (input.action === \"adopt\") {\r\n if (selectedSkill.kind !== \"unmanaged\") {\r\n return refusal(input.model, \"Adopt is only available for unmanaged rows\");\r\n }\r\n\r\n const result = await services.runAdopt({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n agent: selectedSkill.agentId,\r\n skill: selectedSkill.skillName\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n if (selectedSkill.kind === \"enabled\") {\r\n return refusal(input.model, \"Disable this skill before removing it\");\r\n }\r\n\r\n if (selectedSkill.kind !== \"disabled\") {\r\n return refusal(input.model, \"Remove is only available for disabled rows\");\r\n }\r\n\r\n const result = await services.runRemove({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n skill: selectedSkill.skillId\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n } catch (error) {\r\n return {\r\n model: input.model,\r\n statusMessage: `${actionLabel(input.action)} failed: ${errorReason(error)}`\r\n };\r\n }\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport {\r\n getAvailableActions,\r\n getSelectedSkill,\r\n getVisibleAgents,\r\n getVisibleSkills,\r\n type TuiState\r\n} from \"../state\";\r\nimport { AgentList } from \"./AgentList\";\r\nimport { ConfirmDialog, confirmDialogHeight } from \"./ConfirmDialog\";\r\nimport { DetailPane } from \"./DetailPane\";\r\nimport { Footer } from \"./Footer\";\r\nimport { HelpOverlay } from \"./HelpOverlay\";\r\nimport { SkillList } from \"./SkillList\";\r\nimport { StatusLine } from \"./StatusLine\";\r\n\r\nexport type DashboardProps = {\r\n state: TuiState;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nconst minimumWidth = 80;\r\nconst minimumHeight = 24;\r\nconst agentRatio = 0.26;\r\nconst skillRatio = 0.3;\r\nconst detailRatio = 0.44;\r\nconst agentMinimumWidth = 20;\r\nconst skillMinimumWidth = 24;\r\nconst detailMinimumWidth = 28;\r\n\r\nfunction paneWidths(width: number): {\r\n agentWidth: number;\r\n skillWidth: number;\r\n detailWidth: number;\r\n} {\r\n const agentWidth = Math.max(agentMinimumWidth, Math.round(width * agentRatio));\r\n const skillWidth = Math.max(skillMinimumWidth, Math.round(width * skillRatio));\r\n const detailWidth = Math.max(\r\n detailMinimumWidth,\r\n Math.round(width * detailRatio)\r\n );\r\n const widthDelta = width - (agentWidth + skillWidth + detailWidth);\r\n\r\n if (widthDelta === 0) {\r\n return { agentWidth, skillWidth, detailWidth };\r\n }\r\n\r\n return {\r\n agentWidth,\r\n skillWidth,\r\n detailWidth: detailWidth + widthDelta\r\n };\r\n}\r\n\r\nexport function Dashboard({\r\n state,\r\n width,\r\n height\r\n}: DashboardProps) {\r\n if (width < minimumWidth || height < minimumHeight) {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n width={width}\r\n height={height}\r\n justifyContent=\"center\"\r\n alignItems=\"center\"\r\n >\r\n <Text>Terminal too small. Resize to at least 80x24.</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n const visibleAgents = getVisibleAgents(state);\r\n const visibleSkills = getVisibleSkills(state);\r\n const selectedAgent =\r\n state.model.agents.find((agent) => agent.id === state.model.selectedAgentId) ??\r\n null;\r\n const selectedSkill = getSelectedSkill(state);\r\n const loadingAgentName =\r\n state.pendingAgentId ??\r\n (state.busy && state.statusMessage === \"loading agent...\"\r\n ? state.model.selectedAgentId\r\n : null);\r\n const loadingAgent =\r\n loadingAgentName === null\r\n ? null\r\n : state.model.agents.find((agent) => agent.id === loadingAgentName) ?? null;\r\n const actions = getAvailableActions(state);\r\n const footerHeight = 3;\r\n const overlayHeight =\r\n state.modal?.kind === \"help\"\r\n ? 8\r\n : state.modal?.kind === \"confirm-adopt\" ||\r\n state.modal?.kind === \"confirm-adopt-all\" ||\r\n state.modal?.kind === \"confirm-remove\"\r\n ? confirmDialogHeight\r\n : 0;\r\n const bodyHeight = Math.max(height - 1 - footerHeight - overlayHeight, 0);\r\n const { agentWidth, skillWidth, detailWidth } = paneWidths(width);\r\n\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <StatusLine\r\n busy={state.busy}\r\n statusMessage={state.statusMessage}\r\n lastScanAt={state.model.lastScanAt}\r\n issueCount={state.model.issueCount}\r\n />\r\n <Box flexDirection=\"row\" width={width} height={bodyHeight}>\r\n <AgentList\r\n agents={visibleAgents}\r\n selectedAgentId={state.model.selectedAgentId}\r\n focused={state.focus === \"agents\"}\r\n searchQuery={state.search?.panel === \"agents\" ? state.search.query : undefined}\r\n width={agentWidth}\r\n height={bodyHeight}\r\n />\r\n <SkillList\r\n agentId={state.model.selectedAgentId}\r\n skills={visibleSkills}\r\n selectedSkillId={state.model.selectedSkillId}\r\n focused={state.focus === \"skills\"}\r\n searchQuery={state.search?.panel === \"skills\" ? state.search.query : undefined}\r\n loadingAgentName={loadingAgent?.name ?? null}\r\n width={skillWidth}\r\n height={bodyHeight}\r\n />\r\n <DetailPane\r\n selectedAgent={selectedAgent}\r\n selectedSkill={selectedSkill}\r\n focused={state.focus === \"detail\"}\r\n loadingAgentName={loadingAgent?.name ?? null}\r\n width={detailWidth}\r\n height={bodyHeight}\r\n />\r\n </Box>\r\n {state.modal?.kind === \"help\" ? <HelpOverlay /> : null}\r\n {state.modal?.kind === \"confirm-adopt\" ||\r\n state.modal?.kind === \"confirm-adopt-all\" ||\r\n state.modal?.kind === \"confirm-remove\" ? (\r\n <ConfirmDialog modal={state.modal} />\r\n ) : null}\r\n {state.modal === null ? (\r\n <Footer actions={actions} search={state.search} />\r\n ) : (\r\n <Box height={3} />\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import type { TuiAction } from \"./actions\";\r\nimport type {\r\n DashboardModel,\r\n TuiAgentRow,\r\n TuiSkillRow\r\n} from \"./dashboard-model\";\r\n\r\nexport type TuiFocus = \"agents\" | \"skills\" | \"detail\";\r\n\r\nexport type TuiModal =\r\n | { kind: \"help\" }\r\n | { kind: \"confirm-adopt\"; skillId: string; agentId: string }\r\n | {\r\n kind: \"confirm-adopt-all\";\r\n agentId: string;\r\n unmanagedCount: number;\r\n }\r\n | { kind: \"confirm-remove\"; skillId: string };\r\n\r\nexport type TuiSearch = {\r\n panel: \"agents\" | \"skills\";\r\n query: string;\r\n previousSelection: {\r\n selectedAgentId: string | null;\r\n selectedSkillId: string | null;\r\n agentCursor: number;\r\n skillCursor: number;\r\n pendingAgentId: string | null;\r\n };\r\n};\r\n\r\nexport type TuiState = {\r\n model: DashboardModel;\r\n focus: TuiFocus;\r\n agentCursor: number;\r\n skillCursor: number;\r\n search: TuiSearch | null;\r\n statusMessage: string | null;\r\n modal: TuiModal | null;\r\n busy: boolean;\r\n pendingAction: TuiAction | null;\r\n pendingAgentId: string | null;\r\n};\r\n\r\nexport type TuiStateEvent =\r\n | { type: \"focus-next\" }\r\n | { type: \"focus-previous\" }\r\n | { type: \"next-row\" }\r\n | { type: \"previous-row\" }\r\n | { type: \"first-row\" }\r\n | { type: \"last-row\" }\r\n | { type: \"open-search\" }\r\n | { type: \"search-query-changed\"; query: string }\r\n | { type: \"submit-search\" }\r\n | { type: \"close\" }\r\n | { type: \"open-help\" }\r\n | { type: \"request-adopt\" }\r\n | { type: \"request-adopt-all\" }\r\n | { type: \"request-remove\" }\r\n | { type: \"request-toggle\" }\r\n | { type: \"request-scan\" }\r\n | { type: \"set-busy\"; busy: boolean }\r\n | { type: \"set-status\"; message: string | null }\r\n | { type: \"clear-pending-action\" };\r\n\r\nexport type TuiAvailableActions = {\r\n toggle: boolean;\r\n adopt: boolean;\r\n adoptAll: boolean;\r\n remove: boolean;\r\n scan: boolean;\r\n help: boolean;\r\n};\r\n\r\nconst focusOrder: TuiFocus[] = [\"agents\", \"skills\"];\r\n\r\nfunction clampCursor(cursor: number, rowCount: number): number {\r\n if (rowCount <= 0) {\r\n return 0;\r\n }\r\n\r\n return Math.min(Math.max(cursor, 0), rowCount - 1);\r\n}\r\n\r\nfunction normalizeQuery(query: string): string {\r\n return query.trim().toLocaleLowerCase();\r\n}\r\n\r\nfunction includesQuery(values: Array<string | null>, query: string): boolean {\r\n const normalizedQuery = normalizeQuery(query);\r\n\r\n if (normalizedQuery.length === 0) {\r\n return true;\r\n }\r\n\r\n return values.some((value) =>\r\n (value ?? \"\").toLocaleLowerCase().includes(normalizedQuery)\r\n );\r\n}\r\n\r\nfunction isRelevantAgentRow(\r\n row: TuiAgentRow,\r\n selectedAgentId: string | null\r\n): boolean {\r\n return (\r\n row.id === selectedAgentId ||\r\n row.exists ||\r\n (row.activationCount ?? 0) > 0 ||\r\n row.enabledCount > 0 ||\r\n row.unmanagedCount > 0 ||\r\n row.issueCount > 0\r\n );\r\n}\r\n\r\nfunction skillMatchesQuery(row: TuiSkillRow, query: string): boolean {\r\n if (row.kind === \"issue\") {\r\n return includesQuery(\r\n [row.id, row.issueCode, row.message, row.path, row.agentId],\r\n query\r\n );\r\n }\r\n\r\n if (row.kind === \"unmanaged\") {\r\n return includesQuery(\r\n [row.id, row.skillName, row.name, row.path, row.agentId],\r\n query\r\n );\r\n }\r\n\r\n return includesQuery([row.id, row.skillId, row.name, row.path, row.agentId], query);\r\n}\r\n\r\nfunction replaceModelSelection(\r\n state: TuiState,\r\n selection: Pick<DashboardModel, \"selectedAgentId\" | \"selectedSkillId\">\r\n): TuiState {\r\n return {\r\n ...state,\r\n model: {\r\n ...state.model,\r\n ...selection\r\n }\r\n };\r\n}\r\n\r\nfunction clearTransientIntent(state: TuiState): TuiState {\r\n return {\r\n ...state,\r\n pendingAction: null,\r\n statusMessage: null\r\n };\r\n}\r\n\r\nfunction restoreSearchSelection(state: TuiState): TuiState {\r\n if (state.search === null) {\r\n return state;\r\n }\r\n\r\n const previousSelection = state.search.previousSelection;\r\n\r\n return {\r\n ...state,\r\n model: {\r\n ...state.model,\r\n selectedAgentId: previousSelection.selectedAgentId,\r\n selectedSkillId: previousSelection.selectedSkillId\r\n },\r\n agentCursor: previousSelection.agentCursor,\r\n skillCursor: previousSelection.skillCursor,\r\n pendingAgentId: previousSelection.pendingAgentId\r\n };\r\n}\r\n\r\nfunction searchHasVisibleResults(state: TuiState): boolean {\r\n if (state.search === null) {\r\n return false;\r\n }\r\n\r\n return state.search.panel === \"agents\"\r\n ? getVisibleAgents(state).length > 0\r\n : getVisibleSkills(state).length > 0;\r\n}\r\n\r\nfunction selectedAgentIndex(model: DashboardModel): number {\r\n if (model.selectedAgentId === null) {\r\n return 0;\r\n }\r\n\r\n const index = model.agents.findIndex((row) => row.id === model.selectedAgentId);\r\n return index < 0 ? 0 : index;\r\n}\r\n\r\nfunction selectedSkillIndex(model: DashboardModel): number {\r\n if (model.selectedSkillId === null) {\r\n return 0;\r\n }\r\n\r\n const index = model.skills.findIndex((row) => row.id === model.selectedSkillId);\r\n return index < 0 ? 0 : index;\r\n}\r\n\r\nfunction selectedAgentSkill(\r\n skills: TuiSkillRow[],\r\n agentId: string | null\r\n): TuiSkillRow | null {\r\n if (agentId === null) {\r\n return null;\r\n }\r\n\r\n return skills.find((row) => row.agentId === agentId) ?? null;\r\n}\r\n\r\nfunction selectedAgentRow(state: TuiState): TuiAgentRow | null {\r\n if (state.model.selectedAgentId === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n state.model.agents.find((row) => row.id === state.model.selectedAgentId) ?? null\r\n );\r\n}\r\n\r\nfunction moveFocus(focus: TuiFocus, direction: 1 | -1): TuiFocus {\r\n const currentIndex = focusOrder.indexOf(focus);\r\n const nextIndex =\r\n (currentIndex + direction + focusOrder.length) % focusOrder.length;\r\n\r\n return focusOrder[nextIndex] ?? \"agents\";\r\n}\r\n\r\nfunction stateWithAgentCursor(state: TuiState, cursor: number): TuiState {\r\n const visibleAgents = getVisibleAgents(state);\r\n const agentCursor = clampCursor(cursor, visibleAgents.length);\r\n const selectedAgent = visibleAgents[agentCursor] ?? null;\r\n const selectedSkill = selectedAgentSkill(state.model.skills, selectedAgent?.id ?? null);\r\n const previousAgentId = state.model.selectedAgentId;\r\n const selectedAgentId = selectedAgent?.id ?? null;\r\n const model = {\r\n ...state.model,\r\n selectedAgentId,\r\n selectedSkillId: selectedSkill?.id ?? null\r\n };\r\n const skillCursor =\r\n selectedSkill === null\r\n ? 0\r\n : clampCursor(\r\n getVisibleSkills({ ...state, model }).findIndex(\r\n (row) => row.id === selectedSkill.id\r\n ),\r\n getVisibleSkills({ ...state, model }).length\r\n );\r\n\r\n return {\r\n ...state,\r\n model,\r\n agentCursor,\r\n skillCursor,\r\n pendingAgentId:\r\n selectedAgentId !== null && selectedAgentId !== previousAgentId\r\n ? selectedAgentId\r\n : state.pendingAgentId\r\n };\r\n}\r\n\r\nfunction stateWithSkillCursor(state: TuiState, cursor: number): TuiState {\r\n const visibleSkills = getVisibleSkills(state);\r\n const skillCursor = clampCursor(cursor, visibleSkills.length);\r\n const selectedSkill = visibleSkills[skillCursor] ?? null;\r\n\r\n return replaceModelSelection(\r\n {\r\n ...state,\r\n skillCursor\r\n },\r\n {\r\n selectedAgentId: state.model.selectedAgentId,\r\n selectedSkillId: selectedSkill?.id ?? null\r\n }\r\n );\r\n}\r\n\r\nfunction moveCursor(state: TuiState, cursor: number): TuiState {\r\n if (state.focus === \"agents\") {\r\n return stateWithAgentCursor(state, cursor);\r\n }\r\n\r\n if (state.focus === \"skills\") {\r\n return stateWithSkillCursor(state, cursor);\r\n }\r\n\r\n return state;\r\n}\r\n\r\nfunction isModalBackgroundEvent(event: TuiStateEvent): boolean {\r\n return (\r\n event.type === \"focus-next\" ||\r\n event.type === \"focus-previous\" ||\r\n event.type === \"next-row\" ||\r\n event.type === \"previous-row\" ||\r\n event.type === \"first-row\" ||\r\n event.type === \"last-row\" ||\r\n event.type === \"open-search\" ||\r\n event.type === \"search-query-changed\" ||\r\n event.type === \"open-help\" ||\r\n event.type === \"request-adopt\" ||\r\n event.type === \"request-adopt-all\" ||\r\n event.type === \"request-remove\" ||\r\n event.type === \"request-toggle\" ||\r\n event.type === \"request-scan\" ||\r\n event.type === \"clear-pending-action\"\r\n );\r\n}\r\n\r\nexport function getVisibleAgents(state: TuiState): TuiAgentRow[] {\r\n if (state.search?.panel !== \"agents\") {\r\n return state.model.agents.filter((row) =>\r\n isRelevantAgentRow(row, state.model.selectedAgentId)\r\n );\r\n }\r\n\r\n return state.model.agents.filter((row) =>\r\n includesQuery([row.id, row.name, row.path, row.discovery], state.search?.query ?? \"\")\r\n );\r\n}\r\n\r\nexport function getVisibleSkills(state: TuiState): TuiSkillRow[] {\r\n if (state.model.selectedAgentId === null) {\r\n return [];\r\n }\r\n\r\n const agentSkills =\r\n state.model.skills.filter((row) => row.agentId === state.model.selectedAgentId);\r\n\r\n if (state.search?.panel !== \"skills\") {\r\n return agentSkills;\r\n }\r\n\r\n return agentSkills.filter((row) => skillMatchesQuery(row, state.search?.query ?? \"\"));\r\n}\r\n\r\nexport function getSelectedSkill(state: TuiState): TuiSkillRow | null {\r\n if (state.model.selectedSkillId === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n state.model.skills.find((row) => row.id === state.model.selectedSkillId) ?? null\r\n );\r\n}\r\n\r\nexport function getAvailableActions(state: TuiState): TuiAvailableActions {\r\n const selectedSkill = getSelectedSkill(state);\r\n const selectedAgent = selectedAgentRow(state);\r\n const canAcceptActions = state.modal === null && !state.busy;\r\n const hasFocusedSkill = canAcceptActions && state.focus === \"skills\";\r\n\r\n return {\r\n toggle:\r\n hasFocusedSkill &&\r\n (selectedSkill?.kind === \"enabled\" || selectedSkill?.kind === \"disabled\"),\r\n adopt: hasFocusedSkill && selectedSkill?.kind === \"unmanaged\",\r\n adoptAll: canAcceptActions && (selectedAgent?.unmanagedCount ?? 0) > 0,\r\n remove: hasFocusedSkill && selectedSkill?.kind === \"disabled\",\r\n scan: canAcceptActions,\r\n help: canAcceptActions\r\n };\r\n}\r\n\r\nexport function consumeActionIntent(state: TuiState): {\r\n state: TuiState;\r\n action: TuiAction | null;\r\n} {\r\n return {\r\n state: {\r\n ...state,\r\n pendingAction: null\r\n },\r\n action: state.pendingAction\r\n };\r\n}\r\n\r\nexport function consumeAgentSelectionIntent(state: TuiState): {\r\n state: TuiState;\r\n agentId: string | null;\r\n} {\r\n return {\r\n state: {\r\n ...state,\r\n pendingAgentId: null\r\n },\r\n agentId: state.pendingAgentId\r\n };\r\n}\r\n\r\nexport function createInitialTuiState(model: DashboardModel): TuiState {\r\n const state: TuiState = {\r\n model,\r\n focus: \"agents\",\r\n agentCursor: selectedAgentIndex(model),\r\n skillCursor: selectedSkillIndex(model),\r\n search: null,\r\n statusMessage: null,\r\n modal: null,\r\n busy: false,\r\n pendingAction: null,\r\n pendingAgentId: null\r\n };\r\n\r\n return {\r\n ...state,\r\n agentCursor: clampCursor(state.agentCursor, getVisibleAgents(state).length),\r\n skillCursor: clampCursor(state.skillCursor, getVisibleSkills(state).length)\r\n };\r\n}\r\n\r\nexport function updateTuiState(state: TuiState, event: TuiStateEvent): TuiState {\r\n if (state.modal !== null) {\r\n if (event.type === \"close\") {\r\n return {\r\n ...state,\r\n modal: null,\r\n pendingAction: null\r\n };\r\n }\r\n\r\n if (event.type === \"set-busy\") {\r\n return {\r\n ...state,\r\n busy: event.busy\r\n };\r\n }\r\n\r\n if (event.type === \"set-status\") {\r\n return {\r\n ...state,\r\n statusMessage: event.message\r\n };\r\n }\r\n\r\n if (isModalBackgroundEvent(event)) {\r\n return state;\r\n }\r\n }\r\n\r\n if (state.busy) {\r\n if (event.type === \"set-busy\") {\r\n return {\r\n ...state,\r\n busy: event.busy\r\n };\r\n }\r\n\r\n if (event.type === \"set-status\") {\r\n return {\r\n ...state,\r\n statusMessage: event.message\r\n };\r\n }\r\n\r\n if (\r\n event.type === \"request-toggle\" ||\r\n event.type === \"request-adopt\" ||\r\n event.type === \"request-remove\" ||\r\n event.type === \"request-scan\" ||\r\n event.type === \"open-help\"\r\n ) {\r\n return {\r\n ...state,\r\n pendingAction: null\r\n };\r\n }\r\n }\r\n\r\n const readyState = clearTransientIntent(state);\r\n\r\n if (event.type === \"focus-next\") {\r\n return {\r\n ...readyState,\r\n focus: moveFocus(state.focus, 1)\r\n };\r\n }\r\n\r\n if (event.type === \"focus-previous\") {\r\n return {\r\n ...readyState,\r\n focus: moveFocus(state.focus, -1)\r\n };\r\n }\r\n\r\n if (event.type === \"next-row\") {\r\n return moveCursor(\r\n readyState,\r\n state.focus === \"agents\" ? state.agentCursor + 1 : state.skillCursor + 1\r\n );\r\n }\r\n\r\n if (event.type === \"previous-row\") {\r\n return moveCursor(\r\n readyState,\r\n state.focus === \"agents\" ? state.agentCursor - 1 : state.skillCursor - 1\r\n );\r\n }\r\n\r\n if (event.type === \"first-row\") {\r\n return moveCursor(readyState, 0);\r\n }\r\n\r\n if (event.type === \"last-row\") {\r\n const rowCount =\r\n state.focus === \"agents\"\r\n ? getVisibleAgents(state).length\r\n : getVisibleSkills(state).length;\r\n\r\n return moveCursor(readyState, rowCount - 1);\r\n }\r\n\r\n if (event.type === \"open-search\") {\r\n if (state.focus !== \"agents\" && state.focus !== \"skills\") {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Search is available for agents and skills\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n search: {\r\n panel: state.focus,\r\n query: \"\",\r\n previousSelection: {\r\n selectedAgentId: state.model.selectedAgentId,\r\n selectedSkillId: state.model.selectedSkillId,\r\n agentCursor: state.agentCursor,\r\n skillCursor: state.skillCursor,\r\n pendingAgentId: state.pendingAgentId\r\n }\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"search-query-changed\") {\r\n if (state.search === null) {\r\n return readyState;\r\n }\r\n\r\n const searchedState = {\r\n ...readyState,\r\n search: {\r\n ...state.search,\r\n query: event.query\r\n }\r\n };\r\n const rowCount =\r\n searchedState.search.panel === \"agents\"\r\n ? getVisibleAgents(searchedState).length\r\n : getVisibleSkills(searchedState).length;\r\n\r\n return searchedState.search.panel === \"agents\"\r\n ? stateWithAgentCursor(searchedState, clampCursor(searchedState.agentCursor, rowCount))\r\n : stateWithSkillCursor(searchedState, clampCursor(searchedState.skillCursor, rowCount));\r\n }\r\n\r\n if (event.type === \"close\") {\r\n if (state.search !== null) {\r\n return {\r\n ...restoreSearchSelection(readyState),\r\n search: null\r\n };\r\n }\r\n\r\n if (state.modal !== null) {\r\n return {\r\n ...readyState,\r\n modal: null\r\n };\r\n }\r\n\r\n return readyState;\r\n }\r\n\r\n if (event.type === \"submit-search\") {\r\n if (state.search !== null) {\r\n if (!searchHasVisibleResults(state)) {\r\n return {\r\n ...restoreSearchSelection(readyState),\r\n search: null\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n search: null\r\n };\r\n }\r\n\r\n return readyState;\r\n }\r\n\r\n if (event.type === \"open-help\") {\r\n return {\r\n ...readyState,\r\n modal: { kind: \"help\" }\r\n };\r\n }\r\n\r\n if (event.type === \"request-adopt\") {\r\n if (state.focus !== \"skills\") {\r\n return readyState;\r\n }\r\n\r\n const selectedSkill = getSelectedSkill(state);\r\n\r\n if (selectedSkill?.kind !== \"unmanaged\") {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Adopt is only available for unmanaged rows\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"confirm-adopt\",\r\n skillId: selectedSkill.skillName,\r\n agentId: selectedSkill.agentId\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"request-adopt-all\") {\r\n const selectedAgent = selectedAgentRow(state);\r\n\r\n if (selectedAgent === null) {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Select an agent first\"\r\n };\r\n }\r\n\r\n if (selectedAgent.unmanagedCount <= 0) {\r\n return {\r\n ...readyState,\r\n statusMessage: \"No unmanaged skills to adopt for this agent\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"confirm-adopt-all\",\r\n agentId: selectedAgent.id,\r\n unmanagedCount: selectedAgent.unmanagedCount\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"request-remove\") {\r\n if (state.focus !== \"skills\") {\r\n return readyState;\r\n }\r\n\r\n const selectedSkill = getSelectedSkill(state);\r\n\r\n if (selectedSkill?.kind !== \"disabled\") {\r\n return {\r\n ...readyState,\r\n statusMessage:\r\n selectedSkill?.kind === \"enabled\"\r\n ? \"Disable this skill before removing it\"\r\n : \"Remove is only available for disabled rows\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"confirm-remove\",\r\n skillId: selectedSkill.skillId\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"request-toggle\") {\r\n if (state.focus !== \"skills\") {\r\n return readyState;\r\n }\r\n\r\n const selectedSkill = getSelectedSkill(state);\r\n\r\n if (selectedSkill?.kind !== \"enabled\" && selectedSkill?.kind !== \"disabled\") {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Toggle is only available for managed rows\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n pendingAction: \"toggle\"\r\n };\r\n }\r\n\r\n if (event.type === \"request-scan\") {\r\n return {\r\n ...readyState,\r\n pendingAction: \"scan\"\r\n };\r\n }\r\n\r\n if (event.type === \"set-busy\") {\r\n return {\r\n ...readyState,\r\n busy: event.busy\r\n };\r\n }\r\n\r\n if (event.type === \"set-status\") {\r\n return {\r\n ...readyState,\r\n statusMessage: event.message\r\n };\r\n }\r\n\r\n return readyState;\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { TuiAgentRow } from \"../dashboard-model\";\r\n\r\nexport type AgentListProps = {\n agents: TuiAgentRow[];\n selectedAgentId: string | null;\n focused: boolean;\n searchQuery?: string;\n width?: number;\n height?: number;\n};\n\r\nfunction statusMarker(agent: TuiAgentRow): string {\r\n if (!agent.supported) {\r\n return \"!\";\r\n }\r\n\r\n if (!agent.exists) {\r\n return \"?\";\r\n }\r\n\r\n return \"*\";\r\n}\r\n\r\nfunction statusColor(agent: TuiAgentRow): string | undefined {\r\n if (!agent.supported) {\r\n return \"red\";\r\n }\r\n\r\n if (!agent.exists || agent.issueCount > 0) {\r\n return \"yellow\";\r\n }\r\n\r\n return \"green\";\r\n}\r\n\r\nexport function AgentList({\n agents,\n selectedAgentId,\n focused,\n searchQuery,\n width = 24,\n height = 18\n}: AgentListProps) {\n const emptyMessage =\n searchQuery !== undefined && searchQuery.trim().length > 0\n ? \"No matching agents\"\n : \"No agents found\";\n\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n <Text bold color={focused ? \"cyan\" : undefined}>\n Agents\n </Text>\n {agents.length === 0 ? (\n <Text dimColor>{emptyMessage}</Text>\n ) : (\n agents.map((agent) => {\n const selected = agent.id === selectedAgentId;\r\n const selectionPrefix = selected ? \">\" : \" \";\r\n\r\n return (\r\n <Text key={agent.id} inverse={selected}>\r\n <Text color={statusColor(agent)}>{statusMarker(agent)}</Text>\r\n <Text>{selectionPrefix} {agent.name}</Text>\r\n </Text>\r\n );\r\n })\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { TuiModal } from \"../state\";\r\n\r\nexport type ConfirmDialogProps = {\r\n modal: Extract<\r\n TuiModal,\r\n { kind: \"confirm-adopt\" } | { kind: \"confirm-adopt-all\" } | { kind: \"confirm-remove\" }\r\n >;\r\n};\r\n\r\nexport const confirmDialogHeight = 4;\r\n\r\nfunction confirmationText(modal: ConfirmDialogProps[\"modal\"]): string {\r\n if (modal.kind === \"confirm-adopt\") {\r\n return `Adopt ${modal.skillId} for ${modal.agentId}?`;\r\n }\r\n\r\n if (modal.kind === \"confirm-adopt-all\") {\r\n return `Adopt all unmanaged skills for ${modal.agentId}?`;\r\n }\r\n\r\n return `Remove ${modal.skillId} from SkillMux?`;\r\n}\r\n\r\nfunction confirmationDetails(modal: ConfirmDialogProps[\"modal\"]): string | null {\r\n if (modal.kind !== \"confirm-adopt-all\") {\r\n return null;\r\n }\r\n\r\n return `${modal.unmanagedCount} unmanaged skills will be moved under SkillMux management.`;\r\n}\r\n\r\nexport function ConfirmDialog({ modal }: ConfirmDialogProps) {\r\n return (\r\n <Box flexDirection=\"column\" height={confirmDialogHeight}>\r\n <Text bold color={modal.kind === \"confirm-remove\" ? \"yellow\" : \"cyan\"}>\r\n Confirm\r\n </Text>\r\n <Text>{confirmationText(modal)}</Text>\r\n {confirmationDetails(modal) === null ? null : <Text>{confirmationDetails(modal)}</Text>}\r\n <Text>[y] confirm [Esc] cancel</Text>\r\n </Box>\r\n );\r\n}\r\n","import { Box, Text } from \"ink\";\nimport type { TuiAgentRow, TuiSkillRow } from \"../dashboard-model\";\n\r\nexport type DetailPaneProps = {\n selectedAgent: TuiAgentRow | null;\n selectedSkill: TuiSkillRow | null;\n focused: boolean;\n loadingAgentName?: string | null;\n width?: number;\n height?: number;\n};\n\ntype DetailLine = {\n label: string;\n value: string;\n compact: boolean;\n};\n\nfunction compactPath(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n\n const separator = value.includes(\"\\\\\") ? \"\\\\\" : \"/\";\n const parts = value.split(/[\\\\/]+/).filter((part) => part.length > 0);\n let suffix = parts.at(-1) ?? value;\n\n for (let index = parts.length - 2; index >= 0; index -= 1) {\n const candidate = `${parts[index]}${separator}${suffix}`;\n\n if (`...${separator}${candidate}`.length > maxLength) {\n break;\n }\n\n suffix = candidate;\n }\n\n const shortened = `...${separator}${suffix}`;\n\n if (shortened.length <= maxLength) {\n return shortened;\n }\n\n if (maxLength <= 3) {\n return \".\".repeat(maxLength);\n }\n\n return `...${suffix.slice(-(maxLength - 3))}`;\n}\n\nfunction detailLines(skill: TuiSkillRow): DetailLine[] {\n if (skill.kind === \"enabled\") {\n return [\n { label: \"Name\", value: skill.name, compact: false },\n { label: \"Status\", value: \"enabled\", compact: false },\n { label: \"Store\", value: skill.path, compact: true },\n { label: \"Link\", value: skill.activationLinkPath, compact: true }\n ];\n }\n\n if (skill.kind === \"disabled\") {\n return [\n { label: \"Name\", value: skill.name, compact: false },\n { label: \"Status\", value: \"disabled\", compact: false },\n { label: \"Store\", value: skill.path, compact: true },\n {\n label: \"Link\",\n value: skill.activationLinkPath ?? \"not linked\",\n compact: skill.activationLinkPath !== null\n }\n ];\n }\n\n if (skill.kind === \"unmanaged\") {\n return [\n { label: \"Name\", value: skill.name, compact: false },\n { label: \"Status\", value: \"unmanaged\", compact: false },\n { label: \"Entry\", value: skill.entryKind, compact: false },\n { label: \"Path\", value: skill.path, compact: true }\n ];\n }\n\n return [\n { label: \"Status\", value: \"issue\", compact: false },\n { label: \"Code\", value: skill.issueCode, compact: false },\n { label: \"Severity\", value: skill.severity, compact: false },\n { label: \"Message\", value: skill.message, compact: false },\n { label: \"Path\", value: skill.path ?? \"none\", compact: skill.path !== null }\n ];\n}\n\r\nexport function DetailPane({\n selectedAgent,\n selectedSkill,\n focused: _focused,\n loadingAgentName = null,\n width = 28,\n height = 18\n}: DetailPaneProps) {\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n <Text bold>\r\n Detail\r\n </Text>\r\n {selectedAgent === null ? (\r\n <Text dimColor>Select an agent</Text>\r\n ) : (\r\n <Text dimColor>Agent: {selectedAgent.name}</Text>\r\n )}\r\n {selectedSkill === null ? (\n loadingAgentName !== null ? (\n <Text dimColor>Loading details for {loadingAgentName}...</Text>\n ) : (\n <Text dimColor>Select a skill row</Text>\n )\n ) : (\n detailLines(selectedSkill).map(({ label, value, compact }) => {\n const valueWidth = Math.max(width - (label.length + 2), 8);\n const renderedValue = compact ? compactPath(value, valueWidth) : value;\n\n return (\n <Text key={label}>\n <Text dimColor>{label}: </Text>\n <Text>{renderedValue}</Text>\n </Text>\n );\n })\n )}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\r\nimport type { TuiAvailableActions, TuiSearch } from \"../state\";\r\n\r\nconst agentLegend =\r\n \"Agent icons: * ready yellow * issues ? missing ! unsupported\";\r\nconst skillLegend = \"Skill markers: ● enabled ○ disabled ? unmanaged ! issue\";\r\n\r\nexport type FooterProps = {\r\n actions: TuiAvailableActions;\r\n search: TuiSearch | null;\r\n};\r\n\r\nexport function Footer({ actions, search }: FooterProps) {\r\n const shortcuts = [\r\n \"[Left/Right]focus\",\r\n actions.toggle ? \"[Space]toggle\" : null,\r\n actions.adopt ? \"[a]adopt\" : null,\r\n actions.adoptAll ? \"[Shift+A]adopt all\" : null,\r\n actions.remove ? \"[r]remove\" : null,\r\n actions.scan ? \"[s]scan\" : null,\r\n actions.help ? \"[?]help\" : null,\r\n \"[q]quit\"\r\n ].filter((shortcut): shortcut is string => shortcut !== null);\r\n\r\n return (\r\n <Box flexDirection=\"column\" height={3}>\r\n {search === null ? (\r\n <>\r\n <Text>{shortcuts.join(\" \")}</Text>\r\n <Text dimColor>{agentLegend}</Text>\r\n <Text dimColor>{skillLegend}</Text>\r\n </>\r\n ) : (\r\n <Text>\r\n <Text color=\"cyan\">/</Text>\r\n <Text>{search.query}</Text>\r\n <Text dimColor> [Enter]keep [Esc]cancel</Text>\r\n </Text>\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import { Box, Text } from \"ink\";\r\n\r\nexport function HelpOverlay() {\r\n return (\r\n <Box flexDirection=\"column\" height={8}>\r\n <Text bold>Help</Text>\r\n <Text>\r\n <Text bold>Navigation</Text>\r\n <Text>: Left/Right switch panels, j/k or Up/Down move, g/G jump.</Text>\r\n </Text>\r\n <Text>\r\n <Text bold>Actions</Text>\r\n <Text>: Space toggles, a adopts, Shift+A current-agent bulk adopt, r removes, s scans.</Text>\r\n </Text>\r\n <Text>\r\n <Text bold>Search</Text>\r\n <Text>: / filters the focused list, Enter keeps the result, Esc cancels.</Text>\r\n </Text>\r\n <Text>\r\n <Text bold>Agent icons</Text>\r\n <Text>: * ready, yellow * issues, ? missing, ! unsupported.</Text>\r\n </Text>\r\n <Text>\r\n <Text bold>Skill markers</Text>\r\n <Text>: ● enabled, ○ disabled, ? unmanaged, ! issue.</Text>\r\n </Text>\r\n <Text>\r\n <Text bold>Safety</Text>\r\n <Text>\r\n : Toggle, adopt, remove, and scan can update SkillMux state and agent links.\r\n </Text>\r\n </Text>\r\n </Box>\r\n );\r\n}\r\n","import { Box, Text } from \"ink\";\r\nimport type { TuiSkillRow } from \"../dashboard-model\";\r\n\r\nexport type SkillListProps = {\n agentId: string | null;\n skills: TuiSkillRow[];\n selectedSkillId: string | null;\n focused: boolean;\n searchQuery?: string;\n loadingAgentName?: string | null;\n width?: number;\n height?: number;\n};\n\r\nfunction markerColor(skill: TuiSkillRow): string {\r\n if (skill.kind === \"enabled\") {\r\n return \"green\";\r\n }\r\n\r\n if (skill.kind === \"issue\") {\r\n return skill.severity === \"error\" ? \"red\" : \"yellow\";\r\n }\r\n\r\n if (skill.kind === \"unmanaged\") {\r\n return \"yellow\";\r\n }\r\n\r\n return \"gray\";\r\n}\r\n\r\nfunction skillLabel(skill: TuiSkillRow): string {\r\n if (skill.kind === \"issue\") {\r\n return skill.issueCode;\r\n }\r\n\r\n return skill.name;\r\n}\r\n\r\nexport function SkillList({\n agentId,\n skills,\n selectedSkillId,\n focused,\n searchQuery,\n loadingAgentName = null,\n width = 28,\n height = 18\n}: SkillListProps) {\n const emptyMessage =\n loadingAgentName !== null\n ? `Loading skills for ${loadingAgentName}...`\n : agentId === null\n ? \"Select an agent\"\n : searchQuery !== undefined && searchQuery.trim().length > 0\n ? \"No matching skills\"\n : \"No skills for this agent\";\n\n return (\n <Box flexDirection=\"column\" width={width} height={height}>\n <Text bold color={focused ? \"cyan\" : undefined}>\n Skills for {agentId ?? \"none\"}\n </Text>\n {skills.length === 0 ? (\n <Text dimColor>{emptyMessage}</Text>\n ) : (\n skills.map((skill) => {\n const selected = skill.id === selectedSkillId;\r\n\r\n return (\r\n <Text key={skill.id} inverse={focused && selected}>\r\n <Text color={markerColor(skill)}>{skill.marker}</Text>\r\n <Text> {skillLabel(skill)}</Text>\r\n </Text>\r\n );\r\n })\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import { Box, Text } from \"ink\";\r\n\r\nexport type StatusLineProps = {\r\n busy: boolean;\r\n statusMessage: string | null;\r\n lastScanAt: string | null;\r\n issueCount: number;\r\n};\r\n\r\nexport function StatusLine({\r\n busy,\r\n statusMessage,\r\n lastScanAt,\r\n issueCount\r\n}: StatusLineProps) {\r\n const message =\r\n statusMessage ??\r\n (busy\r\n ? \"scanning...\"\r\n : `Last scan: ${lastScanAt ?? \"never\"} | issues: ${issueCount}`);\r\n\r\n return (\r\n <Box height={1}>\r\n <Text color={busy ? \"cyan\" : undefined}>{message}</Text>\r\n </Box>\r\n );\r\n}\r\n"],"mappings":"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","names":["Text","result","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsx","jsxs","Box","Text","jsx","defaultServices","errorReason","Text","jsx","resolve"]}
|