@poping/yome 0.0.2 → 0.0.3

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 (185) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +11 -0
  3. package/README.md +308 -27
  4. package/README.zh-CN.md +335 -0
  5. package/dist/agent.d.ts +24 -2
  6. package/dist/agent.js +34 -2
  7. package/dist/agent.js.map +1 -1
  8. package/dist/context.d.ts +2 -0
  9. package/dist/context.js +116 -11
  10. package/dist/context.js.map +1 -1
  11. package/dist/index.js +147 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/llm.js +45 -2
  14. package/dist/llm.js.map +1 -1
  15. package/dist/loops/chain.js +8 -0
  16. package/dist/loops/chain.js.map +1 -1
  17. package/dist/loops/evaluator.js +8 -0
  18. package/dist/loops/evaluator.js.map +1 -1
  19. package/dist/loops/orchestrator.js +8 -0
  20. package/dist/loops/orchestrator.js.map +1 -1
  21. package/dist/loops/parallel.js.map +1 -1
  22. package/dist/loops/route.js +8 -0
  23. package/dist/loops/route.js.map +1 -1
  24. package/dist/loops/simple.js +15 -0
  25. package/dist/loops/simple.js.map +1 -1
  26. package/dist/permissions/index.d.ts +1 -1
  27. package/dist/permissions/index.js +1 -1
  28. package/dist/permissions/index.js.map +1 -1
  29. package/dist/permissions/loader.d.ts +20 -1
  30. package/dist/permissions/loader.js +51 -0
  31. package/dist/permissions/loader.js.map +1 -1
  32. package/dist/redact.d.ts +56 -0
  33. package/dist/redact.js +191 -0
  34. package/dist/redact.js.map +1 -0
  35. package/dist/skills/runner/applescript.d.ts +49 -0
  36. package/dist/skills/runner/applescript.js +100 -0
  37. package/dist/skills/runner/applescript.js.map +1 -0
  38. package/dist/skills/runner/dispatcher.d.ts +57 -0
  39. package/dist/skills/runner/dispatcher.js +407 -0
  40. package/dist/skills/runner/dispatcher.js.map +1 -0
  41. package/dist/skills/runner/kernel.d.ts +8 -0
  42. package/dist/skills/runner/kernel.js +732 -0
  43. package/dist/skills/runner/kernel.js.map +1 -0
  44. package/dist/skills/runner/tokenizer.d.ts +36 -0
  45. package/dist/skills/runner/tokenizer.js +177 -0
  46. package/dist/skills/runner/tokenizer.js.map +1 -0
  47. package/dist/threadCli.d.ts +11 -0
  48. package/dist/threadCli.js +177 -0
  49. package/dist/threadCli.js.map +1 -0
  50. package/dist/threadShare.d.ts +21 -0
  51. package/dist/threadShare.js +121 -0
  52. package/dist/threadShare.js.map +1 -0
  53. package/dist/threadSubmit.d.ts +32 -0
  54. package/dist/threadSubmit.js +199 -0
  55. package/dist/threadSubmit.js.map +1 -0
  56. package/dist/tools/bash.js +68 -13
  57. package/dist/tools/bash.js.map +1 -1
  58. package/dist/tools/index.d.ts +22 -2
  59. package/dist/tools/index.js +41 -5
  60. package/dist/tools/index.js.map +1 -1
  61. package/dist/tools/skillCall.d.ts +2 -0
  62. package/dist/tools/skillCall.js +77 -0
  63. package/dist/tools/skillCall.js.map +1 -0
  64. package/dist/ui/AgentPicker.js +3 -3
  65. package/dist/ui/AgentPicker.js.map +1 -1
  66. package/dist/ui/App.js +214 -61
  67. package/dist/ui/App.js.map +1 -1
  68. package/dist/ui/Banner.d.ts +2 -1
  69. package/dist/ui/Banner.js +23 -4
  70. package/dist/ui/Banner.js.map +1 -1
  71. package/dist/ui/InputBar.js +6 -3
  72. package/dist/ui/InputBar.js.map +1 -1
  73. package/dist/ui/Markdown.d.ts +2 -2
  74. package/dist/ui/Markdown.js +22 -7
  75. package/dist/ui/Markdown.js.map +1 -1
  76. package/dist/ui/MarketplacePicker.d.ts +7 -0
  77. package/dist/ui/MarketplacePicker.js +122 -0
  78. package/dist/ui/MarketplacePicker.js.map +1 -0
  79. package/dist/ui/MessageList.d.ts +4 -1
  80. package/dist/ui/MessageList.js +72 -7
  81. package/dist/ui/MessageList.js.map +1 -1
  82. package/dist/ui/ModelPicker.js +4 -4
  83. package/dist/ui/ModelPicker.js.map +1 -1
  84. package/dist/ui/PermissionPrompt.d.ts +16 -4
  85. package/dist/ui/PermissionPrompt.js +60 -15
  86. package/dist/ui/PermissionPrompt.js.map +1 -1
  87. package/dist/ui/SessionPicker.js +2 -2
  88. package/dist/ui/SessionPicker.js.map +1 -1
  89. package/dist/ui/ShimmerText.d.ts +8 -0
  90. package/dist/ui/ShimmerText.js +40 -0
  91. package/dist/ui/ShimmerText.js.map +1 -0
  92. package/dist/ui/Spinner.js +3 -9
  93. package/dist/ui/Spinner.js.map +1 -1
  94. package/dist/ui/TogglePicker.js +4 -4
  95. package/dist/ui/TogglePicker.js.map +1 -1
  96. package/dist/ui/ToolResult.js +6 -0
  97. package/dist/ui/ToolResult.js.map +1 -1
  98. package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
  99. package/dist/ui/UnifiedSkillsPicker.js +63 -0
  100. package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
  101. package/dist/ui/animation.d.ts +3 -0
  102. package/dist/ui/animation.js +48 -0
  103. package/dist/ui/animation.js.map +1 -0
  104. package/dist/ui/useThrottledStream.d.ts +7 -0
  105. package/dist/ui/useThrottledStream.js +63 -0
  106. package/dist/ui/useThrottledStream.js.map +1 -0
  107. package/dist/yomeSkills/auth.d.ts +20 -0
  108. package/dist/yomeSkills/auth.js +70 -0
  109. package/dist/yomeSkills/auth.js.map +1 -0
  110. package/dist/yomeSkills/blacklist.d.ts +33 -0
  111. package/dist/yomeSkills/blacklist.js +101 -0
  112. package/dist/yomeSkills/blacklist.js.map +1 -0
  113. package/dist/yomeSkills/capabilities.d.ts +54 -0
  114. package/dist/yomeSkills/capabilities.js +175 -0
  115. package/dist/yomeSkills/capabilities.js.map +1 -0
  116. package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
  117. package/dist/yomeSkills/capabilityGuard.js +113 -0
  118. package/dist/yomeSkills/capabilityGuard.js.map +1 -0
  119. package/dist/yomeSkills/cli.d.ts +17 -0
  120. package/dist/yomeSkills/cli.js +477 -0
  121. package/dist/yomeSkills/cli.js.map +1 -0
  122. package/dist/yomeSkills/devLink.d.ts +17 -0
  123. package/dist/yomeSkills/devLink.js +91 -0
  124. package/dist/yomeSkills/devLink.js.map +1 -0
  125. package/dist/yomeSkills/doctor.d.ts +13 -0
  126. package/dist/yomeSkills/doctor.js +152 -0
  127. package/dist/yomeSkills/doctor.js.map +1 -0
  128. package/dist/yomeSkills/enable.d.ts +8 -0
  129. package/dist/yomeSkills/enable.js +67 -0
  130. package/dist/yomeSkills/enable.js.map +1 -0
  131. package/dist/yomeSkills/hubPing.d.ts +1 -0
  132. package/dist/yomeSkills/hubPing.js +41 -0
  133. package/dist/yomeSkills/hubPing.js.map +1 -0
  134. package/dist/yomeSkills/install.d.ts +18 -0
  135. package/dist/yomeSkills/install.js +143 -0
  136. package/dist/yomeSkills/install.js.map +1 -0
  137. package/dist/yomeSkills/installGithub.d.ts +26 -0
  138. package/dist/yomeSkills/installGithub.js +192 -0
  139. package/dist/yomeSkills/installGithub.js.map +1 -0
  140. package/dist/yomeSkills/installMeta.d.ts +8 -0
  141. package/dist/yomeSkills/installMeta.js +76 -0
  142. package/dist/yomeSkills/installMeta.js.map +1 -0
  143. package/dist/yomeSkills/integrity.d.ts +26 -0
  144. package/dist/yomeSkills/integrity.js +107 -0
  145. package/dist/yomeSkills/integrity.js.map +1 -0
  146. package/dist/yomeSkills/invoke.d.ts +29 -0
  147. package/dist/yomeSkills/invoke.js +103 -0
  148. package/dist/yomeSkills/invoke.js.map +1 -0
  149. package/dist/yomeSkills/list.d.ts +11 -0
  150. package/dist/yomeSkills/list.js +55 -0
  151. package/dist/yomeSkills/list.js.map +1 -0
  152. package/dist/yomeSkills/login.d.ts +41 -0
  153. package/dist/yomeSkills/login.js +221 -0
  154. package/dist/yomeSkills/login.js.map +1 -0
  155. package/dist/yomeSkills/manifest.d.ts +60 -0
  156. package/dist/yomeSkills/manifest.js +47 -0
  157. package/dist/yomeSkills/manifest.js.map +1 -0
  158. package/dist/yomeSkills/paths.d.ts +13 -0
  159. package/dist/yomeSkills/paths.js +33 -0
  160. package/dist/yomeSkills/paths.js.map +1 -0
  161. package/dist/yomeSkills/publish.d.ts +16 -0
  162. package/dist/yomeSkills/publish.js +109 -0
  163. package/dist/yomeSkills/publish.js.map +1 -0
  164. package/dist/yomeSkills/rollback.d.ts +10 -0
  165. package/dist/yomeSkills/rollback.js +83 -0
  166. package/dist/yomeSkills/rollback.js.map +1 -0
  167. package/dist/yomeSkills/search.d.ts +21 -0
  168. package/dist/yomeSkills/search.js +31 -0
  169. package/dist/yomeSkills/search.js.map +1 -0
  170. package/dist/yomeSkills/skillsIndex.d.ts +36 -0
  171. package/dist/yomeSkills/skillsIndex.js +111 -0
  172. package/dist/yomeSkills/skillsIndex.js.map +1 -0
  173. package/dist/yomeSkills/unified.d.ts +53 -0
  174. package/dist/yomeSkills/unified.js +187 -0
  175. package/dist/yomeSkills/unified.js.map +1 -0
  176. package/dist/yomeSkills/uninstall.d.ts +7 -0
  177. package/dist/yomeSkills/uninstall.js +22 -0
  178. package/dist/yomeSkills/uninstall.js.map +1 -0
  179. package/dist/yomeSkills/update.d.ts +18 -0
  180. package/dist/yomeSkills/update.js +75 -0
  181. package/dist/yomeSkills/update.js.map +1 -0
  182. package/dist/yomeSkills/validate.d.ts +11 -0
  183. package/dist/yomeSkills/validate.js +99 -0
  184. package/dist/yomeSkills/validate.js.map +1 -0
  185. package/package.json +14 -5
