@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.
- package/{cli.js → cli.cjs} +25 -23
- package/dist/commands/agents/AgentsCommand.js +459 -655
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +673 -93
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/language.js +110 -0
- package/dist/commands/language.js.map +7 -0
- package/dist/commands/mcp-interactive.js +419 -217
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +415 -66
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/new.js +56 -0
- package/dist/commands/new.js.map +7 -0
- package/dist/commands/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin.js +882 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/resume.js +251 -16
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +7 -0
- package/dist/commands/setup.js +596 -109
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +292 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/status.js +75 -7
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +154 -180
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands.js +6 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/Config.js +9 -8
- package/dist/components/Config.js.map +2 -2
- package/dist/components/HeaderBar.js +2 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +166 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +46 -44
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/Logo.js +5 -2
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +6 -5
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +5 -4
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModelConfig.js +13 -12
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +4 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +419 -501
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +77 -44
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +12 -8
- package/dist/components/SensitiveFileWarning.js.map +2 -2
- package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- package/dist/components/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/TabbedListView/ScrollableList.js +117 -0
- package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
- package/dist/components/TabbedListView/SearchInput.js +23 -0
- package/dist/components/TabbedListView/SearchInput.js.map +7 -0
- package/dist/components/TabbedListView/TabBar.js +20 -0
- package/dist/components/TabbedListView/TabBar.js.map +7 -0
- package/dist/components/TabbedListView/TabbedListView.js +246 -0
- package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
- package/dist/components/TabbedListView/index.js +11 -0
- package/dist/components/TabbedListView/index.js.map +7 -0
- package/dist/components/TabbedListView/types.js +1 -0
- package/dist/components/TabbedListView/types.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +6 -5
- package/dist/components/TodoChangeBlock.js.map +3 -3
- package/dist/components/TodoPanel.js +6 -3
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TrustDialog.js +6 -5
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
- package/dist/constants/macros.js +1 -1
- package/dist/constants/macros.js.map +1 -1
- package/dist/constants/product.js +2 -2
- package/dist/constants/product.js.map +1 -1
- package/dist/constants/prompts.js +17 -0
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/toolInputExamples.js +5 -1
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/core/backupHook.js +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +8 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +14 -2
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +0 -16
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/tokenStatsManager.js +5 -0
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +56 -0
- package/dist/entrypoints/bootstrap.js.map +7 -0
- package/dist/entrypoints/cli.js +164 -23
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/history.js +75 -15
- package/dist/history.js.map +2 -2
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +2 -2
- package/dist/i18n/locales/en.js +582 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +582 -1
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/messages.js +11 -0
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +9 -0
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +45 -7
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/customCommands.js +44 -16
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/plugins/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +16 -8
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/systemReminder.js +17 -6
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +179 -1
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TodoWriteTool/prompt.js +21 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +14 -9
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +12 -6
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/types/PermissionMode.js +30 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/plugin.js +2 -4
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +103 -0
- package/dist/utils/agentHookExecutor.js.map +7 -0
- package/dist/utils/agentLoader.js +272 -32
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js +134 -0
- package/dist/utils/agentMemory.js.map +7 -0
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +52 -24
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configPaths.js +199 -0
- package/dist/utils/configPaths.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/historyManager.js +234 -0
- package/dist/utils/historyManager.js.map +7 -0
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messages.js +13 -8
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/migration/index.js +37 -0
- package/dist/utils/migration/index.js.map +7 -0
- package/dist/utils/migration/migrateHistory.js +273 -0
- package/dist/utils/migration/migrateHistory.js.map +7 -0
- package/dist/utils/migration/migrateTodos.js +323 -0
- package/dist/utils/migration/migrateTodos.js.map +7 -0
- package/dist/utils/pasteCache.js +309 -0
- package/dist/utils/pasteCache.js.map +7 -0
- package/dist/utils/pluginInstaller.js +34 -24
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +54 -28
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/sessionIndex.js +192 -0
- package/dist/utils/sessionIndex.js.map +7 -0
- package/dist/utils/sessionTracker.js +170 -0
- package/dist/utils/sessionTracker.js.map +7 -0
- package/dist/utils/skillLoader.js +103 -5
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/stats.js +417 -0
- package/dist/utils/stats.js.map +7 -0
- package/dist/utils/stringSubstitution.js +106 -0
- package/dist/utils/stringSubstitution.js.map +7 -0
- package/dist/utils/teamConfig.js +156 -14
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/todoStorage.js +51 -19
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/tooling/safeRender.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +71 -28
- 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
|
|
5
|
-
"mappings": "
|
|
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
|
+
}
|