@within-7/minto 0.3.10 → 0.4.0

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 (306) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +2 -2
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/ctx_viz.js +1 -1
  5. package/dist/commands/effort.js +87 -0
  6. package/dist/commands/effort.js.map +7 -0
  7. package/dist/commands/export.js +19 -9
  8. package/dist/commands/export.js.map +2 -2
  9. package/dist/commands/ide.js +18 -0
  10. package/dist/commands/ide.js.map +7 -0
  11. package/dist/commands/mcp-interactive.js +14 -8
  12. package/dist/commands/mcp-interactive.js.map +2 -2
  13. package/dist/commands/memory.js +168 -0
  14. package/dist/commands/memory.js.map +7 -0
  15. package/dist/commands/model.js +45 -2
  16. package/dist/commands/model.js.map +2 -2
  17. package/dist/commands/outputStyle.js +64 -0
  18. package/dist/commands/outputStyle.js.map +7 -0
  19. package/dist/commands/plugin/utils.js +33 -1
  20. package/dist/commands/plugin/utils.js.map +2 -2
  21. package/dist/commands/plugin.js +10 -1
  22. package/dist/commands/plugin.js.map +2 -2
  23. package/dist/commands/refreshCommands.js +2 -0
  24. package/dist/commands/refreshCommands.js.map +2 -2
  25. package/dist/commands/review.js +51 -0
  26. package/dist/commands/review.js.map +7 -0
  27. package/dist/commands/terminalSetup.js +6 -0
  28. package/dist/commands/terminalSetup.js.map +2 -2
  29. package/dist/commands/undo.js +8 -0
  30. package/dist/commands/undo.js.map +2 -2
  31. package/dist/commands/vim.js +22 -0
  32. package/dist/commands/vim.js.map +7 -0
  33. package/dist/commands.js +12 -0
  34. package/dist/commands.js.map +2 -2
  35. package/dist/components/HighlightedCode.js +1 -0
  36. package/dist/components/HighlightedCode.js.map +2 -2
  37. package/dist/components/ModelSelector/ModelSelector.js +250 -143
  38. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  39. package/dist/components/PromptInput.js +21 -6
  40. package/dist/components/PromptInput.js.map +2 -2
  41. package/dist/components/PulseLabel.js +44 -0
  42. package/dist/components/PulseLabel.js.map +7 -0
  43. package/dist/components/RequestStatusIndicator.js +1 -1
  44. package/dist/components/RequestStatusIndicator.js.map +1 -1
  45. package/dist/components/Spinner.js +12 -42
  46. package/dist/components/Spinner.js.map +3 -3
  47. package/dist/components/StartupStatus.js +57 -0
  48. package/dist/components/StartupStatus.js.map +7 -0
  49. package/dist/components/SubagentBlock.js +43 -6
  50. package/dist/components/SubagentBlock.js.map +2 -2
  51. package/dist/components/TabbedListView/TabBar.js +13 -8
  52. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  53. package/dist/components/TabbedListView/TabbedListView.js +1 -1
  54. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  55. package/dist/components/TodoPanel.js +1 -1
  56. package/dist/components/TodoPanel.js.map +1 -1
  57. package/dist/components/ToolUseLoader.js +5 -0
  58. package/dist/components/ToolUseLoader.js.map +2 -2
  59. package/dist/components/TrustDialog.js +0 -2
  60. package/dist/components/TrustDialog.js.map +2 -2
  61. package/dist/components/messages/TaskInModuleView.js +1 -1
  62. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  63. package/dist/components/messages/TaskToolMessage.js +1 -1
  64. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  65. package/dist/components/messages/UserPromptMessage.js +6 -1
  66. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  67. package/dist/constants/modelCapabilities.js +103 -18
  68. package/dist/constants/modelCapabilities.js.map +2 -2
  69. package/dist/constants/product.js +2 -0
  70. package/dist/constants/product.js.map +2 -2
  71. package/dist/constants/prompts/agentPrompt.js +30 -0
  72. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  73. package/dist/constants/prompts/codeConventions.js +27 -0
  74. package/dist/constants/prompts/codeConventions.js.map +7 -0
  75. package/dist/constants/prompts/doingTasks.js +15 -0
  76. package/dist/constants/prompts/doingTasks.js.map +7 -0
  77. package/dist/constants/prompts/envInfo.js +17 -0
  78. package/dist/constants/prompts/envInfo.js.map +7 -0
  79. package/dist/constants/prompts/executingWithCare.js +17 -0
  80. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  81. package/dist/constants/prompts/identity.js +10 -0
  82. package/dist/constants/prompts/identity.js.map +7 -0
  83. package/dist/constants/prompts/index.js +78 -0
  84. package/dist/constants/prompts/index.js.map +7 -0
  85. package/dist/constants/prompts/taskManagement.js +60 -0
  86. package/dist/constants/prompts/taskManagement.js.map +7 -0
  87. package/dist/constants/prompts/toneAndStyle.js +62 -0
  88. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  89. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  90. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  91. package/dist/constants/prompts.js +5 -176
  92. package/dist/constants/prompts.js.map +2 -2
  93. package/dist/constants/providerRegistry.js +235 -0
  94. package/dist/constants/providerRegistry.js.map +7 -0
  95. package/dist/constants/providers.js +35 -0
  96. package/dist/constants/providers.js.map +7 -0
  97. package/dist/context/PermissionContext.js +0 -1
  98. package/dist/context/PermissionContext.js.map +2 -2
  99. package/dist/context.js +87 -31
  100. package/dist/context.js.map +2 -2
  101. package/dist/core/backupHook.js +2 -2
  102. package/dist/core/backupHook.js.map +2 -2
  103. package/dist/core/config/defaults.js +4 -1
  104. package/dist/core/config/defaults.js.map +2 -2
  105. package/dist/core/config/schema.js +7 -1
  106. package/dist/core/config/schema.js.map +2 -2
  107. package/dist/core/costTracker.js +18 -0
  108. package/dist/core/costTracker.js.map +2 -2
  109. package/dist/core/index.js +0 -1
  110. package/dist/core/index.js.map +2 -2
  111. package/dist/core/tokenStatsManager.js +22 -4
  112. package/dist/core/tokenStatsManager.js.map +2 -2
  113. package/dist/entrypoints/cli.js +65 -84
  114. package/dist/entrypoints/cli.js.map +2 -2
  115. package/dist/hooks/useAgentTokenStats.js +1 -1
  116. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  117. package/dist/hooks/useAgentTranscripts.js +2 -1
  118. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  119. package/dist/hooks/useBackgroundShells.js +29 -0
  120. package/dist/hooks/useBackgroundShells.js.map +7 -0
  121. package/dist/hooks/useCanUseTool.js +1 -1
  122. package/dist/hooks/useCanUseTool.js.map +2 -2
  123. package/dist/hooks/useDeferredLoading.js +64 -0
  124. package/dist/hooks/useDeferredLoading.js.map +7 -0
  125. package/dist/hooks/useHookStatus.js +1 -1
  126. package/dist/hooks/useHookStatus.js.map +2 -2
  127. package/dist/hooks/useSessionTracking.js +55 -0
  128. package/dist/hooks/useSessionTracking.js.map +7 -0
  129. package/dist/hooks/useTerminalSize.js +21 -0
  130. package/dist/hooks/useTerminalSize.js.map +2 -2
  131. package/dist/hooks/useTextInput.js +1 -0
  132. package/dist/hooks/useTextInput.js.map +2 -2
  133. package/dist/hooks/useUnifiedCompletion.js +3 -2
  134. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  135. package/dist/i18n/locales/en.js +8 -9
  136. package/dist/i18n/locales/en.js.map +2 -2
  137. package/dist/i18n/locales/zh-CN.js +8 -9
  138. package/dist/i18n/locales/zh-CN.js.map +2 -2
  139. package/dist/i18n/types.js.map +1 -1
  140. package/dist/messages.js +41 -17
  141. package/dist/messages.js.map +2 -2
  142. package/dist/permissions.js +94 -1
  143. package/dist/permissions.js.map +2 -2
  144. package/dist/query.js +27 -19
  145. package/dist/query.js.map +2 -2
  146. package/dist/screens/REPL.js +83 -74
  147. package/dist/screens/REPL.js.map +2 -2
  148. package/dist/services/adapters/responsesAPI.js +6 -0
  149. package/dist/services/adapters/responsesAPI.js.map +2 -2
  150. package/dist/services/agentTeams/index.js +35 -0
  151. package/dist/services/agentTeams/index.js.map +7 -0
  152. package/dist/services/agentTeams/mailbox.js +114 -0
  153. package/dist/services/agentTeams/mailbox.js.map +7 -0
  154. package/dist/services/agentTeams/teamManager.js +149 -0
  155. package/dist/services/agentTeams/teamManager.js.map +7 -0
  156. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  157. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  158. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  159. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  160. package/dist/services/checkpointManager.js +16 -3
  161. package/dist/services/checkpointManager.js.map +2 -2
  162. package/dist/services/claude.js +19 -1728
  163. package/dist/services/claude.js.map +3 -3
  164. package/dist/services/gpt5ConnectionTest.js +4 -2
  165. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  166. package/dist/services/hookExecutor.js +411 -127
  167. package/dist/services/hookExecutor.js.map +2 -2
  168. package/dist/services/llm/anthropicProvider.js +807 -0
  169. package/dist/services/llm/anthropicProvider.js.map +7 -0
  170. package/dist/services/llm/dispatch.js +218 -0
  171. package/dist/services/llm/dispatch.js.map +7 -0
  172. package/dist/services/llm/index.js +44 -0
  173. package/dist/services/llm/index.js.map +7 -0
  174. package/dist/services/llm/mintoContext.js +69 -0
  175. package/dist/services/llm/mintoContext.js.map +7 -0
  176. package/dist/services/llm/openaiProvider.js +622 -0
  177. package/dist/services/llm/openaiProvider.js.map +7 -0
  178. package/dist/services/llm/types.js +157 -0
  179. package/dist/services/llm/types.js.map +7 -0
  180. package/dist/services/mcpClient.js +183 -33
  181. package/dist/services/mcpClient.js.map +2 -2
  182. package/dist/services/notifier.js +14 -0
  183. package/dist/services/notifier.js.map +2 -2
  184. package/dist/services/oauth.js +4 -2
  185. package/dist/services/oauth.js.map +2 -2
  186. package/dist/services/openai.js +66 -56
  187. package/dist/services/openai.js.map +3 -3
  188. package/dist/services/outputStyles.js +102 -21
  189. package/dist/services/outputStyles.js.map +2 -2
  190. package/dist/services/plugins/skillMarketplace.js +4 -1
  191. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  192. package/dist/services/sentry.js +1 -1
  193. package/dist/services/sentry.js.map +2 -2
  194. package/dist/services/sessionMemory.js +16 -3
  195. package/dist/services/sessionMemory.js.map +2 -2
  196. package/dist/services/systemReminder.js +350 -3
  197. package/dist/services/systemReminder.js.map +2 -2
  198. package/dist/services/taskStore.js +19 -0
  199. package/dist/services/taskStore.js.map +2 -2
  200. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  201. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  202. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  203. package/dist/tools/BashTool/BashTool.js +28 -0
  204. package/dist/tools/BashTool/BashTool.js.map +2 -2
  205. package/dist/tools/FileEditTool/FileEditTool.js +1 -1
  206. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  207. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  208. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  209. package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
  210. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  211. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  212. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  213. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  214. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  215. package/dist/tools/LspTool/LspTool.js +11 -2
  216. package/dist/tools/LspTool/LspTool.js.map +2 -2
  217. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  218. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  219. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  220. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  221. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  222. package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
  223. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
  224. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  225. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  226. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  227. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  228. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  229. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  230. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  231. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  232. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  233. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  234. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  235. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  236. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  237. package/dist/tools/TaskTool/TaskTool.js +75 -5
  238. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  239. package/dist/tools/TaskTool/prompt.js +12 -6
  240. package/dist/tools/TaskTool/prompt.js.map +2 -2
  241. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  242. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  243. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  244. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  245. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  246. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  247. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  248. package/dist/tools/lsTool/lsTool.js.map +2 -2
  249. package/dist/tools/lsTool/prompt.js.map +1 -1
  250. package/dist/tools.js +14 -3
  251. package/dist/tools.js.map +2 -2
  252. package/dist/types/PermissionMode.js +21 -1
  253. package/dist/types/PermissionMode.js.map +2 -2
  254. package/dist/types/agentTeams.js +1 -0
  255. package/dist/types/agentTeams.js.map +7 -0
  256. package/dist/types/hooks.js +8 -2
  257. package/dist/types/hooks.js.map +2 -2
  258. package/dist/types/plugin.js +1 -1
  259. package/dist/types/plugin.js.map +2 -2
  260. package/dist/utils/agentLoader.js +25 -3
  261. package/dist/utils/agentLoader.js.map +2 -2
  262. package/dist/utils/animationManager.js +1 -1
  263. package/dist/utils/animationManager.js.map +2 -2
  264. package/dist/utils/ask.js +1 -1
  265. package/dist/utils/async.js +5 -1
  266. package/dist/utils/async.js.map +2 -2
  267. package/dist/utils/autoCompactCore.js +60 -0
  268. package/dist/utils/autoCompactCore.js.map +2 -2
  269. package/dist/utils/config.js +26 -128
  270. package/dist/utils/config.js.map +2 -2
  271. package/dist/utils/configSchema.js +227 -0
  272. package/dist/utils/configSchema.js.map +7 -0
  273. package/dist/utils/debugLogger.js.map +2 -2
  274. package/dist/utils/env.js +4 -3
  275. package/dist/utils/env.js.map +2 -2
  276. package/dist/utils/envConfig.js +34 -0
  277. package/dist/utils/envConfig.js.map +3 -3
  278. package/dist/utils/gpt5.js +146 -0
  279. package/dist/utils/gpt5.js.map +7 -0
  280. package/dist/utils/hookManager.js +374 -140
  281. package/dist/utils/hookManager.js.map +2 -2
  282. package/dist/utils/markdown.js +47 -0
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/memoizeWithTTL.js +25 -0
  285. package/dist/utils/memoizeWithTTL.js.map +7 -0
  286. package/dist/utils/model.js +34 -9
  287. package/dist/utils/model.js.map +2 -2
  288. package/dist/utils/pluginInstaller.js +34 -5
  289. package/dist/utils/pluginInstaller.js.map +2 -2
  290. package/dist/utils/pluginLoader.js +201 -32
  291. package/dist/utils/pluginLoader.js.map +2 -2
  292. package/dist/utils/safeFetch.js +45 -0
  293. package/dist/utils/safeFetch.js.map +7 -0
  294. package/dist/utils/skillLoader.js +59 -6
  295. package/dist/utils/skillLoader.js.map +2 -2
  296. package/dist/utils/streamingState.js +52 -0
  297. package/dist/utils/streamingState.js.map +7 -0
  298. package/dist/utils/style.js +6 -3
  299. package/dist/utils/style.js.map +2 -2
  300. package/dist/utils/teamConfig.js +9 -3
  301. package/dist/utils/teamConfig.js.map +2 -2
  302. package/dist/utils/toolRiskClassification.js +0 -6
  303. package/dist/utils/toolRiskClassification.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +2 -1
