@poping/yome 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -0
- package/bin/yome.js +2 -0
- package/dist/agent.d.ts +43 -0
- package/dist/agent.js +140 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.js +108 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.js +101 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +13 -0
- package/dist/llm.js +317 -0
- package/dist/llm.js.map +1 -0
- package/dist/loops/chain.d.ts +15 -0
- package/dist/loops/chain.js +105 -0
- package/dist/loops/chain.js.map +1 -0
- package/dist/loops/evaluator.d.ts +12 -0
- package/dist/loops/evaluator.js +100 -0
- package/dist/loops/evaluator.js.map +1 -0
- package/dist/loops/index.d.ts +12 -0
- package/dist/loops/index.js +39 -0
- package/dist/loops/index.js.map +1 -0
- package/dist/loops/orchestrator.d.ts +13 -0
- package/dist/loops/orchestrator.js +107 -0
- package/dist/loops/orchestrator.js.map +1 -0
- package/dist/loops/parallel.d.ts +6 -0
- package/dist/loops/parallel.js +48 -0
- package/dist/loops/parallel.js.map +1 -0
- package/dist/loops/route.d.ts +13 -0
- package/dist/loops/route.js +88 -0
- package/dist/loops/route.js.map +1 -0
- package/dist/loops/simple.d.ts +6 -0
- package/dist/loops/simple.js +46 -0
- package/dist/loops/simple.js.map +1 -0
- package/dist/loops/types.d.ts +32 -0
- package/dist/loops/types.js +9 -0
- package/dist/loops/types.js.map +1 -0
- package/dist/permissions/checker.d.ts +18 -0
- package/dist/permissions/checker.js +89 -0
- package/dist/permissions/checker.js.map +1 -0
- package/dist/permissions/index.d.ts +4 -0
- package/dist/permissions/index.js +4 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/loader.d.ts +22 -0
- package/dist/permissions/loader.js +104 -0
- package/dist/permissions/loader.js.map +1 -0
- package/dist/permissions/ruleParser.d.ts +23 -0
- package/dist/permissions/ruleParser.js +59 -0
- package/dist/permissions/ruleParser.js.map +1 -0
- package/dist/permissions/types.d.ts +37 -0
- package/dist/permissions/types.js +2 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/sessions.d.ts +20 -0
- package/dist/sessions.js +119 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +4 -0
- package/dist/skills/loader.js +125 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/types.d.ts +22 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/subagent/agentTool.d.ts +7 -0
- package/dist/subagent/agentTool.js +121 -0
- package/dist/subagent/agentTool.js.map +1 -0
- package/dist/subagent/builtinAgents.d.ts +3 -0
- package/dist/subagent/builtinAgents.js +23 -0
- package/dist/subagent/builtinAgents.js.map +1 -0
- package/dist/subagent/index.d.ts +6 -0
- package/dist/subagent/index.js +5 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/loadAgents.d.ts +2 -0
- package/dist/subagent/loadAgents.js +98 -0
- package/dist/subagent/loadAgents.js.map +1 -0
- package/dist/subagent/runAgent.d.ts +18 -0
- package/dist/subagent/runAgent.js +115 -0
- package/dist/subagent/runAgent.js.map +1 -0
- package/dist/subagent/types.d.ts +20 -0
- package/dist/subagent/types.js +2 -0
- package/dist/subagent/types.js.map +1 -0
- package/dist/toggleState.d.ts +6 -0
- package/dist/toggleState.js +58 -0
- package/dist/toggleState.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +78 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +103 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +2 -0
- package/dist/tools/glob.js +44 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +2 -0
- package/dist/tools/grep.js +89 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.js +99 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +2 -0
- package/dist/tools/ls.js +47 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +52 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +46 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/AgentPicker.d.ts +12 -0
- package/dist/ui/AgentPicker.js +32 -0
- package/dist/ui/AgentPicker.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.js +327 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/Banner.d.ts +1 -0
- package/dist/ui/Banner.js +14 -0
- package/dist/ui/Banner.js.map +1 -0
- package/dist/ui/InputBar.d.ts +17 -0
- package/dist/ui/InputBar.js +93 -0
- package/dist/ui/InputBar.js.map +1 -0
- package/dist/ui/Markdown.d.ts +4 -0
- package/dist/ui/Markdown.js +97 -0
- package/dist/ui/Markdown.js.map +1 -0
- package/dist/ui/MessageList.d.ts +17 -0
- package/dist/ui/MessageList.js +50 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/ModelPicker.d.ts +9 -0
- package/dist/ui/ModelPicker.js +70 -0
- package/dist/ui/ModelPicker.js.map +1 -0
- package/dist/ui/PermissionPrompt.d.ts +10 -0
- package/dist/ui/PermissionPrompt.js +37 -0
- package/dist/ui/PermissionPrompt.js.map +1 -0
- package/dist/ui/SessionPicker.d.ts +8 -0
- package/dist/ui/SessionPicker.js +64 -0
- package/dist/ui/SessionPicker.js.map +1 -0
- package/dist/ui/Spinner.d.ts +3 -0
- package/dist/ui/Spinner.js +15 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/TogglePicker.d.ts +16 -0
- package/dist/ui/TogglePicker.js +35 -0
- package/dist/ui/TogglePicker.js.map +1 -0
- package/dist/ui/ToolResult.d.ts +6 -0
- package/dist/ui/ToolResult.js +59 -0
- package/dist/ui/ToolResult.js.map +1 -0
- package/dist/utils/imagePaste.d.ts +12 -0
- package/dist/utils/imagePaste.js +54 -0
- package/dist/utils/imagePaste.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo, useCallback, useRef } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
import TextInput from 'ink-text-input';
|
|
5
|
+
const MAX_VISIBLE = 5;
|
|
6
|
+
function getPermissionLabel(mode) {
|
|
7
|
+
switch (mode) {
|
|
8
|
+
case 'bypassPermissions':
|
|
9
|
+
return { text: 'Bypass - all commands allowed', color: '#FF6B6B' };
|
|
10
|
+
case 'acceptEdits':
|
|
11
|
+
return { text: 'Auto - edit and read-only commands', color: '#E7BD1F' };
|
|
12
|
+
case 'default':
|
|
13
|
+
default:
|
|
14
|
+
return { text: 'Default - ask before write operations', color: '#7EC8E3' };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function InputBar({ value, onChange, onSubmit, model, loopName, slashCommands = [], permissionMode = 'default', imageCount = 0 }) {
|
|
18
|
+
const [cursor, setCursor] = useState(0);
|
|
19
|
+
const suppressNextChange = useRef(false);
|
|
20
|
+
const filtered = useMemo(() => {
|
|
21
|
+
if (!value.startsWith('/'))
|
|
22
|
+
return [];
|
|
23
|
+
const query = value.slice(1).toLowerCase();
|
|
24
|
+
return slashCommands.filter((c) => c.name.toLowerCase().startsWith(query));
|
|
25
|
+
}, [value, slashCommands]);
|
|
26
|
+
const showSuggestions = filtered.length > 0 && value.startsWith('/') && !value.includes(' ');
|
|
27
|
+
useMemo(() => {
|
|
28
|
+
setCursor(0);
|
|
29
|
+
}, [filtered.length]);
|
|
30
|
+
const handleChange = useCallback((v) => {
|
|
31
|
+
if (suppressNextChange.current) {
|
|
32
|
+
suppressNextChange.current = false;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
onChange(v);
|
|
36
|
+
}, [onChange]);
|
|
37
|
+
const handleSubmit = useCallback((v) => {
|
|
38
|
+
if (showSuggestions && filtered[cursor]) {
|
|
39
|
+
const selected = '/' + filtered[cursor].name;
|
|
40
|
+
onChange(selected);
|
|
41
|
+
onSubmit(selected);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
onSubmit(v);
|
|
45
|
+
}
|
|
46
|
+
}, [showSuggestions, filtered, cursor, onChange, onSubmit]);
|
|
47
|
+
useInput((input, key) => {
|
|
48
|
+
// Suppress Ctrl+V so ink-text-input doesn't insert 'v'
|
|
49
|
+
if (key.ctrl && input === 'v') {
|
|
50
|
+
suppressNextChange.current = true;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!showSuggestions)
|
|
54
|
+
return;
|
|
55
|
+
if (key.upArrow) {
|
|
56
|
+
setCursor((prev) => (prev > 0 ? prev - 1 : filtered.length - 1));
|
|
57
|
+
}
|
|
58
|
+
else if (key.downArrow) {
|
|
59
|
+
setCursor((prev) => (prev < filtered.length - 1 ? prev + 1 : 0));
|
|
60
|
+
}
|
|
61
|
+
else if (key.tab) {
|
|
62
|
+
if (filtered[cursor]) {
|
|
63
|
+
onChange('/' + filtered[cursor].name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
const maxNameLen = showSuggestions
|
|
68
|
+
? Math.max(...filtered.map((c) => c.name.length))
|
|
69
|
+
: 0;
|
|
70
|
+
// Compute visible window for scrollable slash menu
|
|
71
|
+
const visibleStart = useMemo(() => {
|
|
72
|
+
if (filtered.length <= MAX_VISIBLE)
|
|
73
|
+
return 0;
|
|
74
|
+
const half = Math.floor(MAX_VISIBLE / 2);
|
|
75
|
+
let start = cursor - half;
|
|
76
|
+
if (start < 0)
|
|
77
|
+
start = 0;
|
|
78
|
+
if (start + MAX_VISIBLE > filtered.length)
|
|
79
|
+
start = filtered.length - MAX_VISIBLE;
|
|
80
|
+
return start;
|
|
81
|
+
}, [cursor, filtered.length]);
|
|
82
|
+
const visibleItems = showSuggestions ? filtered.slice(visibleStart, visibleStart + MAX_VISIBLE) : [];
|
|
83
|
+
const hasScrollUp = visibleStart > 0;
|
|
84
|
+
const hasScrollDown = visibleStart + MAX_VISIBLE < filtered.length;
|
|
85
|
+
const perm = getPermissionLabel(permissionMode);
|
|
86
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { color: perm.color, children: perm.text }), _jsx(Text, { dimColor: true, children: model || 'qwen-plus' })] }), imageCount > 0 && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: "green", bold: true, children: `\u{1F4CE} ${imageCount} image${imageCount > 1 ? 's' : ''} attached` }), _jsx(Text, { dimColor: true, children: " (press Enter to send)" })] })), _jsxs(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Text, { color: "yellow", children: `> ` }), _jsx(TextInput, { value: value, onChange: handleChange, onSubmit: handleSubmit, placeholder: "" })] }), showSuggestions && (_jsxs(Box, { flexDirection: "column", paddingX: 1, marginTop: 0, children: [hasScrollUp && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '↑', " more"] }) })), visibleItems.map((item, vi) => {
|
|
87
|
+
const realIdx = visibleStart + vi;
|
|
88
|
+
const isFocused = realIdx === cursor;
|
|
89
|
+
const padded = ('/' + item.name).padEnd(maxNameLen + 3);
|
|
90
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isFocused ? 'cyan' : 'yellow', bold: isFocused, children: padded }), _jsx(Text, { dimColor: !isFocused, children: item.description })] }, item.name));
|
|
91
|
+
}), hasScrollDown && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '↓', " more"] }) }))] }))] }));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=InputBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/ui/InputBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
import { marked } from 'marked';
|
|
5
|
+
function parseInline(raw) {
|
|
6
|
+
const segs = [];
|
|
7
|
+
const re = /(\*\*(.+?)\*\*)|(`([^`]+)`)|(\*(.+?)\*)|(~~(.+?)~~)|([^*`~]+)/gs;
|
|
8
|
+
let m;
|
|
9
|
+
while ((m = re.exec(raw)) !== null) {
|
|
10
|
+
if (m[2])
|
|
11
|
+
segs.push({ text: m[2], bold: true });
|
|
12
|
+
else if (m[4])
|
|
13
|
+
segs.push({ text: m[4], code: true });
|
|
14
|
+
else if (m[6])
|
|
15
|
+
segs.push({ text: m[6], italic: true });
|
|
16
|
+
else if (m[8])
|
|
17
|
+
segs.push({ text: m[8], dim: true }); // strikethrough → dim
|
|
18
|
+
else if (m[9])
|
|
19
|
+
segs.push({ text: m[9] });
|
|
20
|
+
}
|
|
21
|
+
return segs.length > 0 ? segs : [{ text: raw }];
|
|
22
|
+
}
|
|
23
|
+
function InlineText({ text }) {
|
|
24
|
+
const segs = parseInline(text);
|
|
25
|
+
return (_jsx(Text, { children: segs.map((s, i) => {
|
|
26
|
+
if (s.code)
|
|
27
|
+
return _jsx(Text, { color: "cyan", children: s.text }, i);
|
|
28
|
+
if (s.bold)
|
|
29
|
+
return _jsx(Text, { bold: true, children: s.text }, i);
|
|
30
|
+
if (s.italic)
|
|
31
|
+
return _jsx(Text, { italic: true, children: s.text }, i);
|
|
32
|
+
if (s.dim)
|
|
33
|
+
return _jsx(Text, { dimColor: true, strikethrough: true, children: s.text }, i);
|
|
34
|
+
return _jsx(Text, { children: s.text }, i);
|
|
35
|
+
}) }));
|
|
36
|
+
}
|
|
37
|
+
function RenderToken({ token }) {
|
|
38
|
+
switch (token.type) {
|
|
39
|
+
case 'heading': {
|
|
40
|
+
const t = token;
|
|
41
|
+
return _jsx(Text, { bold: true, children: _jsx(InlineText, { text: t.text }) });
|
|
42
|
+
}
|
|
43
|
+
case 'paragraph': {
|
|
44
|
+
const t = token;
|
|
45
|
+
return _jsx(InlineText, { text: t.text });
|
|
46
|
+
}
|
|
47
|
+
case 'text': {
|
|
48
|
+
const t = token;
|
|
49
|
+
return _jsx(InlineText, { text: t.text });
|
|
50
|
+
}
|
|
51
|
+
case 'code': {
|
|
52
|
+
const t = token;
|
|
53
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 0, children: [t.lang ? _jsxs(Text, { dimColor: true, children: [' ', t.lang] }) : null, t.text.split('\n').map((line, i) => (_jsxs(Text, { color: "gray", children: [' ', line] }, i)))] }));
|
|
54
|
+
}
|
|
55
|
+
case 'list': {
|
|
56
|
+
const t = token;
|
|
57
|
+
return (_jsx(Box, { flexDirection: "column", children: t.items.map((item, i) => {
|
|
58
|
+
const bullet = t.ordered ? `${i + 1}. ` : '• ';
|
|
59
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { dimColor: true, children: [' ', bullet] }), _jsx(Box, { flexShrink: 1, children: _jsx(InlineText, { text: item.text }) })] }, i));
|
|
60
|
+
}) }));
|
|
61
|
+
}
|
|
62
|
+
case 'blockquote': {
|
|
63
|
+
const t = token;
|
|
64
|
+
return (_jsx(Box, { flexDirection: "column", children: t.tokens.map((tk, i) => {
|
|
65
|
+
const inner = tk.type === 'paragraph' ? tk.text : '';
|
|
66
|
+
return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: '▎ ' }), _jsx(Text, { italic: true, children: _jsx(InlineText, { text: inner }) })] }, i));
|
|
67
|
+
}) }));
|
|
68
|
+
}
|
|
69
|
+
case 'hr':
|
|
70
|
+
return _jsx(Text, { dimColor: true, children: '─'.repeat(40) });
|
|
71
|
+
case 'space':
|
|
72
|
+
case 'html':
|
|
73
|
+
return null;
|
|
74
|
+
default:
|
|
75
|
+
if ('text' in token && typeof token.text === 'string') {
|
|
76
|
+
return _jsx(InlineText, { text: token.text });
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function stripMarkdownFence(text) {
|
|
82
|
+
const trimmed = text.trim();
|
|
83
|
+
const match = trimmed.match(/^```(?:markdown|md)?\s*\n([\s\S]*?)```\s*$/);
|
|
84
|
+
if (match)
|
|
85
|
+
return match[1];
|
|
86
|
+
return text;
|
|
87
|
+
}
|
|
88
|
+
export function Markdown({ children }) {
|
|
89
|
+
const tokens = useMemo(() => marked.lexer(stripMarkdownFence(children)), [children]);
|
|
90
|
+
return (_jsx(Box, { flexDirection: "column", children: tokens.map((token, i) => {
|
|
91
|
+
const node = _jsx(RenderToken, { token: token });
|
|
92
|
+
if (token.type === 'space')
|
|
93
|
+
return null;
|
|
94
|
+
return _jsx(Box, { children: node }, i);
|
|
95
|
+
}) }));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=Markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../src/ui/Markdown.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAUzD,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,iEAAiE,CAAC;IAC7E,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aAC3C,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aAChD,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aAClD,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,sBAAsB;aACtE,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,IAAI,EAAoB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CACL,KAAC,IAAI,cACF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,KAAC,IAAI,IAAS,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,IAAI,IAAvB,CAAC,CAA8B,CAAC;YAC9D,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,KAAC,IAAI,IAAS,IAAI,kBAAE,CAAC,CAAC,IAAI,IAAf,CAAC,CAAsB,CAAC;YACtD,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,KAAC,IAAI,IAAS,MAAM,kBAAE,CAAC,CAAC,IAAI,IAAjB,CAAC,CAAwB,CAAC;YAC1D,IAAI,CAAC,CAAC,GAAG;gBAAE,OAAO,KAAC,IAAI,IAAS,QAAQ,QAAC,aAAa,kBAAE,CAAC,CAAC,IAAI,IAAjC,CAAC,CAAwC,CAAC;YACvE,OAAO,KAAC,IAAI,cAAU,CAAC,CAAC,IAAI,IAAV,CAAC,CAAiB,CAAC;QACvC,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,KAAK,EAAoB;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,KAAuB,CAAC;YAClC,OAAO,KAAC,IAAI,IAAC,IAAI,kBAAC,KAAC,UAAU,IAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,GAAO,CAAC;QACxD,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,KAAyB,CAAC;YACpC,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,CAAC;QACtC,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,KAAoB,CAAC;YAC/B,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAI,CAAC;QACtC,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,KAAoB,CAAC;YAC/B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACnC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,QAAQ,mBAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAQ,CAAC,CAAC,CAAC,IAAI,EACpD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACnC,MAAC,IAAI,IAAS,KAAK,EAAC,MAAM,aAAE,MAAM,EAAE,IAAI,KAA7B,CAAC,CAAoC,CACjD,CAAC,IACE,CACP,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,KAAoB,CAAC;YAC/B,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;oBACvB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC/C,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,QAAQ,mBAAE,IAAI,EAAE,MAAM,IAAQ,EACpC,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,UAAU,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI,GAC3B,KAJE,CAAC,CAKL,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,CACP,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,GAAG,KAA0B,CAAC;YACrC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;oBACtB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAE,EAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,EAC5B,KAAC,IAAI,IAAC,MAAM,kBAAC,KAAC,UAAU,IAAC,IAAI,EAAE,KAAK,GAAI,GAAO,KAFvC,CAAC,CAGL,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,CACP,CAAC;QACJ,CAAC;QAED,KAAK,IAAI;YACP,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,CAAC;QAEhD,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QAEd;YACE,IAAI,MAAM,IAAI,KAAK,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/D,OAAO,KAAC,UAAU,IAAC,IAAI,EAAG,KAAa,CAAC,IAAI,GAAI,CAAC;YACnD,CAAC;YACD,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC1E,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAwB;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAErF,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;YAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YACxC,OAAO,KAAC,GAAG,cAAU,IAAI,IAAR,CAAC,CAAc,CAAC;QACnC,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface Message {
|
|
2
|
+
type: 'user' | 'text' | 'tool_start' | 'tool_result' | 'error';
|
|
3
|
+
content: string;
|
|
4
|
+
toolName?: string;
|
|
5
|
+
toolSummary?: string;
|
|
6
|
+
toolLabel?: string;
|
|
7
|
+
done?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function getToolLabel(name: string): string;
|
|
10
|
+
export declare function getToolDetail(name: string, input: Record<string, unknown>): string;
|
|
11
|
+
interface MessageListProps {
|
|
12
|
+
messages: Message[];
|
|
13
|
+
streamText: string;
|
|
14
|
+
isRunning: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function MessageList({ messages, streamText, isRunning }: MessageListProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { Markdown } from './Markdown.js';
|
|
4
|
+
import { ToolResult } from './ToolResult.js';
|
|
5
|
+
import { Spinner } from './Spinner.js';
|
|
6
|
+
const DOT = process.platform === 'darwin' ? '\u23FA' : '\u25CF';
|
|
7
|
+
export function getToolLabel(name) {
|
|
8
|
+
const labels = {
|
|
9
|
+
Read: 'Read 1 file',
|
|
10
|
+
Write: 'Write file',
|
|
11
|
+
Edit: 'Edit file',
|
|
12
|
+
Bash: 'Run command',
|
|
13
|
+
Glob: 'Find files',
|
|
14
|
+
Grep: 'Search files',
|
|
15
|
+
LS: 'List directory',
|
|
16
|
+
};
|
|
17
|
+
return labels[name] ?? name;
|
|
18
|
+
}
|
|
19
|
+
export function getToolDetail(name, input) {
|
|
20
|
+
const keys = {
|
|
21
|
+
Bash: 'command', Read: 'file_path', Write: 'file_path',
|
|
22
|
+
Edit: 'file_path', Glob: 'pattern', Grep: 'pattern',
|
|
23
|
+
};
|
|
24
|
+
const key = keys[name];
|
|
25
|
+
if (key)
|
|
26
|
+
return String(input[key] || '');
|
|
27
|
+
if (name === 'LS')
|
|
28
|
+
return String(input.path || process.cwd());
|
|
29
|
+
return JSON.stringify(input).slice(0, 60);
|
|
30
|
+
}
|
|
31
|
+
function MessageItem({ msg }) {
|
|
32
|
+
switch (msg.type) {
|
|
33
|
+
case 'user':
|
|
34
|
+
return (_jsx(Box, { marginTop: 1, borderStyle: "single", borderLeft: true, borderTop: false, borderBottom: false, borderRight: false, borderColor: "#E87B35", children: _jsx(Text, { backgroundColor: "black", color: "white", bold: true, children: ' ' + msg.content + ' ' }) }));
|
|
35
|
+
case 'text':
|
|
36
|
+
return (_jsx(Box, { marginTop: 1, marginLeft: 2, flexShrink: 1, flexDirection: "column", children: _jsx(Markdown, { children: msg.content }) }));
|
|
37
|
+
case 'tool_start':
|
|
38
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 0, children: [_jsxs(Box, { children: [_jsx(Text, { children: ' ' }), !msg.done && _jsx(Spinner, { color: "cyan" }), msg.done && _jsx(Text, { color: "green", children: DOT }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, children: msg.toolLabel })] }), msg.toolSummary && (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: ' \u21B3 ' }), _jsx(Text, { dimColor: true, children: msg.toolSummary })] }))] }));
|
|
39
|
+
case 'tool_result':
|
|
40
|
+
return _jsx(ToolResult, { name: msg.toolName || '', result: msg.content });
|
|
41
|
+
case 'error':
|
|
42
|
+
return (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: ' \u21B3 ' }), _jsx(Text, { color: "red", children: msg.content })] }));
|
|
43
|
+
default:
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function MessageList({ messages, streamText, isRunning }) {
|
|
48
|
+
return (_jsxs(_Fragment, { children: [messages.map((msg, i) => (_jsx(MessageItem, { msg: msg }, i))), streamText && (_jsx(Box, { marginTop: 1, marginLeft: 2, flexShrink: 1, flexDirection: "column", children: _jsx(Markdown, { children: streamText }) })), isRunning && !streamText && (_jsxs(Box, { marginTop: 1, marginLeft: 2, children: [_jsx(Spinner, {}), _jsx(Text, { dimColor: true, children: ' Thinking\u2026' })] }))] }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=MessageList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/ui/MessageList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModelEntry } from '../config.js';
|
|
2
|
+
interface ModelPickerProps {
|
|
3
|
+
models: ModelEntry[];
|
|
4
|
+
currentModel?: string;
|
|
5
|
+
onSelect: (entry: ModelEntry) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function ModelPicker({ models, currentModel, onSelect, onCancel }: ModelPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
const MAX_VISIBLE = 8;
|
|
5
|
+
export function ModelPicker({ models, currentModel, onSelect, onCancel }) {
|
|
6
|
+
const [cursor, setCursor] = useState(() => {
|
|
7
|
+
const idx = models.findIndex((m) => m.model === currentModel || m.id === currentModel);
|
|
8
|
+
return idx >= 0 ? idx : 0;
|
|
9
|
+
});
|
|
10
|
+
useInput((input, key) => {
|
|
11
|
+
if (key.upArrow) {
|
|
12
|
+
setCursor((prev) => (prev > 0 ? prev - 1 : models.length - 1));
|
|
13
|
+
}
|
|
14
|
+
else if (key.downArrow) {
|
|
15
|
+
setCursor((prev) => (prev < models.length - 1 ? prev + 1 : 0));
|
|
16
|
+
}
|
|
17
|
+
else if (key.return) {
|
|
18
|
+
if (models.length > 0)
|
|
19
|
+
onSelect(models[cursor]);
|
|
20
|
+
}
|
|
21
|
+
else if (key.escape || (key.ctrl && input === 'c')) {
|
|
22
|
+
onCancel();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
if (models.length === 0) {
|
|
26
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "yellow", children: "Model" }) }), _jsxs(Text, { dimColor: true, children: ['No models configured.\n\nAdd models to ~/.yome/settings.json:\n', ' {\n "customModels": [\n {\n "displayName": "My Model",\n', ' "model": "model-name",\n "baseUrl": "https://...",\n', ' "apiKey": "sk-...",\n "provider": "anthropic"\n }\n ]\n }'] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc close" }) })] }));
|
|
27
|
+
}
|
|
28
|
+
const maxNameLen = Math.max(...models.map((m) => m.displayName.length));
|
|
29
|
+
// Scrollable window
|
|
30
|
+
const visibleStart = useMemo(() => {
|
|
31
|
+
if (models.length <= MAX_VISIBLE)
|
|
32
|
+
return 0;
|
|
33
|
+
const half = Math.floor(MAX_VISIBLE / 2);
|
|
34
|
+
let start = cursor - half;
|
|
35
|
+
if (start < 0)
|
|
36
|
+
start = 0;
|
|
37
|
+
if (start + MAX_VISIBLE > models.length)
|
|
38
|
+
start = models.length - MAX_VISIBLE;
|
|
39
|
+
return start;
|
|
40
|
+
}, [cursor, models.length]);
|
|
41
|
+
const visibleItems = models.slice(visibleStart, visibleStart + MAX_VISIBLE);
|
|
42
|
+
const hasScrollUp = visibleStart > 0;
|
|
43
|
+
const hasScrollDown = visibleStart + MAX_VISIBLE < models.length;
|
|
44
|
+
// Mask API key for display
|
|
45
|
+
function maskKey(key) {
|
|
46
|
+
if (key.length <= 8)
|
|
47
|
+
return '****';
|
|
48
|
+
return key.slice(0, 4) + '...' + key.slice(-4);
|
|
49
|
+
}
|
|
50
|
+
// Shorten base URL for display
|
|
51
|
+
function shortUrl(url) {
|
|
52
|
+
try {
|
|
53
|
+
const u = new URL(url);
|
|
54
|
+
return u.hostname;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return url.slice(0, 30);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Model" }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " ", '\u2191\u2193', " navigate, Enter select, Esc cancel"] })] }), hasScrollUp && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '\u2191', " more"] }) })), visibleItems.map((entry, vi) => {
|
|
61
|
+
const realIdx = visibleStart + vi;
|
|
62
|
+
const isFocused = realIdx === cursor;
|
|
63
|
+
const isActive = entry.model === currentModel || entry.id === currentModel;
|
|
64
|
+
const pointer = isFocused ? '\u276F' : ' ';
|
|
65
|
+
const padded = entry.displayName.padEnd(maxNameLen + 2);
|
|
66
|
+
const nameColor = isActive ? 'green' : isFocused ? 'cyan' : undefined;
|
|
67
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? 'cyan' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: nameColor, children: padded }), isActive && _jsx(Text, { color: "green", dimColor: true, children: ' (active) ' }), !isActive && _jsx(Text, { children: ' ' }), _jsx(Text, { dimColor: true, children: shortUrl(entry.baseUrl) })] }), isFocused && (_jsx(Box, { marginLeft: 4, children: _jsxs(Text, { dimColor: true, children: ["model: ", entry.model, " provider: ", entry.provider, " key: ", maskKey(entry.apiKey)] }) }))] }, `${entry.id}-${realIdx}`));
|
|
68
|
+
}), hasScrollDown && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '\u2193', " more"] }) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Enter select ", ' ', " Esc cancel"] }) })] }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ModelPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelPicker.js","sourceRoot":"","sources":["../../src/ui/ModelPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface PermissionPromptProps {
|
|
2
|
+
toolName: string;
|
|
3
|
+
message: string;
|
|
4
|
+
detail?: string;
|
|
5
|
+
onAllow: () => void;
|
|
6
|
+
onDeny: () => void;
|
|
7
|
+
onAlwaysAllow: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function PermissionPrompt({ toolName, message, detail, onAllow, onDeny, onAlwaysAllow }: PermissionPromptProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
const OPTIONS = [
|
|
5
|
+
{ id: 'allow', label: '是,允许' },
|
|
6
|
+
{ id: 'always', label: '是,并始终允许该命令(所有可逆命令)' },
|
|
7
|
+
{ id: 'deny', label: '不,取消' },
|
|
8
|
+
];
|
|
9
|
+
export function PermissionPrompt({ toolName, message, detail, onAllow, onDeny, onAlwaysAllow }) {
|
|
10
|
+
const [cursor, setCursor] = useState(0);
|
|
11
|
+
useInput((_input, key) => {
|
|
12
|
+
if (key.upArrow) {
|
|
13
|
+
setCursor((prev) => (prev > 0 ? prev - 1 : OPTIONS.length - 1));
|
|
14
|
+
}
|
|
15
|
+
else if (key.downArrow) {
|
|
16
|
+
setCursor((prev) => (prev < OPTIONS.length - 1 ? prev + 1 : 0));
|
|
17
|
+
}
|
|
18
|
+
else if (key.return) {
|
|
19
|
+
const selected = OPTIONS[cursor].id;
|
|
20
|
+
if (selected === 'allow')
|
|
21
|
+
onAllow();
|
|
22
|
+
else if (selected === 'always')
|
|
23
|
+
onAlwaysAllow();
|
|
24
|
+
else
|
|
25
|
+
onDeny();
|
|
26
|
+
}
|
|
27
|
+
else if (key.escape) {
|
|
28
|
+
onDeny();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, marginTop: 1, children: [OPTIONS.map((opt, i) => {
|
|
32
|
+
const isFocused = i === cursor;
|
|
33
|
+
const pointer = isFocused ? '> ' : ' ';
|
|
34
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: isFocused ? 'yellow' : undefined, bold: isFocused, children: [pointer, opt.label] }) }, opt.id));
|
|
35
|
+
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " \u5BFC\u822A Enter \u9009\u62E9 Esc \u53D6\u6D88"] }) })] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=PermissionPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionPrompt.js","sourceRoot":"","sources":["../../src/ui/PermissionPrompt.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAW1C,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC9B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CACrB,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAyB;IACnH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAExC,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAE,CAAC,EAAE,CAAC;YACrC,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,EAAE,CAAC;iBAC/B,IAAI,QAAQ,KAAK,QAAQ;gBAAE,aAAa,EAAE,CAAC;;gBAC3C,MAAM,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,aAC3F,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACtB,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,CAAC;gBAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxC,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,aAAG,OAAO,EAAE,GAAG,CAAC,KAAK,IAAQ,IADnF,GAAG,CAAC,EAAE,CAEV,CACP,CAAC;YACJ,CAAC,CAAC,EACF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBAAE,cAAc,2DAA6B,GACvD,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionInfo } from '../sessions.js';
|
|
2
|
+
interface SessionPickerProps {
|
|
3
|
+
sessions: SessionInfo[];
|
|
4
|
+
onSelect: (sessionId: string) => void;
|
|
5
|
+
onCancel: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function SessionPicker({ sessions, onSelect, onCancel }: SessionPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
const MAX_VISIBLE = 8;
|
|
5
|
+
function formatDate(d) {
|
|
6
|
+
const now = new Date();
|
|
7
|
+
const diffMs = now.getTime() - d.getTime();
|
|
8
|
+
const diffMin = Math.floor(diffMs / 60000);
|
|
9
|
+
if (diffMin < 1)
|
|
10
|
+
return 'just now';
|
|
11
|
+
if (diffMin < 60)
|
|
12
|
+
return `${diffMin}m ago`;
|
|
13
|
+
const diffHr = Math.floor(diffMin / 60);
|
|
14
|
+
if (diffHr < 24)
|
|
15
|
+
return `${diffHr}h ago`;
|
|
16
|
+
const diffDay = Math.floor(diffHr / 24);
|
|
17
|
+
if (diffDay < 7)
|
|
18
|
+
return `${diffDay}d ago`;
|
|
19
|
+
return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
|
|
20
|
+
}
|
|
21
|
+
export function SessionPicker({ sessions, onSelect, onCancel }) {
|
|
22
|
+
const [cursor, setCursor] = useState(0);
|
|
23
|
+
useInput((input, key) => {
|
|
24
|
+
if (key.upArrow) {
|
|
25
|
+
setCursor((prev) => (prev > 0 ? prev - 1 : sessions.length - 1));
|
|
26
|
+
}
|
|
27
|
+
else if (key.downArrow) {
|
|
28
|
+
setCursor((prev) => (prev < sessions.length - 1 ? prev + 1 : 0));
|
|
29
|
+
}
|
|
30
|
+
else if (key.return) {
|
|
31
|
+
if (sessions[cursor])
|
|
32
|
+
onSelect(sessions[cursor].sessionId);
|
|
33
|
+
}
|
|
34
|
+
else if (key.escape || (key.ctrl && input === 'c')) {
|
|
35
|
+
onCancel();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const visibleStart = useMemo(() => {
|
|
39
|
+
if (sessions.length <= MAX_VISIBLE)
|
|
40
|
+
return 0;
|
|
41
|
+
const half = Math.floor(MAX_VISIBLE / 2);
|
|
42
|
+
let start = cursor - half;
|
|
43
|
+
if (start < 0)
|
|
44
|
+
start = 0;
|
|
45
|
+
if (start + MAX_VISIBLE > sessions.length)
|
|
46
|
+
start = sessions.length - MAX_VISIBLE;
|
|
47
|
+
return start;
|
|
48
|
+
}, [cursor, sessions.length]);
|
|
49
|
+
const visibleItems = sessions.slice(visibleStart, visibleStart + MAX_VISIBLE);
|
|
50
|
+
const hasScrollUp = visibleStart > 0;
|
|
51
|
+
const hasScrollDown = visibleStart + MAX_VISIBLE < sessions.length;
|
|
52
|
+
if (sessions.length === 0) {
|
|
53
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Text, { dimColor: true, children: "No previous sessions found for this project." }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc to close" }) })] }));
|
|
54
|
+
}
|
|
55
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Sessions" }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " ", sessions.length, " session", sessions.length !== 1 ? 's' : '', ", select to continue"] })] }), hasScrollUp && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '\u2191', " more"] }) })), visibleItems.map((s, vi) => {
|
|
56
|
+
const realIdx = visibleStart + vi;
|
|
57
|
+
const isFocused = realIdx === cursor;
|
|
58
|
+
const pointer = isFocused ? '\u276F' : ' ';
|
|
59
|
+
const titleText = s.title.length > 60 ? s.title.slice(0, 57) + '...' : s.title;
|
|
60
|
+
const timeStr = formatDate(s.lastModified);
|
|
61
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? 'cyan' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: isFocused ? 'cyan' : 'white', children: titleText })] }), _jsxs(Box, { children: [_jsx(Text, { children: ' ' }), _jsx(Text, { dimColor: true, children: timeStr }), _jsx(Text, { dimColor: true, children: ' \u00B7 ' }), _jsxs(Text, { dimColor: true, children: [s.messageCount, " messages"] })] })] }, s.sessionId));
|
|
62
|
+
}), hasScrollDown && (_jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [" ", '\u2193', " more"] }) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Enter continue ", ' ', " Esc cancel"] }) })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=SessionPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionPicker.js","sourceRoot":"","sources":["../../src/ui/SessionPicker.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAS1C,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,UAAU,CAAC,CAAO;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,MAAM,OAAO,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACxC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC1C,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAsB;IAChF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAExC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACzB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,IAAI,QAAQ,CAAC,MAAM,CAAC;gBAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;YACrD,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC;QACzB,IAAI,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC,MAAM;YAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEnE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,aAC5E,KAAC,IAAI,IAAC,QAAQ,mEAAoD,EAClE,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,mCAAoB,GAC9B,IACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,aAC5E,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,yBAAgB,EACzC,MAAC,IAAI,IAAC,QAAQ,wBAAG,QAAQ,OAAG,QAAQ,CAAC,MAAM,cAAU,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,4BAA4B,IAC7G,EAEL,WAAW,IAAI,CACd,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,QAAQ,yBAAI,QAAQ,aAAa,GACnC,CACP,EAEA,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;gBAC1B,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,OAAO,KAAK,MAAM,CAAC;gBACrC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/E,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAE3C,OAAO,CACL,MAAC,GAAG,IAAmB,aAAa,EAAC,QAAQ,aAC3C,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAAG,OAAO,SAAS,EAC9D,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,YAAG,SAAS,GAAQ,IAC9D,EACN,MAAC,GAAG,eACF,KAAC,IAAI,cAAE,KAAK,GAAQ,EACpB,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,GAAQ,EAC/B,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,GAAQ,EAClC,MAAC,IAAI,IAAC,QAAQ,mBAAE,CAAC,CAAC,YAAY,iBAAiB,IAC3C,KAVE,CAAC,CAAC,SAAS,CAWf,CACP,CAAC;YACJ,CAAC,CAAC,EAED,aAAa,IAAI,CAChB,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,QAAQ,yBAAI,QAAQ,aAAa,GACnC,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBACX,cAAc,gBAAY,IAAI,sBAAkB,IAAI,mBAChD,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { Text } from 'ink';
|
|
4
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
5
|
+
export function Spinner({ color = 'cyan' }) {
|
|
6
|
+
const [frame, setFrame] = useState(0);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const timer = setInterval(() => {
|
|
9
|
+
setFrame((prev) => (prev + 1) % FRAMES.length);
|
|
10
|
+
}, 80);
|
|
11
|
+
return () => clearInterval(timer);
|
|
12
|
+
}, []);
|
|
13
|
+
return _jsx(Text, { color: color, children: FRAMES[frame] });
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/ui/Spinner.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,EAAsB;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,CAAC,KAAK,CAAC,GAAQ,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ToggleItem {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
source: string;
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
skills?: string[];
|
|
7
|
+
}
|
|
8
|
+
interface TogglePickerProps {
|
|
9
|
+
title: string;
|
|
10
|
+
items: ToggleItem[];
|
|
11
|
+
onToggle: (name: string) => void;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
emptyHint: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function TogglePicker({ title, items, onToggle, onClose, emptyHint }: TogglePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
export function TogglePicker({ title, items, onToggle, onClose, emptyHint }) {
|
|
5
|
+
const [cursor, setCursor] = useState(0);
|
|
6
|
+
useInput((input, key) => {
|
|
7
|
+
if (key.escape || (key.ctrl && input === 'c')) {
|
|
8
|
+
onClose();
|
|
9
|
+
}
|
|
10
|
+
else if (key.upArrow) {
|
|
11
|
+
setCursor((prev) => (prev > 0 ? prev - 1 : items.length - 1));
|
|
12
|
+
}
|
|
13
|
+
else if (key.downArrow) {
|
|
14
|
+
setCursor((prev) => (prev < items.length - 1 ? prev + 1 : 0));
|
|
15
|
+
}
|
|
16
|
+
else if (key.return || input === ' ') {
|
|
17
|
+
if (items.length > 0) {
|
|
18
|
+
onToggle(items[cursor].name);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
if (items.length === 0) {
|
|
23
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "yellow", children: title }) }), _jsx(Text, { dimColor: true, children: emptyHint }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc close" }) })] }));
|
|
24
|
+
}
|
|
25
|
+
const maxNameLen = Math.max(...items.map((i) => i.name.length));
|
|
26
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: title }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " Space/Enter toggle, Esc close"] })] }), items.map((item, i) => {
|
|
27
|
+
const isFocused = i === cursor;
|
|
28
|
+
const pointer = isFocused ? '\u276F' : ' ';
|
|
29
|
+
const toggle = item.enabled ? '\u25C9' : '\u25CB';
|
|
30
|
+
const toggleColor = item.enabled ? 'green' : 'red';
|
|
31
|
+
const padded = item.name.padEnd(maxNameLen + 2);
|
|
32
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? 'cyan' : undefined, children: [pointer, " "] }), _jsxs(Text, { color: toggleColor, children: [toggle, " "] }), _jsx(Text, { bold: true, color: isFocused ? 'cyan' : undefined, children: padded }), _jsx(Text, { dimColor: !isFocused, children: item.description }), _jsxs(Text, { dimColor: true, children: [" (", item.source, ")"] })] }), isFocused && item.skills && item.skills.length > 0 && (_jsx(Box, { marginLeft: 6, children: _jsxs(Text, { dimColor: true, children: ["Skills: ", item.skills.join(', ')] }) }))] }, item.name));
|
|
33
|
+
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Space/Enter toggle ", ' ', " Esc close"] }) })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=TogglePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TogglePicker.js","sourceRoot":"","sources":["../../src/ui/TogglePicker.tsx"],"names":[],"mappings":"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"}
|