skillmux 0.1.4 → 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-EEIOA7GC.js → chunk-OY3C7VIL.js} +209 -102
- package/dist/chunk-OY3C7VIL.js.map +1 -0
- package/dist/{chunk-6TMTFWDX.js → chunk-R5V2WOZV.js} +4 -4
- package/dist/chunk-R5V2WOZV.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/{launch-tui-IC7COEGE.js → launch-tui-4TJFQA3L.js} +3 -2
- package/dist/launch-tui-4TJFQA3L.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-6TMTFWDX.js.map +0 -1
- package/dist/chunk-EEIOA7GC.js.map +0 -1
- package/dist/launch-tui-IC7COEGE.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tui/launch-tui.tsx","../src/tui/app.tsx","../src/tui/forms.ts","../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/DoctorDialog.tsx","../src/tui/components/DetailPane.tsx","../src/tui/components/Footer.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/components/FormDialog.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, type DashboardModalInteraction } 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 consumePendingCommandIntent,\r\n consumeActionIntent,\r\n consumeAgentSelectionIntent,\r\n createInitialTuiState,\r\n updateTuiState,\r\n type TuiFormModal,\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\nconst addAgentFieldOrder = [\r\n \"id\",\r\n \"root\",\r\n \"skills\",\r\n \"name\",\r\n \"platforms\",\r\n \"disabledByDefault\"\r\n] as const;\r\n\r\nconst editAgentFieldOrder = [\r\n \"root\",\r\n \"skills\",\r\n \"name\",\r\n \"platforms\",\r\n \"enabledByDefault\",\r\n \"disabledByDefault\"\r\n] as const;\r\n\r\nconst importFieldOrder = [\"sourcePath\", \"skillName\"] as const;\r\nconst platformOptions = [\"win32\", \"linux\", \"darwin\"] as const;\r\n\r\nfunction formFieldCount(modal: { kind: \"add-agent\" | \"edit-agent\" | \"import\" }): number {\r\n return modal.kind === \"import\" ? importFieldOrder.length : addAgentFieldOrder.length;\r\n}\r\n\r\nfunction clampIndex(index: number, count: number): number {\r\n if (count <= 0) {\r\n return 0;\r\n }\r\n\r\n return ((index % count) + count) % count;\r\n}\r\n\r\nfunction nextText(value: string, input: string): string {\r\n return `${value}${input}`;\r\n}\r\n\r\nfunction trimLast(value: string): string {\r\n return value.slice(0, Math.max(value.length - 1, 0));\r\n}\r\n\r\nfunction togglePlatform(values: string[], platform: string): string[] {\r\n return values.includes(platform)\r\n ? values.filter((entry) => entry !== platform)\r\n : [...values, platform];\r\n}\r\n\r\nfunction commandFailureMessage(error: unknown): string {\r\n return `Action failed: ${errorReason(error)}`;\r\n}\r\n\r\nfunction restoreFailedFormModal(modal: TuiFormModal, message: string): TuiFormModal {\r\n switch (modal.kind) {\r\n case \"add-agent\":\r\n return {\r\n kind: \"add-agent\",\r\n form: {\r\n ...modal.form,\r\n error: message\r\n }\r\n };\r\n case \"edit-agent\":\r\n return {\r\n kind: \"edit-agent\",\r\n agentId: modal.agentId,\r\n form: {\r\n ...modal.form,\r\n error: message\r\n }\r\n };\r\n case \"import\":\r\n return {\r\n kind: \"import\",\r\n form: {\r\n ...modal.form,\r\n error: message\r\n }\r\n };\r\n }\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 modalInteraction: DashboardModalInteraction;\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 modalInteraction\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 modalInteraction={modalInteraction}\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 modalInteraction\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 modalInteraction={modalInteraction}\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 [modalInteraction, setModalInteraction] = useState<DashboardModalInteraction>({\r\n fieldIndex: 0,\r\n platformIndex: 0,\r\n doctorScrollOffset: 0\r\n });\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 const modalKind = state?.modal?.kind ?? null;\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 useEffect(() => {\r\n setModalInteraction({\r\n fieldIndex: 0,\r\n platformIndex: 0,\r\n doctorScrollOffset: 0\r\n });\r\n }, [modalKind]);\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 useEffect(() => {\r\n if (state?.pendingCommand === null || state?.pendingCommand === undefined) {\r\n return;\r\n }\r\n\r\n const consumed = consumePendingCommandIntent(state);\r\n setState(consumed.state);\r\n\r\n if (consumed.command === null) {\r\n return;\r\n }\r\n\r\n if (consumed.command.kind === \"doctor\") {\r\n const requestId = beginRequest();\r\n\r\n services\r\n .dispatchTuiAction({\r\n action: consumed.command,\r\n model: consumed.state.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 if (result.commandSucceeded === false) {\r\n const failureMessage = result.statusMessage;\r\n\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : updateTuiState(\r\n updateTuiState(current, {\r\n type: \"doctor-result-failed\",\r\n errorMessage: failureMessage\r\n }),\r\n { type: \"set-status\", message: failureMessage }\r\n )\r\n );\r\n return;\r\n }\r\n\r\n const doctorReport = result.doctor;\r\n\r\n if (doctorReport === undefined) {\r\n throw new Error(\"Doctor report missing\");\r\n }\r\n\r\n stableModel.current = result.model;\r\n setState((current) =>\r\n current === null\r\n ? current\r\n : updateTuiState(\r\n updateTuiState(current, {\r\n type: \"doctor-result-loaded\",\r\n report: doctorReport\r\n }),\r\n { type: \"set-status\", message: result.statusMessage }\r\n )\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, {\r\n type: \"doctor-result-failed\",\r\n errorMessage: `Doctor failed: ${errorReason(error)}`\r\n }),\r\n { type: \"set-status\", message: `Doctor failed: ${errorReason(error)}` }\r\n )\r\n );\r\n });\r\n\r\n return;\r\n }\r\n\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 const busyState: TuiState = {\r\n ...consumed.state,\r\n modal: null,\r\n busy: true,\r\n statusMessage: \"working...\"\r\n };\r\n setState(busyState);\r\n\r\n services\r\n .dispatchTuiAction({\r\n action: consumed.command,\r\n model: busyState.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 if (result.commandSucceeded === false) {\r\n const failureMessage = result.statusMessage;\r\n\r\n if (consumed.command?.kind === \"doctor\") {\r\n setState({\r\n ...consumed.state,\r\n busy: false,\r\n statusMessage: failureMessage,\r\n modal: {\r\n kind: \"doctor\",\r\n status: \"error\",\r\n errorMessage: failureMessage\r\n }\r\n });\r\n return;\r\n }\r\n\r\n if (\r\n consumed.state.modal !== null &&\r\n \"form\" in consumed.state.modal\r\n ) {\r\n setState({\r\n ...consumed.state,\r\n busy: false,\r\n statusMessage: failureMessage,\r\n modal: restoreFailedFormModal(consumed.state.modal, failureMessage)\r\n });\r\n return;\r\n }\r\n\r\n setState({\r\n ...consumed.state,\r\n busy: false,\r\n statusMessage: failureMessage\r\n });\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 const failedModal = consumed.state.modal;\r\n const failureMessage = commandFailureMessage(error);\r\n\r\n if (\r\n failedModal === null ||\r\n failedModal.kind !== \"add-agent\" &&\r\n failedModal.kind !== \"edit-agent\" &&\r\n failedModal.kind !== \"import\"\r\n ) {\r\n setState({\r\n ...consumed.state,\r\n busy: false,\r\n statusMessage: failureMessage\r\n });\r\n return;\r\n }\r\n\r\n setState({\r\n ...consumed.state,\r\n busy: false,\r\n statusMessage: failureMessage,\r\n modal: restoreFailedFormModal(failedModal, failureMessage)\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 beginRequest,\r\n homeDir,\r\n isLatestRequest,\r\n platform,\r\n services,\r\n skillmuxHome,\r\n state\r\n ]);\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 || input === \"\\u001B\") {\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 (input === \"q\") {\r\n if (\r\n state.modal.kind === \"confirm-discard-dirty-form\" ||\r\n (\"form\" in state.modal && state.modal.form.dirty)\r\n ) {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\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 (state.modal.kind === \"help\") {\r\n if (key.escape || input === \"\\u001B\") {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (state.modal.kind === \"confirm-discard-dirty-form\") {\r\n if (input.toLocaleLowerCase() === \"y\") {\r\n setState(updateTuiState(state, { type: \"confirm-discard-dirty-form\" }));\r\n return;\r\n }\r\n\r\n if (key.escape || input === \"\\u001B\" || input.toLocaleLowerCase() === \"n\") {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (\r\n state.modal.kind === \"confirm-adopt\" ||\r\n state.modal.kind === \"confirm-adopt-all\" ||\r\n state.modal.kind === \"confirm-remove\" ||\r\n state.modal.kind === \"confirm-remove-agent\"\r\n ) {\r\n if (input.toLocaleLowerCase() === \"y\") {\r\n const closedState = updateTuiState(state, { type: \"close\" });\r\n\r\n if (state.modal.kind === \"confirm-adopt\") {\r\n runAction(\"adopt\", closedState.model, closedState);\r\n } else if (state.modal.kind === \"confirm-adopt-all\") {\r\n runAction(\"adopt-all\", closedState.model, closedState);\r\n } else if (state.modal.kind === \"confirm-remove\") {\r\n runAction(\"remove\", closedState.model, closedState);\r\n } else {\r\n setState(updateTuiState(state, { type: \"submit-remove-agent\" }));\r\n }\r\n return;\r\n }\r\n\r\n if (key.escape || input === \"\\u001B\" || input.toLocaleLowerCase() === \"n\") {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (state.modal.kind === \"doctor\") {\r\n if (key.escape || input === \"\\u001B\") {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\r\n if (key.downArrow || key.rightArrow || input === \"j\") {\r\n setModalInteraction((current) => ({\r\n ...current,\r\n doctorScrollOffset: current.doctorScrollOffset + 1\r\n }));\r\n return;\r\n }\r\n\r\n if (key.upArrow || key.leftArrow || input === \"k\") {\r\n setModalInteraction((current) => ({\r\n ...current,\r\n doctorScrollOffset: Math.max(current.doctorScrollOffset - 1, 0)\r\n }));\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (\r\n state.modal.kind === \"add-agent\" ||\r\n state.modal.kind === \"edit-agent\" ||\r\n state.modal.kind === \"import\"\r\n ) {\r\n const fieldOrder =\r\n state.modal.kind === \"add-agent\"\r\n ? addAgentFieldOrder\r\n : state.modal.kind === \"edit-agent\"\r\n ? editAgentFieldOrder\r\n : importFieldOrder;\r\n const submitFieldIndex = fieldOrder.length;\r\n const currentFieldIndex = clampIndex(\r\n modalInteraction.fieldIndex,\r\n fieldOrder.length + 1\r\n );\r\n const currentField = fieldOrder[currentFieldIndex];\r\n const moveField = (direction: 1 | -1) => {\r\n setModalInteraction((current) => ({\r\n ...current,\r\n fieldIndex: clampIndex(\r\n current.fieldIndex + direction,\r\n fieldOrder.length + 1\r\n ),\r\n platformIndex: 0\r\n }));\r\n };\r\n const updateAddAgent = (\r\n field: (typeof addAgentFieldOrder)[number],\r\n value: string | boolean | string[]\r\n ) => {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"add-agent-form-field-changed\",\r\n field,\r\n value\r\n })\r\n );\r\n };\r\n const updateEditAgent = (\r\n field: (typeof editAgentFieldOrder)[number],\r\n value: string | boolean | string[]\r\n ) => {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"edit-agent-form-field-changed\",\r\n field,\r\n value\r\n })\r\n );\r\n };\r\n const updateImport = (\r\n field: (typeof importFieldOrder)[number],\r\n value: string\r\n ) => {\r\n setState(\r\n updateTuiState(state, {\r\n type: \"import-form-field-changed\",\r\n field,\r\n value\r\n })\r\n );\r\n };\r\n\r\n if (key.escape || input === \"\\u001B\") {\r\n setState(updateTuiState(state, { type: \"close\" }));\r\n return;\r\n }\r\n\r\n if (key.return && currentFieldIndex === submitFieldIndex) {\r\n if (state.modal.kind === \"add-agent\") {\r\n setState(updateTuiState(state, { type: \"submit-add-agent-form\" }));\r\n } else if (state.modal.kind === \"edit-agent\") {\r\n setState(updateTuiState(state, { type: \"submit-edit-agent-form\" }));\r\n } else {\r\n setState(updateTuiState(state, { type: \"submit-import-form\" }));\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (key.downArrow) {\r\n moveField(1);\r\n return;\r\n }\r\n\r\n if (key.upArrow) {\r\n moveField(-1);\r\n return;\r\n }\r\n\r\n if (currentField === undefined) {\r\n return;\r\n }\r\n\r\n if (currentField === \"platforms\") {\r\n const platform = platformOptions[modalInteraction.platformIndex] ?? platformOptions[0];\r\n\r\n if (key.leftArrow) {\r\n setModalInteraction((current) => ({\r\n ...current,\r\n platformIndex: clampIndex(current.platformIndex - 1, platformOptions.length)\r\n }));\r\n return;\r\n }\r\n\r\n if (key.rightArrow) {\r\n setModalInteraction((current) => ({\r\n ...current,\r\n platformIndex: clampIndex(current.platformIndex + 1, platformOptions.length)\r\n }));\r\n return;\r\n }\r\n\r\n if (input === \" \") {\r\n if (state.modal.kind === \"add-agent\") {\r\n updateAddAgent(\r\n \"platforms\",\r\n togglePlatform(state.modal.form.values.platforms, platform)\r\n );\r\n } else if (state.modal.kind === \"edit-agent\") {\r\n updateEditAgent(\r\n \"platforms\",\r\n togglePlatform(state.modal.form.values.platforms, platform)\r\n );\r\n }\r\n return;\r\n }\r\n }\r\n\r\n if (currentField === \"disabledByDefault\" && state.modal.kind === \"add-agent\") {\r\n if (input === \" \") {\r\n updateAddAgent(\"disabledByDefault\", !state.modal.form.values.disabledByDefault);\r\n return;\r\n }\r\n }\r\n\r\n if (state.modal.kind === \"edit-agent\") {\r\n if (currentField === \"enabledByDefault\") {\r\n if (input === \" \") {\r\n updateEditAgent(\"enabledByDefault\", !state.modal.form.values.enabledByDefault);\r\n return;\r\n }\r\n }\r\n\r\n if (currentField === \"disabledByDefault\") {\r\n if (input === \" \") {\r\n updateEditAgent(\r\n \"disabledByDefault\",\r\n !state.modal.form.values.disabledByDefault\r\n );\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (isTextInput(input)) {\r\n if (state.modal.kind === \"add-agent\") {\r\n if (currentField === \"id\") {\r\n updateAddAgent(\"id\", nextText(state.modal.form.values.id, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"root\") {\r\n updateAddAgent(\"root\", nextText(state.modal.form.values.root, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"skills\") {\r\n updateAddAgent(\"skills\", nextText(state.modal.form.values.skills, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"name\") {\r\n updateAddAgent(\"name\", nextText(state.modal.form.values.name, input));\r\n return;\r\n }\r\n } else if (state.modal.kind === \"edit-agent\") {\r\n if (currentField === \"root\") {\r\n updateEditAgent(\"root\", nextText(state.modal.form.values.root, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"skills\") {\r\n updateEditAgent(\"skills\", nextText(state.modal.form.values.skills, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"name\") {\r\n updateEditAgent(\"name\", nextText(state.modal.form.values.name, input));\r\n return;\r\n }\r\n } else if (state.modal.kind === \"import\") {\r\n if (currentField === \"sourcePath\") {\r\n updateImport(\"sourcePath\", nextText(state.modal.form.values.sourcePath, input));\r\n return;\r\n }\r\n\r\n if (currentField === \"skillName\") {\r\n updateImport(\"skillName\", nextText(state.modal.form.values.skillName, input));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (key.backspace || key.delete) {\r\n if (state.modal.kind === \"add-agent\") {\r\n if (currentField === \"id\") {\r\n updateAddAgent(\"id\", trimLast(state.modal.form.values.id));\r\n return;\r\n }\r\n\r\n if (currentField === \"root\") {\r\n updateAddAgent(\"root\", trimLast(state.modal.form.values.root));\r\n return;\r\n }\r\n\r\n if (currentField === \"skills\") {\r\n updateAddAgent(\"skills\", trimLast(state.modal.form.values.skills));\r\n return;\r\n }\r\n\r\n if (currentField === \"name\") {\r\n updateAddAgent(\"name\", trimLast(state.modal.form.values.name));\r\n return;\r\n }\r\n } else if (state.modal.kind === \"edit-agent\") {\r\n if (currentField === \"root\") {\r\n updateEditAgent(\"root\", trimLast(state.modal.form.values.root));\r\n return;\r\n }\r\n\r\n if (currentField === \"skills\") {\r\n updateEditAgent(\"skills\", trimLast(state.modal.form.values.skills));\r\n return;\r\n }\r\n\r\n if (currentField === \"name\") {\r\n updateEditAgent(\"name\", trimLast(state.modal.form.values.name));\r\n return;\r\n }\r\n } else if (state.modal.kind === \"import\") {\r\n if (currentField === \"sourcePath\") {\r\n updateImport(\"sourcePath\", trimLast(state.modal.form.values.sourcePath));\r\n return;\r\n }\r\n\r\n if (currentField === \"skillName\") {\r\n updateImport(\"skillName\", trimLast(state.modal.form.values.skillName));\r\n return;\r\n }\r\n }\r\n }\r\n\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 (input === \"n\") {\r\n setState(updateTuiState(state, { type: \"open-add-agent\" }));\r\n return;\r\n }\r\n\r\n if (input === \"e\") {\r\n setState(updateTuiState(state, { type: \"open-edit-agent\" }));\r\n return;\r\n }\r\n\r\n if (input === \"X\" || (key.shift && input === \"x\")) {\r\n setState(updateTuiState(state, { type: \"open-remove-agent\" }));\r\n return;\r\n }\r\n\r\n if (input === \"i\") {\r\n setState(updateTuiState(state, { type: \"open-import\" }));\r\n return;\r\n }\r\n\r\n if (input === \"d\") {\r\n setState(updateTuiState(state, { type: \"open-doctor\" }));\r\n return;\r\n }\r\n\r\n if (key.escape || input === \"\\u001B\") {\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 modalInteraction={modalInteraction}\r\n />\r\n ) : (\r\n <LiveDashboardViewport\r\n state={state}\r\n terminalWidth={terminalWidth}\r\n terminalHeight={terminalHeight}\r\n modalInteraction={modalInteraction}\r\n />\r\n );\r\n}\r\n","import type { RunConfigAddAgentOptions } from \"../commands/config-add-agent\";\r\nimport type { RunConfigUpdateAgentOptions } from \"../commands/config-update-agent\";\r\nimport type { RunImportOptions } from \"../commands/import\";\r\n\r\ntype FormState<TValues extends Record<string, unknown>> = {\r\n values: TValues;\r\n initialValues: TValues;\r\n dirty: boolean;\r\n error: string | null;\r\n};\r\n\r\nexport type ConfigAddAgentFormValues = {\r\n id: string;\r\n root: string;\r\n skills: string;\r\n name: string;\r\n platforms: string[];\r\n disabledByDefault: boolean;\r\n};\r\n\r\nexport type ConfigAddAgentForm = FormState<ConfigAddAgentFormValues>;\r\n\r\nexport type ConfigUpdateAgentFormValues = {\r\n root: string;\r\n skills: string;\r\n name: string;\r\n platforms: string[];\r\n enabledByDefault: boolean;\r\n disabledByDefault: boolean;\r\n preserveEnabledByDefault: boolean;\r\n};\r\n\r\nexport type ConfigUpdateAgentForm = FormState<ConfigUpdateAgentFormValues>;\r\n\r\nexport type ImportSkillFormValues = {\r\n sourcePath: string;\r\n skillName: string;\r\n};\r\n\r\nexport type ImportSkillForm = FormState<ImportSkillFormValues>;\r\n\r\nfunction cloneValues<TValues extends Record<string, unknown>>(values: TValues): TValues {\r\n return Object.fromEntries(\r\n Object.entries(values).map(([key, value]) => [\r\n key,\r\n Array.isArray(value) ? [...value] : value\r\n ])\r\n ) as TValues;\r\n}\r\n\r\nfunction isDirty<TValues extends Record<string, unknown>>(\r\n values: TValues,\r\n initialValues: TValues\r\n): boolean {\r\n return JSON.stringify(values) !== JSON.stringify(initialValues);\r\n}\r\n\r\nfunction trimOrEmpty(value: string | undefined): string {\r\n return (value ?? \"\").trim();\r\n}\r\n\r\nfunction normalizePlatformList(value: string[]): string[] | undefined {\r\n const platforms = value\r\n .map((entry) => entry.trim().toLowerCase())\r\n .filter((entry) => entry.length > 0);\r\n\r\n return platforms.length === 0 ? undefined : [...new Set(platforms)];\r\n}\r\n\r\nfunction updateFormField<TValues extends Record<string, unknown>, TField extends keyof TValues>(\r\n form: FormState<TValues>,\r\n field: TField,\r\n value: TValues[TField]\r\n): FormState<TValues> {\r\n const nextValues = {\r\n ...form.values,\r\n [field]: value\r\n } as TValues;\r\n\r\n return {\r\n values: nextValues,\r\n initialValues: form.initialValues,\r\n dirty: isDirty(nextValues, form.initialValues),\r\n error: null\r\n };\r\n}\r\n\r\nfunction buildConfigAddAgentDefaults(): ConfigAddAgentFormValues {\r\n return {\r\n id: \"\",\r\n root: \"root\",\r\n skills: \"skills\",\r\n name: \"\",\r\n platforms: [],\r\n disabledByDefault: false\r\n };\r\n}\r\n\r\nfunction buildConfigUpdateAgentDefaults(): ConfigUpdateAgentFormValues {\r\n return {\r\n root: \"\",\r\n skills: \"skills\",\r\n name: \"\",\r\n platforms: [],\r\n enabledByDefault: false,\r\n disabledByDefault: false,\r\n preserveEnabledByDefault: false\r\n };\r\n}\r\n\r\nfunction buildImportDefaults(): ImportSkillFormValues {\r\n return {\r\n sourcePath: \"\",\r\n skillName: \"\"\r\n };\r\n}\r\n\r\nfunction normalizeConfigAddAgentValues(\r\n values: ConfigAddAgentFormValues\r\n): RunConfigAddAgentOptionsLike {\r\n return {\r\n id: trimOrEmpty(values.id),\r\n root: trimOrEmpty(values.root),\r\n skills: trimOrEmpty(values.skills) || undefined,\r\n name: trimOrEmpty(values.name) || undefined,\r\n platforms: normalizePlatformList(values.platforms),\r\n disabledByDefault: values.disabledByDefault ? true : undefined\r\n };\r\n}\r\n\r\nfunction normalizeConfigUpdateAgentValues(\r\n values: ConfigUpdateAgentFormValues,\r\n agentId: string\r\n): RunConfigUpdateAgentOptionsLike {\r\n const enabledByDefault = values.enabledByDefault ? true : undefined;\r\n const disabledByDefault = values.disabledByDefault ? true : undefined;\r\n\r\n return {\r\n id: agentId,\r\n root: trimOrEmpty(values.root) || undefined,\r\n skills: trimOrEmpty(values.skills) || undefined,\r\n name: trimOrEmpty(values.name) || undefined,\r\n platforms: normalizePlatformList(values.platforms),\r\n ...(values.preserveEnabledByDefault\r\n ? {}\r\n : {\r\n enabledByDefault,\r\n disabledByDefault\r\n })\r\n };\r\n}\r\n\r\nfunction normalizeImportValues(values: ImportSkillFormValues): RunImportOptionsLike {\r\n return {\r\n sourcePath: trimOrEmpty(values.sourcePath),\r\n skillName: trimOrEmpty(values.skillName)\r\n };\r\n}\r\n\r\ntype RunConfigAddAgentOptionsLike = Pick<\r\n RunConfigAddAgentOptions,\r\n \"id\" | \"root\" | \"skills\" | \"name\" | \"platforms\" | \"disabledByDefault\"\r\n>;\r\n\r\ntype RunConfigUpdateAgentOptionsLike = Pick<\r\n RunConfigUpdateAgentOptions,\r\n \"id\" | \"root\" | \"skills\" | \"name\" | \"platforms\" | \"enabledByDefault\" | \"disabledByDefault\"\r\n>;\r\n\r\ntype RunImportOptionsLike = Pick<RunImportOptions, \"sourcePath\" | \"skillName\">;\r\n\r\nexport function createConfigAddAgentForm(\r\n values: Partial<ConfigAddAgentFormValues> = {}\r\n): ConfigAddAgentForm {\r\n const initialValues = {\r\n ...buildConfigAddAgentDefaults(),\r\n ...values\r\n };\r\n\r\n return {\r\n values: cloneValues(initialValues),\r\n initialValues: cloneValues(initialValues),\r\n dirty: false,\r\n error: null\r\n };\r\n}\r\n\r\nexport function updateConfigAddAgentFormField<TField extends keyof ConfigAddAgentFormValues>(\r\n form: ConfigAddAgentForm,\r\n field: TField,\r\n value: ConfigAddAgentFormValues[TField]\r\n): ConfigAddAgentForm {\r\n return updateFormField(form, field, value);\r\n}\r\n\r\nexport function validateConfigAddAgentForm(form: ConfigAddAgentForm): string | null {\r\n const values = normalizeConfigAddAgentValues(form.values);\r\n\r\n if (values.id.length === 0 || values.root.length === 0) {\r\n return \"Agent id and root are required\";\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function buildRunConfigAddAgentOptions(\r\n form: ConfigAddAgentForm\r\n): RunConfigAddAgentOptionsLike {\r\n return normalizeConfigAddAgentValues(form.values);\r\n}\r\n\r\nexport function normalizeRunConfigAddAgentOptions(\r\n input: RunConfigAddAgentOptionsLike\r\n): RunConfigAddAgentOptionsLike {\r\n return {\r\n id: trimOrEmpty(input.id),\r\n root: trimOrEmpty(input.root),\r\n skills: input.skills === undefined ? undefined : trimOrEmpty(input.skills),\r\n name: input.name === undefined ? undefined : trimOrEmpty(input.name),\r\n platforms:\r\n input.platforms === undefined\r\n ? undefined\r\n : [...new Set(input.platforms.map((entry) => entry.trim().toLowerCase()).filter((entry) => entry.length > 0))],\r\n disabledByDefault: input.disabledByDefault === true ? true : undefined\r\n };\r\n}\r\n\r\nexport function createConfigUpdateAgentForm(\r\n values: Partial<ConfigUpdateAgentFormValues> = {}\r\n): ConfigUpdateAgentForm {\r\n const initialValues = {\r\n ...buildConfigUpdateAgentDefaults(),\r\n ...values\r\n };\r\n\r\n return {\r\n values: cloneValues(initialValues),\r\n initialValues: cloneValues(initialValues),\r\n dirty: false,\r\n error: null\r\n };\r\n}\r\n\r\nexport function updateConfigUpdateAgentFormField<TField extends keyof ConfigUpdateAgentFormValues>(\r\n form: ConfigUpdateAgentForm,\r\n field: TField,\r\n value: ConfigUpdateAgentFormValues[TField]\r\n): ConfigUpdateAgentForm {\r\n const next =\r\n field === \"enabledByDefault\" && value === true\r\n ? updateFormField(\r\n updateFormField(form, field, value),\r\n \"disabledByDefault\",\r\n false\r\n )\r\n : field === \"disabledByDefault\" && value === true\r\n ? updateFormField(updateFormField(form, field, value), \"enabledByDefault\", false)\r\n : updateFormField(form, field, value);\r\n\r\n return {\r\n ...next,\r\n values: {\r\n ...next.values,\r\n enabledByDefault:\r\n field === \"disabledByDefault\" && value === true ? false : next.values.enabledByDefault,\r\n disabledByDefault:\r\n field === \"enabledByDefault\" && value === true ? false : next.values.disabledByDefault,\r\n preserveEnabledByDefault:\r\n field === \"enabledByDefault\" || field === \"disabledByDefault\"\r\n ? false\r\n : next.values.preserveEnabledByDefault\r\n }\r\n };\r\n}\r\n\r\nexport function validateConfigUpdateAgentForm(form: ConfigUpdateAgentForm): string | null {\r\n const values = normalizeConfigUpdateAgentValues(form.values, \"agent\");\r\n\r\n if (values.root !== undefined && values.root.length === 0) {\r\n return \"Root path cannot be empty\";\r\n }\r\n\r\n if (form.values.enabledByDefault && form.values.disabledByDefault) {\r\n return \"Enabled by default and disabled by default cannot both be set\";\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport type ConfigUpdateAgentSeed = {\r\n id: string;\r\n stableName?: string;\r\n homeRelativeRootPath?: string;\r\n skillsDirectoryPath?: string;\r\n supportedPlatforms?: string[];\r\n overrideEnabledByDefault?: boolean;\r\n};\r\n\r\nexport function createConfigUpdateAgentFormFromSeed(\r\n seed: ConfigUpdateAgentSeed\r\n): ConfigUpdateAgentForm {\r\n return createConfigUpdateAgentForm({\r\n root: seed.homeRelativeRootPath ?? \"\",\r\n skills: seed.skillsDirectoryPath ?? \"\",\r\n name: seed.stableName ?? \"\",\r\n platforms: [...(seed.supportedPlatforms ?? [])],\r\n enabledByDefault: seed.overrideEnabledByDefault === true,\r\n disabledByDefault: seed.overrideEnabledByDefault === false,\r\n preserveEnabledByDefault: seed.overrideEnabledByDefault === undefined\r\n });\r\n}\r\n\r\nexport function buildRunConfigUpdateAgentOptions(\r\n form: ConfigUpdateAgentForm,\r\n agentId: string\r\n): RunConfigUpdateAgentOptionsLike {\r\n const values = normalizeConfigUpdateAgentValues(form.values, agentId);\r\n\r\n return {\r\n id: values.id,\r\n ...(values.root === undefined ? {} : { root: values.root }),\r\n ...(values.skills === undefined ? {} : { skills: values.skills }),\r\n ...(values.name === undefined ? {} : { name: values.name }),\r\n ...(values.platforms === undefined ? {} : { platforms: values.platforms }),\r\n ...(values.enabledByDefault === undefined ? {} : { enabledByDefault: true }),\r\n ...(values.disabledByDefault === undefined ? {} : { disabledByDefault: true })\r\n };\r\n}\r\n\r\nexport function normalizeRunConfigUpdateAgentOptions(\r\n input: RunConfigUpdateAgentOptionsLike\r\n): RunConfigUpdateAgentOptionsLike {\r\n return {\r\n id: trimOrEmpty(input.id),\r\n ...(input.root === undefined ? {} : { root: trimOrEmpty(input.root) }),\r\n ...(input.skills === undefined ? {} : { skills: trimOrEmpty(input.skills) }),\r\n ...(input.name === undefined ? {} : { name: trimOrEmpty(input.name) }),\r\n ...(input.platforms === undefined\r\n ? {}\r\n : {\r\n platforms: [...new Set(input.platforms.map((entry) => entry.trim().toLowerCase()))]\r\n }),\r\n ...(input.enabledByDefault === true ? { enabledByDefault: true } : {}),\r\n ...(input.disabledByDefault === true ? { disabledByDefault: true } : {})\r\n };\r\n}\r\n\r\nexport function createImportSkillForm(\r\n values: Partial<ImportSkillFormValues> = {}\r\n): ImportSkillForm {\r\n const initialValues = {\r\n ...buildImportDefaults(),\r\n ...values\r\n };\r\n\r\n return {\r\n values: cloneValues(initialValues),\r\n initialValues: cloneValues(initialValues),\r\n dirty: false,\r\n error: null\r\n };\r\n}\r\n\r\nexport function updateImportSkillFormField<TField extends keyof ImportSkillFormValues>(\r\n form: ImportSkillForm,\r\n field: TField,\r\n value: ImportSkillFormValues[TField]\r\n): ImportSkillForm {\r\n return updateFormField(form, field, value);\r\n}\r\n\r\nexport function validateImportSkillForm(form: ImportSkillForm): string | null {\r\n const values = normalizeImportValues(form.values);\r\n\r\n if (values.sourcePath.length === 0 || values.skillName.length === 0) {\r\n return \"Skill name and source path are required\";\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function buildRunImportOptions(form: ImportSkillForm): RunImportOptionsLike {\r\n return normalizeImportValues(form.values);\r\n}\r\n","import { homedir } from \"node:os\";\r\nimport { resolveSkillmuxHome } from \"../config/resolve-skillmux-home\";\r\nimport { loadUserConfig } from \"../config/load-user-config\";\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 userConfig = await loadUserConfig(skillmuxHome);\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 configuredAgentIds: Object.keys(userConfig.agents),\r\n agentOverrides: userConfig.agents,\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\";\r\nimport type { AgentOverride } from \"../config/load-user-config\";\r\nimport type { DiscoveredAgent } from \"../discovery/discover-agents\";\r\nimport type {\r\n ScannedSkillEntry,\r\n SkillEntryKind\r\n} from \"../discovery/infer-skill-entry\";\r\nimport { isPathInside } from \"../fs/path-utils\";\r\n\r\nexport type TuiAgentRow = {\r\n id: string;\r\n name: string;\r\n stableName?: string;\r\n path: string;\r\n homeRelativeRootPath?: string;\r\n skillsDirectoryPath?: string;\r\n supportedPlatforms?: string[];\r\n enabledByDefault?: boolean;\r\n overrideStableName?: string;\r\n overrideHomeRelativeRootPath?: string;\r\n overrideSkillsDirectoryPath?: string;\r\n overrideSupportedPlatforms?: string[];\r\n overrideEnabledByDefault?: boolean;\r\n discovery: \"builtin\" | \"custom\";\r\n exists: boolean;\r\n supported: boolean;\r\n hasUserOverride: boolean;\r\n canEditOverride: boolean;\r\n canRemoveOverride: boolean;\r\n activationCount?: number;\r\n enabledCount: number;\r\n disabledCount: number;\r\n unmanagedCount: number;\r\n issueCount: number;\r\n};\r\n\r\nexport type TuiEnabledSkillRow = {\r\n id: string;\r\n kind: \"enabled\";\r\n marker: \"●\";\r\n skillId: string;\r\n name: string;\r\n path: string;\r\n agentId: string;\r\n activationLinkPath: string;\r\n};\r\n\r\nexport type TuiDisabledSkillRow = {\r\n id: string;\r\n kind: \"disabled\";\r\n marker: \"○\";\r\n skillId: string;\r\n name: string;\r\n path: string;\r\n agentId: string;\r\n activationLinkPath: string | null;\r\n};\r\n\r\nexport type TuiUnmanagedSkillRow = {\r\n id: string;\r\n kind: \"unmanaged\";\r\n marker: \"?\";\r\n skillName: string;\r\n name: string;\r\n path: string;\r\n agentId: string;\r\n entryKind: Extract<SkillEntryKind, \"unmanaged-directory\" | \"unmanaged-link\">;\r\n targetPath?: string;\r\n};\r\n\r\nexport type TuiIssueSkillRow = {\r\n id: string;\r\n kind: \"issue\";\r\n marker: \"!\";\r\n issueCode: string;\r\n severity: ScanIssue[\"severity\"];\r\n message: string;\r\n path: string | null;\r\n agentId: string;\r\n};\r\n\r\nexport type TuiSkillRow =\r\n | TuiEnabledSkillRow\r\n | TuiDisabledSkillRow\r\n | TuiUnmanagedSkillRow\r\n | TuiIssueSkillRow;\r\n\r\nexport type DashboardModel = {\r\n agents: TuiAgentRow[];\r\n skills: TuiSkillRow[];\r\n selectedAgentId: string | null;\r\n selectedSkillId: string | null;\r\n lastScanAt: string | null;\r\n issueCount: number;\r\n};\r\n\r\nexport type BuildDashboardModelInput = {\r\n manifest: Manifest;\r\n agents: DiscoveredAgent[];\r\n entries: ScannedSkillEntry[];\r\n issues: ScanIssue[];\r\n configuredAgentIds?: string[];\r\n agentOverrides?: Record<string, AgentOverride>;\r\n selectedAgentId?: string;\r\n selectedSkillId?: string;\r\n};\r\n\r\ntype RowCounts = {\r\n enabledCount: number;\r\n disabledCount: number;\r\n unmanagedCount: number;\r\n issueCount: number;\r\n};\r\n\r\nconst emptyCounts = (): RowCounts => ({\r\n enabledCount: 0,\r\n disabledCount: 0,\r\n unmanagedCount: 0,\r\n issueCount: 0\r\n});\r\n\r\nfunction sortById<T extends { id: string }>(values: T[]): T[] {\r\n return [...values].sort((left, right) => left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction getSelectedAgentId(\r\n agents: DiscoveredAgent[],\r\n requestedAgentId?: string\r\n): string | null {\r\n if (requestedAgentId !== undefined) {\r\n const requestedAgent = agents.find((agent) => agent.id === requestedAgentId);\r\n\r\n if (requestedAgent !== undefined) {\r\n return requestedAgent.id;\r\n }\r\n }\r\n\r\n const availableAgent = agents.find(\r\n (agent) => agent.exists && agent.supportedOnPlatform\r\n );\r\n\r\n return availableAgent?.id ?? agents[0]?.id ?? null;\r\n}\r\n\r\nfunction findEnabledActivation(\r\n manifest: Manifest,\r\n skillId: string,\r\n agentId: string\r\n) {\r\n return manifest.activations.find(\r\n (activation) =>\r\n activation.skillId === skillId &&\r\n activation.agentId === agentId &&\r\n activation.state === \"enabled\"\r\n );\r\n}\r\n\r\nfunction findAnyActivation(\r\n manifest: Manifest,\r\n skillId: string,\r\n agentId: string\r\n) {\r\n return manifest.activations.find(\r\n (activation) =>\r\n activation.skillId === skillId && activation.agentId === agentId\r\n );\r\n}\r\n\r\nfunction buildManagedSkillRow(\r\n manifest: Manifest,\r\n skill: ManagedSkill,\r\n agentId: string\r\n): TuiEnabledSkillRow | TuiDisabledSkillRow {\r\n const enabledActivation = findEnabledActivation(manifest, skill.id, agentId);\r\n\r\n if (enabledActivation !== undefined) {\r\n return {\r\n id: skill.id,\r\n kind: \"enabled\",\r\n marker: \"●\",\r\n skillId: skill.id,\r\n name: skill.name,\r\n path: skill.path,\r\n agentId,\r\n activationLinkPath: enabledActivation.linkPath\r\n };\r\n }\r\n\r\n return {\r\n id: skill.id,\r\n kind: \"disabled\",\r\n marker: \"○\",\r\n skillId: skill.id,\r\n name: skill.name,\r\n path: skill.path,\r\n agentId,\r\n activationLinkPath:\r\n findAnyActivation(manifest, skill.id, agentId)?.linkPath ?? null\r\n };\r\n}\r\n\r\nfunction isAdoptableEntry(\r\n entry: ScannedSkillEntry\r\n): entry is ScannedSkillEntry & {\r\n kind: \"unmanaged-directory\" | \"unmanaged-link\";\r\n} {\r\n return entry.kind === \"unmanaged-directory\" || entry.kind === \"unmanaged-link\";\r\n}\r\n\r\nfunction buildUnmanagedRows(\r\n entries: ScannedSkillEntry[],\r\n agentId: string\r\n): TuiUnmanagedSkillRow[] {\r\n return entries\r\n .filter((entry) => entry.agentId === agentId)\r\n .filter(isAdoptableEntry)\r\n .sort((left, right) =>\r\n `${left.skillName}:${left.path}`.localeCompare(\r\n `${right.skillName}:${right.path}`\r\n )\r\n )\r\n .map((entry) => ({\r\n id: `unmanaged:${entry.skillName}`,\r\n kind: \"unmanaged\",\r\n marker: \"?\",\r\n skillName: entry.skillName,\r\n name: entry.skillName,\r\n path: entry.path,\r\n agentId,\r\n entryKind: entry.kind,\r\n targetPath: entry.targetPath\r\n }));\r\n}\r\n\r\nfunction relatedAgentIdsForIssue(\r\n issue: ScanIssue,\r\n agents: DiscoveredAgent[]\r\n): string[] {\r\n if (issue.path === undefined) {\r\n return [];\r\n }\r\n\r\n const issuePath = issue.path;\r\n\r\n return agents\r\n .filter((agent) => isPathInside(agent.absoluteSkillsDirectoryPath, issuePath))\r\n .map((agent) => agent.id);\r\n}\r\n\r\nfunction buildIssueId(issue: ScanIssue, agentId: string): string {\r\n return `issue:${agentId}:${issue.code}:${issue.path ?? issue.message}`;\r\n}\r\n\r\nfunction buildIssueRows(\r\n issues: ScanIssue[],\r\n agents: DiscoveredAgent[],\r\n agentId: string\r\n): TuiIssueSkillRow[] {\r\n return issues\r\n .filter((issue) => {\r\n const relatedAgentIds = relatedAgentIdsForIssue(issue, agents);\r\n return relatedAgentIds.includes(agentId);\r\n })\r\n .map((issue) => ({\r\n id: buildIssueId(issue, agentId),\r\n kind: \"issue\",\r\n marker: \"!\",\r\n issueCode: issue.code,\r\n severity: issue.severity,\r\n message: issue.message,\r\n path: issue.path ?? null,\r\n agentId\r\n }));\r\n}\r\n\r\nfunction buildSkillRowsForAgent(\r\n input: BuildDashboardModelInput,\r\n agentId: string\r\n): TuiSkillRow[] {\r\n const managedRows = sortById(Object.values(input.manifest.skills)).map((skill) =>\r\n buildManagedSkillRow(input.manifest, skill, agentId)\r\n );\r\n const unmanagedRows = buildUnmanagedRows(input.entries, agentId);\r\n const issueRows = buildIssueRows(input.issues, input.agents, agentId);\r\n\r\n return [...managedRows, ...unmanagedRows, ...issueRows];\r\n}\r\n\r\nfunction countsForRows(rows: TuiSkillRow[]): RowCounts {\r\n const counts = emptyCounts();\r\n\r\n for (const row of rows) {\r\n if (row.kind === \"enabled\") {\r\n counts.enabledCount += 1;\r\n } else if (row.kind === \"disabled\") {\r\n counts.disabledCount += 1;\r\n } else if (row.kind === \"unmanaged\") {\r\n counts.unmanagedCount += 1;\r\n } else {\r\n counts.issueCount += 1;\r\n }\r\n }\r\n\r\n return counts;\r\n}\r\n\r\nfunction countActivationsForAgent(\r\n manifest: Manifest,\r\n agentId: string\r\n): number {\r\n return manifest.activations.filter((activation) => activation.agentId === agentId)\r\n .length;\r\n}\r\n\r\nfunction hasUserOverride(\r\n configuredAgentIds: Set<string>,\r\n agentId: string\r\n): boolean {\r\n return configuredAgentIds.has(agentId);\r\n}\r\n\r\nfunction buildAgentRows(input: BuildDashboardModelInput): TuiAgentRow[] {\r\n const configuredAgentIds = new Set(input.configuredAgentIds ?? []);\r\n\r\n return sortById(input.agents).map((agent) => {\r\n const counts = countsForRows(buildSkillRowsForAgent(input, agent.id));\r\n const userOverride = hasUserOverride(configuredAgentIds, agent.id);\r\n const agentOverride = input.agentOverrides?.[agent.id];\r\n\r\n return {\r\n id: agent.id,\r\n name: agent.stableName,\r\n stableName: agent.stableName,\r\n path: agent.absoluteSkillsDirectoryPath,\r\n homeRelativeRootPath: agent.homeRelativeRootPath,\r\n skillsDirectoryPath: agent.skillsDirectoryPath,\r\n supportedPlatforms: [...agent.supportedPlatforms],\r\n enabledByDefault: agent.enabledByDefault,\r\n ...(agentOverride?.stableName === undefined\r\n ? {}\r\n : { overrideStableName: agentOverride.stableName }),\r\n ...(agentOverride?.homeRelativeRootPath === undefined\r\n ? {}\r\n : { overrideHomeRelativeRootPath: agentOverride.homeRelativeRootPath }),\r\n ...(agentOverride?.skillsDirectoryPath === undefined\r\n ? {}\r\n : { overrideSkillsDirectoryPath: agentOverride.skillsDirectoryPath }),\r\n ...(agentOverride?.supportedPlatforms === undefined\r\n ? {}\r\n : { overrideSupportedPlatforms: [...agentOverride.supportedPlatforms] }),\r\n ...(agentOverride?.enabledByDefault === undefined\r\n ? {}\r\n : { overrideEnabledByDefault: agentOverride.enabledByDefault }),\r\n discovery: agent.discovery,\r\n exists: agent.exists,\r\n supported: agent.supportedOnPlatform,\r\n hasUserOverride: userOverride,\r\n canEditOverride: userOverride,\r\n canRemoveOverride: userOverride,\r\n activationCount: countActivationsForAgent(input.manifest, agent.id),\r\n ...counts\r\n };\r\n });\r\n}\r\n\r\nexport function buildDashboardModel(\r\n input: BuildDashboardModelInput\r\n): DashboardModel {\r\n const sortedAgents = sortById(input.agents);\r\n const selectedAgentId = getSelectedAgentId(\r\n sortedAgents,\r\n input.selectedAgentId\r\n );\r\n const skills =\r\n selectedAgentId === null\r\n ? []\r\n : buildSkillRowsForAgent({ ...input, agents: sortedAgents }, selectedAgentId);\r\n const selectedSkillId = skills.some((row) => row.id === input.selectedSkillId)\r\n ? (input.selectedSkillId as string)\r\n : skills[0]?.id ?? null;\r\n\r\n return {\r\n agents: buildAgentRows({ ...input, agents: sortedAgents }),\r\n skills,\r\n selectedAgentId,\r\n selectedSkillId,\r\n lastScanAt: input.manifest.lastScan.at,\r\n issueCount: input.issues.length\r\n };\r\n}\r\n","import { runAdopt as defaultRunAdopt } from \"../commands/adopt\";\r\nimport { runConfigAddAgent as defaultRunConfigAddAgent } from \"../commands/config-add-agent\";\r\nimport { runConfigRemoveAgent as defaultRunConfigRemoveAgent } from \"../commands/config-remove-agent\";\r\nimport { runConfigUpdateAgent as defaultRunConfigUpdateAgent } from \"../commands/config-update-agent\";\r\nimport { runDisable as defaultRunDisable } from \"../commands/disable\";\r\nimport { runDoctor as defaultRunDoctor } from \"../commands/doctor\";\r\nimport { runEnable as defaultRunEnable } from \"../commands/enable\";\r\nimport { runImport as defaultRunImport } from \"../commands/import\";\r\nimport { runRemove as defaultRunRemove } from \"../commands/remove\";\r\nimport { runScan as defaultRunScan } from \"../commands/scan\";\r\nimport { normalizeAgentId } from \"../config/agent-override-validation\";\r\nimport type { RunConfigAddAgentResult } from \"../commands/config-add-agent\";\r\nimport type { RunConfigRemoveAgentResult } from \"../commands/config-remove-agent\";\r\nimport type { RunConfigUpdateAgentResult } from \"../commands/config-update-agent\";\r\nimport type { RunDoctorResult } from \"../commands/doctor\";\r\nimport type { RunImportResult } from \"../commands/import\";\r\nimport type { DashboardModel, TuiSkillRow } from \"./dashboard-model\";\r\nimport {\r\n normalizeRunConfigAddAgentOptions,\r\n normalizeRunConfigUpdateAgentOptions\r\n} from \"./forms\";\r\nimport {\r\n loadDashboardState,\r\n type LoadDashboardStateOptions\r\n} from \"./load-dashboard-state\";\r\nimport type { TuiPendingCommand } from \"./state\";\r\n\r\nexport type { TuiPendingCommand } from \"./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 runConfigAddAgent: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n id: string;\r\n root: string;\r\n skills?: string;\r\n name?: string;\r\n platforms?: string[];\r\n disabledByDefault?: boolean;\r\n }) => Promise<Pick<RunConfigAddAgentResult, \"output\" | \"agentId\">>;\r\n runConfigUpdateAgent: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n id: string;\r\n root?: string;\r\n skills?: string;\r\n name?: string;\r\n platforms?: string[];\r\n enabledByDefault?: boolean;\r\n disabledByDefault?: boolean;\r\n }) => Promise<Pick<RunConfigUpdateAgentResult, \"output\" | \"agentId\">>;\r\n runConfigRemoveAgent: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n id: string;\r\n }) => Promise<Pick<RunConfigRemoveAgentResult, \"output\">>;\r\n runImport: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n sourcePath: string;\r\n skillName: string;\r\n }) => Promise<Pick<RunImportResult, \"output\">>;\r\n runDoctor: (options: {\r\n homeDir?: string;\r\n skillmuxHome?: string;\r\n platform?: NodeJS.Platform;\r\n }) => Promise<RunDoctorResult>;\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 | TuiPendingCommand;\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 doctor?: RunDoctorResult;\r\n commandSucceeded?: boolean;\r\n};\r\n\r\nconst defaultServices: TuiActionServices = {\r\n runEnable: defaultRunEnable,\r\n runDisable: defaultRunDisable,\r\n runAdopt: defaultRunAdopt,\r\n runConfigAddAgent: defaultRunConfigAddAgent,\r\n runConfigUpdateAgent: defaultRunConfigUpdateAgent,\r\n runConfigRemoveAgent: defaultRunConfigRemoveAgent,\r\n runImport: defaultRunImport,\r\n runDoctor: defaultRunDoctor,\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 commandLabel(kind: TuiPendingCommand[\"kind\"]): string {\r\n if (kind === \"config-add-agent\") {\r\n return \"Config add agent\";\r\n }\r\n\r\n if (kind === \"config-update-agent\") {\r\n return \"Config update agent\";\r\n }\r\n\r\n if (kind === \"config-remove-agent\") {\r\n return \"Config remove agent\";\r\n }\r\n\r\n if (kind === \"import-skill\") {\r\n return \"Import skill\";\r\n }\r\n\r\n return \"Doctor\";\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(\r\n input: DispatchTuiActionInput,\r\n selection: {\r\n selectedAgentId?: string | null;\r\n selectedSkillId?: string | null;\r\n } = {}\r\n): LoadDashboardStateOptions {\r\n const hasSelectedAgentId = Object.prototype.hasOwnProperty.call(\r\n selection,\r\n \"selectedAgentId\"\r\n );\r\n const hasSelectedSkillId = Object.prototype.hasOwnProperty.call(\r\n selection,\r\n \"selectedSkillId\"\r\n );\r\n\r\n return {\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n platform: input.platform,\r\n selectedAgentId: hasSelectedAgentId\r\n ? selection.selectedAgentId ?? undefined\r\n : input.model.selectedAgentId ?? undefined,\r\n selectedSkillId: hasSelectedSkillId\r\n ? selection.selectedSkillId ?? undefined\r\n : 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 selection: {\r\n selectedAgentId?: string | null;\r\n selectedSkillId?: string | null;\r\n } = {}\r\n): Promise<DispatchTuiActionResult> {\r\n return {\r\n model: await services.reload(reloadOptions(input, selection)),\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\nfunction isPendingCommand(action: TuiAction | TuiPendingCommand): action is TuiPendingCommand {\r\n return typeof action === \"object\";\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 (isPendingCommand(input.action)) {\r\n if (input.action.kind === \"config-add-agent\") {\r\n const normalizedInput = normalizeRunConfigAddAgentOptions(input.action.input);\r\n const result = await services.runConfigAddAgent({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n ...normalizedInput\r\n });\r\n\r\n return reloadAfterCommand(\r\n input,\r\n services,\r\n result.output,\r\n {\r\n selectedAgentId: result.agentId ?? normalizeAgentId(normalizedInput.id),\r\n selectedSkillId: undefined\r\n }\r\n );\r\n }\r\n\r\n if (input.action.kind === \"config-update-agent\") {\r\n const normalizedInput = normalizeRunConfigUpdateAgentOptions(input.action.input);\r\n const result = await services.runConfigUpdateAgent({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n ...normalizedInput\r\n });\r\n\r\n return reloadAfterCommand(\r\n input,\r\n services,\r\n result.output,\r\n {\r\n selectedAgentId: result.agentId ?? normalizedInput.id,\r\n selectedSkillId: undefined\r\n }\r\n );\r\n }\r\n\r\n if (input.action.kind === \"config-remove-agent\") {\r\n const result = await services.runConfigRemoveAgent({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n ...input.action.input\r\n });\r\n\r\n return reloadAfterCommand(\r\n input,\r\n services,\r\n result.output,\r\n {\r\n selectedAgentId: null,\r\n selectedSkillId: undefined\r\n }\r\n );\r\n }\r\n\r\n if (input.action.kind === \"import-skill\") {\r\n const result = await services.runImport({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n ...input.action.input\r\n });\r\n\r\n return reloadAfterCommand(input, services, result.output);\r\n }\r\n\r\n const result = await services.runDoctor({\r\n homeDir: input.homeDir,\r\n skillmuxHome: input.skillmuxHome,\r\n platform: input.platform\r\n });\r\n\r\n return {\r\n model: input.model,\r\n statusMessage: stripTrailingNewlines(result.output),\r\n doctor: result\r\n };\r\n }\r\n\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 const label = isPendingCommand(input.action)\r\n ? commandLabel(input.action.kind)\r\n : actionLabel(input.action);\r\n\r\n return {\r\n model: input.model,\r\n statusMessage: `${label} failed: ${errorReason(error)}`,\r\n commandSucceeded: false\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 { DoctorDialog } from \"./DoctorDialog\";\r\nimport { DetailPane } from \"./DetailPane\";\r\nimport { Footer } from \"./Footer\";\r\nimport { HelpOverlay } from \"./HelpOverlay\";\r\nimport { FormDialog } from \"./FormDialog\";\r\nimport { SkillList } from \"./SkillList\";\r\nimport { StatusLine } from \"./StatusLine\";\r\n\r\nexport type DashboardModalInteraction = {\r\n fieldIndex: number;\r\n platformIndex: number;\r\n doctorScrollOffset: number;\r\n};\r\n\r\nexport type DashboardProps = {\r\n state: TuiState;\r\n width: number;\r\n height: number;\r\n modalInteraction?: DashboardModalInteraction;\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\nconst largeModalWidth = 72;\r\nconst largeModalHeight = 14;\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 modalInteraction\r\n}: DashboardProps) {\r\n const interaction = modalInteraction ?? {\r\n fieldIndex: 0,\r\n platformIndex: 0,\r\n doctorScrollOffset: 0\r\n };\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 largeModal =\r\n state.modal?.kind === \"add-agent\" ||\r\n state.modal?.kind === \"edit-agent\" ||\r\n state.modal?.kind === \"import\" ||\r\n state.modal?.kind === \"doctor\" ||\r\n state.modal?.kind === \"confirm-remove-agent\";\r\n const overlayHeight =\r\n largeModal\r\n ? 0\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 footerSpace =\r\n state.modal === null ? footerHeight : largeModal ? 0 : footerHeight;\r\n const bodyHeight = Math.max(height - 1 - footerSpace - overlayHeight, 0);\r\n const { agentWidth, skillWidth, detailWidth } = paneWidths(width);\r\n const modalWidth = Math.min(width - 4, largeModalWidth);\r\n const modalHeight = Math.min(bodyHeight, largeModalHeight);\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 {largeModal ? (\r\n <Box\r\n flexDirection=\"column\"\r\n width={width}\r\n height={bodyHeight}\r\n justifyContent=\"center\"\r\n alignItems=\"center\"\r\n >\r\n <Box width={modalWidth} height={modalHeight}>\r\n {state.modal?.kind === \"add-agent\" || state.modal?.kind === \"edit-agent\" || state.modal?.kind === \"import\" ? (\r\n <FormDialog\r\n modal={state.modal}\r\n fieldIndex={interaction.fieldIndex}\r\n platformIndex={interaction.platformIndex}\r\n width={modalWidth}\r\n height={modalHeight}\r\n />\r\n ) : state.modal?.kind === \"doctor\" ? (\r\n <DoctorDialog\r\n modal={state.modal}\r\n scrollOffset={interaction.doctorScrollOffset}\r\n width={modalWidth}\r\n height={modalHeight}\r\n />\r\n ) : state.modal?.kind === \"confirm-remove-agent\" ? (\r\n <ConfirmDialog modal={state.modal} />\r\n ) : null}\r\n </Box>\r\n </Box>\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 )}\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 state.modal?.kind === \"confirm-discard-dirty-form\" ? (\r\n <ConfirmDialog modal={state.modal} />\r\n ) : null}\r\n {state.modal === null ? (\r\n <Footer actions={actions} search={state.search} />\r\n ) : largeModal ? null : (\r\n <Box height={3} />\r\n )}\r\n </Box>\r\n );\r\n}\r\n","import type { RunDoctorResult } from \"../commands/doctor\";\r\nimport {\r\n buildRunConfigAddAgentOptions,\r\n buildRunConfigUpdateAgentOptions,\r\n buildRunImportOptions,\r\n createConfigAddAgentForm,\r\n createConfigUpdateAgentForm,\r\n createConfigUpdateAgentFormFromSeed,\r\n createImportSkillForm,\r\n updateConfigAddAgentFormField,\r\n updateConfigUpdateAgentFormField,\r\n updateImportSkillFormField,\r\n validateConfigAddAgentForm,\r\n validateConfigUpdateAgentForm,\r\n validateImportSkillForm,\r\n type ConfigAddAgentForm,\r\n type ConfigAddAgentFormValues,\r\n type ConfigUpdateAgentForm,\r\n type ConfigUpdateAgentFormValues,\r\n type ImportSkillForm,\r\n type ImportSkillFormValues\r\n} from \"./forms\";\r\nimport 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 | { kind: \"add-agent\"; form: ConfigAddAgentForm }\r\n | { kind: \"edit-agent\"; agentId: string; form: ConfigUpdateAgentForm }\r\n | { kind: \"confirm-remove-agent\"; agentId: string }\r\n | { kind: \"import\"; form: ImportSkillForm }\r\n | DoctorModal\r\n | { kind: \"confirm-discard-dirty-form\"; modal: TuiFormModal };\r\n\r\nexport type TuiFormModal =\r\n | { kind: \"add-agent\"; form: ConfigAddAgentForm }\r\n | { kind: \"edit-agent\"; agentId: string; form: ConfigUpdateAgentForm }\r\n | { kind: \"import\"; form: ImportSkillForm };\r\n\r\nexport type DoctorModal =\r\n | { kind: \"doctor\"; status: \"loading\" }\r\n | { kind: \"doctor\"; status: \"ready\"; report: RunDoctorResult }\r\n | { kind: \"doctor\"; status: \"error\"; errorMessage: string };\r\n\r\nexport type TuiPendingCommand =\r\n | {\r\n kind: \"config-add-agent\";\r\n input: ReturnType<typeof buildRunConfigAddAgentOptions>;\r\n }\r\n | {\r\n kind: \"config-update-agent\";\r\n input: ReturnType<typeof buildRunConfigUpdateAgentOptions>;\r\n }\r\n | {\r\n kind: \"config-remove-agent\";\r\n input: { id: string };\r\n }\r\n | {\r\n kind: \"import-skill\";\r\n input: ReturnType<typeof buildRunImportOptions>;\r\n }\r\n | { kind: \"doctor\" };\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 pendingCommand: TuiPendingCommand | 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: \"open-add-agent\" }\r\n | { type: \"open-edit-agent\" }\r\n | { type: \"open-remove-agent\" }\r\n | { type: \"open-import\" }\r\n | { type: \"open-doctor\" }\r\n | { type: \"open-discard-dirty-form\" }\r\n | {\r\n type: \"add-agent-form-field-changed\";\r\n field: keyof ConfigAddAgentFormValues;\r\n value: ConfigAddAgentFormValues[keyof ConfigAddAgentFormValues];\r\n }\r\n | {\r\n type: \"edit-agent-form-field-changed\";\r\n field: keyof ConfigUpdateAgentFormValues;\r\n value: ConfigUpdateAgentFormValues[keyof ConfigUpdateAgentFormValues];\r\n }\r\n | {\r\n type: \"import-form-field-changed\";\r\n field: keyof ImportSkillFormValues;\r\n value: ImportSkillFormValues[keyof ImportSkillFormValues];\r\n }\r\n | { type: \"submit-add-agent-form\" }\r\n | { type: \"submit-edit-agent-form\" }\r\n | { type: \"submit-remove-agent\" }\r\n | { type: \"submit-import-form\" }\r\n | { type: \"doctor-result-loaded\"; report: RunDoctorResult }\r\n | { type: \"doctor-result-failed\"; errorMessage: string }\r\n | { type: \"confirm-discard-dirty-form\" }\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 addAgent?: boolean;\r\n editAgent?: boolean;\r\n removeAgent?: boolean;\r\n importSkill?: boolean;\r\n doctor?: boolean;\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.hasUserOverride === true ||\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 pendingCommand: null,\r\n statusMessage: null\r\n };\r\n}\r\n\r\nfunction isFormModal(modal: TuiModal | null): modal is TuiFormModal {\r\n return modal?.kind === \"add-agent\" || modal?.kind === \"edit-agent\" || modal?.kind === \"import\";\r\n}\r\n\r\nfunction isDoctorModal(modal: TuiModal | null): modal is DoctorModal {\r\n return modal?.kind === \"doctor\";\r\n}\r\n\r\nfunction dirtyFormError(modal: TuiFormModal): string | null {\r\n if (modal.kind === \"add-agent\") {\r\n return validateConfigAddAgentForm(modal.form);\r\n }\r\n\r\n if (modal.kind === \"edit-agent\") {\r\n return validateConfigUpdateAgentForm(modal.form);\r\n }\r\n\r\n return validateImportSkillForm(modal.form);\r\n}\r\n\r\nfunction updateFormError(modal: TuiFormModal, error: string | null): TuiFormModal {\r\n if (modal.kind === \"add-agent\") {\r\n return { ...modal, form: { ...modal.form, error } };\r\n }\r\n\r\n if (modal.kind === \"edit-agent\") {\r\n return { ...modal, form: { ...modal.form, error } };\r\n }\r\n\r\n return { ...modal, form: { ...modal.form, error } };\r\n}\r\n\r\nfunction restoreDismissedForm(modal: TuiModal): TuiModal {\r\n if (modal.kind !== \"confirm-discard-dirty-form\") {\r\n return modal;\r\n }\r\n\r\n return modal.modal;\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 === \"open-add-agent\" ||\r\n event.type === \"open-edit-agent\" ||\r\n event.type === \"open-remove-agent\" ||\r\n event.type === \"open-import\" ||\r\n event.type === \"open-doctor\" ||\r\n event.type === \"open-discard-dirty-form\" ||\r\n event.type === \"submit-remove-agent\" ||\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 const canEditSelectedAgent = selectedAgent?.canEditOverride === true;\r\n const canRemoveSelectedAgent = selectedAgent?.canRemoveOverride === true;\r\n\r\n return {\r\n addAgent: canAcceptActions,\r\n editAgent: canAcceptActions && canEditSelectedAgent,\r\n removeAgent: canAcceptActions && canRemoveSelectedAgent,\r\n importSkill: canAcceptActions,\r\n doctor: canAcceptActions,\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 consumePendingCommandIntent(state: TuiState): {\r\n state: TuiState;\r\n command: TuiPendingCommand | null;\r\n} {\r\n return {\r\n state: {\r\n ...state,\r\n pendingCommand: null\r\n },\r\n command: state.pendingCommand\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 pendingCommand: 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 === \"confirm-discard-dirty-form\") {\r\n if (state.modal.kind !== \"confirm-discard-dirty-form\") {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n modal: null,\r\n pendingCommand: null\r\n };\r\n }\r\n\r\n if (event.type === \"close\") {\r\n if (state.modal.kind === \"confirm-discard-dirty-form\") {\r\n return {\r\n ...state,\r\n modal: restoreDismissedForm(state.modal)\r\n };\r\n }\r\n\r\n if (isFormModal(state.modal) && state.modal.form.dirty) {\r\n return {\r\n ...state,\r\n modal: {\r\n kind: \"confirm-discard-dirty-form\",\r\n modal: state.modal\r\n }\r\n };\r\n }\r\n\r\n return {\r\n ...state,\r\n modal: null,\r\n pendingAction: null,\r\n pendingCommand: 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 (state.modal.kind === \"doctor\") {\r\n if (event.type === \"doctor-result-loaded\") {\r\n return {\r\n ...state,\r\n modal: {\r\n kind: \"doctor\",\r\n status: \"ready\",\r\n report: event.report\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"doctor-result-failed\") {\r\n return {\r\n ...state,\r\n modal: {\r\n kind: \"doctor\",\r\n status: \"error\",\r\n errorMessage: event.errorMessage\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (state.modal.kind === \"add-agent\") {\r\n if (event.type === \"add-agent-form-field-changed\") {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: updateConfigAddAgentFormField(\r\n state.modal.form,\r\n event.field,\r\n event.value as never\r\n )\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"submit-add-agent-form\") {\r\n const error = validateConfigAddAgentForm(state.modal.form);\r\n\r\n if (error !== null) {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error\r\n }\r\n }\r\n };\r\n }\r\n\r\n return {\r\n ...state,\r\n pendingCommand: {\r\n kind: \"config-add-agent\",\r\n input: buildRunConfigAddAgentOptions(state.modal.form)\r\n },\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error: null\r\n }\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (state.modal.kind === \"edit-agent\") {\r\n if (event.type === \"edit-agent-form-field-changed\") {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: updateConfigUpdateAgentFormField(\r\n state.modal.form,\r\n event.field,\r\n event.value as never\r\n )\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"submit-edit-agent-form\") {\r\n const error = validateConfigUpdateAgentForm(state.modal.form);\r\n\r\n if (error !== null) {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error\r\n }\r\n }\r\n };\r\n }\r\n\r\n return {\r\n ...state,\r\n pendingCommand: {\r\n kind: \"config-update-agent\",\r\n input: buildRunConfigUpdateAgentOptions(state.modal.form, state.modal.agentId)\r\n },\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error: null\r\n }\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (state.modal.kind === \"confirm-remove-agent\") {\r\n if (event.type === \"submit-remove-agent\") {\r\n return {\r\n ...state,\r\n pendingCommand: {\r\n kind: \"config-remove-agent\",\r\n input: { id: state.modal.agentId }\r\n }\r\n };\r\n }\r\n }\r\n\r\n if (state.modal.kind === \"import\") {\r\n if (event.type === \"import-form-field-changed\") {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: updateImportSkillFormField(\r\n state.modal.form,\r\n event.field,\r\n event.value as never\r\n )\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"submit-import-form\") {\r\n const error = validateImportSkillForm(state.modal.form);\r\n\r\n if (error !== null) {\r\n return {\r\n ...state,\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error\r\n }\r\n }\r\n };\r\n }\r\n\r\n return {\r\n ...state,\r\n pendingCommand: {\r\n kind: \"import-skill\",\r\n input: buildRunImportOptions(state.modal.form)\r\n },\r\n modal: {\r\n ...state.modal,\r\n form: {\r\n ...state.modal.form,\r\n error: null\r\n }\r\n }\r\n };\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 event.type === \"open-add-agent\" ||\r\n event.type === \"open-edit-agent\" ||\r\n event.type === \"open-remove-agent\" ||\r\n event.type === \"open-import\" ||\r\n event.type === \"open-doctor\" ||\r\n event.type === \"open-discard-dirty-form\"\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 === \"open-add-agent\") {\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"add-agent\",\r\n form: createConfigAddAgentForm()\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"open-edit-agent\") {\r\n const selectedAgent = selectedAgentRow(state);\r\n\r\n if (selectedAgent?.canEditOverride !== true) {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Select an agent override first\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"edit-agent\",\r\n agentId: selectedAgent.id,\r\n form: createConfigUpdateAgentFormFromSeed({\r\n id: selectedAgent.id,\r\n stableName: selectedAgent.overrideStableName,\r\n homeRelativeRootPath: selectedAgent.overrideHomeRelativeRootPath,\r\n skillsDirectoryPath: selectedAgent.overrideSkillsDirectoryPath,\r\n supportedPlatforms: selectedAgent.overrideSupportedPlatforms,\r\n overrideEnabledByDefault: selectedAgent.overrideEnabledByDefault\r\n })\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"open-remove-agent\") {\r\n const selectedAgent = selectedAgentRow(state);\r\n\r\n if (selectedAgent?.canRemoveOverride !== true) {\r\n return {\r\n ...readyState,\r\n statusMessage: \"Select an agent override first\"\r\n };\r\n }\r\n\r\n return {\r\n ...readyState,\r\n modal: { kind: \"confirm-remove-agent\", agentId: selectedAgent.id }\r\n };\r\n }\r\n\r\n if (event.type === \"open-import\") {\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"import\",\r\n form: createImportSkillForm()\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"open-doctor\") {\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"doctor\",\r\n status: \"loading\"\r\n },\r\n pendingCommand: {\r\n kind: \"doctor\"\r\n }\r\n };\r\n }\r\n\r\n if (event.type === \"open-discard-dirty-form\") {\r\n return {\r\n ...readyState,\r\n modal: {\r\n kind: \"confirm-discard-dirty-form\",\r\n modal: {\r\n kind: \"add-agent\",\r\n form: createConfigAddAgentForm()\r\n }\r\n }\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\" }\r\n | { kind: \"confirm-adopt-all\" }\r\n | { kind: \"confirm-remove\" }\r\n | { kind: \"confirm-remove-agent\" }\r\n | { kind: \"confirm-discard-dirty-form\" }\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 if (modal.kind === \"confirm-remove-agent\") {\r\n return `Remove agent override for ${modal.agentId}?`;\r\n }\r\n\r\n if (modal.kind === \"confirm-discard-dirty-form\") {\r\n return \"Discard unsaved changes?\";\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 if (modal.kind === \"confirm-remove-agent\") {\r\n return \"This will remove the selected agent override from SkillMux.\";\r\n }\r\n\r\n if (modal.kind === \"confirm-discard-dirty-form\") {\r\n return \"This will close the form and discard the current changes.\";\r\n }\r\n\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\r\n bold\r\n color={\r\n modal.kind === \"confirm-remove\" || modal.kind === \"confirm-remove-agent\"\r\n ? \"yellow\"\r\n : \"cyan\"\r\n }\r\n >\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\";\r\nimport type { DoctorModal } from \"../state\";\r\n\r\nexport type DoctorDialogProps = {\r\n modal: DoctorModal;\r\n scrollOffset?: number;\r\n width?: number;\r\n height?: number;\r\n};\r\n\r\ntype DoctorIssue = NonNullable<Extract<DoctorModal, { status: \"ready\" }>[\"report\"][\"issues\"]>[number];\r\n\r\nfunction issueLabel(issue: DoctorIssue): string {\r\n return `${issue.severity} ${issue.code}`;\r\n}\r\n\r\nfunction issuePath(issue: DoctorIssue): string | null {\r\n return issue.path ?? null;\r\n}\r\n\r\nfunction visibleIssueCount(height: number): number {\r\n return Math.max(height - 5, 1);\r\n}\r\n\r\nexport function DoctorDialog({\r\n modal,\r\n scrollOffset = 0,\r\n width = 72,\r\n height = 14\r\n}: DoctorDialogProps) {\r\n if (modal.status === \"loading\") {\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <Text bold>Doctor</Text>\r\n <Text>Loading doctor diagnostics...</Text>\r\n <Text dimColor>[Esc] close</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n if (modal.status === \"error\") {\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <Text bold>Doctor</Text>\r\n <Text color=\"red\">{modal.errorMessage}</Text>\r\n <Text dimColor>[Esc] close</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n const issues = modal.report.issues;\r\n const maxIssues = visibleIssueCount(height);\r\n const maxOffset = Math.max(issues.length - maxIssues, 0);\r\n const clampedOffset = Math.min(Math.max(scrollOffset, 0), maxOffset);\r\n const visibleIssues = issues.slice(clampedOffset, clampedOffset + maxIssues);\r\n\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <Text bold>Doctor</Text>\r\n <Text dimColor>{issues.length === 0 ? \"No doctor issues found.\" : `${issues.length} issue(s) found`}</Text>\r\n {issues.length === 0 ? null : (\r\n <>\r\n {visibleIssues.map((issue) => (\r\n <Text key={`${issue.code}:${issue.path ?? issue.message}`}>\r\n <Text color={issue.severity === \"error\" ? \"red\" : \"yellow\"}>! </Text>\r\n <Text>\r\n {issueLabel(issue)} - {issue.message}\r\n {issuePath(issue) === null ? \"\" : ` - ${issuePath(issue)}`}\r\n </Text>\r\n </Text>\r\n ))}\r\n {issues.length > visibleIssues.length ? (\r\n <Text dimColor>\r\n Showing {clampedOffset + 1}-{clampedOffset + visibleIssues.length} of {issues.length}\r\n </Text>\r\n ) : null}\r\n </>\r\n )}\r\n <Text dimColor>[Up/Down] scroll [Esc] close</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 actions.addAgent ? \"[n]add agent\" : null,\r\n actions.editAgent ? \"[e]edit agent\" : null,\r\n actions.removeAgent ? \"[X]remove agent\" : null,\r\n actions.importSkill ? \"[i]import\" : null,\r\n actions.doctor ? \"[d]doctor\" : null,\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>\r\n : Space toggles, a adopts, Shift+A current-agent bulk adopt, r removes, s scans, n add agent, e edit selected override, X remove selected override, i import, d doctor.\r\n </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 { ReactElement } from \"react\";\r\nimport type { TuiModal } from \"../state\";\r\n\r\nexport type FormDialogModal = Extract<\r\n TuiModal,\r\n { kind: \"add-agent\" } | { kind: \"edit-agent\" } | { kind: \"import\" }\r\n>;\r\n\r\nexport type FormDialogProps = {\r\n modal: FormDialogModal;\r\n fieldIndex?: number;\r\n platformIndex?: number;\r\n width?: number;\r\n height?: number;\r\n};\r\n\r\nconst platformOptions = [\"win32\", \"linux\", \"darwin\"] as const;\r\n\r\nfunction checkbox(value: boolean): string {\r\n return value ? \"[x]\" : \"[ ]\";\r\n}\r\n\r\nfunction renderTextField(\r\n label: string,\r\n value: string,\r\n active: boolean\r\n): ReactElement {\r\n return (\r\n <Text key={label} inverse={active}>\r\n <Text bold>{label}: </Text>\r\n <Text>{value.length > 0 ? value : \" \"}</Text>\r\n </Text>\r\n );\r\n}\r\n\r\nfunction renderBooleanField(\r\n label: string,\r\n value: boolean,\r\n active: boolean\r\n): ReactElement {\r\n return (\r\n <Text key={label} inverse={active}>\r\n <Text bold>{label}: </Text>\r\n <Text>{checkbox(value)}</Text>\r\n </Text>\r\n );\r\n}\r\n\r\nfunction renderPlatformField(\r\n selectedPlatforms: string[],\r\n activePlatformIndex: number,\r\n active: boolean\r\n): ReactElement[] {\r\n return platformOptions.map((platform, index) => {\r\n const selected = selectedPlatforms.includes(platform);\r\n const isCurrent = active && index === activePlatformIndex;\r\n\r\n return (\r\n <Text key={platform} inverse={isCurrent}>\r\n <Text>{isCurrent ? \"> \" : \" \"}</Text>\r\n <Text>{checkbox(selected)} </Text>\r\n <Text>{platform}</Text>\r\n </Text>\r\n );\r\n });\r\n}\r\n\r\nexport function FormDialog({\r\n modal,\r\n fieldIndex = 0,\r\n platformIndex = 0,\r\n width = 72,\r\n height = 14\r\n}: FormDialogProps) {\r\n const activeField = fieldIndex;\r\n const submitFieldIndex = modal.kind === \"import\" ? 2 : 6;\r\n\r\n if (modal.kind === \"import\") {\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <Text bold>Import skill</Text>\r\n {modal.form.error === null ? null : <Text color=\"red\">{modal.form.error}</Text>}\r\n {renderTextField(\r\n \"Source path\",\r\n modal.form.values.sourcePath,\r\n activeField === 0\r\n )}\r\n {renderTextField(\r\n \"Skill name\",\r\n modal.form.values.skillName,\r\n activeField === 1\r\n )}\r\n <Text inverse={activeField === submitFieldIndex}>Submit</Text>\r\n <Text dimColor>[Up/Down] move [Enter] submit selected row [Esc] cancel</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n const title =\r\n modal.kind === \"add-agent\"\r\n ? \"Add agent\"\r\n : `Edit agent ${modal.agentId}`;\r\n const fields =\r\n modal.kind === \"add-agent\"\r\n ? [\r\n renderTextField(\"Agent id\", modal.form.values.id, activeField === 0),\r\n renderTextField(\"Root path\", modal.form.values.root, activeField === 1),\r\n renderTextField(\"Skills path\", modal.form.values.skills, activeField === 2),\r\n renderTextField(\"Display name\", modal.form.values.name, activeField === 3)\r\n ]\r\n : [\r\n renderTextField(\"Root path\", modal.form.values.root, activeField === 0),\r\n renderTextField(\"Skills path\", modal.form.values.skills, activeField === 1),\r\n renderTextField(\"Display name\", modal.form.values.name, activeField === 2)\r\n ];\r\n\r\n const platformFieldIndex = modal.kind === \"add-agent\" ? 4 : 3;\r\n const booleanFieldIndex = modal.kind === \"add-agent\" ? 5 : 4;\r\n const platformLines = renderPlatformField(\r\n modal.form.values.platforms,\r\n platformIndex,\r\n activeField === platformFieldIndex\r\n );\r\n const booleanLabel =\r\n modal.kind === \"add-agent\"\r\n ? \"Disabled by default\"\r\n : \"Enabled by default\";\r\n const booleanValue =\r\n modal.kind === \"add-agent\"\r\n ? modal.form.values.disabledByDefault\r\n : modal.form.values.enabledByDefault;\r\n const secondaryBooleanLabel =\r\n modal.kind === \"add-agent\" ? null : \"Disabled by default\";\r\n\r\n return (\r\n <Box flexDirection=\"column\" width={width} height={height}>\r\n <Text bold>{title}</Text>\r\n {modal.form.error === null ? null : <Text color=\"red\">{modal.form.error}</Text>}\r\n {fields}\r\n <Text bold inverse={activeField === platformFieldIndex}>\r\n Platforms\r\n </Text>\r\n {platformLines}\r\n {renderBooleanField(\r\n booleanLabel,\r\n booleanValue,\r\n activeField === booleanFieldIndex\r\n )}\r\n {secondaryBooleanLabel === null\r\n ? null\r\n : renderBooleanField(\r\n secondaryBooleanLabel,\r\n modal.form.values.disabledByDefault,\r\n activeField === booleanFieldIndex + 1\r\n )}\r\n <Text inverse={activeField === submitFieldIndex}>Submit</Text>\r\n {modal.kind === \"edit-agent\" ? (\r\n <Text dimColor>Leaving both defaults unchecked preserves the current setting.</Text>\r\n ) : null}\r\n <Text dimColor>[Up/Down] move [Enter] submit selected row [Esc] cancel</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","issuePath","result","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Fragment","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsx","jsxs","Box","Text","jsx","defaultServices","platformOptions","errorReason","jsx","defaultServices","requestId","platform","platformOptions","Text","jsx","resolve"]}
|