@@ -0,0 +1,64 @@
1
+ import React, { useMemo, useCallback } from "react";
2
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
3
+ import {
4
+ loadAllOutputStyles,
5
+ clearOutputStylesCache
6
+ } from "../services/outputStyles.js";
7
+ import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
8
+ function OutputStyleSelector({
9
+ onClose
10
+ }) {
11
+ const items = useMemo(() => {
12
+ clearOutputStylesCache();
13
+ const styles = loadAllOutputStyles();
14
+ const config = getGlobalConfig();
15
+ const currentStyle = config.outputStyle || "";
16
+ return styles.map((style) => {
17
+ const sourceLabel = style.source === "builtin" ? "built-in" : style.source === "global" ? "global" : style.source === "project" ? "project" : style.source === "plugin" ? "plugin" : "";
18
+ return {
19
+ id: style.name,
20
+ label: style.name,
21
+ description: `${style.config.description || ""} (${sourceLabel})`.trim(),
22
+ isCurrent: style.name === currentStyle || !currentStyle && style.name === "default"
23
+ };
24
+ });
25
+ }, []);
26
+ const handleSelect = useCallback(
27
+ (item) => {
28
+ const config = getGlobalConfig();
29
+ const styleName = item.id === "default" ? void 0 : item.id;
30
+ saveGlobalConfig({ ...config, outputStyle: styleName });
31
+ clearOutputStylesCache();
32
+ onClose(`Output style set to "${item.id}".`);
33
+ },
34
+ [onClose]
35
+ );
36
+ return /* @__PURE__ */ React.createElement(
37
+ SimpleSelector,
38
+ {
39
+ title: "Output Style",
40
+ items,
41
+ onSelect: handleSelect,
42
+ onClose: () => onClose()
43
+ }
44
+ );
45
+ }
46
+ const outputStyle = {
47
+ name: "output-style",
48
+ description: "Select output style for response formatting",
49
+ isEnabled: true,
50
+ isHidden: false,
51
+ hidePromptInput: true,
52
+ type: "local-jsx",
53
+ userFacingName() {
54
+ return "output-style";
55
+ },
56
+ async call(onDone) {
57
+ return /* @__PURE__ */ React.createElement(OutputStyleSelector, { onClose: onDone });
58
+ }
59
+ };
60
+ var outputStyle_default = outputStyle;
61
+ export {
62
+ outputStyle_default as default
63
+ };
64
+ //# sourceMappingURL=outputStyle.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/outputStyle.tsx"],
4
+ "sourcesContent": ["/**\n * /output-style command\n *\n * Interactive output style selector.\n * Lists all available styles (built-in + user + project + plugin)\n * and persists the selection to GlobalConfig.\n */\n\nimport React, { useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport {\n loadAllOutputStyles,\n clearOutputStylesCache,\n} from '@services/outputStyles'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport type { Command } from '../commands'\n\nfunction OutputStyleSelector({\n onClose,\n}: {\n onClose: (result?: string) => void\n}): React.ReactNode {\n const items = useMemo((): SelectorItem[] => {\n // Force fresh load\n clearOutputStylesCache()\n const styles = loadAllOutputStyles()\n const config = getGlobalConfig()\n const currentStyle = config.outputStyle || ''\n\n return styles.map(style => {\n const sourceLabel =\n style.source === 'builtin'\n ? 'built-in'\n : style.source === 'global'\n ? 'global'\n : style.source === 'project'\n ? 'project'\n : style.source === 'plugin'\n ? 'plugin'\n : ''\n\n return {\n id: style.name,\n label: style.name,\n description:\n `${style.config.description || ''} (${sourceLabel})`.trim(),\n isCurrent:\n style.name === currentStyle ||\n (!currentStyle && style.name === 'default'),\n }\n })\n }, [])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n const config = getGlobalConfig()\n const styleName = item.id === 'default' ? undefined : item.id\n saveGlobalConfig({ ...config, outputStyle: styleName })\n\n // Clear cache so next prompt assembly picks up the change\n clearOutputStylesCache()\n\n onClose(`Output style set to \"${item.id}\".`)\n },\n [onClose],\n )\n\n return (\n <SimpleSelector\n title=\"Output Style\"\n items={items}\n onSelect={handleSelect}\n onClose={() => onClose()}\n />\n )\n}\n\nconst outputStyle: Command = {\n name: 'output-style',\n description: 'Select output style for response formatting',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'output-style'\n },\n async call(onDone) {\n return <OutputStyleSelector onClose={onDone} />\n },\n}\n\nexport default outputStyle\n"],
5
+ "mappings": "AAQA,OAAO,SAAS,SAAS,mBAAmB;AAC5C,SAAS,sBAAsB;AAE/B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,wBAAwB;AAGlD,SAAS,oBAAoB;AAAA,EAC3B;AACF,GAEoB;AAClB,QAAM,QAAQ,QAAQ,MAAsB;AAE1C,2BAAuB;AACvB,UAAM,SAAS,oBAAoB;AACnC,UAAM,SAAS,gBAAgB;AAC/B,UAAM,eAAe,OAAO,eAAe;AAE3C,WAAO,OAAO,IAAI,WAAS;AACzB,YAAM,cACJ,MAAM,WAAW,YACb,aACA,MAAM,WAAW,WACf,WACA,MAAM,WAAW,YACf,YACA,MAAM,WAAW,WACf,WACA;AAEZ,aAAO;AAAA,QACL,IAAI,MAAM;AAAA,QACV,OAAO,MAAM;AAAA,QACb,aACE,GAAG,MAAM,OAAO,eAAe,EAAE,KAAK,WAAW,IAAI,KAAK;AAAA,QAC5D,WACE,MAAM,SAAS,gBACd,CAAC,gBAAgB,MAAM,SAAS;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,YAAM,SAAS,gBAAgB;AAC/B,YAAM,YAAY,KAAK,OAAO,YAAY,SAAY,KAAK;AAC3D,uBAAiB,EAAE,GAAG,QAAQ,aAAa,UAAU,CAAC;AAGtD,6BAAuB;AAEvB,cAAQ,wBAAwB,KAAK,EAAE,IAAI;AAAA,IAC7C;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,SAAS,MAAM,QAAQ;AAAA;AAAA,EACzB;AAEJ;AAEA,MAAM,cAAuB;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ;AACjB,WAAO,oCAAC,uBAAoB,SAAS,QAAQ;AAAA,EAC/C;AACF;AAEA,IAAO,sBAAQ;",
6
+ "names": []
7
+ }
@@ -1,3 +1,7 @@
1
+ import { existsSync, readdirSync, readFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ import { getCwd } from "../../utils/state.js";
1
5
  function truncate(text, maxLength) {
2
6
  if (text.length <= maxLength) return text;
3
7
  return text.slice(0, maxLength - 3) + "...";
@@ -56,7 +60,35 @@ function formatTimeAgo(date) {
56
60
  return formatDate(d);
57
61
  }
58
62
  function countInstalledPlugins(marketplaceName) {
59
- return 0;
63
+ const cwd = getCwd();
64
+ const home = homedir();
65
+ const pluginDirs = [
66
+ join(home, ".claude", "plugins"),
67
+ join(home, ".minto", "plugins"),
68
+ join(cwd, ".claude", "plugins"),
69
+ join(cwd, ".minto", "plugins")
70
+ ];
71
+ let count = 0;
72
+ for (const dir of pluginDirs) {
73
+ if (!existsSync(dir)) continue;
74
+ try {
75
+ const entries = readdirSync(dir, { withFileTypes: true });
76
+ for (const entry of entries) {
77
+ if (!entry.isDirectory()) continue;
78
+ const metaPath = join(dir, entry.name, ".marketplace-meta.json");
79
+ if (!existsSync(metaPath)) continue;
80
+ try {
81
+ const meta = JSON.parse(readFileSync(metaPath, "utf-8"));
82
+ if (meta.marketplace === marketplaceName) {
83
+ count++;
84
+ }
85
+ } catch {
86
+ }
87
+ }
88
+ } catch {
89
+ }
90
+ }
91
+ return count;
60
92
  }
61
93
  function formatAuthor(author) {
62
94
  if (!author) return "Unknown";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/plugin/utils.ts"],
4
- "sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (\n available: number,\n installed: number,\n): string => {\n const availableText =\n available === 1 ? '1 plugin available' : `${available} plugins available`\n const installedText =\n installed === 1 ? '1 already installed' : `${installed} already installed`\n return `${availableText} \u00B7 ${installedText}`\n}\n\n/**\n * Shorten long file paths for display.\n * Truncates from the beginning if path exceeds max length.\n *\n * @param path - Full file system path\n * @param maxLength - Maximum length before truncation (default: 80)\n * @returns Formatted path, possibly with leading \"...\"\n */\nexport const formatMarketplacePathShort = (\n path: string,\n maxLength: number = 80,\n): string => {\n if (path.length > maxLength) {\n return '...' + path.slice(-(maxLength - 3))\n }\n return path\n}\n\n/**\n * Format marketplace source path for display\n */\nexport function formatMarketplacePath(source: any): string {\n switch (source.type) {\n case 'github':\n return `github:${source.repo}${source.ref ? `@${source.ref}` : ''}`\n case 'url':\n return truncate(source.url, 60)\n case 'local':\n return source.path\n default:\n return 'unknown'\n }\n}\n\n/**\n * Format marketplace source for display.\n * Converts source type and details into readable string.\n *\n * @param type - Source type (github, url, local)\n * @param details - Additional source details\n * @returns Formatted source string\n */\nexport const formatMarketplaceSource = (\n type: string,\n details: string,\n): string => {\n switch (type) {\n case 'github':\n return `GitHub: ${details}`\n case 'url':\n return `URL: ${details}`\n case 'local':\n return `Local: ${formatMarketplacePathShort(details)}`\n default:\n return `${type}: ${details}`\n }\n}\n\n/**\n * Format time ago\n */\nexport function formatTimeAgo(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const seconds = Math.floor((now.getTime() - d.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n if (seconds < 2592000) return `${Math.floor(seconds / 604800)}w ago`\n\n return formatDate(d)\n}\n\n/**\n * Count installed plugins from a marketplace\n */\nexport function countInstalledPlugins(marketplaceName: string): number {\n // TODO: Implement plugin installation tracking\n // For now, return 0 as we don't track this yet\n return 0\n}\n\n/**\n * Format author field for display.\n * Handles both string and object formats.\n *\n * @param author - Author information (string or object)\n * @returns Formatted author string\n */\nexport function formatAuthor(\n author: string | { name: string; email?: string; url?: string } | undefined,\n): string {\n if (!author) return 'Unknown'\n if (typeof author === 'string') return author\n return author.name\n}\n"],
5
- "mappings": "AASO,SAAS,SAAS,MAAc,WAA2B;AAChE,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,KAAK,MAAM,GAAG,YAAY,CAAC,IAAI;AACxC;AAKO,SAAS,WAAW,MAA6B;AACtD,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,QAAM,OAAO,EAAE,YAAY;AAC3B,QAAM,QAAQ,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,QAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AASO,MAAM,oBAAoB,CAC/B,WACA,cACW;AACX,QAAM,gBACJ,cAAc,IAAI,uBAAuB,GAAG,SAAS;AACvD,QAAM,gBACJ,cAAc,IAAI,wBAAwB,GAAG,SAAS;AACxD,SAAO,GAAG,aAAa,SAAM,aAAa;AAC5C;AAUO,MAAM,6BAA6B,CACxC,MACA,YAAoB,OACT;AACX,MAAI,KAAK,SAAS,WAAW;AAC3B,WAAO,QAAQ,KAAK,MAAM,EAAE,YAAY,EAAE;AAAA,EAC5C;AACA,SAAO;AACT;AAKO,SAAS,sBAAsB,QAAqB;AACzD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,OAAO,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,GAAG,KAAK,EAAE;AAAA,IACnE,KAAK;AACH,aAAO,SAAS,OAAO,KAAK,EAAE;AAAA,IAChC,KAAK;AACH,aAAO,OAAO;AAAA,IAChB;AACE,aAAO;AAAA,EACX;AACF;AAUO,MAAM,0BAA0B,CACrC,MACA,YACW;AACX,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,WAAW,OAAO;AAAA,IAC3B,KAAK;AACH,aAAO,QAAQ,OAAO;AAAA,IACxB,KAAK;AACH,aAAO,UAAU,2BAA2B,OAAO,CAAC;AAAA,IACtD;AACE,aAAO,GAAG,IAAI,KAAK,OAAO;AAAA,EAC9B;AACF;AAKO,SAAS,cAAc,MAA6B;AACzD,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAU,KAAK,OAAO,IAAI,QAAQ,IAAI,EAAE,QAAQ,KAAK,GAAI;AAE/D,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,UAAU,KAAM,QAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC;AACtD,MAAI,UAAU,MAAO,QAAO,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;AACzD,MAAI,UAAU,OAAQ,QAAO,GAAG,KAAK,MAAM,UAAU,KAAK,CAAC;AAC3D,MAAI,UAAU,OAAS,QAAO,GAAG,KAAK,MAAM,UAAU,MAAM,CAAC;AAE7D,SAAO,WAAW,CAAC;AACrB;AAKO,SAAS,sBAAsB,iBAAiC;AAGrE,SAAO;AACT;AASO,SAAS,aACd,QACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAO,OAAO;AAChB;",
4
+ "sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { getCwd } from '@utils/state'\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (\n available: number,\n installed: number,\n): string => {\n const availableText =\n available === 1 ? '1 plugin available' : `${available} plugins available`\n const installedText =\n installed === 1 ? '1 already installed' : `${installed} already installed`\n return `${availableText} \u00B7 ${installedText}`\n}\n\n/**\n * Shorten long file paths for display.\n * Truncates from the beginning if path exceeds max length.\n *\n * @param path - Full file system path\n * @param maxLength - Maximum length before truncation (default: 80)\n * @returns Formatted path, possibly with leading \"...\"\n */\nexport const formatMarketplacePathShort = (\n path: string,\n maxLength: number = 80,\n): string => {\n if (path.length > maxLength) {\n return '...' + path.slice(-(maxLength - 3))\n }\n return path\n}\n\n/**\n * Format marketplace source path for display\n */\nexport function formatMarketplacePath(source: any): string {\n switch (source.type) {\n case 'github':\n return `github:${source.repo}${source.ref ? `@${source.ref}` : ''}`\n case 'url':\n return truncate(source.url, 60)\n case 'local':\n return source.path\n default:\n return 'unknown'\n }\n}\n\n/**\n * Format marketplace source for display.\n * Converts source type and details into readable string.\n *\n * @param type - Source type (github, url, local)\n * @param details - Additional source details\n * @returns Formatted source string\n */\nexport const formatMarketplaceSource = (\n type: string,\n details: string,\n): string => {\n switch (type) {\n case 'github':\n return `GitHub: ${details}`\n case 'url':\n return `URL: ${details}`\n case 'local':\n return `Local: ${formatMarketplacePathShort(details)}`\n default:\n return `${type}: ${details}`\n }\n}\n\n/**\n * Format time ago\n */\nexport function formatTimeAgo(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const seconds = Math.floor((now.getTime() - d.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n if (seconds < 2592000) return `${Math.floor(seconds / 604800)}w ago`\n\n return formatDate(d)\n}\n\n/**\n * Count installed plugins from a marketplace by scanning plugin directories\n * for .marketplace-meta.json files matching the given marketplace name.\n */\nexport function countInstalledPlugins(marketplaceName: string): number {\n const cwd = getCwd()\n const home = homedir()\n\n const pluginDirs = [\n join(home, '.claude', 'plugins'),\n join(home, '.minto', 'plugins'),\n join(cwd, '.claude', 'plugins'),\n join(cwd, '.minto', 'plugins'),\n ]\n\n let count = 0\n for (const dir of pluginDirs) {\n if (!existsSync(dir)) continue\n try {\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const metaPath = join(dir, entry.name, '.marketplace-meta.json')\n if (!existsSync(metaPath)) continue\n try {\n const meta = JSON.parse(readFileSync(metaPath, 'utf-8'))\n if (meta.marketplace === marketplaceName) {\n count++\n }\n } catch {\n // Skip invalid meta files\n }\n }\n } catch {\n // Skip inaccessible directories\n }\n }\n return count\n}\n\n/**\n * Format author field for display.\n * Handles both string and object formats.\n *\n * @param author - Author information (string or object)\n * @returns Formatted author string\n */\nexport function formatAuthor(\n author: string | { name: string; email?: string; url?: string } | undefined,\n): string {\n if (!author) return 'Unknown'\n if (typeof author === 'string') return author\n return author.name\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -801,6 +801,15 @@ const InteractivePluginCommand = ({
801
801
  searchPlaceholder: t("commands.plugin.addMarketplacePlaceholder")
802
802
  };
803
803
  }
804
+ default:
805
+ return {
806
+ tabs: [],
807
+ items: [],
808
+ title: "",
809
+ footerHint: "",
810
+ searchEnabled: false,
811
+ searchPlaceholder: void 0
812
+ };
804
813
  }
805
814
  }, [
806
815
  phase,
@@ -842,7 +851,7 @@ const InteractivePluginCommand = ({
842
851
  [activeTab]
843
852
  );
844
853
  useEffect(() => {
845
- if (phase.type !== "batch-progress") return;
854
+ if (phase.type !== "batch-progress") return void 0;
846
855
  let cancelled = false;
847
856
  const { action, plugins } = phase;
848
857
  const executeBatch = async () => {