@within-7/minto 0.3.6 → 0.3.10

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 (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. package/scripts/{postinstall.js → postinstall.cjs} +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/new.tsx"],
4
+ "sourcesContent": ["/**\n * New Command\n *\n * Start a new conversation (skip auto-resume).\n * Same effect as starting with `-n, --new` CLI parameter.\n *\n * Usage:\n * /new # Start a new conversation\n * /n # Alias\n */\n\nimport React from 'react'\nimport { render } from 'ink'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { dateToFilename } from '@utils/log'\nimport { isDefaultSlowAndCapableModel } from '@utils/model'\nimport { prepareTerminalForREPL } from '@utils/terminal'\nimport { REPL } from '@screens/REPL'\nimport { clearConversation } from './clear'\n\nexport default {\n type: 'local-jsx',\n name: 'new',\n description: t('commands.new.description'),\n isEnabled: true,\n isHidden: false,\n aliases: ['n'],\n userFacingName() {\n return 'new'\n },\n async call(onDone, context) {\n const { commands = [], tools = [], verbose = false } = context.options || {}\n const unmount = context.unmount\n\n // Clear current conversation state\n await clearConversation(context)\n\n // Check if using default model before unmounting\n const isDefaultModel = await isDefaultSlowAndCapableModel()\n\n // Generate new message log name (timestamp-based)\n const messageLogName = dateToFilename(new Date())\n\n // Close the command UI\n onDone()\n\n // Unmount current REPL before creating new one\n if (unmount) {\n unmount()\n }\n\n // Clear screen and prepare terminal for REPL\n await prepareTerminalForREPL()\n\n // Render a new REPL with fresh state\n render(\n <REPL\n messageLogName={messageLogName}\n initialPrompt=\"\"\n shouldShowPromptInput={true}\n verbose={verbose}\n commands={commands}\n tools={tools}\n initialMessages={[]}\n initialForkNumber={1}\n isDefaultModel={isDefaultModel}\n isResumedConversation={false}\n />,\n {\n exitOnCtrlC: false,\n },\n )\n\n return null\n },\n} satisfies Command\n"],
5
+ "mappings": "AAWA,OAAO,WAAW;AAClB,SAAS,cAAc;AAEvB,SAAS,SAAS;AAClB,SAAS,sBAAsB;AAC/B,SAAS,oCAAoC;AAC7C,SAAS,8BAA8B;AACvC,SAAS,YAAY;AACrB,SAAS,yBAAyB;AAElC,IAAO,cAAQ;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa,EAAE,0BAA0B;AAAA,EACzC,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS,CAAC,GAAG;AAAA,EACb,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ,SAAS;AAC1B,UAAM,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,MAAM,IAAI,QAAQ,WAAW,CAAC;AAC3E,UAAM,UAAU,QAAQ;AAGxB,UAAM,kBAAkB,OAAO;AAG/B,UAAM,iBAAiB,MAAM,6BAA6B;AAG1D,UAAM,iBAAiB,eAAe,oBAAI,KAAK,CAAC;AAGhD,WAAO;AAGP,QAAI,SAAS;AACX,cAAQ;AAAA,IACV;AAGA,UAAM,uBAAuB;AAG7B;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,eAAc;AAAA,UACd,uBAAuB;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB,CAAC;AAAA,UAClB,mBAAmB;AAAA,UACnB;AAAA,UACA,uBAAuB;AAAA;AAAA,MACzB;AAAA,MACA;AAAA,QACE,aAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -1,66 +1,92 @@
1
- import React, { useState } from "react";
2
- import { Box, Text, useInput } from "ink";
1
+ import React from "react";
3
2
  import {
4
3
  getPermissionRuleEngine
5
4
  } from "../core/permissions/index.js";
6
5
  import { SEMANTIC_COLORS } from "../constants/colors.js";
7
- const PermissionList = ({
6
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
7
+ import { t } from "../i18n/index.js";
8
+ function getDecisionIcon(decision) {
9
+ switch (decision) {
10
+ case "allow":
11
+ return "\u2713";
12
+ case "deny":
13
+ return "\u2717";
14
+ case "ask":
15
+ return "?";
16
+ }
17
+ }
18
+ function getDecisionColor(decision) {
19
+ switch (decision) {
20
+ case "allow":
21
+ return SEMANTIC_COLORS.success;
22
+ case "deny":
23
+ return SEMANTIC_COLORS.error;
24
+ case "ask":
25
+ return "#FFB86C";
26
+ }
27
+ }
28
+ function formatDecision(decision) {
29
+ switch (decision) {
30
+ case "allow":
31
+ return "ALLOW";
32
+ case "deny":
33
+ return "DENY";
34
+ case "ask":
35
+ return "ASK";
36
+ }
37
+ }
38
+ function rulesToSelectorItems(rules) {
39
+ return rules.map((rule) => ({
40
+ id: rule.id,
41
+ label: `${formatDecision(rule.decision).padEnd(6)} ${rule.pattern}`,
42
+ description: rule.description ? `P${rule.priority} - ${rule.description}` : `P${rule.priority}`,
43
+ statusIcon: getDecisionIcon(rule.decision),
44
+ statusColor: getDecisionColor(rule.decision),
45
+ category: rule.scope === "project" ? "Project Rules" : "Global Rules"
46
+ }));
47
+ }
48
+ const PermissionsView = ({
8
49
  rules,
9
50
  defaultDecision,
10
51
  onDone
11
52
  }) => {
12
- const [selectedIndex, setSelectedIndex] = useState(0);
13
- useInput((input, key) => {
14
- if (key.upArrow) {
15
- setSelectedIndex(Math.max(0, selectedIndex - 1));
16
- } else if (key.downArrow) {
17
- setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1));
18
- } else if (input === "q" || key.escape) {
19
- onDone();
20
- }
21
- });
22
- const globalRules = rules.filter((r) => r.scope === "global");
23
- const projectRules = rules.filter((r) => r.scope === "project");
24
- const getDecisionColor = (decision) => {
25
- switch (decision) {
26
- case "allow":
27
- return "green";
28
- case "deny":
29
- return "red";
30
- case "ask":
31
- return "yellow";
32
- }
33
- };
34
- const formatDecision = (decision) => {
35
- switch (decision) {
36
- case "allow":
37
- return "\u2713 ALLOW";
38
- case "deny":
39
- return "\u2717 DENY";
40
- case "ask":
41
- return "? ASK";
53
+ const items = rulesToSelectorItems(rules);
54
+ if (rules.length === 0) {
55
+ return /* @__PURE__ */ React.createElement(
56
+ SimpleSelector,
57
+ {
58
+ title: t("commands.permissions.description"),
59
+ subtitle: `${t("common.default")}: ${formatDecision(defaultDecision)}`,
60
+ items: [
61
+ {
62
+ id: "empty",
63
+ label: "No custom rules defined. Using default rules."
64
+ }
65
+ ],
66
+ onSelect: () => onDone(),
67
+ onClose: () => onDone()
68
+ }
69
+ );
70
+ }
71
+ return /* @__PURE__ */ React.createElement(
72
+ SimpleSelector,
73
+ {
74
+ title: "Permission Rules",
75
+ subtitle: `${t("common.default")}: ${formatDecision(defaultDecision)}`,
76
+ items,
77
+ groupByCategory: true,
78
+ onSelect: () => {
79
+ },
80
+ onClose: () => onDone()
42
81
  }
43
- };
44
- const renderRule = (rule, index) => {
45
- const isSelected = index === selectedIndex;
46
- return /* @__PURE__ */ React.createElement(Box, { key: rule.id, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u25B6 " : " ", /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(rule.decision) }, formatDecision(rule.decision).padEnd(10)), /* @__PURE__ */ React.createElement(Text, { bold: true }, rule.pattern.padEnd(30)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "P", rule.priority), rule.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " - ", rule.description)));
47
- };
48
- let displayIndex = 0;
49
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Permission Rules")), /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Default decision: "), /* @__PURE__ */ React.createElement(Text, { color: getDecisionColor(defaultDecision), bold: true }, formatDecision(defaultDecision)))), projectRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "blue" }, "Project Rules (", projectRules.length, ")")), projectRules.map((rule) => {
50
- const result = renderRule(rule, displayIndex);
51
- displayIndex++;
52
- return result;
53
- })), globalRules.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "magenta" }, "Global Rules (", globalRules.length, ")")), globalRules.map((rule) => {
54
- const result = renderRule(rule, displayIndex);
55
- displayIndex++;
56
- return result;
57
- })), rules.length === 0 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "No custom rules defined. Using default rules.")), /* @__PURE__ */ React.createElement(Box, { marginTop: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191/\u2193: Navigate | q/Esc: Exit")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Legend: ", /* @__PURE__ */ React.createElement(Text, { color: "green" }, "ALLOW"), " = auto-approve,", " ", /* @__PURE__ */ React.createElement(Text, { color: "red" }, "DENY"), " = block, ", /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "ASK"), " ", "= prompt user")));
82
+ );
58
83
  };
59
84
  const command = {
60
85
  name: "permissions",
61
86
  description: "View and manage permission rules for tool access",
62
87
  isEnabled: true,
63
88
  isHidden: false,
89
+ hidePromptInput: true,
64
90
  type: "local-jsx",
65
91
  aliases: ["perms"],
66
92
  userFacingName() {
@@ -71,7 +97,7 @@ const command = {
71
97
  const rules = engine.getRules();
72
98
  const defaultDecision = engine.getDefaultDecision();
73
99
  return /* @__PURE__ */ React.createElement(
74
- PermissionList,
100
+ PermissionsView,
75
101
  {
76
102
  rules,
77
103
  defaultDecision,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/permissions.tsx"],
4
- "sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getPermissionRuleEngine,\n type PatternPermissionRule,\n type RulePermissionDecision,\n} from '../core/permissions'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface PermissionListProps {\n rules: PatternPermissionRule[]\n defaultDecision: RulePermissionDecision\n onDone: (result?: string) => void\n}\n\nconst PermissionList = ({\n rules,\n defaultDecision,\n onDone,\n}: PermissionListProps) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1))\n } else if (key.downArrow) {\n setSelectedIndex(Math.min(rules.length - 1, selectedIndex + 1))\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n // Group rules by scope\n const globalRules = rules.filter(r => r.scope === 'global')\n const projectRules = rules.filter(r => r.scope === 'project')\n\n const getDecisionColor = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return 'green'\n case 'deny':\n return 'red'\n case 'ask':\n return 'yellow'\n }\n }\n\n const formatDecision = (decision: RulePermissionDecision) => {\n switch (decision) {\n case 'allow':\n return '\u2713 ALLOW'\n case 'deny':\n return '\u2717 DENY'\n case 'ask':\n return '? ASK'\n }\n }\n\n const renderRule = (rule: PatternPermissionRule, index: number) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={rule.id} paddingLeft={1}>\n <Text color={isSelected ? 'cyan' : undefined}>\n {isSelected ? '\u25B6 ' : ' '}\n <Text color={getDecisionColor(rule.decision)}>\n {formatDecision(rule.decision).padEnd(10)}\n </Text>\n <Text bold>{rule.pattern.padEnd(30)}</Text>\n <Text color={SEMANTIC_COLORS.dim}>P{rule.priority}</Text>\n {rule.description && (\n <Text color={SEMANTIC_COLORS.dim}> - {rule.description}</Text>\n )}\n </Text>\n </Box>\n )\n }\n\n let displayIndex = 0\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>Permission Rules</Text>\n </Box>\n\n {/* Default decision */}\n <Box marginBottom={1}>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Default decision: </Text>\n <Text color={getDecisionColor(defaultDecision)} bold>\n {formatDecision(defaultDecision)}\n </Text>\n </Text>\n </Box>\n\n {/* Project rules */}\n {projectRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"blue\">\n Project Rules ({projectRules.length})\n </Text>\n </Box>\n {projectRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {/* Global rules */}\n {globalRules.length > 0 && (\n <>\n <Box marginTop={1}>\n <Text bold color=\"magenta\">\n Global Rules ({globalRules.length})\n </Text>\n </Box>\n {globalRules.map(rule => {\n const result = renderRule(rule, displayIndex)\n displayIndex++\n return result\n })}\n </>\n )}\n\n {rules.length === 0 && (\n <Box paddingLeft={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n No custom rules defined. Using default rules.\n </Text>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={2}>\n <Text color={SEMANTIC_COLORS.dim}>\u2191/\u2193: Navigate | q/Esc: Exit</Text>\n </Box>\n\n {/* Legend */}\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Legend: <Text color=\"green\">ALLOW</Text> = auto-approve,{' '}\n <Text color=\"red\">DENY</Text> = block, <Text color=\"yellow\">ASK</Text>{' '}\n = prompt user\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'permissions',\n description: 'View and manage permission rules for tool access',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n aliases: ['perms'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const engine = getPermissionRuleEngine()\n const rules = engine.getRules()\n const defaultDecision = engine.getDefaultDecision()\n\n return (\n <PermissionList\n rules={rules}\n defaultDecision={defaultDecision}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Permissions Command\n *\n * View and manage permission rules for tool access.\n * Uses SimpleSelector with groupByCategory for consistent UI.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getPermissionRuleEngine,\n type PatternPermissionRule,\n type RulePermissionDecision,\n} from '../core/permissions'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport { t } from '@i18n'\n\nfunction getDecisionIcon(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return '\\u2713'\n case 'deny':\n return '\\u2717'\n case 'ask':\n return '?'\n }\n}\n\nfunction getDecisionColor(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return SEMANTIC_COLORS.success\n case 'deny':\n return SEMANTIC_COLORS.error\n case 'ask':\n return '#FFB86C' // warning\n }\n}\n\nfunction formatDecision(decision: RulePermissionDecision): string {\n switch (decision) {\n case 'allow':\n return 'ALLOW'\n case 'deny':\n return 'DENY'\n case 'ask':\n return 'ASK'\n }\n}\n\nfunction rulesToSelectorItems(rules: PatternPermissionRule[]): SelectorItem[] {\n return rules.map(rule => ({\n id: rule.id,\n label: `${formatDecision(rule.decision).padEnd(6)} ${rule.pattern}`,\n description: rule.description\n ? `P${rule.priority} - ${rule.description}`\n : `P${rule.priority}`,\n statusIcon: getDecisionIcon(rule.decision),\n statusColor: getDecisionColor(rule.decision),\n category: rule.scope === 'project' ? 'Project Rules' : 'Global Rules',\n }))\n}\n\ninterface PermissionsViewProps {\n rules: PatternPermissionRule[]\n defaultDecision: RulePermissionDecision\n onDone: (result?: string) => void\n}\n\nconst PermissionsView: React.FC<PermissionsViewProps> = ({\n rules,\n defaultDecision,\n onDone,\n}) => {\n const items = rulesToSelectorItems(rules)\n\n if (rules.length === 0) {\n return (\n <SimpleSelector\n title={t('commands.permissions.description')}\n subtitle={`${t('common.default')}: ${formatDecision(defaultDecision)}`}\n items={[\n {\n id: 'empty',\n label: 'No custom rules defined. Using default rules.',\n },\n ]}\n onSelect={() => onDone()}\n onClose={() => onDone()}\n />\n )\n }\n\n return (\n <SimpleSelector\n title=\"Permission Rules\"\n subtitle={`${t('common.default')}: ${formatDecision(defaultDecision)}`}\n items={items}\n groupByCategory={true}\n onSelect={() => {\n /* read-only for now */\n }}\n onClose={() => onDone()}\n />\n )\n}\n\nconst command: Command = {\n name: 'permissions',\n description: 'View and manage permission rules for tool access',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n aliases: ['perms'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const engine = getPermissionRuleEngine()\n const rules = engine.getRules()\n const defaultDecision = engine.getDefaultDecision()\n\n return (\n <PermissionsView\n rules={rules}\n defaultDecision={defaultDecision}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "AAOA,OAAO,WAAW;AAGlB;AAAA,EACE;AAAA,OAGK;AACP,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAE/B,SAAS,SAAS;AAElB,SAAS,gBAAgB,UAA0C;AACjE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iBAAiB,UAA0C;AAClE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,gBAAgB;AAAA,IACzB,KAAK;AACH,aAAO,gBAAgB;AAAA,IACzB,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,UAA0C;AAChE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,OAAgD;AAC5E,SAAO,MAAM,IAAI,WAAS;AAAA,IACxB,IAAI,KAAK;AAAA,IACT,OAAO,GAAG,eAAe,KAAK,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO;AAAA,IACjE,aAAa,KAAK,cACd,IAAI,KAAK,QAAQ,MAAM,KAAK,WAAW,KACvC,IAAI,KAAK,QAAQ;AAAA,IACrB,YAAY,gBAAgB,KAAK,QAAQ;AAAA,IACzC,aAAa,iBAAiB,KAAK,QAAQ;AAAA,IAC3C,UAAU,KAAK,UAAU,YAAY,kBAAkB;AAAA,EACzD,EAAE;AACJ;AAQA,MAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,qBAAqB,KAAK;AAExC,MAAI,MAAM,WAAW,GAAG;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,kCAAkC;AAAA,QAC3C,UAAU,GAAG,EAAE,gBAAgB,CAAC,KAAK,eAAe,eAAe,CAAC;AAAA,QACpE,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,UAAU,MAAM,OAAO;AAAA,QACvB,SAAS,MAAM,OAAO;AAAA;AAAA,IACxB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,UAAU,GAAG,EAAE,gBAAgB,CAAC,KAAK,eAAe,eAAe,CAAC;AAAA,MACpE;AAAA,MACA,iBAAiB;AAAA,MACjB,UAAU,MAAM;AAAA,MAEhB;AAAA,MACA,SAAS,MAAM,OAAO;AAAA;AAAA,EACxB;AAEJ;AAEA,MAAM,UAAmB;AAAA,EACvB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,SAAS,CAAC,OAAO;AAAA,EAEjB,iBAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,QAAQ,UAAU;AAC3B,UAAM,SAAS,wBAAwB;AACvC,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,kBAAkB,OAAO,mBAAmB;AAElD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAO,sBAAQ;",
6
6
  "names": []
7
7
  }