@@ -1,14 +1,23 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { Box, Text, useInput } from 'ink';
4
+ import TextInput from 'ink-text-input';
4
5
  const OPTIONS = [
5
- { id: 'allow', label: '是,允许' },
6
- { id: 'always', label: '是,并始终允许该命令(所有可逆命令)' },
7
- { id: 'deny', label: '不,取消' },
6
+ { id: 'allow', label: () => '是,允许(仅本次)' },
7
+ { id: 'session', label: (r) => `是,本会话内不再询问 (${r})` },
8
+ { id: 'always', label: (r) => `是,并永久允许 (${r}) — 写入 ~/.yome/settings.json` },
9
+ { id: 'deny', label: () => '否,并可选告知原因 (Esc 直接拒绝)' },
8
10
  ];
9
- export function PermissionPrompt({ toolName, message, detail, onAllow, onDeny, onAlwaysAllow }) {
11
+ export function PermissionPrompt({ toolName, message, detail, suggestedRule, onResolve }) {
10
12
  const [cursor, setCursor] = useState(0);
13
+ const [feedbackMode, setFeedbackMode] = useState(false);
14
+ const [feedback, setFeedback] = useState('');
15
+ const [editingRule, setEditingRule] = useState(false);
16
+ const [ruleDraft, setRuleDraft] = useState(suggestedRule);
17
+ const [pendingScope, setPendingScope] = useState(null);
11
18
  useInput((_input, key) => {
19
+ if (feedbackMode || editingRule)
20
+ return; // TextInput handles keys
12
21
  if (key.upArrow) {
13
22
  setCursor((prev) => (prev > 0 ? prev - 1 : OPTIONS.length - 1));
14
23
  }
@@ -17,21 +26,57 @@ export function PermissionPrompt({ toolName, message, detail, onAllow, onDeny, o
17
26
  }
18
27
  else if (key.return) {
19
28
  const selected = OPTIONS[cursor].id;
20
- if (selected === 'allow')
21
- onAllow();
22
- else if (selected === 'always')
23
- onAlwaysAllow();
24
- else
25
- onDeny();
29
+ if (selected === 'allow') {
30
+ onResolve({ kind: 'allow_once' });
31
+ }
32
+ else if (selected === 'session') {
33
+ if (suggestedRule.includes('(')) {
34
+ // Pre-formed rule like "Bash(npm run:*)" — let user edit
35
+ setPendingScope('session');
36
+ setEditingRule(true);
37
+ }
38
+ else {
39
+ onResolve({ kind: 'allow_session', ruleString: suggestedRule });
40
+ }
41
+ }
42
+ else if (selected === 'always') {
43
+ if (suggestedRule.includes('(')) {
44
+ setPendingScope('always');
45
+ setEditingRule(true);
46
+ }
47
+ else {
48
+ onResolve({ kind: 'allow_always', ruleString: suggestedRule });
49
+ }
50
+ }
51
+ else if (selected === 'deny') {
52
+ setFeedbackMode(true);
53
+ }
26
54
  }
27
55
  else if (key.escape) {
28
- onDeny();
56
+ onResolve({ kind: 'deny' });
29
57
  }
30
58
  });
31
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, marginTop: 1, children: [OPTIONS.map((opt, i) => {
59
+ const handleFeedbackSubmit = (value) => {
60
+ onResolve({ kind: 'deny', feedback: value.trim() || undefined });
61
+ };
62
+ const handleRuleSubmit = (value) => {
63
+ const trimmed = value.trim();
64
+ if (!trimmed) {
65
+ setEditingRule(false);
66
+ setPendingScope(null);
67
+ return;
68
+ }
69
+ if (pendingScope === 'session') {
70
+ onResolve({ kind: 'allow_session', ruleString: trimmed });
71
+ }
72
+ else if (pendingScope === 'always') {
73
+ onResolve({ kind: 'allow_always', ruleString: trimmed });
74
+ }
75
+ };
76
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#E87B35", paddingX: 1, marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: "#E87B35", children: toolName }), _jsxs(Text, { children: [": ", message] })] }), detail && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { dimColor: true, children: ' ' }), _jsx(Text, { children: detail.length > 200 ? detail.slice(0, 200) + '…' : detail })] })), !feedbackMode && !editingRule && OPTIONS.map((opt, i) => {
32
77
  const isFocused = i === cursor;
33
78
  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"] }) })] }));
79
+ return (_jsx(Box, { children: _jsxs(Text, { color: isFocused ? '#E87B35' : undefined, bold: isFocused, children: [pointer, opt.label(suggestedRule)] }) }, opt.id));
80
+ }), editingRule && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: ["\u7F16\u8F91 ", pendingScope === 'always' ? '永久' : '本会话', " \u5141\u8BB8\u89C4\u5219\uFF08Enter \u786E\u8BA4\uFF0C\u7A7A\u503C\u53D6\u6D88\uFF09\uFF1A"] }), _jsxs(Box, { children: [_jsx(Text, { color: "#E87B35", children: '> ' }), _jsx(TextInput, { value: ruleDraft, onChange: setRuleDraft, onSubmit: handleRuleSubmit })] })] })), feedbackMode && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "\u544A\u8BC9 agent \u62D2\u7EDD\u539F\u56E0\uFF08Enter \u786E\u8BA4\uFF0C\u7559\u7A7A\u8868\u793A\u65E0\u53CD\u9988\uFF09\uFF1A" }), _jsxs(Box, { children: [_jsx(Text, { color: "#E87B35", children: '> ' }), _jsx(TextInput, { value: feedback, onChange: setFeedback, onSubmit: handleFeedbackSubmit })] })] })), !feedbackMode && !editingRule && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " \u5BFC\u822A Enter \u9009\u62E9 Esc \u76F4\u63A5\u62D2\u7EDD"] }) }))] }));
36
81
  }
37
82
  //# sourceMappingURL=PermissionPrompt.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"PermissionPrompt.js","sourceRoot":"","sources":["../../src/ui/PermissionPrompt.tsx"],"names":[],"mappings":"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"}
@@ -52,13 +52,13 @@ export function SessionPicker({ sessions, onSelect, onCancel }) {
52
52
  if (sessions.length === 0) {
53
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
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) => {
55
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "#E87B35", 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
56
  const realIdx = visibleStart + vi;
57
57
  const isFocused = realIdx === cursor;
58
58
  const pointer = isFocused ? '\u276F' : ' ';
59
59
  const titleText = s.title.length > 60 ? s.title.slice(0, 57) + '...' : s.title;
60
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));
61
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? '#E87B35' : undefined, children: [pointer, " "] }), _jsx(Text, { bold: true, color: isFocused ? '#E87B35' : undefined, 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
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
63
  }
64
64
  //# sourceMappingURL=SessionPicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionPicker.js","sourceRoot":"","sources":["../../src/ui/SessionPicker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionPicker.js","sourceRoot":"","sources":["../../src/ui/SessionPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface ShimmerTextProps {
2
+ text: string;
3
+ /** How many frames between each character shift. 1 = fastest. */
4
+ speed?: number;
5
+ bold?: boolean;
6
+ }
7
+ export declare function ShimmerText({ text, speed, bold }: ShimmerTextProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Text } from 'ink';
3
+ import { useFrame } from './animation.js';
4
+ // Two-tone ramp: brand orange → white → orange. Linear interpolation
5
+ // from #E87B35 to #FFFFFF and back. The peak (#FFFFFF) is the moving
6
+ // "spot light" sweeping across the word; everything else is just an
7
+ // orange-to-white gradient with no extra hues.
8
+ //
9
+ // Ink uses chalk under the hood, which supports truecolor in modern
10
+ // terminals, so any hex value works.
11
+ const RAMP = [
12
+ '#E87B35', // brand orange (base)
13
+ '#EC8C4D',
14
+ '#F09D65',
15
+ '#F3AE7D',
16
+ '#F7BF95',
17
+ '#FBD0AD',
18
+ '#FFFFFF', // peak (the "spark")
19
+ '#FBD0AD',
20
+ '#F7BF95',
21
+ '#F3AE7D',
22
+ '#F09D65',
23
+ '#EC8C4D',
24
+ ];
25
+ export function ShimmerText({ text, speed = 1, bold = true }) {
26
+ const frame = useFrame();
27
+ const period = RAMP.length;
28
+ // Slower speed = larger divisor so the spot light moves less per frame.
29
+ const phase = Math.floor(frame / Math.max(1, speed));
30
+ // We render one <Text> per character. That's a few extra nodes but
31
+ // they're tiny and Ink's renderer batches them into one terminal
32
+ // patch via its damage tracker. Memoization elsewhere already makes
33
+ // sure non-shimmering rows don't re-render along with this one.
34
+ return (_jsx(Text, { children: Array.from(text).map((ch, i) => {
35
+ const idx = ((phase - i) % period + period) % period;
36
+ const color = RAMP[idx];
37
+ return (_jsx(Text, { color: color, bold: bold, children: ch }, i));
38
+ }) }));
39
+ }
40
+ //# sourceMappingURL=ShimmerText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShimmerText.js","sourceRoot":"","sources":["../../src/ui/ShimmerText.tsx"],"names":[],"mappings":";AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,qCAAqC;AACrC,MAAM,IAAI,GAAG;IACX,SAAS,EAAE,sBAAsB;IACjC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS,EAAE,qBAAqB;IAChC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AASF,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,EAAoB;IAC5E,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,wEAAwE;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAErD,mEAAmE;IACnE,iEAAiE;IACjE,oEAAoE;IACpE,gEAAgE;IAChE,OAAO,CACL,KAAC,IAAI,cACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAE,CAAC;YACzB,OAAO,CACL,KAAC,IAAI,IAAS,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,YACnC,EAAE,IADM,CAAC,CAEL,CACR,CAAC;QACJ,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC"}
@@ -1,15 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useState, useEffect } from 'react';
3
2
  import { Text } from 'ink';
3
+ import { useFrame } from './animation.js';
4
4
  const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
5
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] });
6
+ const frame = useFrame();
7
+ return _jsx(Text, { color: color, children: FRAMES[frame % FRAMES.length] });
14
8
  }
15
9
  //# sourceMappingURL=Spinner.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/ui/Spinner.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,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,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAQ,CAAC;AACpE,CAAC"}
@@ -20,16 +20,16 @@ export function TogglePicker({ title, items, onToggle, onClose, emptyHint }) {
20
20
  }
21
21
  });
22
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" }) })] }));
23
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "#E87B35", children: title }) }), _jsx(Text, { dimColor: true, children: emptyHint }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Esc close" }) })] }));
24
24
  }
25
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) => {
26
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "#E87B35", children: title }), _jsxs(Text, { dimColor: true, children: [" ", '\u2014', " Space/Enter toggle, Esc close"] })] }), items.map((item, i) => {
27
27
  const isFocused = i === cursor;
28
28
  const pointer = isFocused ? '\u276F' : ' ';
29
29
  const toggle = item.enabled ? '\u25C9' : '\u25CB';
30
- const toggleColor = item.enabled ? 'green' : 'red';
30
+ const toggleColor = item.enabled ? '#E87B35' : 'gray';
31
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));
32
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: isFocused ? '#E87B35' : undefined, children: [pointer, " "] }), _jsxs(Text, { color: toggleColor, children: [toggle, " "] }), _jsx(Text, { bold: true, color: isFocused ? '#E87B35' : 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
33
  }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2191\u2193', " navigate ", ' ', " Space/Enter toggle ", ' ', " Esc close"] }) })] }));
34
34
  }
