@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.
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +2 -2
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/ctx_viz.js +1 -1
- package/dist/commands/effort.js +87 -0
- package/dist/commands/effort.js.map +7 -0
- package/dist/commands/export.js +19 -9
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/ide.js +18 -0
- package/dist/commands/ide.js.map +7 -0
- package/dist/commands/mcp-interactive.js +14 -8
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/memory.js +168 -0
- package/dist/commands/memory.js.map +7 -0
- package/dist/commands/model.js +45 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/outputStyle.js +64 -0
- package/dist/commands/outputStyle.js.map +7 -0
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +10 -1
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +8 -0
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands/vim.js +22 -0
- package/dist/commands/vim.js.map +7 -0
- package/dist/commands.js +12 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +250 -143
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +21 -6
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/PulseLabel.js +44 -0
- package/dist/components/PulseLabel.js.map +7 -0
- package/dist/components/RequestStatusIndicator.js +1 -1
- package/dist/components/RequestStatusIndicator.js.map +1 -1
- package/dist/components/Spinner.js +12 -42
- package/dist/components/Spinner.js.map +3 -3
- package/dist/components/StartupStatus.js +57 -0
- package/dist/components/StartupStatus.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/TabBar.js +13 -8
- package/dist/components/TabbedListView/TabBar.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +1 -1
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TodoPanel.js +1 -1
- package/dist/components/TodoPanel.js.map +1 -1
- package/dist/components/ToolUseLoader.js +5 -0
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TrustDialog.js +0 -2
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +1 -1
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js +1 -1
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +6 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/modelCapabilities.js +103 -18
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/product.js +2 -0
- package/dist/constants/product.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +30 -0
- package/dist/constants/prompts/agentPrompt.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +27 -0
- package/dist/constants/prompts/codeConventions.js.map +7 -0
- package/dist/constants/prompts/doingTasks.js +15 -0
- package/dist/constants/prompts/doingTasks.js.map +7 -0
- package/dist/constants/prompts/envInfo.js +17 -0
- package/dist/constants/prompts/envInfo.js.map +7 -0
- package/dist/constants/prompts/executingWithCare.js +17 -0
- package/dist/constants/prompts/executingWithCare.js.map +7 -0
- package/dist/constants/prompts/identity.js +10 -0
- package/dist/constants/prompts/identity.js.map +7 -0
- package/dist/constants/prompts/index.js +78 -0
- package/dist/constants/prompts/index.js.map +7 -0
- package/dist/constants/prompts/taskManagement.js +60 -0
- package/dist/constants/prompts/taskManagement.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +62 -0
- package/dist/constants/prompts/toneAndStyle.js.map +7 -0
- package/dist/constants/prompts/toolUsagePolicy.js +38 -0
- package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
- package/dist/constants/prompts.js +5 -176
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/providerRegistry.js +235 -0
- package/dist/constants/providerRegistry.js.map +7 -0
- package/dist/constants/providers.js +35 -0
- package/dist/constants/providers.js.map +7 -0
- package/dist/context/PermissionContext.js +0 -1
- package/dist/context/PermissionContext.js.map +2 -2
- package/dist/context.js +87 -31
- package/dist/context.js.map +2 -2
- package/dist/core/backupHook.js +2 -2
- package/dist/core/backupHook.js.map +2 -2
- package/dist/core/config/defaults.js +4 -1
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +7 -1
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -0
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +2 -2
- package/dist/core/tokenStatsManager.js +22 -4
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/entrypoints/cli.js +65 -84
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +2 -1
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useBackgroundShells.js +29 -0
- package/dist/hooks/useBackgroundShells.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +1 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +64 -0
- package/dist/hooks/useDeferredLoading.js.map +7 -0
- package/dist/hooks/useHookStatus.js +1 -1
- package/dist/hooks/useHookStatus.js.map +2 -2
- package/dist/hooks/useSessionTracking.js +55 -0
- package/dist/hooks/useSessionTracking.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +21 -0
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useTextInput.js +1 -0
- package/dist/hooks/useTextInput.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +3 -2
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/locales/en.js +8 -9
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +8 -9
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js +41 -17
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +94 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +27 -19
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +83 -74
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +6 -0
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/agentTeams/index.js +35 -0
- package/dist/services/agentTeams/index.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +114 -0
- package/dist/services/agentTeams/mailbox.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +149 -0
- package/dist/services/agentTeams/teamManager.js.map +7 -0
- package/dist/services/agentTeams/teamTaskStore.js +114 -0
- package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
- package/dist/services/agentTeams/teammateSpawner.js +80 -0
- package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
- package/dist/services/checkpointManager.js +16 -3
- package/dist/services/checkpointManager.js.map +2 -2
- package/dist/services/claude.js +19 -1728
- package/dist/services/claude.js.map +3 -3
- package/dist/services/gpt5ConnectionTest.js +4 -2
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +411 -127
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +807 -0
- package/dist/services/llm/anthropicProvider.js.map +7 -0
- package/dist/services/llm/dispatch.js +218 -0
- package/dist/services/llm/dispatch.js.map +7 -0
- package/dist/services/llm/index.js +44 -0
- package/dist/services/llm/index.js.map +7 -0
- package/dist/services/llm/mintoContext.js +69 -0
- package/dist/services/llm/mintoContext.js.map +7 -0
- package/dist/services/llm/openaiProvider.js +622 -0
- package/dist/services/llm/openaiProvider.js.map +7 -0
- package/dist/services/llm/types.js +157 -0
- package/dist/services/llm/types.js.map +7 -0
- package/dist/services/mcpClient.js +183 -33
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/notifier.js +14 -0
- package/dist/services/notifier.js.map +2 -2
- package/dist/services/oauth.js +4 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +66 -56
- package/dist/services/openai.js.map +3 -3
- package/dist/services/outputStyles.js +102 -21
- package/dist/services/outputStyles.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +4 -1
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/sentry.js +1 -1
- package/dist/services/sentry.js.map +2 -2
- package/dist/services/sessionMemory.js +16 -3
- package/dist/services/sessionMemory.js.map +2 -2
- package/dist/services/systemReminder.js +350 -3
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +19 -0
- package/dist/services/taskStore.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
- package/dist/tools/BashTool/BashTool.js +28 -0
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +1 -1
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +14 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js.map +1 -1
- package/dist/tools/GrepTool/GrepTool.js.map +1 -1
- package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/LspTool/LspTool.js +11 -2
- package/dist/tools/LspTool/LspTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js.map +1 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
- package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
- package/dist/tools/TaskTool/TaskTool.js +75 -5
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +12 -6
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
- package/dist/tools/WebSearchTool/searchProviders.js +2 -1
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools/lsTool/lsTool.js.map +2 -2
- package/dist/tools/lsTool/prompt.js.map +1 -1
- package/dist/tools.js +14 -3
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +21 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/agentTeams.js +1 -0
- package/dist/types/agentTeams.js.map +7 -0
- package/dist/types/hooks.js +8 -2
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +1 -1
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentLoader.js +25 -3
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +1 -1
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +1 -1
- package/dist/utils/async.js +5 -1
- package/dist/utils/async.js.map +2 -2
- package/dist/utils/autoCompactCore.js +60 -0
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/config.js +26 -128
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +227 -0
- package/dist/utils/configSchema.js.map +7 -0
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js +4 -3
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +34 -0
- package/dist/utils/envConfig.js.map +3 -3
- package/dist/utils/gpt5.js +146 -0
- package/dist/utils/gpt5.js.map +7 -0
- package/dist/utils/hookManager.js +374 -140
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/markdown.js +47 -0
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +34 -5
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +201 -32
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +59 -6
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/streamingState.js +52 -0
- package/dist/utils/streamingState.js.map +7 -0
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +9 -3
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +0 -6
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/constants/providerRegistry.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Provider-level capabilities and model-specific overrides.\n * Used by normalizeRequestParams() to transform API requests\n * before they're sent to each provider.\n */\n\nexport interface ProviderCapabilities {\n /** Which parameter name to use for max tokens */\n maxTokensField: 'max_tokens' | 'max_completion_tokens' | 'max_output_tokens'\n /** Temperature range, or 'omit' if model doesn't support temperature */\n temperatureRange: { min: number; max: number } | 'omit'\n /** Whether the provider supports system role messages */\n supportsSystemRole: boolean\n /** Alternative role name for system messages if not supported */\n systemRoleAlternative?: 'developer' | 'instruction'\n /** tool_choice support: true = full, 'auto-only' = only auto, false = none */\n supportsToolChoice: boolean | 'auto-only'\n /** Maximum number of stop sequences, or null for unlimited */\n maxStopSequences: number | null\n /** Whether provider supports streaming */\n supportsStreaming: boolean\n /** Whether provider supports reasoning_effort parameter */\n supportsReasoningEffort: boolean\n /** API type */\n apiType: 'chat-completions' | 'responses'\n}\n\n/**\n * Provider-level default capabilities.\n * These are the defaults for all models from a given provider.\n */\nexport const PROVIDER_REGISTRY: Record<string, ProviderCapabilities> = {\n openai: {\n maxTokensField: 'max_completion_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n 'openai-responses': {\n maxTokensField: 'max_output_tokens',\n temperatureRange: 'omit',\n supportsSystemRole: false,\n systemRoleAlternative: 'instruction',\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: false,\n supportsReasoningEffort: true,\n apiType: 'responses',\n },\n gemini: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n deepseek: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n mistral: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 1.5 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n qwen: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n glm: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 1.0 },\n supportsSystemRole: true,\n supportsToolChoice: 'auto-only',\n maxStopSequences: 1,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n kimi: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 1.0 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n minimax: {\n maxTokensField: 'max_completion_tokens',\n temperatureRange: { min: 0, max: 1.0 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n groq: {\n maxTokensField: 'max_completion_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n xai: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n ollama: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n azure: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n 'baidu-qianfan': {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 1.0 },\n supportsSystemRole: true,\n supportsToolChoice: 'auto-only',\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n siliconflow: {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n 'custom-openai': {\n maxTokensField: 'max_tokens',\n temperatureRange: { min: 0, max: 2 },\n supportsSystemRole: true,\n supportsToolChoice: true,\n maxStopSequences: null,\n supportsStreaming: true,\n supportsReasoningEffort: false,\n apiType: 'chat-completions',\n },\n}\n\n/**\n * Model-specific overrides that take precedence over provider defaults.\n * Use model name prefixes for matching.\n */\nexport const MODEL_OVERRIDES: Record<string, Partial<ProviderCapabilities>> = {\n // OpenAI reasoning models - temperature must be omitted\n 'o1-mini': {\n temperatureRange: 'omit',\n supportsReasoningEffort: false,\n maxTokensField: 'max_completion_tokens',\n },\n 'o1-preview': {\n temperatureRange: 'omit',\n supportsReasoningEffort: false,\n maxTokensField: 'max_completion_tokens',\n },\n o1: {\n temperatureRange: 'omit',\n supportsReasoningEffort: false,\n maxTokensField: 'max_completion_tokens',\n },\n 'o3-mini': {\n temperatureRange: 'omit',\n supportsReasoningEffort: true,\n maxTokensField: 'max_completion_tokens',\n },\n o3: {\n temperatureRange: 'omit',\n supportsReasoningEffort: true,\n maxTokensField: 'max_completion_tokens',\n },\n 'o4-mini': {\n temperatureRange: 'omit',\n supportsReasoningEffort: true,\n maxTokensField: 'max_completion_tokens',\n },\n // GPT-5 models - temperature must be omitted, uses Responses API\n 'gpt-5': {\n temperatureRange: 'omit',\n supportsReasoningEffort: true,\n maxTokensField: 'max_output_tokens',\n apiType: 'responses',\n },\n // Kimi reasoning models - temperature must be exactly 1 (omit and let API default)\n 'kimi-k2': {\n temperatureRange: 'omit',\n supportsReasoningEffort: false,\n },\n // DeepSeek reasoning models - temperature must be omitted\n 'deepseek-reasoner': {\n temperatureRange: 'omit',\n supportsReasoningEffort: false,\n },\n}\n\n/**\n * Get effective capabilities for a provider + model combination.\n * Model overrides take precedence over provider defaults.\n */\nexport function getEffectiveCapabilities(\n provider: string,\n modelName: string,\n): ProviderCapabilities {\n // Start with provider defaults\n const providerCaps =\n PROVIDER_REGISTRY[provider] || PROVIDER_REGISTRY['custom-openai']\n\n // Check for exact model match first, then prefix matches\n let override: Partial<ProviderCapabilities> | undefined =\n MODEL_OVERRIDES[modelName]\n\n if (!override) {\n // Try prefix matching (e.g., 'gpt-5' matches 'gpt-5-mini')\n for (const [prefix, overrideValue] of Object.entries(MODEL_OVERRIDES)) {\n if (modelName.startsWith(prefix)) {\n override = overrideValue\n break\n }\n }\n }\n\n if (override) {\n return { ...providerCaps, ...override }\n }\n\n return providerCaps\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const OPENAI_COMPATIBLE_PROVIDERS = [
|
|
2
|
+
"minimax",
|
|
3
|
+
"kimi",
|
|
4
|
+
"deepseek",
|
|
5
|
+
"siliconflow",
|
|
6
|
+
"qwen",
|
|
7
|
+
"glm",
|
|
8
|
+
"baidu-qianfan",
|
|
9
|
+
"openai",
|
|
10
|
+
"mistral",
|
|
11
|
+
"xai",
|
|
12
|
+
"groq",
|
|
13
|
+
"gemini",
|
|
14
|
+
"ollama",
|
|
15
|
+
"azure",
|
|
16
|
+
"custom-openai"
|
|
17
|
+
];
|
|
18
|
+
function isOpenAICompatibleProvider(provider) {
|
|
19
|
+
return OPENAI_COMPATIBLE_PROVIDERS.includes(provider);
|
|
20
|
+
}
|
|
21
|
+
const ANTHROPIC_NATIVE_PROVIDERS = [
|
|
22
|
+
"anthropic",
|
|
23
|
+
"bigdream",
|
|
24
|
+
"opendev"
|
|
25
|
+
];
|
|
26
|
+
function isAnthropicNativeProvider(provider) {
|
|
27
|
+
return ANTHROPIC_NATIVE_PROVIDERS.includes(provider);
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
ANTHROPIC_NATIVE_PROVIDERS,
|
|
31
|
+
OPENAI_COMPATIBLE_PROVIDERS,
|
|
32
|
+
isAnthropicNativeProvider,
|
|
33
|
+
isOpenAICompatibleProvider
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/constants/providers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Consolidated list of OpenAI-compatible providers.\n * Single source of truth - import this everywhere instead of duplicating the list.\n */\nexport const OPENAI_COMPATIBLE_PROVIDERS = [\n 'minimax',\n 'kimi',\n 'deepseek',\n 'siliconflow',\n 'qwen',\n 'glm',\n 'baidu-qianfan',\n 'openai',\n 'mistral',\n 'xai',\n 'groq',\n 'gemini',\n 'ollama',\n 'azure',\n 'custom-openai',\n] as const\n\nexport type OpenAICompatibleProvider =\n (typeof OPENAI_COMPATIBLE_PROVIDERS)[number]\n\n/**\n * Check if a provider uses OpenAI-compatible API\n */\nexport function isOpenAICompatibleProvider(provider: string): boolean {\n return (OPENAI_COMPATIBLE_PROVIDERS as readonly string[]).includes(provider)\n}\n\n/**\n * Providers that use the Anthropic native SDK\n */\nexport const ANTHROPIC_NATIVE_PROVIDERS = [\n 'anthropic',\n 'bigdream',\n 'opendev',\n] as const\n\nexport type AnthropicNativeProvider =\n (typeof ANTHROPIC_NATIVE_PROVIDERS)[number]\n\n/**\n * Check if a provider uses the Anthropic native SDK\n */\nexport function isAnthropicNativeProvider(provider: string): boolean {\n return (ANTHROPIC_NATIVE_PROVIDERS as readonly string[]).includes(provider)\n}\n"],
|
|
5
|
+
"mappings": "AAIO,MAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,2BAA2B,UAA2B;AACpE,SAAQ,4BAAkD,SAAS,QAAQ;AAC7E;AAKO,MAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,0BAA0B,UAA2B;AACnE,SAAQ,2BAAiD,SAAS,QAAQ;AAC5E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/context/PermissionContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n ReactNode,\n} from 'react'\nimport {\n PermissionMode,\n PermissionContext as IPermissionContext,\n getNextPermissionMode,\n MODE_CONFIGS,\n} from '@minto-types/PermissionMode'\n\ninterface PermissionContextValue {\n permissionContext: IPermissionContext\n currentMode: PermissionMode\n cycleMode: () => void\n setMode: (mode: PermissionMode) => void\n isToolAllowed: (toolName: string) => boolean\n getModeConfig: () => (typeof MODE_CONFIGS)[PermissionMode]\n}\n\nconst PermissionContext = createContext<PermissionContextValue | undefined>(\n undefined,\n)\n\ninterface PermissionProviderProps {\n children: ReactNode\n isBypassPermissionsModeAvailable?: boolean\n}\n\nexport function PermissionProvider({\n children,\n isBypassPermissionsModeAvailable = false,\n}: PermissionProviderProps) {\n const [permissionContext, setPermissionContext] =\n useState<IPermissionContext>({\n mode: 'default',\n allowedTools: ['*'],\n allowedPaths: [process.cwd()],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n metadata: {\n transitionCount: 0,\n },\n })\n\n const cycleMode = useCallback(() => {\n setPermissionContext(prev => {\n const nextMode = getNextPermissionMode(\n prev.mode,\n isBypassPermissionsModeAvailable,\n )\n const modeConfig = MODE_CONFIGS[nextMode]\n\n
|
|
5
|
-
"mappings": "AAAA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAWP,MAAM,oBAAoB;AAAA,EACxB;AACF;AAOO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,mCAAmC;AACrC,GAA4B;AAC1B,QAAM,CAAC,mBAAmB,oBAAoB,IAC5C,SAA6B;AAAA,IAC3B,MAAM;AAAA,IACN,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc,CAAC,QAAQ,IAAI,CAAC;AAAA,IAC5B,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAEH,QAAM,YAAY,YAAY,MAAM;AAClC,yBAAqB,UAAQ;AAC3B,YAAM,WAAW;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACF;AACA,YAAM,aAAa,aAAa,QAAQ;AAExC,
|
|
4
|
+
"sourcesContent": ["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n ReactNode,\n} from 'react'\nimport {\n PermissionMode,\n PermissionContext as IPermissionContext,\n getNextPermissionMode,\n MODE_CONFIGS,\n} from '@minto-types/PermissionMode'\n\ninterface PermissionContextValue {\n permissionContext: IPermissionContext\n currentMode: PermissionMode\n cycleMode: () => void\n setMode: (mode: PermissionMode) => void\n isToolAllowed: (toolName: string) => boolean\n getModeConfig: () => (typeof MODE_CONFIGS)[PermissionMode]\n}\n\nconst PermissionContext = createContext<PermissionContextValue | undefined>(\n undefined,\n)\n\ninterface PermissionProviderProps {\n children: ReactNode\n isBypassPermissionsModeAvailable?: boolean\n}\n\nexport function PermissionProvider({\n children,\n isBypassPermissionsModeAvailable = false,\n}: PermissionProviderProps) {\n const [permissionContext, setPermissionContext] =\n useState<IPermissionContext>({\n mode: 'default',\n allowedTools: ['*'],\n allowedPaths: [process.cwd()],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n metadata: {\n transitionCount: 0,\n },\n })\n\n const cycleMode = useCallback(() => {\n setPermissionContext(prev => {\n const nextMode = getNextPermissionMode(\n prev.mode,\n isBypassPermissionsModeAvailable,\n )\n const modeConfig = MODE_CONFIGS[nextMode]\n\n return {\n ...prev,\n mode: nextMode,\n allowedTools: modeConfig.allowedTools,\n restrictions: modeConfig.restrictions,\n metadata: {\n ...prev.metadata,\n previousMode: prev.mode,\n activatedAt: new Date().toISOString(),\n transitionCount: prev.metadata.transitionCount + 1,\n },\n }\n })\n }, [isBypassPermissionsModeAvailable])\n\n const setMode = useCallback((mode: PermissionMode) => {\n setPermissionContext(prev => {\n const modeConfig = MODE_CONFIGS[mode]\n\n return {\n ...prev,\n mode,\n allowedTools: modeConfig.allowedTools,\n restrictions: modeConfig.restrictions,\n metadata: {\n ...prev.metadata,\n previousMode: prev.mode,\n activatedAt: new Date().toISOString(),\n transitionCount: prev.metadata.transitionCount + 1,\n },\n }\n })\n }, [])\n\n const isToolAllowed = useCallback(\n (toolName: string) => {\n const { allowedTools } = permissionContext\n\n // If '*' is in allowed tools, all tools are allowed\n if (allowedTools.includes('*')) {\n return true\n }\n\n // Check if specific tool is in allowed list\n return allowedTools.includes(toolName)\n },\n [permissionContext],\n )\n\n const getModeConfig = useCallback(() => {\n return MODE_CONFIGS[permissionContext.mode]\n }, [permissionContext.mode])\n\n const value: PermissionContextValue = {\n permissionContext,\n currentMode: permissionContext.mode,\n cycleMode,\n setMode,\n isToolAllowed,\n getModeConfig,\n }\n\n return (\n <PermissionContext.Provider value={value}>\n {children}\n </PermissionContext.Provider>\n )\n}\n\nexport function usePermissionContext(): PermissionContextValue {\n const context = useContext(PermissionContext)\n if (context === undefined) {\n throw new Error(\n 'usePermissionContext must be used within a PermissionProvider',\n )\n }\n return context\n}\n\n// Hook for components that need to respond to permission mode changes\nexport function usePermissionMode(): [\n PermissionMode,\n (mode: PermissionMode) => void,\n () => void,\n] {\n const { currentMode, setMode, cycleMode } = usePermissionContext()\n return [currentMode, setMode, cycleMode]\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAWP,MAAM,oBAAoB;AAAA,EACxB;AACF;AAOO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,mCAAmC;AACrC,GAA4B;AAC1B,QAAM,CAAC,mBAAmB,oBAAoB,IAC5C,SAA6B;AAAA,IAC3B,MAAM;AAAA,IACN,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc,CAAC,QAAQ,IAAI,CAAC;AAAA,IAC5B,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAEH,QAAM,YAAY,YAAY,MAAM;AAClC,yBAAqB,UAAQ;AAC3B,YAAM,WAAW;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACF;AACA,YAAM,aAAa,aAAa,QAAQ;AAExC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,QACN,cAAc,WAAW;AAAA,QACzB,cAAc,WAAW;AAAA,QACzB,UAAU;AAAA,UACR,GAAG,KAAK;AAAA,UACR,cAAc,KAAK;AAAA,UACnB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,iBAAiB,KAAK,SAAS,kBAAkB;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,gCAAgC,CAAC;AAErC,QAAM,UAAU,YAAY,CAAC,SAAyB;AACpD,yBAAqB,UAAQ;AAC3B,YAAM,aAAa,aAAa,IAAI;AAEpC,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,cAAc,WAAW;AAAA,QACzB,cAAc,WAAW;AAAA,QACzB,UAAU;AAAA,UACR,GAAG,KAAK;AAAA,UACR,cAAc,KAAK;AAAA,UACnB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,iBAAiB,KAAK,SAAS,kBAAkB;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB;AAAA,IACpB,CAAC,aAAqB;AACpB,YAAM,EAAE,aAAa,IAAI;AAGzB,UAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,eAAO;AAAA,MACT;AAGA,aAAO,aAAa,SAAS,QAAQ;AAAA,IACvC;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,gBAAgB,YAAY,MAAM;AACtC,WAAO,aAAa,kBAAkB,IAAI;AAAA,EAC5C,GAAG,CAAC,kBAAkB,IAAI,CAAC;AAE3B,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA,aAAa,kBAAkB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,oCAAC,kBAAkB,UAAlB,EAA2B,SACzB,QACH;AAEJ;AAEO,SAAS,uBAA+C;AAC7D,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,oBAId;AACA,QAAM,EAAE,aAAa,SAAS,UAAU,IAAI,qBAAqB;AACjE,SAAO,CAAC,aAAa,SAAS,SAAS;AACzC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/context.js
CHANGED
|
@@ -14,13 +14,14 @@ import { execFileNoThrow } from "./utils/execFileNoThrow.js";
|
|
|
14
14
|
import { join } from "path";
|
|
15
15
|
import { readFile } from "fs/promises";
|
|
16
16
|
import { existsSync } from "fs";
|
|
17
|
+
import { homedir } from "os";
|
|
17
18
|
import { getModelManager } from "./utils/model.js";
|
|
18
19
|
import { lastX } from "./utils/generators.js";
|
|
19
20
|
import { getGitEmail } from "./utils/user.js";
|
|
20
|
-
import {
|
|
21
|
+
import { AGENTS_FILE, CONFIG_BASE_DIR } from "./constants/product.js";
|
|
21
22
|
async function getClaudeFiles() {
|
|
22
23
|
const abortController = new AbortController();
|
|
23
|
-
const timeout = setTimeout(() => abortController.abort(),
|
|
24
|
+
const timeout = setTimeout(() => abortController.abort(), 1e4);
|
|
24
25
|
try {
|
|
25
26
|
const [mintoFiles, agentsFiles, claudeFiles] = await Promise.all([
|
|
26
27
|
ripGrep(
|
|
@@ -29,7 +30,7 @@ async function getClaudeFiles() {
|
|
|
29
30
|
abortController.signal
|
|
30
31
|
).catch(() => []),
|
|
31
32
|
ripGrep(
|
|
32
|
-
["--files", "--glob", join("**", "*",
|
|
33
|
+
["--files", "--glob", join("**", "*", AGENTS_FILE)],
|
|
33
34
|
getCwd(),
|
|
34
35
|
abortController.signal
|
|
35
36
|
).catch(() => []),
|
|
@@ -88,44 +89,71 @@ const getReadme = memoize(async () => {
|
|
|
88
89
|
return null;
|
|
89
90
|
}
|
|
90
91
|
});
|
|
92
|
+
async function readFileIfExists(filePath) {
|
|
93
|
+
try {
|
|
94
|
+
if (!existsSync(filePath)) return null;
|
|
95
|
+
return await readFile(filePath, "utf-8");
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function getGlobalDocs() {
|
|
101
|
+
const home = homedir();
|
|
102
|
+
const mintoGlobal = await readFileIfExists(
|
|
103
|
+
join(home, CONFIG_BASE_DIR, "MINTO.md")
|
|
104
|
+
);
|
|
105
|
+
if (mintoGlobal) return mintoGlobal;
|
|
106
|
+
const agentsGlobal = await readFileIfExists(
|
|
107
|
+
join(home, CONFIG_BASE_DIR, AGENTS_FILE)
|
|
108
|
+
);
|
|
109
|
+
if (agentsGlobal) return agentsGlobal;
|
|
110
|
+
const claudeGlobal = await readFileIfExists(
|
|
111
|
+
join(home, ".claude", "CLAUDE.md")
|
|
112
|
+
);
|
|
113
|
+
return claudeGlobal;
|
|
114
|
+
}
|
|
91
115
|
const getProjectDocs = memoize(async () => {
|
|
92
116
|
try {
|
|
93
117
|
const cwd = getCwd();
|
|
94
|
-
const mintoPath = join(cwd, "MINTO.md");
|
|
95
|
-
const agentsPath = join(cwd, "AGENTS.md");
|
|
96
|
-
const claudePath = join(cwd, "CLAUDE.md");
|
|
97
118
|
const docs = [];
|
|
98
|
-
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
const content = await readFile(mintoPath, "utf-8");
|
|
102
|
-
docs.push(`# MINTO.md
|
|
119
|
+
const globalDocs = await getGlobalDocs();
|
|
120
|
+
if (globalDocs) {
|
|
121
|
+
docs.push(`# Global Instructions
|
|
103
122
|
|
|
104
|
-
${
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
123
|
+
${globalDocs}`);
|
|
124
|
+
}
|
|
125
|
+
const mintoPath = join(cwd, "MINTO.md");
|
|
126
|
+
const claudePath = join(cwd, "CLAUDE.md");
|
|
127
|
+
const agentsPath = join(cwd, "AGENTS.md");
|
|
128
|
+
let projectContent = null;
|
|
129
|
+
let projectDocName = "";
|
|
130
|
+
const mintoContent = await readFileIfExists(mintoPath);
|
|
131
|
+
if (mintoContent) {
|
|
132
|
+
projectContent = mintoContent;
|
|
133
|
+
projectDocName = "MINTO.md";
|
|
134
|
+
} else {
|
|
135
|
+
const agentsContent = await readFileIfExists(agentsPath);
|
|
136
|
+
if (agentsContent) {
|
|
137
|
+
projectContent = agentsContent;
|
|
138
|
+
projectDocName = "AGENTS.md";
|
|
139
|
+
} else {
|
|
140
|
+
const claudeContent = await readFileIfExists(claudePath);
|
|
141
|
+
if (claudeContent) {
|
|
142
|
+
projectContent = claudeContent;
|
|
143
|
+
projectDocName = "CLAUDE.md";
|
|
144
|
+
}
|
|
108
145
|
}
|
|
109
146
|
}
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
const content = await readFile(agentsPath, "utf-8");
|
|
113
|
-
docs.push(`# AGENTS.md
|
|
147
|
+
if (projectContent) {
|
|
148
|
+
docs.push(`# ${projectDocName}
|
|
114
149
|
|
|
115
|
-
${
|
|
116
|
-
} catch (e) {
|
|
117
|
-
logError(e);
|
|
118
|
-
}
|
|
150
|
+
${projectContent}`);
|
|
119
151
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
docs.push(`# CLAUDE.md
|
|
152
|
+
const localContent = await readFileIfExists(join(cwd, "MINTO.local.md")) ?? await readFileIfExists(join(cwd, "AGENTS.local.md")) ?? await readFileIfExists(join(cwd, "CLAUDE.local.md"));
|
|
153
|
+
if (localContent) {
|
|
154
|
+
docs.push(`# Local Instructions
|
|
124
155
|
|
|
125
|
-
${
|
|
126
|
-
} catch (e) {
|
|
127
|
-
logError(e);
|
|
128
|
-
}
|
|
156
|
+
${localContent}`);
|
|
129
157
|
}
|
|
130
158
|
return docs.length > 0 ? docs.join("\n\n---\n\n") : null;
|
|
131
159
|
} catch (e) {
|
|
@@ -133,6 +161,33 @@ ${content}`);
|
|
|
133
161
|
return null;
|
|
134
162
|
}
|
|
135
163
|
});
|
|
164
|
+
async function getDirectoryScopedDocs(filePath) {
|
|
165
|
+
const cwd = getCwd();
|
|
166
|
+
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
|
|
167
|
+
let dir = path.dirname(absolutePath);
|
|
168
|
+
const docs = [];
|
|
169
|
+
while (dir.length > cwd.length && dir.startsWith(cwd)) {
|
|
170
|
+
const mintoDoc = await readFileIfExists(join(dir, "MINTO.md"));
|
|
171
|
+
if (mintoDoc) {
|
|
172
|
+
docs.unshift({ dir: path.relative(cwd, dir), content: mintoDoc });
|
|
173
|
+
} else {
|
|
174
|
+
const agentsDoc = await readFileIfExists(join(dir, AGENTS_FILE));
|
|
175
|
+
if (agentsDoc) {
|
|
176
|
+
docs.unshift({ dir: path.relative(cwd, dir), content: agentsDoc });
|
|
177
|
+
} else {
|
|
178
|
+
const claudeDoc = await readFileIfExists(join(dir, "CLAUDE.md"));
|
|
179
|
+
if (claudeDoc) {
|
|
180
|
+
docs.unshift({ dir: path.relative(cwd, dir), content: claudeDoc });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
dir = path.dirname(dir);
|
|
185
|
+
}
|
|
186
|
+
if (docs.length === 0) return null;
|
|
187
|
+
return docs.map((d) => `# Directory instructions (${d.dir}/)
|
|
188
|
+
|
|
189
|
+
${d.content}`).join("\n\n---\n\n");
|
|
190
|
+
}
|
|
136
191
|
const getGitStatus = memoize(async () => {
|
|
137
192
|
if (process.env.NODE_ENV === "test") {
|
|
138
193
|
return null;
|
|
@@ -268,6 +323,7 @@ ${lines}`;
|
|
|
268
323
|
export {
|
|
269
324
|
getClaudeFiles,
|
|
270
325
|
getContext,
|
|
326
|
+
getDirectoryScopedDocs,
|
|
271
327
|
getDirectoryStructure,
|
|
272
328
|
getGitStatus,
|
|
273
329
|
getProjectDocs,
|
package/dist/context.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/context.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from './utils/log'\nimport { getCodeStyle } from './utils/style'\nimport { getCwd } from './utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { LSTool } from './tools/lsTool/lsTool'\nimport { getIsGit } from './utils/git'\nimport { ripGrep } from './utils/ripgrep'\nimport * as path from 'path'\nimport { execFileNoThrow } from './utils/execFileNoThrow'\nimport { join } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { getModelManager } from './utils/model'\nimport { lastX } from './utils/generators'\nimport { getGitEmail } from './utils/user'\nimport { PROJECT_FILE } from './constants/product'\n/**\n * Locate MINTO.md, AGENTS.md (legacy), and CLAUDE.md files\n * Priority: MINTO.md > AGENTS.md > CLAUDE.md\n */\nexport async function getClaudeFiles(): Promise<string | null> {\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 3000)\n try {\n // Search for MINTO.md, AGENTS.md (legacy), and CLAUDE.md files\n const [mintoFiles, agentsFiles, claudeFiles] = await Promise.all([\n ripGrep(\n ['--files', '--glob', join('**', '*', 'MINTO.md')],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ripGrep(\n ['--files', '--glob', join('**', '*', PROJECT_FILE)],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ripGrep(\n ['--files', '--glob', join('**', '*', 'CLAUDE.md')],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ])\n\n const allFiles = [...mintoFiles, ...agentsFiles, ...claudeFiles]\n if (!allFiles.length) {\n return null\n }\n\n // Add instructions for additional project files\n const fileTypes = []\n if (mintoFiles.length > 0) fileTypes.push('MINTO.md')\n if (agentsFiles.length > 0) fileTypes.push('AGENTS.md (legacy)')\n if (claudeFiles.length > 0) fileTypes.push('CLAUDE.md')\n\n return `NOTE: Additional project documentation files (${fileTypes.join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => path.join(getCwd(), _))\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n } finally {\n clearTimeout(timeout)\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\n/**\n * Get project documentation content\n * Priority: MINTO.md > AGENTS.md (legacy) > CLAUDE.md\n * If MINTO.md exists, CLAUDE.md is ignored\n */\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n try {\n const cwd = getCwd()\n const mintoPath = join(cwd, 'MINTO.md')\n const agentsPath = join(cwd, 'AGENTS.md')\n const claudePath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n let hasMintoMd = false\n\n // Priority 1: Try to read MINTO.md\n if (existsSync(mintoPath)) {\n try {\n const content = await readFile(mintoPath, 'utf-8')\n docs.push(`# MINTO.md\\n\\n${content}`)\n hasMintoMd = true\n } catch (e) {\n logError(e)\n }\n }\n\n // Priority 2: Try to read AGENTS.md (legacy) if MINTO.md doesn't exist\n if (!hasMintoMd && existsSync(agentsPath)) {\n try {\n const content = await readFile(agentsPath, 'utf-8')\n docs.push(`# AGENTS.md\\n\\n${content}`)\n } catch (e) {\n logError(e)\n }\n }\n\n // Priority 3: Try to read CLAUDE.md only if MINTO.md doesn't exist\n if (!hasMintoMd && existsSync(claudePath)) {\n try {\n const content = await readFile(claudePath, 'utf-8')\n docs.push(`# CLAUDE.md\\n\\n${content}`)\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n // Avoid cycles in tests\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n // Check if status has more than 200 lines\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\n/**\n * This context is prepended to each conversation, and cached for the duration of the conversation.\n */\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [gitStatus, directoryStructure, claudeFiles, readme, projectDocs] =\n await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getClaudeFiles(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(claudeFiles ? { claudeFiles } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\n/**\n * Approximate directory structure, to orient Claude. Claude will start with this, then use\n * tools like LS and View to get more information.\n */\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n let lines: string\n try {\n const abortController = new AbortController()\n setTimeout(() => {\n abortController.abort()\n }, 1_000)\n // \uD83D\uDD27 Fix: Use ModelManager instead of legacy function\n const model = getModelManager().getModelName('main')\n const resultsGen = LSTool.call(\n {\n path: '.',\n },\n {\n abortController,\n options: {\n commands: [],\n tools: [],\n forkNumber: 0,\n messageLogName: 'unused',\n maxThinkingTokens: 0,\n },\n messageId: undefined,\n readFileTimestamps: {},\n },\n )\n const result = await lastX(resultsGen)\n lines = result.data\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,SAAS,YAAY;AAC9B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,YAAY,UAAU;AACtB,SAAS,uBAAuB;AAChC,SAAS,YAAY;AACrB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,
|
|
4
|
+
"sourcesContent": ["import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from './utils/log'\nimport { getCodeStyle } from './utils/style'\nimport { getCwd } from './utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { LSTool } from './tools/lsTool/lsTool'\nimport { getIsGit } from './utils/git'\nimport { ripGrep } from './utils/ripgrep'\nimport * as path from 'path'\nimport { execFileNoThrow } from './utils/execFileNoThrow'\nimport { join } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync } from 'fs'\nimport { homedir } from 'os'\nimport { getModelManager } from './utils/model'\nimport { lastX } from './utils/generators'\nimport { getGitEmail } from './utils/user'\nimport { PROJECT_FILE, AGENTS_FILE, CONFIG_BASE_DIR } from './constants/product'\n\n/**\n * Locate MINTO.md, AGENTS.md (legacy), and CLAUDE.md files\n * Priority: MINTO.md > AGENTS.md > CLAUDE.md\n */\nexport async function getClaudeFiles(): Promise<string | null> {\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 10000)\n try {\n // Search for MINTO.md, AGENTS.md (legacy), and CLAUDE.md files\n const [mintoFiles, agentsFiles, claudeFiles] = await Promise.all([\n ripGrep(\n ['--files', '--glob', join('**', '*', 'MINTO.md')],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ripGrep(\n ['--files', '--glob', join('**', '*', AGENTS_FILE)],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ripGrep(\n ['--files', '--glob', join('**', '*', 'CLAUDE.md')],\n getCwd(),\n abortController.signal,\n ).catch(() => []),\n ])\n\n const allFiles = [...mintoFiles, ...agentsFiles, ...claudeFiles]\n if (!allFiles.length) {\n return null\n }\n\n // Add instructions for additional project files\n const fileTypes = []\n if (mintoFiles.length > 0) fileTypes.push('MINTO.md')\n if (agentsFiles.length > 0) fileTypes.push('AGENTS.md (legacy)')\n if (claudeFiles.length > 0) fileTypes.push('CLAUDE.md')\n\n return `NOTE: Additional project documentation files (${fileTypes.join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => path.join(getCwd(), _))\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n } finally {\n clearTimeout(timeout)\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\n/**\n * Read a file if it exists, returning null otherwise\n */\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n try {\n if (!existsSync(filePath)) return null\n return await readFile(filePath, 'utf-8')\n } catch {\n return null\n }\n}\n\n/**\n * Load global-level project docs (~/.minto/MINTO.md or ~/.claude/CLAUDE.md)\n */\nasync function getGlobalDocs(): Promise<string | null> {\n const home = homedir()\n\n // Try Minto global first\n const mintoGlobal = await readFileIfExists(\n join(home, CONFIG_BASE_DIR, 'MINTO.md'),\n )\n if (mintoGlobal) return mintoGlobal\n\n // Try AGENTS.md global\n const agentsGlobal = await readFileIfExists(\n join(home, CONFIG_BASE_DIR, AGENTS_FILE),\n )\n if (agentsGlobal) return agentsGlobal\n\n // Fallback to Claude global\n const claudeGlobal = await readFileIfExists(\n join(home, '.claude', 'CLAUDE.md'),\n )\n return claudeGlobal\n}\n\n/**\n * Get project documentation content\n *\n * Hierarchy (all concatenated, from low to high priority):\n * 1. Global: ~/.minto/MINTO.md or ~/.claude/CLAUDE.md\n * 2. Project: MINTO.md or CLAUDE.md (at project root)\n * 3. Local: MINTO.local.md or CLAUDE.local.md (appended to project)\n *\n * If MINTO.md exists at any level, CLAUDE.md at that level is ignored.\n */\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n try {\n const cwd = getCwd()\n const docs: string[] = []\n\n // 1. Global docs\n const globalDocs = await getGlobalDocs()\n if (globalDocs) {\n docs.push(`# Global Instructions\\n\\n${globalDocs}`)\n }\n\n // 2. Project root docs (MINTO.md > CLAUDE.md)\n const mintoPath = join(cwd, 'MINTO.md')\n const claudePath = join(cwd, 'CLAUDE.md')\n const agentsPath = join(cwd, 'AGENTS.md')\n\n let projectContent: string | null = null\n let projectDocName = ''\n\n const mintoContent = await readFileIfExists(mintoPath)\n if (mintoContent) {\n projectContent = mintoContent\n projectDocName = 'MINTO.md'\n } else {\n // Try AGENTS.md (legacy) then CLAUDE.md\n const agentsContent = await readFileIfExists(agentsPath)\n if (agentsContent) {\n projectContent = agentsContent\n projectDocName = 'AGENTS.md'\n } else {\n const claudeContent = await readFileIfExists(claudePath)\n if (claudeContent) {\n projectContent = claudeContent\n projectDocName = 'CLAUDE.md'\n }\n }\n }\n\n if (projectContent) {\n docs.push(`# ${projectDocName}\\n\\n${projectContent}`)\n }\n\n // 3. Local overrides (.local.md variants, appended to project docs)\n // Check MINTO.local.md first, then CLAUDE.local.md\n const localContent =\n (await readFileIfExists(join(cwd, 'MINTO.local.md'))) ??\n (await readFileIfExists(join(cwd, 'AGENTS.local.md'))) ??\n (await readFileIfExists(join(cwd, 'CLAUDE.local.md')))\n\n if (localContent) {\n docs.push(`# Local Instructions\\n\\n${localContent}`)\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n})\n\n/**\n * Get directory-scoped CLAUDE.md/MINTO.md content for a given file path.\n * Collects all CLAUDE.md/MINTO.md from the file's directory up to the project root.\n *\n * Example: for src/utils/foo.ts, collects:\n * - src/utils/MINTO.md (or CLAUDE.md)\n * - src/MINTO.md (or CLAUDE.md)\n *\n * Excludes root-level docs (already loaded by getProjectDocs).\n */\nexport async function getDirectoryScopedDocs(\n filePath: string,\n): Promise<string | null> {\n const cwd = getCwd()\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(cwd, filePath)\n\n // Get the directory of the file being operated on\n let dir = path.dirname(absolutePath)\n const docs: { dir: string; content: string }[] = []\n\n // Walk up from file's directory to project root (exclusive)\n while (dir.length > cwd.length && dir.startsWith(cwd)) {\n const mintoDoc = await readFileIfExists(join(dir, 'MINTO.md'))\n if (mintoDoc) {\n docs.unshift({ dir: path.relative(cwd, dir), content: mintoDoc })\n } else {\n const agentsDoc = await readFileIfExists(join(dir, AGENTS_FILE))\n if (agentsDoc) {\n docs.unshift({ dir: path.relative(cwd, dir), content: agentsDoc })\n } else {\n const claudeDoc = await readFileIfExists(join(dir, 'CLAUDE.md'))\n if (claudeDoc) {\n docs.unshift({ dir: path.relative(cwd, dir), content: claudeDoc })\n }\n }\n }\n dir = path.dirname(dir)\n }\n\n if (docs.length === 0) return null\n\n return docs\n .map(d => `# Directory instructions (${d.dir}/)\\n\\n${d.content}`)\n .join('\\n\\n---\\n\\n')\n}\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n // Avoid cycles in tests\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n // Check if status has more than 200 lines\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\n/**\n * This context is prepended to each conversation, and cached for the duration of the conversation.\n */\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [gitStatus, directoryStructure, claudeFiles, readme, projectDocs] =\n await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getClaudeFiles(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(claudeFiles ? { claudeFiles } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\n/**\n * Approximate directory structure, to orient Claude. Claude will start with this, then use\n * tools like LS and View to get more information.\n */\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n let lines: string\n try {\n const abortController = new AbortController()\n setTimeout(() => {\n abortController.abort()\n }, 1_000)\n // \uD83D\uDD27 Fix: Use ModelManager instead of legacy function\n const model = getModelManager().getModelName('main')\n const resultsGen = LSTool.call(\n {\n path: '.',\n },\n {\n abortController,\n options: {\n commands: [],\n tools: [],\n forkNumber: 0,\n messageLogName: 'unused',\n maxThinkingTokens: 0,\n },\n messageId: undefined,\n readFileTimestamps: {},\n },\n )\n const result = await lastX(resultsGen)\n lines = result.data\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/core/backupHook.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createBackup } from "./backupManager.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getGlobalConfig } from "../utils/config.js";
|
|
3
3
|
const EXCLUDED_PATTERNS = [
|
|
4
4
|
"/node_modules/",
|
|
5
5
|
"/.git/",
|
|
@@ -14,7 +14,7 @@ function triggerBackup(filePath, oldContent, newContent, operation) {
|
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
16
|
try {
|
|
17
|
-
const config =
|
|
17
|
+
const config = getGlobalConfig();
|
|
18
18
|
if (config.backupEnabled === false) {
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/backupHook.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Backup Hook\n *\n * Thin wrapper around createBackup() for use in file-writing tools.\n * Fire-and-forget: sync signature, internally async with silent failure.\n */\n\nimport { createBackup, type BackupOperation } from './backupManager'\nimport {
|
|
5
|
-
"mappings": "AAOA,SAAS,oBAA0C;AACnD,SAAS,
|
|
4
|
+
"sourcesContent": ["/**\n * Backup Hook\n *\n * Thin wrapper around createBackup() for use in file-writing tools.\n * Fire-and-forget: sync signature, internally async with silent failure.\n */\n\nimport { createBackup, type BackupOperation } from './backupManager'\nimport { getGlobalConfig } from '@utils/config'\n\n/** Paths that should never be backed up */\nconst EXCLUDED_PATTERNS = [\n '/node_modules/',\n '/.git/',\n '/.minto/backups/',\n '/.claude/backups/',\n]\n\n/**\n * Check if a file path should be excluded from backup\n */\nfunction isExcludedPath(filePath: string): boolean {\n return EXCLUDED_PATTERNS.some(pattern => filePath.includes(pattern))\n}\n\n/**\n * Trigger a backup for a file before modification.\n *\n * Fire-and-forget: returns void synchronously, runs createBackup async\n * in the background. Checks config and path exclusions before triggering.\n *\n * @param filePath - Absolute path to the file being modified\n * @param oldContent - Previous content (null for new files)\n * @param newContent - New content being written\n * @param operation - Type of operation (create, update, delete)\n */\nexport function triggerBackup(\n filePath: string,\n oldContent: string | null,\n newContent: string | null,\n operation: BackupOperation,\n): void {\n // Skip excluded paths\n if (isExcludedPath(filePath)) {\n return\n }\n\n // Check config (sync read, cached by loader)\n try {\n const config = getGlobalConfig()\n if (config.backupEnabled === false) {\n return\n }\n } catch {\n // Config read failure \u2014 default to backing up\n }\n\n // Fire and forget \u2014 createBackup handles its own errors\n createBackup(filePath, oldContent, newContent, operation).catch(() => {\n // Silently ignore \u2014 createBackup already logs internally\n })\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,oBAA0C;AACnD,SAAS,uBAAuB;AAGhC,MAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,eAAe,UAA2B;AACjD,SAAO,kBAAkB,KAAK,aAAW,SAAS,SAAS,OAAO,CAAC;AACrE;AAaO,SAAS,cACd,UACA,YACA,YACA,WACM;AAEN,MAAI,eAAe,QAAQ,GAAG;AAC5B;AAAA,EACF;AAGA,MAAI;AACF,UAAM,SAAS,gBAAgB;AAC/B,QAAI,OAAO,kBAAkB,OAAO;AAClC;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,eAAa,UAAU,YAAY,YAAY,SAAS,EAAE,MAAM,MAAM;AAAA,EAEtE,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/config/defaults.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Configuration Default Values\n *\n * Centralized default values for all configuration types.\n */\n\nimport type { GlobalConfig, ProjectConfig, ModelPointers } from './schema'\n\n/**\n * Default project configuration\n */\nexport const DEFAULT_PROJECT_CONFIG: ProjectConfig = {\n allowedTools: [],\n context: {},\n history: [],\n dontCrawlDirectory: false,\n enableArchitectTool: false,\n mcpContextUris: [],\n mcpServers: {},\n approvedMcprcServers: [],\n rejectedMcprcServers: [],\n hasTrustDialogAccepted: false,\n}\n\n/**\n * Default model pointers\n */\nexport const DEFAULT_MODEL_POINTERS: ModelPointers = {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n compact: '',\n}\n\n/**\n * Default global configuration\n */\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n numStartups: 0,\n autoUpdaterStatus: 'not_configured',\n theme: 'dark',\n preferredNotifChannel: 'iterm2',\n verbose: false,\n primaryProvider: 'anthropic',\n customApiKeyResponses: {\n approved: [],\n rejected: [],\n },\n stream: true,\n modelProfiles: [],\n modelPointers: DEFAULT_MODEL_POINTERS,\n lastDismissedUpdateVersion: undefined,\n compressionMode: 'business',\n thinking: false,\n backupEnabled: true,\n configVersion: 1, // Current config version\n}\n\n/**\n * Get default project config, optionally adjusted for home directory\n */\nexport function defaultConfigForProject(\n projectPath: string,\n homeDir: string,\n): ProjectConfig {\n const config = { ...DEFAULT_PROJECT_CONFIG }\n if (projectPath === homeDir) {\n config.dontCrawlDirectory = true\n }\n return config\n}\n\n/**\n * Current configuration version\n * Increment this when making breaking changes to config structure\n */\nexport const CURRENT_CONFIG_VERSION = 1\n\n/**\n * Modifiable global config keys (exposed to CLI)\n */\nexport const GLOBAL_CONFIG_KEYS = [\n 'autoUpdaterStatus',\n 'theme',\n 'hasCompletedOnboarding',\n 'lastOnboardingVersion',\n 'lastReleaseNotesSeen',\n 'verbose',\n 'customApiKeyResponses',\n 'primaryProvider',\n 'preferredNotifChannel',\n 'shiftEnterKeyBindingInstalled',\n 'maxTokens',\n 'compressionMode',\n 'language',\n 'safetyMode',\n 'autoSyncClaudeCode',\n 'backupEnabled',\n] as const\n\nexport type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]\n\n/**\n * Modifiable project config keys (exposed to CLI)\n */\nexport const PROJECT_CONFIG_KEYS = [\n 'dontCrawlDirectory',\n 'enableArchitectTool',\n 'hasTrustDialogAccepted',\n 'hasCompletedProjectOnboarding',\n] as const\n\nexport type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]\n\n/**\n * Type guards for config keys\n */\nexport function isGlobalConfigKey(key: string): key is GlobalConfigKey {\n return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)\n}\n\nexport function isProjectConfigKey(key: string): key is ProjectConfigKey {\n return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)\n}\n"],
|
|
5
|
-
"mappings": "AAWO,MAAM,yBAAwC;AAAA,EACnD,cAAc,CAAC;AAAA,EACf,SAAS,CAAC;AAAA,EACV,SAAS,CAAC;AAAA,EACV,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,gBAAgB,CAAC;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,sBAAsB,CAAC;AAAA,EACvB,sBAAsB,CAAC;AAAA,EACvB,wBAAwB;AAC1B;AAKO,MAAM,yBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AACX;AAKO,MAAM,wBAAsC;AAAA,EACjD,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,IACrB,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR,eAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA;AACjB;AAKO,SAAS,wBACd,aACA,SACe;AACf,QAAM,SAAS,EAAE,GAAG,uBAAuB;AAC3C,MAAI,gBAAgB,SAAS;AAC3B,WAAO,qBAAqB;AAAA,EAC9B;AACA,SAAO;AACT;AAMO,MAAM,yBAAyB;AAK/B,MAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,kBAAkB,KAAqC;AACrE,SAAO,mBAAmB,SAAS,GAAsB;AAC3D;AAEO,SAAS,mBAAmB,KAAsC;AACvE,SAAO,oBAAoB,SAAS,GAAuB;AAC7D;",
|
|
4
|
+
"sourcesContent": ["/**\n * Configuration Default Values\n *\n * Centralized default values for all configuration types.\n */\n\nimport type { GlobalConfig, ProjectConfig, ModelPointers } from './schema'\n\n/**\n * Default project configuration\n */\nexport const DEFAULT_PROJECT_CONFIG: ProjectConfig = {\n allowedTools: [],\n context: {},\n history: [],\n dontCrawlDirectory: false,\n enableArchitectTool: false,\n mcpContextUris: [],\n mcpServers: {},\n approvedMcprcServers: [],\n rejectedMcprcServers: [],\n hasTrustDialogAccepted: false,\n}\n\n/**\n * Default model pointers\n */\nexport const DEFAULT_MODEL_POINTERS: ModelPointers = {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n compact: '',\n}\n\n/**\n * Default global configuration\n */\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n numStartups: 0,\n autoUpdaterStatus: 'not_configured',\n theme: 'dark',\n preferredNotifChannel: 'iterm2',\n verbose: false,\n primaryProvider: 'anthropic',\n customApiKeyResponses: {\n approved: [],\n rejected: [],\n },\n stream: true,\n modelProfiles: [],\n modelPointers: DEFAULT_MODEL_POINTERS,\n lastDismissedUpdateVersion: undefined,\n compressionMode: 'business',\n thinking: false,\n backupEnabled: true,\n configVersion: 1, // Current config version\n}\n\n/**\n * Get default project config, optionally adjusted for home directory\n */\nexport function defaultConfigForProject(\n projectPath: string,\n homeDir: string,\n): ProjectConfig {\n const config = { ...DEFAULT_PROJECT_CONFIG }\n if (projectPath === homeDir) {\n config.dontCrawlDirectory = true\n }\n return config\n}\n\n/**\n * Current configuration version\n * Increment this when making breaking changes to config structure\n */\nexport const CURRENT_CONFIG_VERSION = 1\n\n/**\n * Modifiable global config keys (exposed to CLI)\n */\nexport const GLOBAL_CONFIG_KEYS = [\n 'autoUpdaterStatus',\n 'theme',\n 'hasCompletedOnboarding',\n 'lastOnboardingVersion',\n 'lastReleaseNotesSeen',\n 'verbose',\n 'customApiKeyResponses',\n 'primaryProvider',\n 'preferredNotifChannel',\n 'shiftEnterKeyBindingInstalled',\n 'maxTokens',\n 'compressionMode',\n 'language',\n 'safetyMode',\n 'autoSyncClaudeCode',\n 'backupEnabled',\n 'enableMemoryTools',\n 'outputStyle',\n 'autoMemory',\n] as const\n\nexport type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]\n\n/**\n * Modifiable project config keys (exposed to CLI)\n */\nexport const PROJECT_CONFIG_KEYS = [\n 'dontCrawlDirectory',\n 'enableArchitectTool',\n 'hasTrustDialogAccepted',\n 'hasCompletedProjectOnboarding',\n] as const\n\nexport type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]\n\n/**\n * Type guards for config keys\n */\nexport function isGlobalConfigKey(key: string): key is GlobalConfigKey {\n return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)\n}\n\nexport function isProjectConfigKey(key: string): key is ProjectConfigKey {\n return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)\n}\n"],
|
|
5
|
+
"mappings": "AAWO,MAAM,yBAAwC;AAAA,EACnD,cAAc,CAAC;AAAA,EACf,SAAS,CAAC;AAAA,EACV,SAAS,CAAC;AAAA,EACV,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,gBAAgB,CAAC;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,sBAAsB,CAAC;AAAA,EACvB,sBAAsB,CAAC;AAAA,EACvB,wBAAwB;AAC1B;AAKO,MAAM,yBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AACX;AAKO,MAAM,wBAAsC;AAAA,EACjD,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,IACrB,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR,eAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA;AACjB;AAKO,SAAS,wBACd,aACA,SACe;AACf,QAAM,SAAS,EAAE,GAAG,uBAAuB;AAC3C,MAAI,gBAAgB,SAAS;AAC3B,WAAO,qBAAqB;AAAA,EAC9B;AACA,SAAO;AACT;AAMO,MAAM,yBAAyB;AAK/B,MAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,kBAAkB,KAAqC;AACrE,SAAO,mBAAmB,SAAS,GAAsB;AAC3D;AAEO,SAAS,mBAAmB,KAAsC;AACvE,SAAO,oBAAoB,SAAS,GAAuB;AAC7D;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -149,7 +149,13 @@ const GlobalConfigSchema = z.object({
|
|
|
149
149
|
// File backup for /undo
|
|
150
150
|
backupEnabled: z.boolean().optional(),
|
|
151
151
|
// Config version for migrations
|
|
152
|
-
configVersion: z.number().optional()
|
|
152
|
+
configVersion: z.number().optional(),
|
|
153
|
+
// Enable experimental memory tools
|
|
154
|
+
enableMemoryTools: z.boolean().optional(),
|
|
155
|
+
// Output style selection
|
|
156
|
+
outputStyle: z.string().optional(),
|
|
157
|
+
// Auto-memory: extract key decisions during auto-compact
|
|
158
|
+
autoMemory: z.boolean().optional()
|
|
153
159
|
});
|
|
154
160
|
function validateGlobalConfig(config) {
|
|
155
161
|
return GlobalConfigSchema.parse(config);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/config/schema.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Configuration Schema Definitions\n *\n * Defines all configuration types for Minto with Zod validation.\n */\n\nimport { z } from 'zod'\n\n// MCP Server Configurations\nexport const McpStdioServerConfigSchema = z.object({\n type: z.literal('stdio').optional().default('stdio'),\n command: z.string(),\n args: z.array(z.string()),\n env: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpSSEServerConfigSchema = z.object({\n type: z.literal('sse'),\n url: z.string(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpServerConfigSchema = z.union([\n McpStdioServerConfigSchema,\n McpSSEServerConfigSchema,\n])\n\n// Auto Updater Status\nexport const AutoUpdaterStatusSchema = z.enum([\n 'disabled',\n 'enabled',\n 'no_permissions',\n 'not_configured',\n])\n\n// Notification Channel\nexport const NotificationChannelSchema = z.enum([\n 'iterm2',\n 'terminal_bell',\n 'iterm2_with_bell',\n 'notifications_disabled',\n])\n\n// Provider Types\nexport const ProviderTypeSchema = z.enum([\n 'anthropic',\n 'openai',\n 'mistral',\n 'deepseek',\n 'kimi',\n 'qwen',\n 'glm',\n 'minimax',\n 'baidu-qianfan',\n 'siliconflow',\n 'bigdream',\n 'opendev',\n 'xai',\n 'groq',\n 'gemini',\n 'ollama',\n 'azure',\n 'custom',\n 'custom-openai',\n])\n\n// Compression Mode\nexport const CompressionModeSchema = z.enum(['business', 'code'])\n\n// UI Language\nexport const UILanguageSchema = z.enum(['en', 'zh-CN'])\n\n// Safety Mode\nexport const SafetyModeSchema = z.enum(['yolo', 'smart', 'strict', 'free'])\n\n// Reasoning Effort\nexport const ReasoningEffortSchema = z.enum([\n 'minimal',\n 'low',\n 'medium',\n 'high',\n])\n\n// Model Profile\nexport const ModelProfileSchema = z.object({\n name: z.string(),\n provider: ProviderTypeSchema,\n modelName: z.string(),\n baseURL: z.string().optional(),\n apiKey: z.string(),\n maxTokens: z.number(),\n contextLength: z.number(),\n reasoningEffort: ReasoningEffortSchema.optional(),\n isActive: z.boolean(),\n createdAt: z.number(),\n lastUsed: z.number().optional(),\n isGPT5: z.boolean().optional(),\n validationStatus: z\n .enum(['valid', 'needs_repair', 'auto_repaired'])\n .optional(),\n lastValidation: z.number().optional(),\n})\n\n// Model Pointer Type\nexport const ModelPointerTypeSchema = z.enum([\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n 'compact',\n])\n\n// Model Pointers\nexport const ModelPointersSchema = z.object({\n main: z.string(),\n task: z.string(),\n reasoning: z.string(),\n quick: z.string(),\n compact: z.string(),\n})\n\n// Account Info\nexport const AccountInfoSchema = z.object({\n accountUuid: z.string(),\n emailAddress: z.string(),\n organizationUuid: z.string().optional(),\n})\n\n// Project Configuration\nexport const ProjectConfigSchema = z.object({\n allowedTools: z.array(z.string()),\n context: z.record(z.string()),\n contextFiles: z.array(z.string()).optional(),\n history: z.array(z.string()),\n dontCrawlDirectory: z.boolean().optional(),\n enableArchitectTool: z.boolean().optional(),\n mcpContextUris: z.array(z.string()),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n approvedMcprcServers: z.array(z.string()).optional(),\n rejectedMcprcServers: z.array(z.string()).optional(),\n lastAPIDuration: z.number().optional(),\n lastCost: z.number().optional(),\n lastDuration: z.number().optional(),\n lastSessionId: z.string().optional(),\n exampleFiles: z.array(z.string()).optional(),\n exampleFilesGeneratedAt: z.number().optional(),\n hasTrustDialogAccepted: z.boolean().optional(),\n hasCompletedProjectOnboarding: z.boolean().optional(),\n})\n\n// Global Configuration\nexport const GlobalConfigSchema = z.object({\n projects: z.record(ProjectConfigSchema).optional(),\n numStartups: z.number(),\n autoUpdaterStatus: AutoUpdaterStatusSchema.optional(),\n userID: z.string().optional(),\n theme: z.string(),\n hasCompletedOnboarding: z.boolean().optional(),\n lastOnboardingVersion: z.string().optional(),\n lastReleaseNotesSeen: z.string().optional(),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n preferredNotifChannel: NotificationChannelSchema,\n verbose: z.boolean(),\n customApiKeyResponses: z\n .object({\n approved: z.array(z.string()).optional(),\n rejected: z.array(z.string()).optional(),\n })\n .optional(),\n primaryProvider: ProviderTypeSchema.optional(),\n maxTokens: z.number().optional(),\n hasAcknowledgedCostThreshold: z.boolean().optional(),\n oauthAccount: AccountInfoSchema.optional(),\n iterm2KeyBindingInstalled: z.boolean().optional(),\n shiftEnterKeyBindingInstalled: z.boolean().optional(),\n proxy: z.string().optional(),\n stream: z.boolean().optional(),\n modelProfiles: z.array(ModelProfileSchema).optional(),\n modelPointers: ModelPointersSchema.optional(),\n defaultModelName: z.string().optional(),\n lastDismissedUpdateVersion: z.string().optional(),\n compressionMode: CompressionModeSchema.optional(),\n thinking: z.boolean().optional(),\n language: UILanguageSchema.optional(),\n safetyMode: SafetyModeSchema.optional(),\n // Claude Code sync\n autoSyncClaudeCode: z.boolean().optional(),\n // File backup for /undo\n backupEnabled: z.boolean().optional(),\n // Config version for migrations\n configVersion: z.number().optional(),\n})\n\n// Type exports for TypeScript usage\nexport type McpStdioServerConfig = z.infer<typeof McpStdioServerConfigSchema>\nexport type McpSSEServerConfig = z.infer<typeof McpSSEServerConfigSchema>\nexport type McpServerConfig = z.infer<typeof McpServerConfigSchema>\nexport type AutoUpdaterStatus = z.infer<typeof AutoUpdaterStatusSchema>\nexport type NotificationChannel = z.infer<typeof NotificationChannelSchema>\nexport type ProviderType = z.infer<typeof ProviderTypeSchema>\nexport type CompressionMode = z.infer<typeof CompressionModeSchema>\nexport type UILanguage = z.infer<typeof UILanguageSchema>\nexport type SafetyMode = z.infer<typeof SafetyModeSchema>\nexport type ReasoningEffort = z.infer<typeof ReasoningEffortSchema>\nexport type ModelProfile = z.infer<typeof ModelProfileSchema>\nexport type ModelPointerType = z.infer<typeof ModelPointerTypeSchema>\nexport type ModelPointers = z.infer<typeof ModelPointersSchema>\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>\n\n// Validation utilities\nexport function validateGlobalConfig(config: unknown): GlobalConfig {\n return GlobalConfigSchema.parse(config)\n}\n\nexport function validateProjectConfig(config: unknown): ProjectConfig {\n return ProjectConfigSchema.parse(config)\n}\n\nexport function safeValidateGlobalConfig(config: unknown): {\n success: boolean\n data?: GlobalConfig\n error?: z.ZodError\n} {\n const result = GlobalConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n\nexport function safeValidateProjectConfig(config: unknown): {\n success: boolean\n data?: ProjectConfig\n error?: z.ZodError\n} {\n const result = ProjectConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Configuration Schema Definitions\n *\n * Defines all configuration types for Minto with Zod validation.\n */\n\nimport { z } from 'zod'\n\n// MCP Server Configurations\nexport const McpStdioServerConfigSchema = z.object({\n type: z.literal('stdio').optional().default('stdio'),\n command: z.string(),\n args: z.array(z.string()),\n env: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpSSEServerConfigSchema = z.object({\n type: z.literal('sse'),\n url: z.string(),\n enabled: z.boolean().optional(),\n})\n\nexport const McpServerConfigSchema = z.union([\n McpStdioServerConfigSchema,\n McpSSEServerConfigSchema,\n])\n\n// Auto Updater Status\nexport const AutoUpdaterStatusSchema = z.enum([\n 'disabled',\n 'enabled',\n 'no_permissions',\n 'not_configured',\n])\n\n// Notification Channel\nexport const NotificationChannelSchema = z.enum([\n 'iterm2',\n 'terminal_bell',\n 'iterm2_with_bell',\n 'notifications_disabled',\n])\n\n// Provider Types\nexport const ProviderTypeSchema = z.enum([\n 'anthropic',\n 'openai',\n 'mistral',\n 'deepseek',\n 'kimi',\n 'qwen',\n 'glm',\n 'minimax',\n 'baidu-qianfan',\n 'siliconflow',\n 'bigdream',\n 'opendev',\n 'xai',\n 'groq',\n 'gemini',\n 'ollama',\n 'azure',\n 'custom',\n 'custom-openai',\n])\n\n// Compression Mode\nexport const CompressionModeSchema = z.enum(['business', 'code'])\n\n// UI Language\nexport const UILanguageSchema = z.enum(['en', 'zh-CN'])\n\n// Safety Mode\nexport const SafetyModeSchema = z.enum(['yolo', 'smart', 'strict', 'free'])\n\n// Reasoning Effort\nexport const ReasoningEffortSchema = z.enum([\n 'minimal',\n 'low',\n 'medium',\n 'high',\n])\n\n// Model Profile\nexport const ModelProfileSchema = z.object({\n name: z.string(),\n provider: ProviderTypeSchema,\n modelName: z.string(),\n baseURL: z.string().optional(),\n apiKey: z.string(),\n maxTokens: z.number(),\n contextLength: z.number(),\n reasoningEffort: ReasoningEffortSchema.optional(),\n isActive: z.boolean(),\n createdAt: z.number(),\n lastUsed: z.number().optional(),\n isGPT5: z.boolean().optional(),\n validationStatus: z\n .enum(['valid', 'needs_repair', 'auto_repaired'])\n .optional(),\n lastValidation: z.number().optional(),\n})\n\n// Model Pointer Type\nexport const ModelPointerTypeSchema = z.enum([\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n 'compact',\n])\n\n// Model Pointers\nexport const ModelPointersSchema = z.object({\n main: z.string(),\n task: z.string(),\n reasoning: z.string(),\n quick: z.string(),\n compact: z.string(),\n})\n\n// Account Info\nexport const AccountInfoSchema = z.object({\n accountUuid: z.string(),\n emailAddress: z.string(),\n organizationUuid: z.string().optional(),\n})\n\n// Project Configuration\nexport const ProjectConfigSchema = z.object({\n allowedTools: z.array(z.string()),\n context: z.record(z.string()),\n contextFiles: z.array(z.string()).optional(),\n history: z.array(z.string()),\n dontCrawlDirectory: z.boolean().optional(),\n enableArchitectTool: z.boolean().optional(),\n mcpContextUris: z.array(z.string()),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n approvedMcprcServers: z.array(z.string()).optional(),\n rejectedMcprcServers: z.array(z.string()).optional(),\n lastAPIDuration: z.number().optional(),\n lastCost: z.number().optional(),\n lastDuration: z.number().optional(),\n lastSessionId: z.string().optional(),\n exampleFiles: z.array(z.string()).optional(),\n exampleFilesGeneratedAt: z.number().optional(),\n hasTrustDialogAccepted: z.boolean().optional(),\n hasCompletedProjectOnboarding: z.boolean().optional(),\n})\n\n// Global Configuration\nexport const GlobalConfigSchema = z.object({\n projects: z.record(ProjectConfigSchema).optional(),\n numStartups: z.number(),\n autoUpdaterStatus: AutoUpdaterStatusSchema.optional(),\n userID: z.string().optional(),\n theme: z.string(),\n hasCompletedOnboarding: z.boolean().optional(),\n lastOnboardingVersion: z.string().optional(),\n lastReleaseNotesSeen: z.string().optional(),\n mcpServers: z.record(McpServerConfigSchema).optional(),\n preferredNotifChannel: NotificationChannelSchema,\n verbose: z.boolean(),\n customApiKeyResponses: z\n .object({\n approved: z.array(z.string()).optional(),\n rejected: z.array(z.string()).optional(),\n })\n .optional(),\n primaryProvider: ProviderTypeSchema.optional(),\n maxTokens: z.number().optional(),\n hasAcknowledgedCostThreshold: z.boolean().optional(),\n oauthAccount: AccountInfoSchema.optional(),\n iterm2KeyBindingInstalled: z.boolean().optional(),\n shiftEnterKeyBindingInstalled: z.boolean().optional(),\n proxy: z.string().optional(),\n stream: z.boolean().optional(),\n modelProfiles: z.array(ModelProfileSchema).optional(),\n modelPointers: ModelPointersSchema.optional(),\n defaultModelName: z.string().optional(),\n lastDismissedUpdateVersion: z.string().optional(),\n compressionMode: CompressionModeSchema.optional(),\n thinking: z.boolean().optional(),\n language: UILanguageSchema.optional(),\n safetyMode: SafetyModeSchema.optional(),\n // Claude Code sync\n autoSyncClaudeCode: z.boolean().optional(),\n // File backup for /undo\n backupEnabled: z.boolean().optional(),\n // Config version for migrations\n configVersion: z.number().optional(),\n // Enable experimental memory tools\n enableMemoryTools: z.boolean().optional(),\n // Output style selection\n outputStyle: z.string().optional(),\n // Auto-memory: extract key decisions during auto-compact\n autoMemory: z.boolean().optional(),\n})\n\n// Type exports for TypeScript usage\nexport type McpStdioServerConfig = z.infer<typeof McpStdioServerConfigSchema>\nexport type McpSSEServerConfig = z.infer<typeof McpSSEServerConfigSchema>\nexport type McpServerConfig = z.infer<typeof McpServerConfigSchema>\nexport type AutoUpdaterStatus = z.infer<typeof AutoUpdaterStatusSchema>\nexport type NotificationChannel = z.infer<typeof NotificationChannelSchema>\nexport type ProviderType = z.infer<typeof ProviderTypeSchema>\nexport type CompressionMode = z.infer<typeof CompressionModeSchema>\nexport type UILanguage = z.infer<typeof UILanguageSchema>\nexport type SafetyMode = z.infer<typeof SafetyModeSchema>\nexport type ReasoningEffort = z.infer<typeof ReasoningEffortSchema>\nexport type ModelProfile = z.infer<typeof ModelProfileSchema>\nexport type ModelPointerType = z.infer<typeof ModelPointerTypeSchema>\nexport type ModelPointers = z.infer<typeof ModelPointersSchema>\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>\nexport type GlobalConfig = z.infer<typeof GlobalConfigSchema>\n\n// Validation utilities\nexport function validateGlobalConfig(config: unknown): GlobalConfig {\n return GlobalConfigSchema.parse(config)\n}\n\nexport function validateProjectConfig(config: unknown): ProjectConfig {\n return ProjectConfigSchema.parse(config)\n}\n\nexport function safeValidateGlobalConfig(config: unknown): {\n success: boolean\n data?: GlobalConfig\n error?: z.ZodError\n} {\n const result = GlobalConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n\nexport function safeValidateProjectConfig(config: unknown): {\n success: boolean\n data?: ProjectConfig\n error?: z.ZodError\n} {\n const result = ProjectConfigSchema.safeParse(config)\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/core/costTracker.js
CHANGED
|
@@ -3,16 +3,33 @@ import { useEffect } from "react";
|
|
|
3
3
|
import signalExit from "signal-exit";
|
|
4
4
|
import { formatDuration } from "../utils/format.js";
|
|
5
5
|
import { tokenStatsManager } from "./tokenStatsManager.js";
|
|
6
|
+
import { emitReminderEvent } from "../services/systemReminder.js";
|
|
6
7
|
const STATE = {
|
|
7
8
|
totalCost: 0,
|
|
8
9
|
totalAPIDuration: 0,
|
|
9
10
|
startTime: Date.now(),
|
|
10
11
|
requestCount: 0
|
|
11
12
|
};
|
|
13
|
+
const BUDGET_THRESHOLDS = [50, 75, 90, 100];
|
|
14
|
+
const emittedBudgetThresholds = /* @__PURE__ */ new Set();
|
|
15
|
+
const DEFAULT_BUDGET_LIMIT = 5;
|
|
12
16
|
function addToTotalCost(cost, duration) {
|
|
13
17
|
STATE.totalCost += cost;
|
|
14
18
|
STATE.totalAPIDuration += duration;
|
|
15
19
|
STATE.requestCount += 1;
|
|
20
|
+
const limit = DEFAULT_BUDGET_LIMIT;
|
|
21
|
+
const percentage = Math.round(STATE.totalCost / limit * 100);
|
|
22
|
+
for (const threshold of BUDGET_THRESHOLDS) {
|
|
23
|
+
if (percentage >= threshold && !emittedBudgetThresholds.has(threshold)) {
|
|
24
|
+
emittedBudgetThresholds.add(threshold);
|
|
25
|
+
emitReminderEvent("budget:usd", {
|
|
26
|
+
used: STATE.totalCost,
|
|
27
|
+
limit,
|
|
28
|
+
percentage,
|
|
29
|
+
threshold
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
16
33
|
}
|
|
17
34
|
function addTokenUsage(_inputTokens, _outputTokens, _cacheCreationTokens, _cacheReadTokens) {
|
|
18
35
|
}
|
|
@@ -94,6 +111,7 @@ function resetStateForTests() {
|
|
|
94
111
|
STATE.totalCost = 0;
|
|
95
112
|
STATE.totalAPIDuration = 0;
|
|
96
113
|
STATE.requestCount = 0;
|
|
114
|
+
emittedBudgetThresholds.clear();
|
|
97
115
|
tokenStatsManager.reset();
|
|
98
116
|
}
|
|
99
117
|
export {
|