@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/sandbox.tsx"],
4
- "sourcesContent": ["/**\n * Sandbox Command\n *\n * Toggle and configure sandbox mode for command execution.\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport {\n getSandboxController,\n type SandboxConfig,\n type SandboxImplementation,\n} from '../services/sandbox'\nimport { getCwd } from '@utils/state'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface SandboxStatusProps {\n config: SandboxConfig\n implementation: SandboxImplementation\n isAvailable: boolean\n onToggle: () => void\n onDone: () => void\n}\n\nconst SandboxStatus = ({\n config,\n implementation,\n isAvailable,\n onToggle,\n onDone,\n}: SandboxStatusProps) => {\n const [showHelp, setShowHelp] = useState(false)\n\n useInput((input, key) => {\n if (input === 't' || input === 'T') {\n onToggle()\n } else if (input === 'h' || input === 'H') {\n setShowHelp(!showHelp)\n } else if (input === 'q' || key.escape) {\n onDone()\n }\n })\n\n const getImplColor = (impl: SandboxImplementation) => {\n switch (impl) {\n case 'seatbelt':\n return 'green'\n case 'bubblewrap':\n return 'cyan'\n case 'docker':\n return 'yellow'\n case 'none':\n return 'gray'\n }\n }\n\n const getImplDescription = (impl: SandboxImplementation) => {\n switch (impl) {\n case 'seatbelt':\n return 'macOS sandbox-exec (built-in)'\n case 'bubblewrap':\n return 'Linux bubblewrap container'\n case 'docker':\n return 'Docker container isolation'\n case 'none':\n return 'No sandbox available'\n }\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Sandbox Configuration\n </Text>\n </Box>\n\n {/* Status */}\n <Box marginBottom={1}>\n <Text>\n <Text bold>Status: </Text>\n {config.enabled && isAvailable ? (\n <Text color=\"green\">\u25CF ENABLED</Text>\n ) : (\n <Text color=\"red\">\u25CB DISABLED</Text>\n )}\n </Text>\n </Box>\n\n {/* Implementation */}\n <Box marginBottom={1}>\n <Text>\n <Text bold>Implementation: </Text>\n <Text color={getImplColor(implementation)}>\n {implementation.toUpperCase()}\n </Text>\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n - {getImplDescription(implementation)}\n </Text>\n </Box>\n\n {/* Availability */}\n {!isAvailable && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">\u26A0 Sandbox not available on this system</Text>\n </Box>\n )}\n\n {/* Configuration details */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Filesystem Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Write Allowed: </Text>\n {config.filesystem.writeAllowed.length > 0 ? (\n <Text color=\"green\">\n {config.filesystem.writeAllowed.slice(0, 3).join(', ')}\n {config.filesystem.writeAllowed.length > 3 && ' ...'}\n </Text>\n ) : (\n <Text color=\"red\">None</Text>\n )}\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Denied Paths: </Text>\n {config.filesystem.denied.length > 0 ? (\n <Text color=\"red\">\n {config.filesystem.denied.length} paths blocked\n </Text>\n ) : (\n <Text color=\"green\">None blocked</Text>\n )}\n </Text>\n </Box>\n </Box>\n\n {/* Network policy */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Network Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Network Access: </Text>\n {config.network.blockAll ? (\n <Text color=\"red\">Blocked</Text>\n ) : (\n <Text color=\"green\">Allowed</Text>\n )}\n </Text>\n {!config.network.blockAll &&\n config.network.allowedDomains.length > 0 && (\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Allowed Domains: </Text>\n <Text>\n {config.network.allowedDomains.slice(0, 3).join(', ')}\n {config.network.allowedDomains.length > 3 && ' ...'}\n </Text>\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Process policy */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Process Policy:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Max Execution Time: </Text>\n <Text>{config.process.maxExecutionTime / 1000}s</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Excluded Commands: </Text>\n <Text>\n {config.process.excludedCommands.length > 0\n ? config.process.excludedCommands.slice(0, 3).join(', ')\n : 'None'}\n {config.process.excludedCommands.length > 3 && ' ...'}\n </Text>\n </Text>\n </Box>\n </Box>\n\n {/* Help toggle */}\n {showHelp && (\n <Box\n flexDirection=\"column\"\n marginY={1}\n borderStyle=\"round\"\n paddingX={1}\n >\n <Text bold>Sandbox Implementations:</Text>\n <Box flexDirection=\"column\" paddingLeft={1}>\n <Text>\n <Text color=\"green\">\u2022 seatbelt:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n macOS built-in sandbox-exec\n </Text>\n </Text>\n <Text>\n <Text color=\"cyan\">\u2022 bubblewrap:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Linux container isolation (bwrap)\n </Text>\n </Text>\n <Text>\n <Text color=\"yellow\">\u2022 docker:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Docker container isolation\n </Text>\n </Text>\n <Text>\n <Text color=\"gray\">\u2022 none:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n No sandboxing (not recommended)\n </Text>\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Controls */}\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n t: Toggle sandbox | h: Show/hide help | q/Esc: Exit\n </Text>\n </Box>\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'sandbox',\n description: 'View and toggle sandbox mode for command execution',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const cwd = getCwd()\n const controller = getSandboxController(cwd)\n const initialConfig = controller.getConfig()\n const implementation = controller.getImplementationType()\n const initialAvailable = await controller.isAvailable()\n\n // Create a wrapper component to manage state\n const SandboxWrapper = () => {\n const [config, setConfig] = useState(initialConfig)\n const [isAvailable, setIsAvailable] = useState(initialAvailable)\n\n const handleToggle = async () => {\n const newEnabled = !config.enabled\n controller.updateConfig({ enabled: newEnabled })\n const newConfig = controller.getConfig()\n setConfig(newConfig)\n const available = await controller.isAvailable()\n setIsAvailable(available)\n }\n\n return (\n <SandboxStatus\n config={config}\n implementation={implementation}\n isAvailable={isAvailable}\n onToggle={handleToggle}\n onDone={onDone}\n />\n )\n }\n\n return <SandboxWrapper />\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Sandbox Command\n *\n * Toggle and configure sandbox mode for command execution.\n * Uses InfoPanel with actions for consistent UI.\n */\n\nimport React, { useState } from 'react'\nimport type { Command } from '@commands'\nimport {\n getSandboxController,\n type SandboxConfig,\n type SandboxImplementation,\n} from '../services/sandbox'\nimport { getCwd } from '@utils/state'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type {\n InfoSection,\n InfoPanelAction,\n InfoItem,\n} from '@components/InfoPanel'\nimport { t } from '@i18n'\n\nfunction getImplColor(impl: SandboxImplementation): string {\n switch (impl) {\n case 'seatbelt':\n return SEMANTIC_COLORS.success\n case 'bubblewrap':\n return SEMANTIC_COLORS.info\n case 'docker':\n return '#FFB86C'\n case 'none':\n return SEMANTIC_COLORS.dim\n }\n}\n\nfunction getImplDescription(impl: SandboxImplementation): string {\n switch (impl) {\n case 'seatbelt':\n return 'macOS sandbox-exec (built-in)'\n case 'bubblewrap':\n return 'Linux bubblewrap container'\n case 'docker':\n return 'Docker container isolation'\n case 'none':\n return 'No sandbox available'\n }\n}\n\nfunction buildSections(\n config: SandboxConfig,\n implementation: SandboxImplementation,\n isAvailable: boolean,\n showHelp: boolean,\n): InfoSection[] {\n const sections: InfoSection[] = []\n\n // Status\n const statusValue =\n config.enabled && isAvailable\n ? `\\u25CF ${t('commands.sandbox.enabled')}`\n : `\\u25CB ${t('commands.sandbox.disabled')}`\n const statusColor =\n config.enabled && isAvailable\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error\n\n const statusItems: InfoItem[] = [\n { label: 'Status', value: statusValue, valueColor: statusColor },\n {\n label: t('commands.sandbox.implementation'),\n value: `${implementation.toUpperCase()} - ${getImplDescription(implementation)}`,\n valueColor: getImplColor(implementation),\n },\n ]\n if (!isAvailable) {\n statusItems.push({\n label: '\\u26A0',\n value: t('commands.sandbox.notAvailable'),\n valueColor: '#FFB86C',\n })\n }\n sections.push({\n title: t('commands.sandbox.statusSection'),\n items: statusItems,\n })\n\n // Filesystem Policy\n const fsItems: InfoItem[] = [\n {\n label: 'Write Allowed',\n value:\n config.filesystem.writeAllowed.length > 0\n ? config.filesystem.writeAllowed.slice(0, 3).join(', ') +\n (config.filesystem.writeAllowed.length > 3 ? ' ...' : '')\n : 'None',\n valueColor:\n config.filesystem.writeAllowed.length > 0\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error,\n },\n {\n label: 'Denied Paths',\n value:\n config.filesystem.denied.length > 0\n ? `${config.filesystem.denied.length} paths blocked`\n : 'None blocked',\n valueColor:\n config.filesystem.denied.length > 0\n ? SEMANTIC_COLORS.error\n : SEMANTIC_COLORS.success,\n },\n ]\n sections.push({\n title: t('commands.sandbox.filesystemPolicy'),\n items: fsItems,\n })\n\n // Network Policy\n const netItems: InfoItem[] = [\n {\n label: 'Network Access',\n value: config.network.blockAll ? 'Blocked' : 'Allowed',\n valueColor: config.network.blockAll\n ? SEMANTIC_COLORS.error\n : SEMANTIC_COLORS.success,\n },\n ]\n if (!config.network.blockAll && config.network.allowedDomains.length > 0) {\n netItems.push({\n label: 'Allowed Domains',\n value:\n config.network.allowedDomains.slice(0, 3).join(', ') +\n (config.network.allowedDomains.length > 3 ? ' ...' : ''),\n })\n }\n sections.push({ title: t('commands.sandbox.networkPolicy'), items: netItems })\n\n // Process Policy\n sections.push({\n title: t('commands.sandbox.processPolicy'),\n items: [\n {\n label: 'Max Exec Time',\n value: `${config.process.maxExecutionTime / 1000}s`,\n },\n {\n label: 'Excluded Cmds',\n value:\n config.process.excludedCommands.length > 0\n ? config.process.excludedCommands.slice(0, 3).join(', ') +\n (config.process.excludedCommands.length > 3 ? ' ...' : '')\n : 'None',\n },\n ],\n })\n\n // Help section (collapsible)\n if (showHelp) {\n sections.push({\n title: t('commands.sandbox.helpSection'),\n items: [\n {\n label: '\\u2022 seatbelt',\n value: 'macOS built-in sandbox-exec',\n valueColor: SEMANTIC_COLORS.success,\n },\n {\n label: '\\u2022 bubblewrap',\n value: 'Linux container isolation (bwrap)',\n valueColor: SEMANTIC_COLORS.info,\n },\n {\n label: '\\u2022 docker',\n value: 'Docker container isolation',\n valueColor: '#FFB86C',\n },\n {\n label: '\\u2022 none',\n value: 'No sandboxing (not recommended)',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n })\n }\n\n return sections\n}\n\ninterface SandboxViewProps {\n initialConfig: SandboxConfig\n implementation: SandboxImplementation\n initialAvailable: boolean\n onDone: () => void\n}\n\nconst SandboxView: React.FC<SandboxViewProps> = ({\n initialConfig,\n implementation,\n initialAvailable,\n onDone,\n}) => {\n const [config, setConfig] = useState(initialConfig)\n const [isAvailable, setIsAvailable] = useState(initialAvailable)\n const [showHelp, setShowHelp] = useState(false)\n\n const cwd = getCwd()\n const controller = getSandboxController(cwd)\n\n const handleToggle = async () => {\n const newEnabled = !config.enabled\n controller.updateConfig({ enabled: newEnabled })\n const newConfig = controller.getConfig()\n setConfig(newConfig)\n const available = await controller.isAvailable()\n setIsAvailable(available)\n }\n\n const sections = buildSections(config, implementation, isAvailable, showHelp)\n const actions: InfoPanelAction[] = [\n {\n key: 't',\n keyLabel: 'T',\n description: t('commands.sandbox.toggle'),\n onPress: handleToggle,\n },\n {\n key: 'h',\n keyLabel: 'H',\n description: t('commands.sandbox.toggleHelp'),\n onPress: () => setShowHelp(!showHelp),\n },\n ]\n\n return (\n <InfoPanel\n title={t('commands.sandbox.title')}\n sections={sections}\n actions={actions}\n onClose={onDone}\n />\n )\n}\n\nconst command: Command = {\n name: 'sandbox',\n description: t('commands.sandbox.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context) {\n const cwd = getCwd()\n const controller = getSandboxController(cwd)\n const initialConfig = controller.getConfig()\n const implementation = controller.getImplementationType()\n const initialAvailable = await controller.isAvailable()\n\n return (\n <SandboxView\n initialConfig={initialConfig}\n implementation={implementation}\n initialAvailable={initialAvailable}\n onDone={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,224 @@
1
+ import React, { useState, useMemo } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import path from "path";
4
+ import { t } from "../i18n/index.js";
5
+ import { SEMANTIC_COLORS, BRAND_GRADIENT } from "../constants/colors.js";
6
+ import { getCwd } from "../utils/state.js";
7
+ import {
8
+ getRecentSessions,
9
+ getSessionsByProject,
10
+ searchSessions,
11
+ getSessionsIndex
12
+ } from "../utils/sessionIndex.js";
13
+ import { PressEnterToContinue } from "../components/PressEnterToContinue.js";
14
+ import {
15
+ TabbedListView
16
+ } from "../components/TabbedListView/index.js";
17
+ function parseArgs(args) {
18
+ const result = {
19
+ all: false,
20
+ limit: 20,
21
+ project: false,
22
+ search: null,
23
+ help: false
24
+ };
25
+ if (!args) return result;
26
+ const parts = args.trim().split(/\s+/);
27
+ let i = 0;
28
+ while (i < parts.length) {
29
+ const part = parts[i];
30
+ if (part === "--all" || part === "-a") {
31
+ result.all = true;
32
+ } else if (part === "--project" || part === "-p") {
33
+ result.project = true;
34
+ } else if (part === "--help" || part === "-h") {
35
+ result.help = true;
36
+ } else if (part === "--limit" || part === "-l") {
37
+ i++;
38
+ if (i < parts.length) {
39
+ const num = parseInt(parts[i], 10);
40
+ if (!isNaN(num) && num > 0) {
41
+ result.limit = num;
42
+ }
43
+ }
44
+ } else if (part === "--search" || part === "-s") {
45
+ i++;
46
+ if (i < parts.length) {
47
+ const searchParts = [];
48
+ while (i < parts.length && !parts[i].startsWith("-")) {
49
+ searchParts.push(parts[i]);
50
+ i++;
51
+ }
52
+ i--;
53
+ result.search = searchParts.join(" ").replace(/^["']|["']$/g, "");
54
+ }
55
+ }
56
+ i++;
57
+ }
58
+ return result;
59
+ }
60
+ function formatDate(isoString) {
61
+ const date = new Date(isoString);
62
+ const now = /* @__PURE__ */ new Date();
63
+ const hours = date.getHours().toString().padStart(2, "0");
64
+ const minutes = date.getMinutes().toString().padStart(2, "0");
65
+ const timeStr = `${hours}:${minutes}`;
66
+ const isToday = date.getDate() === now.getDate() && date.getMonth() === now.getMonth() && date.getFullYear() === now.getFullYear();
67
+ if (isToday) {
68
+ return `${t("commands.sessions.today")} ${timeStr}`;
69
+ }
70
+ const yesterday = new Date(now);
71
+ yesterday.setDate(yesterday.getDate() - 1);
72
+ const isYesterday = date.getDate() === yesterday.getDate() && date.getMonth() === yesterday.getMonth() && date.getFullYear() === yesterday.getFullYear();
73
+ if (isYesterday) {
74
+ return `${t("commands.sessions.yesterday")} ${timeStr}`;
75
+ }
76
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
77
+ const day = date.getDate().toString().padStart(2, "0");
78
+ return `${month}-${day} ${timeStr}`;
79
+ }
80
+ function truncate(str, maxLength) {
81
+ if (str.length <= maxLength) return str;
82
+ return str.slice(0, maxLength - 3) + "...";
83
+ }
84
+ function getProjectName(projectPath) {
85
+ return path.basename(projectPath) || projectPath;
86
+ }
87
+ const HelpDisplay = ({ onClose }) => {
88
+ useInput((_, key) => {
89
+ if (key.return || key.escape) onClose();
90
+ });
91
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, "/sessions - ", t("commands.sessions.description")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Usage:"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "/sessions"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show recent 20 sessions")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "/sessions --all"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show all sessions")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "/sessions --limit 20"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show recent 20 sessions")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "/sessions --project"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show only current project")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, '/sessions --search "keyword"'), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Search sessions")))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Options:"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "-a, --all"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show all sessions")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "-l, --limit N"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Limit to N sessions (default: 20)")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "-p, --project"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Filter to current project only")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "-s, --search"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Search by prompt or summary")), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "-h, --help"), " ", /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, "Show this help")))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(PressEnterToContinue, null)));
92
+ };
93
+ function sessionToListItem(session) {
94
+ const dateStr = formatDate(session.modified);
95
+ const projectName = truncate(getProjectName(session.projectPath), 15);
96
+ const msgCount = session.messageCount;
97
+ const toolCount = session.toolCallCount;
98
+ return {
99
+ id: session.sessionId,
100
+ label: truncate(session.firstPrompt, 45),
101
+ description: `${projectName}`,
102
+ metadata: `${dateStr} \xB7 ${msgCount} msgs \xB7 ${toolCount} tools`,
103
+ category: projectName,
104
+ data: session
105
+ };
106
+ }
107
+ const SessionsDisplay = ({
108
+ recentSessions,
109
+ projectSessions,
110
+ allSessions,
111
+ total,
112
+ onClose
113
+ }) => {
114
+ const [activeTab, setActiveTab] = useState("recent");
115
+ const [searchQuery, setSearchQuery] = useState("");
116
+ const tabs = useMemo(
117
+ () => [
118
+ {
119
+ id: "recent",
120
+ label: t("commands.sessions.title"),
121
+ badge: recentSessions.length
122
+ },
123
+ {
124
+ id: "project",
125
+ label: t("commands.sessions.headerProject"),
126
+ badge: projectSessions.length
127
+ },
128
+ {
129
+ id: "all",
130
+ label: t("common.all"),
131
+ badge: allSessions.length
132
+ }
133
+ ],
134
+ [recentSessions.length, projectSessions.length, allSessions.length]
135
+ );
136
+ const items = useMemo(() => {
137
+ let sessions;
138
+ switch (activeTab) {
139
+ case "project":
140
+ sessions = projectSessions;
141
+ break;
142
+ case "all":
143
+ sessions = allSessions;
144
+ break;
145
+ case "recent":
146
+ default:
147
+ sessions = recentSessions;
148
+ }
149
+ return sessions.map(sessionToListItem);
150
+ }, [activeTab, recentSessions, projectSessions, allSessions]);
151
+ const handleSelect = () => {
152
+ onClose();
153
+ };
154
+ return /* @__PURE__ */ React.createElement(
155
+ TabbedListView,
156
+ {
157
+ title: t("commands.sessions.title"),
158
+ tabs,
159
+ activeTab,
160
+ onTabChange: setActiveTab,
161
+ items,
162
+ searchEnabled: true,
163
+ searchPlaceholder: t("ui.tabbedList.search"),
164
+ searchQuery,
165
+ onSearchChange: setSearchQuery,
166
+ onSelect: handleSelect,
167
+ onClose,
168
+ emptyText: t("commands.sessions.noSessions"),
169
+ footerHint: t("commands.sessions.navigationHint"),
170
+ groupByCategory: activeTab === "all"
171
+ }
172
+ );
173
+ };
174
+ const command = {
175
+ name: "sessions",
176
+ description: t("commands.sessions.description"),
177
+ isEnabled: true,
178
+ isHidden: false,
179
+ type: "local-jsx",
180
+ showBelowPrompt: true,
181
+ userFacingName() {
182
+ return this.name;
183
+ },
184
+ async call(onDone, _context, args) {
185
+ const options = parseArgs(args || "");
186
+ if (options.help) {
187
+ return /* @__PURE__ */ React.createElement(HelpDisplay, { onClose: onDone });
188
+ }
189
+ const cwd = getCwd();
190
+ const index = getSessionsIndex();
191
+ const total = index.entries.length;
192
+ const recentSessions = getRecentSessions(options.limit);
193
+ const projectSessions = getSessionsByProject(cwd);
194
+ const allSessions = options.all ? getRecentSessions(total) : getRecentSessions(100);
195
+ if (options.search) {
196
+ const searchResults = searchSessions(options.search);
197
+ return /* @__PURE__ */ React.createElement(
198
+ SessionsDisplay,
199
+ {
200
+ recentSessions: searchResults.slice(0, options.limit),
201
+ projectSessions: searchResults.filter((s) => s.projectPath === cwd),
202
+ allSessions: searchResults,
203
+ total: searchResults.length,
204
+ onClose: onDone
205
+ }
206
+ );
207
+ }
208
+ return /* @__PURE__ */ React.createElement(
209
+ SessionsDisplay,
210
+ {
211
+ recentSessions,
212
+ projectSessions,
213
+ allSessions,
214
+ total,
215
+ onClose: onDone
216
+ }
217
+ );
218
+ }
219
+ };
220
+ var sessions_default = command;
221
+ export {
222
+ sessions_default as default
223
+ };
224
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/sessions.tsx"],
4
+ "sourcesContent": ["/**\n * Sessions Command\n *\n * Displays and manages session history with TabbedListView.\n *\n * Usage:\n * /sessions # Show recent sessions\n * /sessions --all # Show all sessions\n * /sessions --help # Show help\n */\n\nimport React, { useState, useMemo } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport path from 'path'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { SEMANTIC_COLORS, BRAND_GRADIENT } from '@constants/colors'\nimport { getCwd } from '@utils/state'\nimport {\n getRecentSessions,\n getSessionsByProject,\n searchSessions,\n getSessionsIndex,\n type SessionEntry,\n} from '@utils/sessionIndex'\nimport { PressEnterToContinue } from '@components/PressEnterToContinue'\nimport {\n TabbedListView,\n type ListItem,\n type TabDefinition,\n} from '@components/TabbedListView'\n\n/**\n * Parse command arguments\n */\nfunction parseArgs(args: string): {\n all: boolean\n limit: number\n project: boolean\n search: string | null\n help: boolean\n} {\n const result = {\n all: false,\n limit: 20,\n project: false,\n search: null as string | null,\n help: false,\n }\n\n if (!args) return result\n\n const parts = args.trim().split(/\\s+/)\n let i = 0\n\n while (i < parts.length) {\n const part = parts[i]\n\n if (part === '--all' || part === '-a') {\n result.all = true\n } else if (part === '--project' || part === '-p') {\n result.project = true\n } else if (part === '--help' || part === '-h') {\n result.help = true\n } else if (part === '--limit' || part === '-l') {\n i++\n if (i < parts.length) {\n const num = parseInt(parts[i], 10)\n if (!isNaN(num) && num > 0) {\n result.limit = num\n }\n }\n } else if (part === '--search' || part === '-s') {\n i++\n if (i < parts.length) {\n // Collect remaining parts as search query\n const searchParts: string[] = []\n while (i < parts.length && !parts[i].startsWith('-')) {\n searchParts.push(parts[i])\n i++\n }\n i-- // Step back since the loop will increment\n result.search = searchParts.join(' ').replace(/^[\"']|[\"']$/g, '')\n }\n }\n\n i++\n }\n\n return result\n}\n\n/**\n * Format date for display\n * - Today: \"Today HH:mm\"\n * - Yesterday: \"Yesterday HH:mm\"\n * - Other: \"MM-DD HH:mm\"\n */\nfunction formatDate(isoString: string): string {\n const date = new Date(isoString)\n const now = new Date()\n\n const hours = date.getHours().toString().padStart(2, '0')\n const minutes = date.getMinutes().toString().padStart(2, '0')\n const timeStr = `${hours}:${minutes}`\n\n // Check if it's today\n const isToday =\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear()\n\n if (isToday) {\n return `${t('commands.sessions.today')} ${timeStr}`\n }\n\n // Check if it's yesterday\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n const isYesterday =\n date.getDate() === yesterday.getDate() &&\n date.getMonth() === yesterday.getMonth() &&\n date.getFullYear() === yesterday.getFullYear()\n\n if (isYesterday) {\n return `${t('commands.sessions.yesterday')} ${timeStr}`\n }\n\n // Default format: MM-DD HH:mm\n const month = (date.getMonth() + 1).toString().padStart(2, '0')\n const day = date.getDate().toString().padStart(2, '0')\n return `${month}-${day} ${timeStr}`\n}\n\n/**\n * Truncate string with ellipsis\n */\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str\n return str.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Get project name from path\n */\nfunction getProjectName(projectPath: string): string {\n return path.basename(projectPath) || projectPath\n}\n\n/**\n * Help display component\n */\nconst HelpDisplay = ({ onClose }: { onClose: () => void }) => {\n useInput((_, key) => {\n if (key.return || key.escape) onClose()\n })\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n /sessions - {t('commands.sessions.description')}\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Usage:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>/sessions</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Show recent 20 sessions\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>/sessions --all</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>Show all sessions</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>/sessions --limit 20</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Show recent 20 sessions\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>/sessions --project</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Show only current project\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>\n /sessions --search \"keyword\"\n </Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>Search sessions</Text>\n </Text>\n </Box>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Options:</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>-a, --all</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>Show all sessions</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>-l, --limit N</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Limit to N sessions (default: 20)\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>-p, --project</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Filter to current project only\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>-s, --search</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>\n Search by prompt or summary\n </Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>-h, --help</Text>\n {' '}\n <Text color={SEMANTIC_COLORS.secondary}>Show this help</Text>\n </Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n}\n\n/**\n * Convert SessionEntry to ListItem for TabbedListView\n */\nfunction sessionToListItem(session: SessionEntry): ListItem {\n const dateStr = formatDate(session.modified)\n const projectName = truncate(getProjectName(session.projectPath), 15)\n const msgCount = session.messageCount\n const toolCount = session.toolCallCount\n\n return {\n id: session.sessionId,\n label: truncate(session.firstPrompt, 45),\n description: `${projectName}`,\n metadata: `${dateStr} \u00B7 ${msgCount} msgs \u00B7 ${toolCount} tools`,\n category: projectName,\n data: session,\n }\n}\n\n/**\n * Sessions display component with TabbedListView\n */\nconst SessionsDisplay = ({\n recentSessions,\n projectSessions,\n allSessions,\n total,\n onClose,\n}: {\n recentSessions: SessionEntry[]\n projectSessions: SessionEntry[]\n allSessions: SessionEntry[]\n total: number\n onClose: () => void\n}) => {\n const [activeTab, setActiveTab] = useState('recent')\n const [searchQuery, setSearchQuery] = useState('')\n\n // Tab definitions\n const tabs: TabDefinition[] = useMemo(\n () => [\n {\n id: 'recent',\n label: t('commands.sessions.title'),\n badge: recentSessions.length,\n },\n {\n id: 'project',\n label: t('commands.sessions.headerProject'),\n badge: projectSessions.length,\n },\n {\n id: 'all',\n label: t('common.all'),\n badge: allSessions.length,\n },\n ],\n [recentSessions.length, projectSessions.length, allSessions.length],\n )\n\n // Get items based on active tab\n const items: ListItem[] = useMemo(() => {\n let sessions: SessionEntry[]\n\n switch (activeTab) {\n case 'project':\n sessions = projectSessions\n break\n case 'all':\n sessions = allSessions\n break\n case 'recent':\n default:\n sessions = recentSessions\n }\n\n return sessions.map(sessionToListItem)\n }, [activeTab, recentSessions, projectSessions, allSessions])\n\n // Handle item selection (view-only mode, just close)\n const handleSelect = () => {\n onClose()\n }\n\n return (\n <TabbedListView\n title={t('commands.sessions.title')}\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n items={items}\n searchEnabled={true}\n searchPlaceholder={t('ui.tabbedList.search')}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelect={handleSelect}\n onClose={onClose}\n emptyText={t('commands.sessions.noSessions')}\n footerHint={t('commands.sessions.navigationHint')}\n groupByCategory={activeTab === 'all'}\n />\n )\n}\n\nconst command: Command = {\n name: 'sessions',\n description: t('commands.sessions.description'),\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n showBelowPrompt: true,\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n const options = parseArgs(args || '')\n\n // Show help if requested\n if (options.help) {\n return <HelpDisplay onClose={onDone} />\n }\n\n // Get sessions based on options\n const cwd = getCwd()\n const index = getSessionsIndex()\n const total = index.entries.length\n\n // Get different session views\n const recentSessions = getRecentSessions(options.limit)\n const projectSessions = getSessionsByProject(cwd)\n const allSessions = options.all\n ? getRecentSessions(total)\n : getRecentSessions(100)\n\n // If search is specified, override with search results\n if (options.search) {\n const searchResults = searchSessions(options.search)\n return (\n <SessionsDisplay\n recentSessions={searchResults.slice(0, options.limit)}\n projectSessions={searchResults.filter(s => s.projectPath === cwd)}\n allSessions={searchResults}\n total={searchResults.length}\n onClose={onDone}\n />\n )\n }\n\n return (\n <SessionsDisplay\n recentSessions={recentSessions}\n projectSessions={projectSessions}\n allSessions={allSessions}\n total={total}\n onClose={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }