@within-7/minto 0.3.9 → 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 (141) hide show
  1. package/dist/commands/agents/AgentsCommand.js +459 -655
  2. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  3. package/dist/commands/agents/types.js +1 -0
  4. package/dist/commands/agents/types.js.map +2 -2
  5. package/dist/commands/agents/utils/fileOperations.js +96 -36
  6. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  7. package/dist/commands/agents/utils/index.js +3 -1
  8. package/dist/commands/agents/utils/index.js.map +2 -2
  9. package/dist/commands/context.js +54 -23
  10. package/dist/commands/context.js.map +2 -2
  11. package/dist/commands/export.js +673 -93
  12. package/dist/commands/export.js.map +2 -2
  13. package/dist/commands/language.js +19 -46
  14. package/dist/commands/language.js.map +2 -2
  15. package/dist/commands/mcp-interactive.js +419 -217
  16. package/dist/commands/mcp-interactive.js.map +2 -2
  17. package/dist/commands/model.js +415 -66
  18. package/dist/commands/model.js.map +2 -2
  19. package/dist/commands/permissions.js +75 -49
  20. package/dist/commands/permissions.js.map +2 -2
  21. package/dist/commands/plugin.js +882 -185
  22. package/dist/commands/plugin.js.map +3 -3
  23. package/dist/commands/resume.js +1 -1
  24. package/dist/commands/resume.js.map +1 -1
  25. package/dist/commands/sandbox.js +168 -70
  26. package/dist/commands/sandbox.js.map +2 -2
  27. package/dist/commands/setup.js +593 -107
  28. package/dist/commands/setup.js.map +2 -2
  29. package/dist/commands/stats.js +188 -131
  30. package/dist/commands/stats.js.map +2 -2
  31. package/dist/commands/status.js +75 -13
  32. package/dist/commands/status.js.map +2 -2
  33. package/dist/commands/undo.js +138 -174
  34. package/dist/commands/undo.js.map +2 -2
  35. package/dist/commands.js.map +1 -1
  36. package/dist/components/Help.js +165 -32
  37. package/dist/components/Help.js.map +2 -2
  38. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  39. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  40. package/dist/components/InfoPanel/index.js +5 -0
  41. package/dist/components/InfoPanel/index.js.map +7 -0
  42. package/dist/components/InfoPanel/types.js +1 -0
  43. package/dist/components/InfoPanel/types.js.map +7 -0
  44. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  45. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  46. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  47. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  48. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  49. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  50. package/dist/components/ModelSelector/index.js +1 -3
  51. package/dist/components/ModelSelector/index.js.map +2 -2
  52. package/dist/components/PromptInput.js +5 -5
  53. package/dist/components/PromptInput.js.map +2 -2
  54. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  55. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  56. package/dist/components/SimpleSelector/index.js +5 -0
  57. package/dist/components/SimpleSelector/index.js.map +7 -0
  58. package/dist/components/SimpleSelector/types.js +1 -0
  59. package/dist/components/SimpleSelector/types.js.map +7 -0
  60. package/dist/components/StatusOverlayContent.js +21 -0
  61. package/dist/components/StatusOverlayContent.js.map +7 -0
  62. package/dist/components/TabbedListView/ScrollableList.js +31 -5
  63. package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
  64. package/dist/components/TabbedListView/TabbedListView.js +122 -47
  65. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  66. package/dist/core/backupHook.js +29 -0
  67. package/dist/core/backupHook.js.map +7 -0
  68. package/dist/core/config/defaults.js +8 -2
  69. package/dist/core/config/defaults.js.map +2 -2
  70. package/dist/core/config/schema.js +14 -2
  71. package/dist/core/config/schema.js.map +2 -2
  72. package/dist/core/costTracker.js +0 -16
  73. package/dist/core/costTracker.js.map +2 -2
  74. package/dist/cost-tracker.js +0 -16
  75. package/dist/cost-tracker.js.map +2 -2
  76. package/dist/entrypoints/bootstrap.js +3 -1
  77. package/dist/entrypoints/bootstrap.js.map +2 -2
  78. package/dist/entrypoints/cli.js +32 -0
  79. package/dist/entrypoints/cli.js.map +2 -2
  80. package/dist/i18n/locales/en.js +300 -1
  81. package/dist/i18n/locales/en.js.map +2 -2
  82. package/dist/i18n/locales/zh-CN.js +301 -2
  83. package/dist/i18n/locales/zh-CN.js.map +2 -2
  84. package/dist/i18n/types.js.map +1 -1
  85. package/dist/services/customCommands.js +30 -8
  86. package/dist/services/customCommands.js.map +2 -2
  87. package/dist/services/plugins/lspServers.js +1 -1
  88. package/dist/services/plugins/lspServers.js.map +2 -2
  89. package/dist/services/plugins/pluginRuntime.js +2 -1
  90. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  91. package/dist/services/plugins/pluginValidation.js +10 -3
  92. package/dist/services/plugins/pluginValidation.js.map +2 -2
  93. package/dist/services/plugins/skillMarketplace.js +16 -8
  94. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  95. package/dist/services/systemReminder.js +17 -6
  96. package/dist/services/systemReminder.js.map +2 -2
  97. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  98. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  99. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  100. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  101. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  102. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  103. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  104. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  105. package/dist/tools/TaskTool/TaskTool.js +9 -6
  106. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  107. package/dist/types/PermissionMode.js.map +1 -1
  108. package/dist/types/plugin.js +2 -4
  109. package/dist/types/plugin.js.map +2 -2
  110. package/dist/utils/agentHookExecutor.js +1 -4
  111. package/dist/utils/agentHookExecutor.js.map +2 -2
  112. package/dist/utils/agentLoader.js +67 -13
  113. package/dist/utils/agentLoader.js.map +2 -2
  114. package/dist/utils/agentMemory.js.map +2 -2
  115. package/dist/utils/claudeCodeSync.js +439 -0
  116. package/dist/utils/claudeCodeSync.js.map +7 -0
  117. package/dist/utils/config.js +1 -23
  118. package/dist/utils/config.js.map +2 -2
  119. package/dist/utils/execFileNoThrow.js +2 -1
  120. package/dist/utils/execFileNoThrow.js.map +2 -2
  121. package/dist/utils/marketplaceManager.js +80 -43
  122. package/dist/utils/marketplaceManager.js.map +2 -2
  123. package/dist/utils/messages.js +2 -2
  124. package/dist/utils/messages.js.map +2 -2
  125. package/dist/utils/pluginInstaller.js +34 -24
  126. package/dist/utils/pluginInstaller.js.map +2 -2
  127. package/dist/utils/pluginLoader.js +48 -25
  128. package/dist/utils/pluginLoader.js.map +2 -2
  129. package/dist/utils/repoFetcher.js +110 -0
  130. package/dist/utils/repoFetcher.js.map +7 -0
  131. package/dist/utils/skillLoader.js +18 -6
  132. package/dist/utils/skillLoader.js.map +2 -2
  133. package/dist/utils/stringSubstitution.js +4 -5
  134. package/dist/utils/stringSubstitution.js.map +2 -2
  135. package/dist/utils/teamConfig.js +153 -13
  136. package/dist/utils/teamConfig.js.map +2 -2
  137. package/dist/utils/terminal.js +1 -1
  138. package/dist/utils/terminal.js.map +2 -2
  139. package/dist/version.js +2 -2
  140. package/dist/version.js.map +1 -1
  141. package/package.json +6 -6
@@ -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
  }