35
35
  //# sourceMappingURL=TogglePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TogglePicker.js","sourceRoot":"","sources":["../../src/ui/TogglePicker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TogglePicker.js","sourceRoot":"","sources":["../../src/ui/TogglePicker.tsx"],"names":[],"mappings":"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"}
@@ -34,6 +34,12 @@ function DiffView({ result }) {
34
34
  }), _jsx(Text, { dimColor: true, children: '─'.repeat(cols) }), truncated && _jsx(Text, { dimColor: true, children: ` … ${diffLines.length - maxShow} more lines` })] }));
35
35
  }
36
36
  export function ToolResult({ name, result }) {
37
+ // Permission denial — surface a concise red line so the user can see the
38
+ // tool was blocked. The full guidance text is kept in the tool_result that
39
+ // goes back to the model.
40
+ if (result.startsWith('[YOME_PERMISSION_DENIED]')) {
41
+ return (_jsx(Box, { marginLeft: 4, children: _jsx(Text, { color: "red", children: `✕ ${name} — permission denied` }) }));
42
+ }
37
43
  // Read, LS, Grep, Glob, Bash — don't show content to user (it's for the AI)
38
44
  if (name === 'Read' || name === 'LS' || name === 'Grep' || name === 'Glob') {
39
45
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolResult.js","sourceRoot":"","sources":["../../src/ui/ToolResult.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolResult.js","sourceRoot":"","sources":["../../src/ui/ToolResult.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,SAAS,QAAQ,CAAC,EAAE,MAAM,EAAsB;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAElE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACxC,IAAI,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAEhD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAQ,EACvC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAE9C,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC5C,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAQ,IADtD,CAAC,CAEL,CACP,CAAC;gBACJ,CAAC;gBACD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC3C,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAQ,IADnD,CAAC,CAEL,CACP,CAAC;gBACJ,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC5C,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,GAAQ,IADjD,CAAC,CAEL,CACP,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAC,IAAI,IAAS,QAAQ,kBAAE,KAAK,IAAI,EAAE,IAAxB,CAAC,CAA+B,CAAC;YACrD,CAAC,CAAC,EACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAQ,EACvC,SAAS,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,aAAa,GAAQ,IAChF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAmB;IAC1D,yEAAyE;IACzE,2EAA2E;IAC3E,0BAA0B;IAC1B,IAAI,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAClD,OAAO,CACL,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,IAAI,sBAAsB,GAAQ,GACtD,CACP,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,CACL,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,kBAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAQ,GACrD,CACP,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CACL,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,SAAS,mBAAmB,GAAQ,GACpD,CACP,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { UnifiedSkill } from '../yomeSkills/unified.js';
2
+ interface UnifiedSkillsPickerProps {
3
+ skills: UnifiedSkill[];
4
+ onToggle: (skill: UnifiedSkill) => void;
5
+ onUninstall: (skill: UnifiedSkill) => void;
6
+ onAdd: () => void;
7
+ onClose: () => void;
8
+ }
9
+ export declare function UnifiedSkillsPicker({ skills, onToggle, onUninstall, onAdd, onClose, }: UnifiedSkillsPickerProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // UnifiedSkillsPicker — TUI for `/skills` slash command.
3
+ //
4
+ // Lists every skill the agent knows about, regardless of system:
5
+ // - prompt skills: SKILL.md files under .yome/skills (Claude Code FORMAT,
6
+ // but yome paths only — we don't read ~/.claude)
7
+ // - hub skills: yome-skill.json packages installed via `yome skill install`
8
+ //
9
+ // The kind column lets the user immediately see what they're toggling.
10
+ // Common actions (enable/disable) work uniformly; uninstall is hub-only
11
+ // because removing a SKILL.md should be left to the user's editor.
12
+ import { useMemo, useState } from 'react';
13
+ import { Box, Text, useInput } from 'ink';
14
+ import { originLabel } from '../yomeSkills/unified.js';
15
+ export function UnifiedSkillsPicker({ skills, onToggle, onUninstall, onAdd, onClose, }) {
16
+ const [cursor, setCursor] = useState(0);
17
+ const focused = skills[cursor];
18
+ const maxNameLen = useMemo(() => (skills.length > 0 ? Math.max(...skills.map((s) => s.name.length)) : 8), [skills]);
19
+ const maxKindLen = useMemo(() => (skills.length > 0 ? Math.max(...skills.map((s) => originLabel(s).length)) : 4), [skills]);
20
+ useInput((input, key) => {
21
+ if (key.escape || (key.ctrl && input === 'c')) {
22
+ onClose();
23
+ return;
24
+ }
25
+ if (input === 'a') {
26
+ onAdd();
27
+ return;
28
+ }
29
+ if (input === 'u' && focused && focused.kind === 'hub') {
30
+ onUninstall(focused);
31
+ return;
32
+ }
33
+ if (skills.length === 0)
34
+ return;
35
+ if (key.upArrow)
36
+ setCursor((c) => (c > 0 ? c - 1 : skills.length - 1));
37
+ else if (key.downArrow)
38
+ setCursor((c) => (c < skills.length - 1 ? c + 1 : 0));
39
+ else if (key.return || input === ' ') {
40
+ if (focused)
41
+ onToggle(focused);
42
+ }
43
+ });
44
+ const promptCount = skills.filter((s) => s.kind === 'prompt').length;
45
+ const hubCount = skills.filter((s) => s.kind === 'hub').length;
46
+ // Fixed column widths derived from longest cell content. Pointer slot,
47
+ // toggle slot, and the gap between them are constants so every row
48
+ // (focused or not) lines up exactly. The detail block under a focused
49
+ // row reuses the same prefix indent so it visually nests under the name
50
+ // column rather than floating at a magic offset.
51
+ const POINTER_W = 2; // '>' + space
52
+ const TOGGLE_W = 2; // '●' + space
53
+ const GAP_W = 2; // gutter before the name column
54
+ const PREFIX_W = POINTER_W + TOGGLE_W + GAP_W; // 6 — detail indent
55
+ const nameColW = maxNameLen + 2;
56
+ const kindColW = maxKindLen + 2;
57
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, paddingY: 0, width: "100%", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: "#E87B35", children: "Skills" }), _jsxs(Text, { dimColor: true, children: [' ', '\u2014', ' ', hubCount, " hub \u00B7 ", promptCount, " prompt"] })] }), _jsx(Box, { marginTop: 1, marginBottom: 1, children: _jsx(Text, { dimColor: true, children: '\u2500'.repeat(60) }) }), skills.length === 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "No skills installed yet." }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "Try one of:" }), _jsx(Text, { dimColor: true, children: " \u00B7 /plugins open the hub marketplace" }), _jsx(Text, { dimColor: true, children: " \u00B7 ~/.yome/skills/<name>/SKILL.md add a prompt skill (user)" }), _jsx(Text, { dimColor: true, children: " \u00B7 ./.yome/skills/<name>/SKILL.md add a prompt skill (project)" })] })] })), skills.map((s, i) => {
58
+ const isFocused = i === cursor;
59
+ const toggle = s.enabled ? '\u25CF' : '\u25CB';
60
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Box, { width: POINTER_W, flexShrink: 0, children: _jsx(Text, { color: isFocused ? '#E87B35' : undefined, bold: isFocused, children: isFocused ? '>' : ' ' }) }), _jsx(Box, { width: TOGGLE_W, flexShrink: 0, children: _jsx(Text, { color: "#E87B35", children: toggle }) }), _jsx(Box, { width: GAP_W, flexShrink: 0, children: _jsx(Text, { children: " " }) }), _jsx(Box, { width: nameColW, flexShrink: 0, children: _jsx(Text, { bold: true, color: isFocused ? '#E87B35' : undefined, wrap: "truncate-end", children: s.name }) }), _jsx(Box, { width: kindColW, flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: originLabel(s) }) }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: s.description }) })] }), isFocused && (_jsxs(Box, { marginLeft: PREFIX_W, marginTop: 0, marginBottom: 1, flexDirection: "column", children: [s.kind === 'hub' && (_jsxs(_Fragment, { children: [_jsxs(Box, { children: [_jsx(Box, { width: 9, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: "slug" }) }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [s.slug, " \u00B7 v", s.version, " \u00B7 ", s.domain] })] }), s.source && (_jsxs(Box, { children: [_jsx(Box, { width: 9, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: "source" }) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: s.source })] })), s.allowedCapabilities && s.allowedCapabilities.length > 0 && (_jsxs(Box, { children: [_jsx(Box, { width: 9, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: "caps" }) }), _jsx(Text, { dimColor: true, wrap: "truncate-end", children: s.allowedCapabilities.join(', ') })] }))] })), s.kind === 'prompt' && (_jsxs(Box, { children: [_jsx(Box, { width: 9, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: "file" }) }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [s.installedAt, "/SKILL.md"] })] }))] }))] }, s.id));
61
+ }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: '\u2500'.repeat(60) }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [_jsx(Text, { color: "#E87B35", children: '\u2191\u2193' }), " nav ", _jsx(Text, { color: "#E87B35", children: "Space" }), " toggle ", _jsx(Text, { color: "#E87B35", children: "a" }), " add", focused?.kind === 'hub' ? _jsxs(_Fragment, { children: [" ", _jsx(Text, { color: "#E87B35", children: "u" }), " uninstall"] }) : '', " ", _jsx(Text, { color: "#E87B35", children: "Esc" }), " close"] }) })] }));
62
+ }
63
+ //# sourceMappingURL=UnifiedSkillsPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnifiedSkillsPicker.js","sourceRoot":"","sources":["../../src/ui/UnifiedSkillsPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const FRAME_INTERVAL_MS = 80;
2
+ /** Subscribe a React component to the global frame ticker. */
3
+ export declare function useFrame(): number;
@@ -0,0 +1,48 @@
1
+ // animation.ts — single shared frame driver for every animated component.
2
+ //
3
+ // Previously each <Spinner> / animated text mounted its own setInterval.
4
+ // With many concurrent indicators that meant N timers all firing every
5
+ // frame, each independently re-rendering. This module exposes ONE timer
6
+ // that ticks at FRAME_INTERVAL_MS, and a tiny pub/sub so any component
7
+ // can subscribe to the global frame counter. The interval auto-stops
8
+ // when the last subscriber leaves and is .unref()'d so it never blocks
9
+ // process exit.
10
+ import { useEffect, useState } from 'react';
11
+ export const FRAME_INTERVAL_MS = 80;
12
+ let currentFrame = 0;
13
+ let timer = null;
14
+ const subscribers = new Set();
15
+ function ensureTimer() {
16
+ if (timer || subscribers.size === 0)
17
+ return;
18
+ timer = setInterval(() => {
19
+ // Use a large modulus so consumers can take whatever sub-period
20
+ // they want (Spinner: %10, Shimmer: %width, etc.) without a wrap
21
+ // boundary every few hundred ms.
22
+ currentFrame = (currentFrame + 1) % 1_000_000;
23
+ for (const cb of subscribers)
24
+ cb(currentFrame);
25
+ }, FRAME_INTERVAL_MS);
26
+ if (timer && typeof timer.unref === 'function')
27
+ timer.unref();
28
+ }
29
+ function maybeStopTimer() {
30
+ if (subscribers.size === 0 && timer) {
31
+ clearInterval(timer);
32
+ timer = null;
33
+ }
34
+ }
35
+ /** Subscribe a React component to the global frame ticker. */
36
+ export function useFrame() {
37
+ const [frame, setFrame] = useState(currentFrame);
38
+ useEffect(() => {
39
+ subscribers.add(setFrame);
40
+ ensureTimer();
41
+ return () => {
42
+ subscribers.delete(setFrame);
43
+ maybeStopTimer();
44
+ };
45
+ }, []);
46
+ return frame;
47
+ }
48
+ //# sourceMappingURL=animation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/ui/animation.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,wEAAwE;AACxE,uEAAuE;AACvE,qEAAqE;AACrE,uEAAuE;AACvE,gBAAgB;AAEhB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,IAAI,KAAK,GAA0C,IAAI,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;AAEvD,SAAS,WAAW;IAClB,IAAI,KAAK,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC5C,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QACvB,gEAAgE;QAChE,iEAAiE;QACjE,iCAAiC;QACjC,YAAY,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;QAC9C,KAAK,MAAM,EAAE,IAAI,WAAW;YAAE,EAAE,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACtB,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACpC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,WAAW,EAAE,CAAC;QACd,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ThrottledStream {
2
+ displayText: string;
3
+ append: (delta: string) => void;
4
+ reset: () => void;
5
+ flush: () => void;
6
+ }
7
+ export declare function useThrottledStream(intervalMs?: number): ThrottledStream;
@@ -0,0 +1,63 @@
1
+ // useThrottledStream — coalesce high-frequency text deltas into ~30fps UI updates.
2
+ //
3
+ // LLM streams emit dozens of token deltas per second. Calling React setState
4
+ // on every delta forces Ink to reconcile + paint the entire tree per token —
5
+ // which on long sessions snowballs into terminal IO storms (the root cause of
6
+ // the "long session crashes my terminal" bug). Claude Code / Gemini CLI both
7
+ // solve this by debouncing the live region: tokens are appended to a ref, and
8
+ // React state is updated on a timer.
9
+ //
10
+ // This hook returns:
11
+ // - displayText: the throttled state suitable for rendering
12
+ // - append: O(1) ref-mutation, safe to call from inside an LLM stream
13
+ // - reset: clear buffer + state (call on /new, on done, before next run)
14
+ // - flush: force-publish ref buffer to state immediately
15
+ //
16
+ // Frame rate is capped at ~30 fps (33ms) by default — Ink's own renderer caps
17
+ // at 30 fps anyway, so anything faster is wasted work.
18
+ import { useCallback, useEffect, useRef, useState } from 'react';
19
+ const DEFAULT_INTERVAL_MS = 33;
20
+ export function useThrottledStream(intervalMs = DEFAULT_INTERVAL_MS) {
21
+ const [displayText, setDisplayText] = useState('');
22
+ const bufferRef = useRef('');
23
+ const lastPublishedRef = useRef('');
24
+ const timerRef = useRef(null);
25
+ const ensureTimer = useCallback(() => {
26
+ if (timerRef.current)
27
+ return;
28
+ timerRef.current = setInterval(() => {
29
+ if (bufferRef.current !== lastPublishedRef.current) {
30
+ lastPublishedRef.current = bufferRef.current;
31
+ setDisplayText(bufferRef.current);
32
+ }
33
+ }, intervalMs);
34
+ }, [intervalMs]);
35
+ const stopTimer = useCallback(() => {
36
+ if (timerRef.current) {
37
+ clearInterval(timerRef.current);
38
+ timerRef.current = null;
39
+ }
40
+ }, []);
41
+ const append = useCallback((delta) => {
42
+ bufferRef.current += delta;
43
+ ensureTimer();
44
+ }, [ensureTimer]);
45
+ const flush = useCallback(() => {
46
+ if (bufferRef.current !== lastPublishedRef.current) {
47
+ lastPublishedRef.current = bufferRef.current;
48
+ setDisplayText(bufferRef.current);
49
+ }
50
+ }, []);
51
+ const reset = useCallback(() => {
52
+ stopTimer();
53
+ bufferRef.current = '';
54
+ lastPublishedRef.current = '';
55
+ setDisplayText('');
56
+ }, [stopTimer]);
57
+ // Cleanup on unmount — critical for long sessions to avoid orphaned timers.
58
+ useEffect(() => {
59
+ return () => stopTimer();
60
+ }, [stopTimer]);
61
+ return { displayText, append, reset, flush };
62
+ }
63
+ //# sourceMappingURL=useThrottledStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThrottledStream.js","sourceRoot":"","sources":["../../src/ui/useThrottledStream.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,qCAAqC;AACrC,EAAE;AACF,qBAAqB;AACrB,8DAA8D;AAC9D,6EAA6E;AAC7E,iFAAiF;AACjF,iEAAiE;AACjE,EAAE;AACF,8EAA8E;AAC9E,uDAAuD;AAEvD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAS/B,MAAM,UAAU,kBAAkB,CAAC,aAAqB,mBAAmB;IACzE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,QAAQ,CAAC,OAAO;YAAE,OAAO;QAC7B,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,SAAS,CAAC,OAAO,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBACnD,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC7C,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC3C,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC;QAC3B,WAAW,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,SAAS,CAAC,OAAO,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACnD,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;YAC7C,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,SAAS,EAAE,CAAC;QACZ,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;QACvB,gBAAgB,CAAC,OAAO,GAAG,EAAE,CAAC;QAC9B,cAAc,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface YomeAuthState {
2
+ /** Opaque token issued by /api/cli/auth/exchange. 64 hex chars. */
3
+ yome_token: string;
4
+ /** Supabase auth.users.id — the Yome principal. */
5
+ yome_user_id: string;
6
+ /** Provider used at login time ("github" today; future: apple/wechat/email). */
7
+ provider: 'github' | 'apple' | 'email' | 'wechat';
8
+ /** Provider-side display name at login time, for whoami output. */
9
+ provider_login?: string;
10
+ /** ISO-8601 timestamp the token expires. */
11
+ expires_at: string;
12
+ /** ISO-8601 timestamp the token was first written. */
13
+ obtained_at: string;
14
+ }
15
+ export declare function getAuthFilePath(): string;
16
+ export declare function readAuthState(): YomeAuthState | null;
17
+ export declare function writeAuthState(state: YomeAuthState): void;
18
+ export declare function clearAuthState(): boolean;
19
+ /** Bearer header object suitable for fetch({headers}). null if logged out. */
20
+ export declare function bearerHeader(): Record<string, string> | null;