ankui 0.1.0
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/LICENSE +21 -0
- package/README.md +369 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +192 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/access.d.ts +6 -0
- package/dist/commands/access.js +12 -0
- package/dist/commands/access.js.map +1 -0
- package/dist/commands/caps.d.ts +6 -0
- package/dist/commands/caps.js +12 -0
- package/dist/commands/caps.js.map +1 -0
- package/dist/commands/discover.d.ts +10 -0
- package/dist/commands/discover.js +120 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +12 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/launch-tui.d.ts +15 -0
- package/dist/commands/launch-tui.js +53 -0
- package/dist/commands/launch-tui.js.map +1 -0
- package/dist/commands/list.d.ts +11 -0
- package/dist/commands/list.js +51 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.js +12 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/scan-all.d.ts +15 -0
- package/dist/commands/scan-all.js +32 -0
- package/dist/commands/scan-all.js.map +1 -0
- package/dist/commands/show.d.ts +7 -0
- package/dist/commands/show.js +12 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/watch.d.ts +32 -0
- package/dist/commands/watch.js +205 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/ankui-config.d.ts +13 -0
- package/dist/config/ankui-config.js +123 -0
- package/dist/config/ankui-config.js.map +1 -0
- package/dist/scanner/access-review.d.ts +2 -0
- package/dist/scanner/access-review.js +183 -0
- package/dist/scanner/access-review.js.map +1 -0
- package/dist/scanner/adapters/claude.d.ts +2 -0
- package/dist/scanner/adapters/claude.js +298 -0
- package/dist/scanner/adapters/claude.js.map +1 -0
- package/dist/scanner/adapters/codex.d.ts +2 -0
- package/dist/scanner/adapters/codex.js +152 -0
- package/dist/scanner/adapters/codex.js.map +1 -0
- package/dist/scanner/adapters/cursor.d.ts +2 -0
- package/dist/scanner/adapters/cursor.js +114 -0
- package/dist/scanner/adapters/cursor.js.map +1 -0
- package/dist/scanner/adapters/gemini.d.ts +2 -0
- package/dist/scanner/adapters/gemini.js +191 -0
- package/dist/scanner/adapters/gemini.js.map +1 -0
- package/dist/scanner/adapters/index.d.ts +35 -0
- package/dist/scanner/adapters/index.js +85 -0
- package/dist/scanner/adapters/index.js.map +1 -0
- package/dist/scanner/adapters/opencode.d.ts +2 -0
- package/dist/scanner/adapters/opencode.js +231 -0
- package/dist/scanner/adapters/opencode.js.map +1 -0
- package/dist/scanner/adapters/shared.d.ts +57 -0
- package/dist/scanner/adapters/shared.js +239 -0
- package/dist/scanner/adapters/shared.js.map +1 -0
- package/dist/scanner/adapters/skills-sh.d.ts +2 -0
- package/dist/scanner/adapters/skills-sh.js +71 -0
- package/dist/scanner/adapters/skills-sh.js.map +1 -0
- package/dist/scanner/capability-map.d.ts +8 -0
- package/dist/scanner/capability-map.js +57 -0
- package/dist/scanner/capability-map.js.map +1 -0
- package/dist/scanner/discovery.d.ts +31 -0
- package/dist/scanner/discovery.js +320 -0
- package/dist/scanner/discovery.js.map +1 -0
- package/dist/scanner/filesystem-crawler.d.ts +32 -0
- package/dist/scanner/filesystem-crawler.js +210 -0
- package/dist/scanner/filesystem-crawler.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.js +120 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/multi-project.d.ts +31 -0
- package/dist/scanner/multi-project.js +227 -0
- package/dist/scanner/multi-project.js.map +1 -0
- package/dist/scanner/parallel.d.ts +4 -0
- package/dist/scanner/parallel.js +41 -0
- package/dist/scanner/parallel.js.map +1 -0
- package/dist/scanner/parsing.d.ts +9 -0
- package/dist/scanner/parsing.js +135 -0
- package/dist/scanner/parsing.js.map +1 -0
- package/dist/scanner/paths.d.ts +8 -0
- package/dist/scanner/paths.js +39 -0
- package/dist/scanner/paths.js.map +1 -0
- package/dist/scanner/preview.d.ts +12 -0
- package/dist/scanner/preview.js +29 -0
- package/dist/scanner/preview.js.map +1 -0
- package/dist/scanner/project-discovery.d.ts +11 -0
- package/dist/scanner/project-discovery.js +35 -0
- package/dist/scanner/project-discovery.js.map +1 -0
- package/dist/scanner/ripgrep.d.ts +11 -0
- package/dist/scanner/ripgrep.js +61 -0
- package/dist/scanner/ripgrep.js.map +1 -0
- package/dist/scanner/safety.d.ts +37 -0
- package/dist/scanner/safety.js +330 -0
- package/dist/scanner/safety.js.map +1 -0
- package/dist/scanner/skill-naming.d.ts +5 -0
- package/dist/scanner/skill-naming.js +53 -0
- package/dist/scanner/skill-naming.js.map +1 -0
- package/dist/scanner/watcher.d.ts +15 -0
- package/dist/scanner/watcher.js +71 -0
- package/dist/scanner/watcher.js.map +1 -0
- package/dist/tui/App.d.ts +33 -0
- package/dist/tui/App.js +201 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/components/Breadcrumb.d.ts +10 -0
- package/dist/tui/components/Breadcrumb.js +11 -0
- package/dist/tui/components/Breadcrumb.js.map +1 -0
- package/dist/tui/components/DisclosureRow.d.ts +17 -0
- package/dist/tui/components/DisclosureRow.js +13 -0
- package/dist/tui/components/DisclosureRow.js.map +1 -0
- package/dist/tui/components/DotLeaderRow.d.ts +17 -0
- package/dist/tui/components/DotLeaderRow.js +34 -0
- package/dist/tui/components/DotLeaderRow.js.map +1 -0
- package/dist/tui/components/EmptyStateWhisper.d.ts +5 -0
- package/dist/tui/components/EmptyStateWhisper.js +6 -0
- package/dist/tui/components/EmptyStateWhisper.js.map +1 -0
- package/dist/tui/components/Frame.d.ts +15 -0
- package/dist/tui/components/Frame.js +21 -0
- package/dist/tui/components/Frame.js.map +1 -0
- package/dist/tui/components/IdleWhisper.d.ts +11 -0
- package/dist/tui/components/IdleWhisper.js +12 -0
- package/dist/tui/components/IdleWhisper.js.map +1 -0
- package/dist/tui/components/KeyHint.d.ts +13 -0
- package/dist/tui/components/KeyHint.js +12 -0
- package/dist/tui/components/KeyHint.js.map +1 -0
- package/dist/tui/components/LoadingSplash.d.ts +12 -0
- package/dist/tui/components/LoadingSplash.js +55 -0
- package/dist/tui/components/LoadingSplash.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +16 -0
- package/dist/tui/components/ProgressBar.js +24 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/SearchBox.d.ts +5 -0
- package/dist/tui/components/SearchBox.js +6 -0
- package/dist/tui/components/SearchBox.js.map +1 -0
- package/dist/tui/components/SectionHeader.d.ts +12 -0
- package/dist/tui/components/SectionHeader.js +14 -0
- package/dist/tui/components/SectionHeader.js.map +1 -0
- package/dist/tui/components/SkillViewport.d.ts +8 -0
- package/dist/tui/components/SkillViewport.js +42 -0
- package/dist/tui/components/SkillViewport.js.map +1 -0
- package/dist/tui/components/Spinner.d.ts +11 -0
- package/dist/tui/components/Spinner.js +13 -0
- package/dist/tui/components/Spinner.js.map +1 -0
- package/dist/tui/components/StatusPill.d.ts +13 -0
- package/dist/tui/components/StatusPill.js +15 -0
- package/dist/tui/components/StatusPill.js.map +1 -0
- package/dist/tui/components/TabBar.d.ts +20 -0
- package/dist/tui/components/TabBar.js +26 -0
- package/dist/tui/components/TabBar.js.map +1 -0
- package/dist/tui/components/TextInput.d.ts +13 -0
- package/dist/tui/components/TextInput.js +34 -0
- package/dist/tui/components/TextInput.js.map +1 -0
- package/dist/tui/hooks/use-idle-whisper.d.ts +17 -0
- package/dist/tui/hooks/use-idle-whisper.js +66 -0
- package/dist/tui/hooks/use-idle-whisper.js.map +1 -0
- package/dist/tui/hooks/use-rotating-message.d.ts +20 -0
- package/dist/tui/hooks/use-rotating-message.js +34 -0
- package/dist/tui/hooks/use-rotating-message.js.map +1 -0
- package/dist/tui/input/use-keys.d.ts +16 -0
- package/dist/tui/input/use-keys.js +32 -0
- package/dist/tui/input/use-keys.js.map +1 -0
- package/dist/tui/messages.d.ts +18 -0
- package/dist/tui/messages.js +59 -0
- package/dist/tui/messages.js.map +1 -0
- package/dist/tui/render.d.ts +12 -0
- package/dist/tui/render.js +112 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/screens/AccessTab.d.ts +6 -0
- package/dist/tui/screens/AccessTab.js +26 -0
- package/dist/tui/screens/AccessTab.js.map +1 -0
- package/dist/tui/screens/DoctorTab.d.ts +6 -0
- package/dist/tui/screens/DoctorTab.js +24 -0
- package/dist/tui/screens/DoctorTab.js.map +1 -0
- package/dist/tui/screens/FirstRunScan.d.ts +11 -0
- package/dist/tui/screens/FirstRunScan.js +128 -0
- package/dist/tui/screens/FirstRunScan.js.map +1 -0
- package/dist/tui/screens/McpsTab.d.ts +6 -0
- package/dist/tui/screens/McpsTab.js +30 -0
- package/dist/tui/screens/McpsTab.js.map +1 -0
- package/dist/tui/screens/Overview.d.ts +6 -0
- package/dist/tui/screens/Overview.js +75 -0
- package/dist/tui/screens/Overview.js.map +1 -0
- package/dist/tui/screens/ProjectDrillIn.d.ts +10 -0
- package/dist/tui/screens/ProjectDrillIn.js +16 -0
- package/dist/tui/screens/ProjectDrillIn.js.map +1 -0
- package/dist/tui/screens/Settings.d.ts +8 -0
- package/dist/tui/screens/Settings.js +71 -0
- package/dist/tui/screens/Settings.js.map +1 -0
- package/dist/tui/screens/ToolTab.d.ts +9 -0
- package/dist/tui/screens/ToolTab.js +38 -0
- package/dist/tui/screens/ToolTab.js.map +1 -0
- package/dist/tui/screens/UserScopeDrillIn.d.ts +13 -0
- package/dist/tui/screens/UserScopeDrillIn.js +15 -0
- package/dist/tui/screens/UserScopeDrillIn.js.map +1 -0
- package/dist/tui/state/navigation.d.ts +1 -0
- package/dist/tui/state/navigation.js +11 -0
- package/dist/tui/state/navigation.js.map +1 -0
- package/dist/tui/state/settings-state.d.ts +22 -0
- package/dist/tui/state/settings-state.js +30 -0
- package/dist/tui/state/settings-state.js.map +1 -0
- package/dist/tui/state/tui-state.d.ts +57 -0
- package/dist/tui/state/tui-state.js +86 -0
- package/dist/tui/state/tui-state.js.map +1 -0
- package/dist/tui/theme/borders.d.ts +20 -0
- package/dist/tui/theme/borders.js +25 -0
- package/dist/tui/theme/borders.js.map +1 -0
- package/dist/tui/theme/colors.d.ts +14 -0
- package/dist/tui/theme/colors.js +18 -0
- package/dist/tui/theme/colors.js.map +1 -0
- package/dist/tui/theme/icons.d.ts +30 -0
- package/dist/tui/theme/icons.js +51 -0
- package/dist/tui/theme/icons.js.map +1 -0
- package/dist/tui/util/doctor-grouping.d.ts +27 -0
- package/dist/tui/util/doctor-grouping.js +67 -0
- package/dist/tui/util/doctor-grouping.js.map +1 -0
- package/dist/tui/util/finding-grouping.d.ts +24 -0
- package/dist/tui/util/finding-grouping.js +43 -0
- package/dist/tui/util/finding-grouping.js.map +1 -0
- package/dist/tui/util/mcp-grouping.d.ts +27 -0
- package/dist/tui/util/mcp-grouping.js +96 -0
- package/dist/tui/util/mcp-grouping.js.map +1 -0
- package/dist/tui/util/scan-history.d.ts +15 -0
- package/dist/tui/util/scan-history.js +43 -0
- package/dist/tui/util/scan-history.js.map +1 -0
- package/dist/tui/util/skill-filter.d.ts +2 -0
- package/dist/tui/util/skill-filter.js +7 -0
- package/dist/tui/util/skill-filter.js.map +1 -0
- package/dist/tui/util/skill-grouping.d.ts +3 -0
- package/dist/tui/util/skill-grouping.js +31 -0
- package/dist/tui/util/skill-grouping.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.js +143 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +1 -0
- package/dist/utils/errors.js +7 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format-access.d.ts +3 -0
- package/dist/utils/format-access.js +94 -0
- package/dist/utils/format-access.js.map +1 -0
- package/dist/utils/format-caps.d.ts +3 -0
- package/dist/utils/format-caps.js +139 -0
- package/dist/utils/format-caps.js.map +1 -0
- package/dist/utils/format-doctor.d.ts +3 -0
- package/dist/utils/format-doctor.js +105 -0
- package/dist/utils/format-doctor.js.map +1 -0
- package/dist/utils/format-list.d.ts +7 -0
- package/dist/utils/format-list.js +112 -0
- package/dist/utils/format-list.js.map +1 -0
- package/dist/utils/format-mcp.d.ts +3 -0
- package/dist/utils/format-mcp.js +130 -0
- package/dist/utils/format-mcp.js.map +1 -0
- package/dist/utils/format-multi-project.d.ts +3 -0
- package/dist/utils/format-multi-project.js +100 -0
- package/dist/utils/format-multi-project.js.map +1 -0
- package/dist/utils/format-show.d.ts +6 -0
- package/dist/utils/format-show.js +143 -0
- package/dist/utils/format-show.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/format.js +53 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.js +10 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +61 -0
package/dist/tui/App.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useReducer } from "react";
|
|
3
|
+
import { Box, useApp } from "ink";
|
|
4
|
+
import { Frame } from "./components/Frame.js";
|
|
5
|
+
import { IdleWhisper } from "./components/IdleWhisper.js";
|
|
6
|
+
import { TabBar } from "./components/TabBar.js";
|
|
7
|
+
import { useIdleWhisper } from "./hooks/use-idle-whisper.js";
|
|
8
|
+
import { useKeys } from "./input/use-keys.js";
|
|
9
|
+
import { createInitialState, tuiReducer } from "./state/tui-state.js";
|
|
10
|
+
import { filterSkillsByQuery } from "./util/skill-filter.js";
|
|
11
|
+
import { Overview } from "./screens/Overview.js";
|
|
12
|
+
import { ToolTab } from "./screens/ToolTab.js";
|
|
13
|
+
import { UserScopeDrillIn } from "./screens/UserScopeDrillIn.js";
|
|
14
|
+
import { ProjectDrillIn } from "./screens/ProjectDrillIn.js";
|
|
15
|
+
import { McpsTab } from "./screens/McpsTab.js";
|
|
16
|
+
import { AccessTab } from "./screens/AccessTab.js";
|
|
17
|
+
import { DoctorTab } from "./screens/DoctorTab.js";
|
|
18
|
+
import { Settings } from "./screens/Settings.js";
|
|
19
|
+
import { FirstRunScan } from "./screens/FirstRunScan.js";
|
|
20
|
+
const CROSS_TOOL_TABS = [
|
|
21
|
+
{ id: "mcps", label: "MCPs" },
|
|
22
|
+
{ id: "access", label: "Access" },
|
|
23
|
+
{ id: "doctor", label: "Doctor" },
|
|
24
|
+
{ id: "settings", label: "Settings" }
|
|
25
|
+
];
|
|
26
|
+
export function App(props) {
|
|
27
|
+
if (props.mode === "firstRun") {
|
|
28
|
+
return _jsx(FirstRunShell, { ...props });
|
|
29
|
+
}
|
|
30
|
+
return _jsx(MainShell, { ...props });
|
|
31
|
+
}
|
|
32
|
+
function FirstRunShell(props) {
|
|
33
|
+
const { exit } = useApp();
|
|
34
|
+
return (_jsx(Frame, { children: _jsx(FirstRunScan, { mode: "firstRun", homeDir: props.homeDir, onConfirm: (roots) => {
|
|
35
|
+
void props.onConfigChange(roots).then(() => exit());
|
|
36
|
+
}, onCancel: () => {
|
|
37
|
+
exit();
|
|
38
|
+
}, crawlImpl: props.crawlImplForFirstRun }) }));
|
|
39
|
+
}
|
|
40
|
+
function MainShell(props) {
|
|
41
|
+
const initialResult = props.dataSource ? props.dataSource.initial : props.result;
|
|
42
|
+
const [state, dispatch] = useReducer(tuiReducer, initialResult, createInitialState);
|
|
43
|
+
const { exit } = useApp();
|
|
44
|
+
const { whisper, bump } = useIdleWhisper({ enabled: true });
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!props.dataSource?.subscribe)
|
|
47
|
+
return;
|
|
48
|
+
const unsubscribe = props.dataSource.subscribe((next) => {
|
|
49
|
+
dispatch({ type: "setResult", result: next });
|
|
50
|
+
});
|
|
51
|
+
return unsubscribe;
|
|
52
|
+
}, [props.dataSource]);
|
|
53
|
+
const result = state.result;
|
|
54
|
+
const { tools, crossTool } = buildTabList(result);
|
|
55
|
+
// Flattened cycle order: tools row, then cross-tool row. Matches the
|
|
56
|
+
// visual top-to-bottom, left-to-right reading of the two-row tab bar.
|
|
57
|
+
const tabIds = [
|
|
58
|
+
...tools.map((t) => t.id),
|
|
59
|
+
...crossTool.map((t) => t.id)
|
|
60
|
+
];
|
|
61
|
+
useKeys({
|
|
62
|
+
onArrowDown: () => {
|
|
63
|
+
bump();
|
|
64
|
+
if (state.drillStack.length > 0) {
|
|
65
|
+
dispatch({
|
|
66
|
+
type: "listMove",
|
|
67
|
+
direction: "down",
|
|
68
|
+
max: getDrillSkillCount(state, result)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
onArrowUp: () => {
|
|
73
|
+
bump();
|
|
74
|
+
if (state.drillStack.length > 0) {
|
|
75
|
+
dispatch({
|
|
76
|
+
type: "listMove",
|
|
77
|
+
direction: "up",
|
|
78
|
+
max: getDrillSkillCount(state, result)
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
onArrowRight: () => {
|
|
83
|
+
bump();
|
|
84
|
+
dispatch({ type: "cycleTab", direction: "next", tabs: tabIds });
|
|
85
|
+
},
|
|
86
|
+
onArrowLeft: () => {
|
|
87
|
+
bump();
|
|
88
|
+
dispatch({ type: "cycleTab", direction: "prev", tabs: tabIds });
|
|
89
|
+
},
|
|
90
|
+
onEnter: () => {
|
|
91
|
+
bump();
|
|
92
|
+
// Phase 8g: minimal Enter binding — drill into the active tool's user
|
|
93
|
+
// scope when a tool tab is active and no drill is currently active.
|
|
94
|
+
if (state.drillStack.length > 0)
|
|
95
|
+
return;
|
|
96
|
+
if (state.activeTab === "overview")
|
|
97
|
+
return;
|
|
98
|
+
if (state.activeTab === "mcps" ||
|
|
99
|
+
state.activeTab === "access" ||
|
|
100
|
+
state.activeTab === "doctor" ||
|
|
101
|
+
state.activeTab === "settings") {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
dispatch({
|
|
105
|
+
type: "drillIn",
|
|
106
|
+
frame: { kind: "userScope", toolId: state.activeTab }
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
onEscape: () => {
|
|
110
|
+
bump();
|
|
111
|
+
if (state.searchOpen) {
|
|
112
|
+
dispatch({ type: "searchClose" });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
dispatch({ type: "drillOut" });
|
|
116
|
+
},
|
|
117
|
+
onSlash: () => {
|
|
118
|
+
bump();
|
|
119
|
+
if (!state.searchOpen)
|
|
120
|
+
dispatch({ type: "searchOpen" });
|
|
121
|
+
},
|
|
122
|
+
onTextInput: (ch) => {
|
|
123
|
+
bump();
|
|
124
|
+
if (state.searchOpen) {
|
|
125
|
+
dispatch({ type: "searchSetQuery", query: state.searchQuery + ch });
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
onBackspace: () => {
|
|
129
|
+
bump();
|
|
130
|
+
if (state.searchOpen && state.searchQuery.length > 0) {
|
|
131
|
+
dispatch({
|
|
132
|
+
type: "searchSetQuery",
|
|
133
|
+
query: state.searchQuery.slice(0, -1)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
onQuit: () => {
|
|
138
|
+
bump();
|
|
139
|
+
exit();
|
|
140
|
+
},
|
|
141
|
+
onRefresh: () => {
|
|
142
|
+
bump();
|
|
143
|
+
if (!props.onRefresh)
|
|
144
|
+
return;
|
|
145
|
+
void props.onRefresh();
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
return (_jsx(Frame, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(TabBar, { rows: [tools, crossTool], activeId: state.activeTab }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: renderScreen(state, result, dispatch, props.onConfigChange) }), _jsx(IdleWhisper, { whisper: whisper })] }) }));
|
|
149
|
+
}
|
|
150
|
+
function buildTabList(result) {
|
|
151
|
+
const tools = [{ id: "overview", label: "Overview" }];
|
|
152
|
+
for (const tool of result.userScope.tools) {
|
|
153
|
+
tools.push({ id: tool.id, label: tool.name });
|
|
154
|
+
}
|
|
155
|
+
return { tools, crossTool: CROSS_TOOL_TABS };
|
|
156
|
+
}
|
|
157
|
+
function renderScreen(state, result, dispatch, onConfigChange) {
|
|
158
|
+
if (state.drillStack.length > 0) {
|
|
159
|
+
const top = state.drillStack[state.drillStack.length - 1];
|
|
160
|
+
if (top.kind === "userScope") {
|
|
161
|
+
return (_jsx(UserScopeDrillIn, { toolId: top.toolId, result: result, cursor: state.listCursor, searchOpen: state.searchOpen, searchQuery: state.searchQuery }));
|
|
162
|
+
}
|
|
163
|
+
return (_jsx(ProjectDrillIn, { toolId: top.toolId, projectPath: top.projectPath, result: result, cursor: state.listCursor }));
|
|
164
|
+
}
|
|
165
|
+
switch (state.activeTab) {
|
|
166
|
+
case "overview":
|
|
167
|
+
return _jsx(Overview, { result: result });
|
|
168
|
+
case "mcps":
|
|
169
|
+
return _jsx(McpsTab, { result: result });
|
|
170
|
+
case "access":
|
|
171
|
+
return _jsx(AccessTab, { result: result });
|
|
172
|
+
case "doctor":
|
|
173
|
+
return _jsx(DoctorTab, { result: result });
|
|
174
|
+
case "settings":
|
|
175
|
+
return (_jsx(Settings, { result: result, onConfigChange: onConfigChange ??
|
|
176
|
+
(async () => {
|
|
177
|
+
// 8f keeps Settings purely presentational when no callback was
|
|
178
|
+
// wired. The CLI always provides one in production.
|
|
179
|
+
}), onRescan: () => {
|
|
180
|
+
// 8f keeps re-scan as a placeholder: dispatch back to overview so
|
|
181
|
+
// the parent's onConfigChange path can re-render. Inline re-scan
|
|
182
|
+
// UI is Phase 8g.
|
|
183
|
+
dispatch({ type: "setTab", id: "overview" });
|
|
184
|
+
} }));
|
|
185
|
+
default:
|
|
186
|
+
return _jsx(ToolTab, { toolId: state.activeTab, result: result, dispatch: dispatch });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function getDrillSkillCount(state, result) {
|
|
190
|
+
const top = state.drillStack[state.drillStack.length - 1];
|
|
191
|
+
if (!top)
|
|
192
|
+
return 0;
|
|
193
|
+
if (top.kind === "userScope") {
|
|
194
|
+
const tool = result.userScope.tools.find((t) => t.id === top.toolId);
|
|
195
|
+
return filterSkillsByQuery(tool?.skills ?? [], state.searchQuery).length;
|
|
196
|
+
}
|
|
197
|
+
const project = result.projects.find((p) => p.projectPath === top.projectPath);
|
|
198
|
+
const tool = project?.scan.tools.find((t) => t.id === top.toolId);
|
|
199
|
+
return tool?.skills.length ?? 0;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface BreadcrumbProps {
|
|
3
|
+
/**
|
|
4
|
+
* Ordered path segments. Leftmost = root, rightmost = current location.
|
|
5
|
+
* Last segment is rendered bold (terminal default color); earlier ones are
|
|
6
|
+
* rendered dim.
|
|
7
|
+
*/
|
|
8
|
+
parts: ReadonlyArray<string>;
|
|
9
|
+
}
|
|
10
|
+
export declare function Breadcrumb({ parts }: BreadcrumbProps): React.ReactElement;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment } from "react";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { BREADCRUMB_SLASH } from "../theme/icons.js";
|
|
5
|
+
export function Breadcrumb({ parts }) {
|
|
6
|
+
return (_jsx(Box, { width: "100%", children: _jsx(Text, { children: parts.map((part, index) => {
|
|
7
|
+
const isLast = index === parts.length - 1;
|
|
8
|
+
return (_jsxs(Fragment, { children: [index > 0 && (_jsx(Text, { dimColor: true, children: ` ${BREADCRUMB_SLASH} ` })), isLast ? (_jsx(Text, { bold: true, children: part })) : (_jsx(Text, { dimColor: true, children: part }))] }, `${index}:${part}`));
|
|
9
|
+
}) }) }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sourceRoot":"","sources":["../../../src/tui/components/Breadcrumb.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAWrD,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAmB;IACnD,OAAO,CACL,KAAC,GAAG,IAAC,KAAK,EAAC,MAAM,YACf,KAAC,IAAI,cACF,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC1C,OAAO,CACL,MAAC,QAAQ,eACN,KAAK,GAAG,CAAC,IAAI,CACZ,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,gBAAgB,GAAG,GAAQ,CAChD,EACA,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,IAAI,IAAC,IAAI,kBAAE,IAAI,GAAQ,CACzB,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,CAC7B,KARY,GAAG,KAAK,IAAI,IAAI,EAAE,CAStB,CACZ,CAAC;YACJ,CAAC,CAAC,GACG,GACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
|
+
export interface DisclosureRowProps {
|
|
3
|
+
/** Label after the disclosure marker, e.g., "user scope". */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Whether the disclosure is open. Controlled by parent. */
|
|
6
|
+
open: boolean;
|
|
7
|
+
/** Optional right-aligned summary text (e.g., `"[82]"`). */
|
|
8
|
+
rightSummary?: string;
|
|
9
|
+
/** Content revealed when `open` is true. Hidden when closed. */
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Controlled disclosure row. Parent owns the open/closed state; this
|
|
14
|
+
* component is purely visual. When open, children render below the row;
|
|
15
|
+
* when closed, they are omitted entirely.
|
|
16
|
+
*/
|
|
17
|
+
export declare function DisclosureRow({ label, open, rightSummary, children }: DisclosureRowProps): React.ReactElement;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { DISCLOSURE_CLOSED, DISCLOSURE_OPEN } from "../theme/icons.js";
|
|
4
|
+
/**
|
|
5
|
+
* Controlled disclosure row. Parent owns the open/closed state; this
|
|
6
|
+
* component is purely visual. When open, children render below the row;
|
|
7
|
+
* when closed, they are omitted entirely.
|
|
8
|
+
*/
|
|
9
|
+
export function DisclosureRow({ label, open, rightSummary, children }) {
|
|
10
|
+
const marker = open ? DISCLOSURE_OPEN : DISCLOSURE_CLOSED;
|
|
11
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { width: "100%", children: [_jsxs(Text, { bold: true, children: [marker, " "] }), _jsx(Text, { bold: true, children: label }), rightSummary !== undefined && (_jsx(Box, { flexGrow: 1, justifyContent: "flex-end", children: _jsx(Text, { dimColor: true, children: rightSummary }) }))] }), open && children !== undefined && children !== null ? (_jsx(Box, { flexDirection: "column", paddingLeft: 2, children: children })) : null] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=DisclosureRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DisclosureRow.js","sourceRoot":"","sources":["../../../src/tui/components/DisclosureRow.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAavE;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,QAAQ,EACW;IACnB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC1D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,KAAK,EAAC,MAAM,aACf,MAAC,IAAI,IAAC,IAAI,mBAAE,MAAM,SAAS,EAC3B,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,GAAQ,EACxB,YAAY,KAAK,SAAS,IAAI,CAC7B,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,UAAU,YACzC,KAAC,IAAI,IAAC,QAAQ,kBAAE,YAAY,GAAQ,GAChC,CACP,IACG,EACL,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CACrD,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,YACvC,QAAQ,GACL,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface DotLeaderRowProps {
|
|
3
|
+
/** Left-side label. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Right-side metadata text. */
|
|
6
|
+
metadata: string;
|
|
7
|
+
/** Total row width (characters). */
|
|
8
|
+
width: number;
|
|
9
|
+
/** When true, prefix with ▶ and tint the label cyan. Default false. */
|
|
10
|
+
active?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Renders one row of `<label> · · · · · <metadata>` padded to exactly `width`
|
|
14
|
+
* characters wide. When `active`, prepends `▶ ` and tints the prefix +
|
|
15
|
+
* label with the accent color.
|
|
16
|
+
*/
|
|
17
|
+
export declare function DotLeaderRow({ label, metadata, width, active }: DotLeaderRowProps): React.ReactElement;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { ACTIVE_PREFIX, DOT_LEADER } from "../theme/icons.js";
|
|
4
|
+
import { ACCENT } from "../theme/colors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Renders one row of `<label> · · · · · <metadata>` padded to exactly `width`
|
|
7
|
+
* characters wide. When `active`, prepends `▶ ` and tints the prefix +
|
|
8
|
+
* label with the accent color.
|
|
9
|
+
*/
|
|
10
|
+
export function DotLeaderRow({ label, metadata, width, active = false }) {
|
|
11
|
+
const prefix = active ? `${ACTIVE_PREFIX} ` : "";
|
|
12
|
+
const reserved = prefix.length + label.length + metadata.length;
|
|
13
|
+
const gap = Math.max(0, width - reserved);
|
|
14
|
+
const leader = buildLeader(gap);
|
|
15
|
+
return (_jsxs(Box, { width: "100%", children: [active ? _jsx(Text, { color: ACCENT, children: prefix }) : null, _jsx(Text, { color: active ? ACCENT : undefined, children: label }), _jsx(Text, { dimColor: true, children: leader }), _jsx(Text, { children: metadata })] }));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Builds a dot-leader string of length `gap`.
|
|
19
|
+
*
|
|
20
|
+
* - If `gap < 3` we can't fit ` · `, so emit `gap` spaces (graceful narrow
|
|
21
|
+
* terminal fallback).
|
|
22
|
+
* - Otherwise emit a leading space, then alternating `· ` pairs, padding
|
|
23
|
+
* the tail with spaces if needed to match exactly `gap` characters.
|
|
24
|
+
*/
|
|
25
|
+
function buildLeader(gap) {
|
|
26
|
+
if (gap <= 0)
|
|
27
|
+
return "";
|
|
28
|
+
if (gap < 3)
|
|
29
|
+
return " ".repeat(gap);
|
|
30
|
+
const dots = Math.floor((gap - 1) / 2);
|
|
31
|
+
const trailing = gap - 1 - dots * 2;
|
|
32
|
+
return " " + `${DOT_LEADER} `.repeat(dots) + " ".repeat(trailing);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=DotLeaderRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DotLeaderRow.js","sourceRoot":"","sources":["../../../src/tui/components/DotLeaderRow.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,KAAK,EACI;IAClB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEhC,OAAO,CACL,MAAC,GAAG,IAAC,KAAK,EAAC,MAAM,aACd,MAAM,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,YAAG,MAAM,GAAQ,CAAC,CAAC,CAAC,IAAI,EACrD,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAAG,KAAK,GAAQ,EACxD,KAAC,IAAI,IAAC,QAAQ,kBAAE,MAAM,GAAQ,EAC9B,KAAC,IAAI,cAAE,QAAQ,GAAQ,IACnB,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACpC,OAAO,GAAG,GAAG,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyStateWhisper.js","sourceRoot":"","sources":["../../../src/tui/components/EmptyStateWhisper.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAM3B,MAAM,UAAU,iBAAiB,CAAC,EAChC,IAAI,EACmB;IACvB,OAAO,CACL,KAAC,IAAI,IAAC,QAAQ,QAAC,MAAM,kBAClB,IAAI,GACA,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
|
+
export interface FrameProps {
|
|
3
|
+
children?: ReactNode;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Outer heavy box drawing. Uses Ink's `borderStyle="bold"` for the heavy
|
|
7
|
+
* variant — Ink maps that to ┏ ┓ ┗ ┛ ━ ┃ which is exactly what the
|
|
8
|
+
* Archive Inspector spec requires.
|
|
9
|
+
*
|
|
10
|
+
* The Frame stretches to fill the available width (`width="100%"`) while
|
|
11
|
+
* keeping height content-driven. Ink handles redraw clearing; forcing the
|
|
12
|
+
* frame to terminal height causes overflowed drill-in screens to overlap
|
|
13
|
+
* stale rows instead of rendering as a clean, longer frame.
|
|
14
|
+
*/
|
|
15
|
+
export declare function Frame({ children }: FrameProps): React.ReactElement;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { HEAVY } from "../theme/borders.js";
|
|
4
|
+
/**
|
|
5
|
+
* Outer heavy box drawing. Uses Ink's `borderStyle="bold"` for the heavy
|
|
6
|
+
* variant — Ink maps that to ┏ ┓ ┗ ┛ ━ ┃ which is exactly what the
|
|
7
|
+
* Archive Inspector spec requires.
|
|
8
|
+
*
|
|
9
|
+
* The Frame stretches to fill the available width (`width="100%"`) while
|
|
10
|
+
* keeping height content-driven. Ink handles redraw clearing; forcing the
|
|
11
|
+
* frame to terminal height causes overflowed drill-in screens to overlap
|
|
12
|
+
* stale rows instead of rendering as a clean, longer frame.
|
|
13
|
+
*/
|
|
14
|
+
export function Frame({ children }) {
|
|
15
|
+
return (_jsx(Box, { flexDirection: "column", width: "100%", borderStyle: "bold", borderColor: undefined, paddingX: 1, children: children ?? _jsx(Text, { children: " " }) }));
|
|
16
|
+
}
|
|
17
|
+
// `HEAVY` is intentionally imported even though Ink's borderStyle="bold"
|
|
18
|
+
// already produces the same glyphs — the import keeps the theme module the
|
|
19
|
+
// single source of truth and helps future maintainers find the box characters.
|
|
20
|
+
void HEAVY;
|
|
21
|
+
//# sourceMappingURL=Frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Frame.js","sourceRoot":"","sources":["../../../src/tui/components/Frame.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAM5C;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAc;IAC5C,OAAO,CACL,KAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,KAAK,EAAC,MAAM,EACZ,WAAW,EAAC,MAAM,EAClB,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,CAAC,YAEV,QAAQ,IAAI,KAAC,IAAI,oBAAS,GACvB,CACP,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,2EAA2E;AAC3E,+EAA+E;AAC/E,KAAK,KAAK,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface IdleWhisperProps {
|
|
3
|
+
whisper: string | null;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Renders the idle whisper in a right-justified row.
|
|
7
|
+
* The App-level container is expected to mount this near the bottom of the
|
|
8
|
+
* frame; the box's own justifyContent="flex-end" handles the right edge.
|
|
9
|
+
* If whisper is null, renders an empty Box (no text).
|
|
10
|
+
*/
|
|
11
|
+
export declare function IdleWhisper({ whisper }: IdleWhisperProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
/**
|
|
4
|
+
* Renders the idle whisper in a right-justified row.
|
|
5
|
+
* The App-level container is expected to mount this near the bottom of the
|
|
6
|
+
* frame; the box's own justifyContent="flex-end" handles the right edge.
|
|
7
|
+
* If whisper is null, renders an empty Box (no text).
|
|
8
|
+
*/
|
|
9
|
+
export function IdleWhisper({ whisper }) {
|
|
10
|
+
return (_jsx(Box, { justifyContent: "flex-end", children: whisper === null ? (_jsx(Text, { children: " " })) : (_jsx(Text, { dimColor: true, italic: true, children: whisper })) }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=IdleWhisper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdleWhisper.js","sourceRoot":"","sources":["../../../src/tui/components/IdleWhisper.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,EACU;IACjB,OAAO,CACL,KAAC,GAAG,IAAC,cAAc,EAAC,UAAU,YAC3B,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAClB,KAAC,IAAI,oBAAS,CACf,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,QAAQ,QAAC,MAAM,kBAClB,OAAO,GACH,CACR,GACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface KeyHintProps {
|
|
3
|
+
/**
|
|
4
|
+
* Ordered list of hints. Each one already includes its glyph(s), e.g.
|
|
5
|
+
* `"▲▼ navigate"`, `"⏎ open"`, `"esc back"`.
|
|
6
|
+
*/
|
|
7
|
+
hints: ReadonlyArray<string>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Footer line of dim key bindings. The separator is the `·` interpunct (the
|
|
11
|
+
* same glyph used for dot leaders) wrapped with single spaces.
|
|
12
|
+
*/
|
|
13
|
+
export declare function KeyHint({ hints }: KeyHintProps): React.ReactElement;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { DOT_LEADER } from "../theme/icons.js";
|
|
4
|
+
/**
|
|
5
|
+
* Footer line of dim key bindings. The separator is the `·` interpunct (the
|
|
6
|
+
* same glyph used for dot leaders) wrapped with single spaces.
|
|
7
|
+
*/
|
|
8
|
+
export function KeyHint({ hints }) {
|
|
9
|
+
const separator = ` ${DOT_LEADER} `;
|
|
10
|
+
return (_jsx(Box, { width: "100%", children: _jsx(Text, { dimColor: true, children: hints.join(separator) }) }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=KeyHint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyHint.js","sourceRoot":"","sources":["../../../src/tui/components/KeyHint.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAU/C;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAgB;IAC7C,MAAM,SAAS,GAAG,IAAI,UAAU,GAAG,CAAC;IACpC,OAAO,CACL,KAAC,GAAG,IAAC,KAAK,EAAC,MAAM,YACf,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAQ,GACzC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface LoadingSplashProps {
|
|
3
|
+
/** True while scanning. When false + completed=true, shows SCAN_COMPLETE. */
|
|
4
|
+
active: boolean;
|
|
5
|
+
/** Shows SCAN_COMPLETE when active=false. */
|
|
6
|
+
completed?: boolean;
|
|
7
|
+
/** Rotation interval forwarded to useRotatingMessage. */
|
|
8
|
+
intervalMs?: number;
|
|
9
|
+
/** Optional 0..100 progress. */
|
|
10
|
+
percent?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function LoadingSplash(props: LoadingSplashProps): React.ReactElement;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { Box, Text } from "ink";
|
|
4
|
+
import { SCAN_COMPLETE } from "../messages.js";
|
|
5
|
+
import { useRotatingMessage } from "../hooks/use-rotating-message.js";
|
|
6
|
+
import { ACCENT } from "../theme/colors.js";
|
|
7
|
+
import { DISCLOSURE_CLOSED, DISCLOSURE_OPEN, SPLASH_DOT } from "../theme/icons.js";
|
|
8
|
+
import { ProgressBar } from "./ProgressBar.js";
|
|
9
|
+
import { Spinner } from "./Spinner.js";
|
|
10
|
+
const SPINNER_FRAME_INTERVAL_MS = 100;
|
|
11
|
+
const PANEL_WIDTH = 64;
|
|
12
|
+
const PROGRESS_BAR_WIDTH = 34;
|
|
13
|
+
const TRACE_WIDTH = 34;
|
|
14
|
+
const SIGNALS = [
|
|
15
|
+
"locating config roots",
|
|
16
|
+
"reading tool manifests",
|
|
17
|
+
"linking MCP access"
|
|
18
|
+
];
|
|
19
|
+
export function LoadingSplash(props) {
|
|
20
|
+
const { message } = useRotatingMessage({
|
|
21
|
+
active: props.active,
|
|
22
|
+
intervalMs: props.intervalMs
|
|
23
|
+
});
|
|
24
|
+
const [frame, setFrame] = useState(0);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!props.active)
|
|
27
|
+
return;
|
|
28
|
+
const id = setInterval(() => setFrame((f) => f + 1), SPINNER_FRAME_INTERVAL_MS);
|
|
29
|
+
return () => clearInterval(id);
|
|
30
|
+
}, [props.active]);
|
|
31
|
+
if (!props.active && props.completed) {
|
|
32
|
+
return (_jsxs(Box, { flexDirection: "column", width: PANEL_WIDTH, borderStyle: "bold", paddingX: 2, paddingY: 1, children: [_jsx(SplashHeader, {}), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: ACCENT, children: DISCLOSURE_OPEN }), _jsx(Text, { children: ` ${SCAN_COMPLETE}` })] })] }));
|
|
33
|
+
}
|
|
34
|
+
const percent = props.percent;
|
|
35
|
+
const activeSignal = Math.floor(frame / 8) % SIGNALS.length;
|
|
36
|
+
return (_jsxs(Box, { flexDirection: "column", width: PANEL_WIDTH, borderStyle: "bold", paddingX: 2, paddingY: 1, children: [_jsx(SplashHeader, {}), _jsx(Box, { marginTop: 1, children: _jsx(Spinner, { frame: frame, label: message }) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: SIGNALS.map((label, index) => (_jsx(SignalRow, { label: label, active: index === activeSignal }, label))) }), _jsx(Box, { marginTop: 1, children: typeof percent === "number" ? (_jsxs(_Fragment, { children: [_jsx(ProgressBar, { value: Math.max(0, Math.min(1, percent / 100)), width: PROGRESS_BAR_WIDTH }), _jsx(Text, { children: ` ${Math.round(percent)}%` })] })) : (_jsx(Text, { color: ACCENT, children: buildTrace(frame) })) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "local files only \u00B7 read-only scan" }) })] }));
|
|
37
|
+
}
|
|
38
|
+
function SplashHeader() {
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: ACCENT, children: SPLASH_DOT }), _jsx(Text, { bold: true, children: " ankui" }), _jsx(Text, { dimColor: true, children: " / memory scan" })] }), _jsx(Text, { dimColor: true, children: "remember what your agents can access" })] }));
|
|
40
|
+
}
|
|
41
|
+
function SignalRow({ label, active }) {
|
|
42
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: active ? ACCENT : undefined, children: active ? DISCLOSURE_OPEN : DISCLOSURE_CLOSED }), _jsx(Text, { children: ` ${label}` }), _jsx(Text, { dimColor: true, children: active ? " scanning" : " queued" })] }));
|
|
43
|
+
}
|
|
44
|
+
function buildTrace(frame) {
|
|
45
|
+
const head = frame % TRACE_WIDTH;
|
|
46
|
+
return Array.from({ length: TRACE_WIDTH }, (_, index) => {
|
|
47
|
+
const distance = (index - head + TRACE_WIDTH) % TRACE_WIDTH;
|
|
48
|
+
if (distance < 4)
|
|
49
|
+
return "━";
|
|
50
|
+
if (distance < 7)
|
|
51
|
+
return "╍";
|
|
52
|
+
return "·";
|
|
53
|
+
}).join("");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=LoadingSplash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingSplash.js","sourceRoot":"","sources":["../../../src/tui/components/LoadingSplash.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface ProgressBarProps {
|
|
3
|
+
/** Fill ratio in [0..1]. Values outside that range are clamped. */
|
|
4
|
+
value: number;
|
|
5
|
+
/** Total bar width in cells. */
|
|
6
|
+
width: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Renders a block-character progress bar with eighth-cell precision.
|
|
10
|
+
*
|
|
11
|
+
* ▊▊▊▊▊▊▊▊▊▊▊▊▏░░░░░░░░░░░░░ (12 full + 1 partial + 13 empty = 26 wide)
|
|
12
|
+
*
|
|
13
|
+
* The bulk-fill glyph is ▊ (6/8) per spec; the partial uses any of the
|
|
14
|
+
* eighths glyphs depending on the leftover; empty is ░.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ProgressBar({ value, width }: ProgressBarProps): React.ReactElement;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from "ink";
|
|
3
|
+
import { PROGRESS_EIGHTHS, PROGRESS_EMPTY, PROGRESS_FULL } from "../theme/icons.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders a block-character progress bar with eighth-cell precision.
|
|
6
|
+
*
|
|
7
|
+
* ▊▊▊▊▊▊▊▊▊▊▊▊▏░░░░░░░░░░░░░ (12 full + 1 partial + 13 empty = 26 wide)
|
|
8
|
+
*
|
|
9
|
+
* The bulk-fill glyph is ▊ (6/8) per spec; the partial uses any of the
|
|
10
|
+
* eighths glyphs depending on the leftover; empty is ░.
|
|
11
|
+
*/
|
|
12
|
+
export function ProgressBar({ value, width }) {
|
|
13
|
+
const clamped = Math.max(0, Math.min(1, value));
|
|
14
|
+
const totalEighths = Math.floor(clamped * width * 8);
|
|
15
|
+
const fullCells = Math.floor(totalEighths / 8);
|
|
16
|
+
const partialEighths = totalEighths - fullCells * 8;
|
|
17
|
+
const hasPartial = partialEighths > 0;
|
|
18
|
+
const emptyCells = Math.max(0, width - fullCells - (hasPartial ? 1 : 0));
|
|
19
|
+
const bar = PROGRESS_FULL.repeat(fullCells) +
|
|
20
|
+
(hasPartial ? PROGRESS_EIGHTHS[partialEighths] : "") +
|
|
21
|
+
PROGRESS_EMPTY.repeat(emptyCells);
|
|
22
|
+
return _jsx(Text, { children: bar });
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../src/tui/components/ProgressBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASpF;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACY;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,GAAG,GACP,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEpC,OAAO,KAAC,IAAI,cAAE,GAAG,GAAQ,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
export function SearchBox({ query }) {
|
|
4
|
+
return (_jsxs(Box, { children: [_jsx(Text, { children: "/" }), query.length === 0 ? (_jsx(Text, { dimColor: true, children: "type to filter \u00B7 esc to close" })) : (_jsx(Text, { children: query }))] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=SearchBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBox.js","sourceRoot":"","sources":["../../../src/tui/components/SearchBox.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAkB;IACjD,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,oBAAS,EACb,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,KAAC,IAAI,IAAC,QAAQ,yDAAqC,CACpD,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,cAAE,KAAK,GAAQ,CACrB,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface SectionHeaderProps {
|
|
3
|
+
/** Plain label (any case). Will be uppercased and spaced. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Length of the underline rule in characters. Default 60. */
|
|
6
|
+
underlineWidth?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Spaces every glyph in the uppercased label so `overview` → `O V E R V I E W`.
|
|
10
|
+
* Used as the section divider in every screen.
|
|
11
|
+
*/
|
|
12
|
+
export declare function SectionHeader({ label, underlineWidth }: SectionHeaderProps): React.ReactElement;
|