@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.
Files changed (156) hide show
  1. package/README.md +54 -0
  2. package/bin/yome.js +2 -0
  3. package/dist/agent.d.ts +43 -0
  4. package/dist/agent.js +140 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config.d.ts +41 -0
  7. package/dist/config.js +108 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/context.d.ts +1 -0
  10. package/dist/context.js +101 -0
  11. package/dist/context.js.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.js +65 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/llm.d.ts +13 -0
  16. package/dist/llm.js +317 -0
  17. package/dist/llm.js.map +1 -0
  18. package/dist/loops/chain.d.ts +15 -0
  19. package/dist/loops/chain.js +105 -0
  20. package/dist/loops/chain.js.map +1 -0
  21. package/dist/loops/evaluator.d.ts +12 -0
  22. package/dist/loops/evaluator.js +100 -0
  23. package/dist/loops/evaluator.js.map +1 -0
  24. package/dist/loops/index.d.ts +12 -0
  25. package/dist/loops/index.js +39 -0
  26. package/dist/loops/index.js.map +1 -0
  27. package/dist/loops/orchestrator.d.ts +13 -0
  28. package/dist/loops/orchestrator.js +107 -0
  29. package/dist/loops/orchestrator.js.map +1 -0
  30. package/dist/loops/parallel.d.ts +6 -0
  31. package/dist/loops/parallel.js +48 -0
  32. package/dist/loops/parallel.js.map +1 -0
  33. package/dist/loops/route.d.ts +13 -0
  34. package/dist/loops/route.js +88 -0
  35. package/dist/loops/route.js.map +1 -0
  36. package/dist/loops/simple.d.ts +6 -0
  37. package/dist/loops/simple.js +46 -0
  38. package/dist/loops/simple.js.map +1 -0
  39. package/dist/loops/types.d.ts +32 -0
  40. package/dist/loops/types.js +9 -0
  41. package/dist/loops/types.js.map +1 -0
  42. package/dist/permissions/checker.d.ts +18 -0
  43. package/dist/permissions/checker.js +89 -0
  44. package/dist/permissions/checker.js.map +1 -0
  45. package/dist/permissions/index.d.ts +4 -0
  46. package/dist/permissions/index.js +4 -0
  47. package/dist/permissions/index.js.map +1 -0
  48. package/dist/permissions/loader.d.ts +22 -0
  49. package/dist/permissions/loader.js +104 -0
  50. package/dist/permissions/loader.js.map +1 -0
  51. package/dist/permissions/ruleParser.d.ts +23 -0
  52. package/dist/permissions/ruleParser.js +59 -0
  53. package/dist/permissions/ruleParser.js.map +1 -0
  54. package/dist/permissions/types.d.ts +37 -0
  55. package/dist/permissions/types.js +2 -0
  56. package/dist/permissions/types.js.map +1 -0
  57. package/dist/sessions.d.ts +20 -0
  58. package/dist/sessions.js +119 -0
  59. package/dist/sessions.js.map +1 -0
  60. package/dist/skills/index.d.ts +2 -0
  61. package/dist/skills/index.js +2 -0
  62. package/dist/skills/index.js.map +1 -0
  63. package/dist/skills/loader.d.ts +4 -0
  64. package/dist/skills/loader.js +125 -0
  65. package/dist/skills/loader.js.map +1 -0
  66. package/dist/skills/types.d.ts +22 -0
  67. package/dist/skills/types.js +2 -0
  68. package/dist/skills/types.js.map +1 -0
  69. package/dist/subagent/agentTool.d.ts +7 -0
  70. package/dist/subagent/agentTool.js +121 -0
  71. package/dist/subagent/agentTool.js.map +1 -0
  72. package/dist/subagent/builtinAgents.d.ts +3 -0
  73. package/dist/subagent/builtinAgents.js +23 -0
  74. package/dist/subagent/builtinAgents.js.map +1 -0
  75. package/dist/subagent/index.d.ts +6 -0
  76. package/dist/subagent/index.js +5 -0
  77. package/dist/subagent/index.js.map +1 -0
  78. package/dist/subagent/loadAgents.d.ts +2 -0
  79. package/dist/subagent/loadAgents.js +98 -0
  80. package/dist/subagent/loadAgents.js.map +1 -0
  81. package/dist/subagent/runAgent.d.ts +18 -0
  82. package/dist/subagent/runAgent.js +115 -0
  83. package/dist/subagent/runAgent.js.map +1 -0
  84. package/dist/subagent/types.d.ts +20 -0
  85. package/dist/subagent/types.js +2 -0
  86. package/dist/subagent/types.js.map +1 -0
  87. package/dist/toggleState.d.ts +6 -0
  88. package/dist/toggleState.js +58 -0
  89. package/dist/toggleState.js.map +1 -0
  90. package/dist/tools/bash.d.ts +2 -0
  91. package/dist/tools/bash.js +78 -0
  92. package/dist/tools/bash.js.map +1 -0
  93. package/dist/tools/edit.d.ts +2 -0
  94. package/dist/tools/edit.js +103 -0
  95. package/dist/tools/edit.js.map +1 -0
  96. package/dist/tools/glob.d.ts +2 -0
  97. package/dist/tools/glob.js +44 -0
  98. package/dist/tools/glob.js.map +1 -0
  99. package/dist/tools/grep.d.ts +2 -0
  100. package/dist/tools/grep.js +89 -0
  101. package/dist/tools/grep.js.map +1 -0
  102. package/dist/tools/index.d.ts +15 -0
  103. package/dist/tools/index.js +99 -0
  104. package/dist/tools/index.js.map +1 -0
  105. package/dist/tools/ls.d.ts +2 -0
  106. package/dist/tools/ls.js +47 -0
  107. package/dist/tools/ls.js.map +1 -0
  108. package/dist/tools/read.d.ts +2 -0
  109. package/dist/tools/read.js +52 -0
  110. package/dist/tools/read.js.map +1 -0
  111. package/dist/tools/write.d.ts +2 -0
  112. package/dist/tools/write.js +46 -0
  113. package/dist/tools/write.js.map +1 -0
  114. package/dist/types.d.ts +82 -0
  115. package/dist/types.js +13 -0
  116. package/dist/types.js.map +1 -0
  117. package/dist/ui/AgentPicker.d.ts +12 -0
  118. package/dist/ui/AgentPicker.js +32 -0
  119. package/dist/ui/AgentPicker.js.map +1 -0
  120. package/dist/ui/App.d.ts +6 -0
  121. package/dist/ui/App.js +327 -0
  122. package/dist/ui/App.js.map +1 -0
  123. package/dist/ui/Banner.d.ts +1 -0
  124. package/dist/ui/Banner.js +14 -0
  125. package/dist/ui/Banner.js.map +1 -0
  126. package/dist/ui/InputBar.d.ts +17 -0
  127. package/dist/ui/InputBar.js +93 -0
  128. package/dist/ui/InputBar.js.map +1 -0
  129. package/dist/ui/Markdown.d.ts +4 -0
  130. package/dist/ui/Markdown.js +97 -0
  131. package/dist/ui/Markdown.js.map +1 -0
  132. package/dist/ui/MessageList.d.ts +17 -0
  133. package/dist/ui/MessageList.js +50 -0
  134. package/dist/ui/MessageList.js.map +1 -0
  135. package/dist/ui/ModelPicker.d.ts +9 -0
  136. package/dist/ui/ModelPicker.js +70 -0
  137. package/dist/ui/ModelPicker.js.map +1 -0
  138. package/dist/ui/PermissionPrompt.d.ts +10 -0
  139. package/dist/ui/PermissionPrompt.js +37 -0
  140. package/dist/ui/PermissionPrompt.js.map +1 -0
  141. package/dist/ui/SessionPicker.d.ts +8 -0
  142. package/dist/ui/SessionPicker.js +64 -0
  143. package/dist/ui/SessionPicker.js.map +1 -0
  144. package/dist/ui/Spinner.d.ts +3 -0
  145. package/dist/ui/Spinner.js +15 -0
  146. package/dist/ui/Spinner.js.map +1 -0
  147. package/dist/ui/TogglePicker.d.ts +16 -0
  148. package/dist/ui/TogglePicker.js +35 -0
  149. package/dist/ui/TogglePicker.js.map +1 -0
  150. package/dist/ui/ToolResult.d.ts +6 -0
  151. package/dist/ui/ToolResult.js +59 -0
  152. package/dist/ui/ToolResult.js.map +1 -0
  153. package/dist/utils/imagePaste.d.ts +12 -0
  154. package/dist/utils/imagePaste.js +54 -0
  155. package/dist/utils/imagePaste.js.map +1 -0
  156. 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,4 @@
1
+ import React from 'react';
2
+ export declare function Markdown({ children }: {
3
+ children: string;
4
+ }): React.ReactElement;
@@ -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":"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"}
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function Spinner({ color }: {
2
+ color?: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -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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"}