@within-7/minto 0.1.7 → 0.3.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/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { DEFAULT_ESTIMATION_CONFIG } from "./tokenStats.js";
|
|
3
|
+
class TokenStatsManagerImpl extends EventEmitter {
|
|
4
|
+
static instance = null;
|
|
5
|
+
// Global aggregated stats
|
|
6
|
+
globalStats = this.createEmptyStats();
|
|
7
|
+
// Per-agent stats (agentId → stats)
|
|
8
|
+
agentStats = /* @__PURE__ */ new Map();
|
|
9
|
+
// Per-request records (requestId → record) - for debugging, with LRU eviction
|
|
10
|
+
requestRecords = /* @__PURE__ */ new Map();
|
|
11
|
+
// Configuration
|
|
12
|
+
static MAX_REQUEST_RECORDS = 1e3;
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
this.setMaxListeners(100);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the singleton instance
|
|
19
|
+
*/
|
|
20
|
+
static getInstance() {
|
|
21
|
+
if (!TokenStatsManagerImpl.instance) {
|
|
22
|
+
TokenStatsManagerImpl.instance = new TokenStatsManagerImpl();
|
|
23
|
+
}
|
|
24
|
+
return TokenStatsManagerImpl.instance;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Record token usage from an API response
|
|
28
|
+
*
|
|
29
|
+
* This is the PRIMARY entry point - called from claude.ts
|
|
30
|
+
* after every API response.
|
|
31
|
+
*
|
|
32
|
+
* @param usage - Raw token usage from API
|
|
33
|
+
* @param costUSD - Calculated cost in USD
|
|
34
|
+
* @param model - Model name used
|
|
35
|
+
* @param context - Optional tracking context (agentId, toolUseId)
|
|
36
|
+
*/
|
|
37
|
+
recordUsage(usage, costUSD, model, context) {
|
|
38
|
+
const record = {
|
|
39
|
+
inputTokens: usage.inputTokens,
|
|
40
|
+
outputTokens: usage.outputTokens,
|
|
41
|
+
cacheCreationTokens: usage.cacheCreationTokens ?? 0,
|
|
42
|
+
cacheReadTokens: usage.cacheReadTokens ?? 0,
|
|
43
|
+
totalTokens: usage.inputTokens + usage.outputTokens,
|
|
44
|
+
estimatedCostUSD: costUSD,
|
|
45
|
+
source: "api",
|
|
46
|
+
timestamp: Date.now(),
|
|
47
|
+
model
|
|
48
|
+
};
|
|
49
|
+
this.aggregateInto(this.globalStats, record);
|
|
50
|
+
if (context?.agentId) {
|
|
51
|
+
let stats = this.agentStats.get(context.agentId);
|
|
52
|
+
if (!stats) {
|
|
53
|
+
stats = this.createEmptyStats();
|
|
54
|
+
this.agentStats.set(context.agentId, stats);
|
|
55
|
+
}
|
|
56
|
+
this.aggregateInto(stats, record);
|
|
57
|
+
}
|
|
58
|
+
const requestId = context?.toolUseId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
59
|
+
this.requestRecords.set(requestId, record);
|
|
60
|
+
if (this.requestRecords.size > TokenStatsManagerImpl.MAX_REQUEST_RECORDS) {
|
|
61
|
+
const oldestKey = this.requestRecords.keys().next().value;
|
|
62
|
+
if (oldestKey) this.requestRecords.delete(oldestKey);
|
|
63
|
+
}
|
|
64
|
+
const scope = context?.agentId ? { type: "agent", agentId: context.agentId } : { type: "global" };
|
|
65
|
+
this.emitEvent({
|
|
66
|
+
eventType: "usage_recorded",
|
|
67
|
+
scope,
|
|
68
|
+
usage: record,
|
|
69
|
+
aggregated: context?.agentId ? this.agentStats.get(context.agentId) : this.globalStats,
|
|
70
|
+
globalStats: this.globalStats
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Estimate token count from text
|
|
75
|
+
*
|
|
76
|
+
* Uses a simple character-based estimation. This is a fallback
|
|
77
|
+
* when the API doesn't return token counts.
|
|
78
|
+
*
|
|
79
|
+
* @param text - Text to estimate tokens for
|
|
80
|
+
* @returns Estimated token count
|
|
81
|
+
*/
|
|
82
|
+
estimateTokens(text) {
|
|
83
|
+
return Math.ceil(text.length / DEFAULT_ESTIMATION_CONFIG.charsPerToken);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Record estimated usage when API doesn't return token counts
|
|
87
|
+
*
|
|
88
|
+
* This is used as a fallback for APIs that don't return usage data.
|
|
89
|
+
*
|
|
90
|
+
* @param inputText - Input text (prompt)
|
|
91
|
+
* @param outputText - Output text (completion)
|
|
92
|
+
* @param model - Model name
|
|
93
|
+
* @param context - Optional tracking context
|
|
94
|
+
*/
|
|
95
|
+
recordEstimatedUsage(inputText, outputText, model, context) {
|
|
96
|
+
const inputTokens = this.estimateTokens(inputText);
|
|
97
|
+
const outputTokens = this.estimateTokens(outputText);
|
|
98
|
+
const costUSD = inputTokens / 1e6 * DEFAULT_ESTIMATION_CONFIG.defaultInputCostPerMillion + outputTokens / 1e6 * DEFAULT_ESTIMATION_CONFIG.defaultOutputCostPerMillion;
|
|
99
|
+
const record = {
|
|
100
|
+
inputTokens,
|
|
101
|
+
outputTokens,
|
|
102
|
+
cacheCreationTokens: 0,
|
|
103
|
+
cacheReadTokens: 0,
|
|
104
|
+
totalTokens: inputTokens + outputTokens,
|
|
105
|
+
estimatedCostUSD: costUSD,
|
|
106
|
+
source: "estimated",
|
|
107
|
+
timestamp: Date.now(),
|
|
108
|
+
model
|
|
109
|
+
};
|
|
110
|
+
this.aggregateInto(this.globalStats, record);
|
|
111
|
+
if (context?.agentId) {
|
|
112
|
+
let stats = this.agentStats.get(context.agentId);
|
|
113
|
+
if (!stats) {
|
|
114
|
+
stats = this.createEmptyStats();
|
|
115
|
+
this.agentStats.set(context.agentId, stats);
|
|
116
|
+
}
|
|
117
|
+
this.aggregateInto(stats, record);
|
|
118
|
+
}
|
|
119
|
+
this.emitEvent({
|
|
120
|
+
eventType: "usage_recorded",
|
|
121
|
+
scope: { type: "global" },
|
|
122
|
+
usage: record,
|
|
123
|
+
aggregated: this.globalStats,
|
|
124
|
+
globalStats: this.globalStats
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// ===== Getters =====
|
|
128
|
+
/**
|
|
129
|
+
* Get global aggregated statistics
|
|
130
|
+
*/
|
|
131
|
+
getGlobalStats() {
|
|
132
|
+
return this.cloneStats(this.globalStats);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get statistics for a specific agent
|
|
136
|
+
*
|
|
137
|
+
* @param agentId - Agent ID to get stats for
|
|
138
|
+
* @returns Agent stats or null if not found
|
|
139
|
+
*/
|
|
140
|
+
getAgentStats(agentId) {
|
|
141
|
+
const stats = this.agentStats.get(agentId);
|
|
142
|
+
return stats ? this.cloneStats(stats) : null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get all agent statistics
|
|
146
|
+
*/
|
|
147
|
+
getAllAgentStats() {
|
|
148
|
+
const result = /* @__PURE__ */ new Map();
|
|
149
|
+
for (const [agentId, stats] of this.agentStats) {
|
|
150
|
+
result.set(agentId, this.cloneStats(stats));
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get a specific request record
|
|
156
|
+
*/
|
|
157
|
+
getRequestRecord(requestId) {
|
|
158
|
+
return this.requestRecords.get(requestId) ?? null;
|
|
159
|
+
}
|
|
160
|
+
// ===== Backward Compatibility Layer =====
|
|
161
|
+
/**
|
|
162
|
+
* Get total tokens (for costTracker.getTokenCounts compatibility)
|
|
163
|
+
*
|
|
164
|
+
* This method provides backward compatibility with the existing
|
|
165
|
+
* costTracker.getTokenCounts() interface.
|
|
166
|
+
*/
|
|
167
|
+
getTokenCounts() {
|
|
168
|
+
return {
|
|
169
|
+
input: this.globalStats.totalInputTokens,
|
|
170
|
+
output: this.globalStats.totalOutputTokens,
|
|
171
|
+
cacheCreation: this.globalStats.totalCacheCreationTokens,
|
|
172
|
+
cacheRead: this.globalStats.totalCacheReadTokens,
|
|
173
|
+
total: this.globalStats.grandTotalTokens
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// ===== Event Subscription =====
|
|
177
|
+
/**
|
|
178
|
+
* Subscribe to all stats updates
|
|
179
|
+
*
|
|
180
|
+
* @param callback - Called when any stats change
|
|
181
|
+
* @returns Unsubscribe function
|
|
182
|
+
*/
|
|
183
|
+
onStatsUpdate(callback) {
|
|
184
|
+
this.on("stats_update", callback);
|
|
185
|
+
return () => this.off("stats_update", callback);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Subscribe to updates for a specific agent
|
|
189
|
+
*
|
|
190
|
+
* @param agentId - Agent ID to subscribe to
|
|
191
|
+
* @param callback - Called when agent stats change
|
|
192
|
+
* @returns Unsubscribe function
|
|
193
|
+
*/
|
|
194
|
+
onAgentStatsUpdate(agentId, callback) {
|
|
195
|
+
const handler = (event) => {
|
|
196
|
+
if (event.scope.type === "agent" && event.scope.agentId === agentId) {
|
|
197
|
+
callback(event.aggregated);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
this.on("stats_update", handler);
|
|
201
|
+
return () => this.off("stats_update", handler);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Subscribe to global stats updates only
|
|
205
|
+
*
|
|
206
|
+
* @param callback - Called when global stats change
|
|
207
|
+
* @returns Unsubscribe function
|
|
208
|
+
*/
|
|
209
|
+
onGlobalStatsUpdate(callback) {
|
|
210
|
+
const handler = (event) => {
|
|
211
|
+
callback(event.globalStats);
|
|
212
|
+
};
|
|
213
|
+
this.on("stats_update", handler);
|
|
214
|
+
return () => this.off("stats_update", handler);
|
|
215
|
+
}
|
|
216
|
+
// ===== Agent Lifecycle =====
|
|
217
|
+
/**
|
|
218
|
+
* Mark an agent's scope as completed
|
|
219
|
+
*
|
|
220
|
+
* This emits a scope_completed event and optionally
|
|
221
|
+
* cleans up the agent's stats from memory.
|
|
222
|
+
*
|
|
223
|
+
* @param agentId - Agent ID to complete
|
|
224
|
+
* @param cleanup - Whether to remove from memory (default: false)
|
|
225
|
+
*/
|
|
226
|
+
completeAgentScope(agentId, cleanup = false) {
|
|
227
|
+
const stats = this.agentStats.get(agentId);
|
|
228
|
+
if (!stats) return;
|
|
229
|
+
this.emitEvent({
|
|
230
|
+
eventType: "scope_completed",
|
|
231
|
+
scope: { type: "agent", agentId },
|
|
232
|
+
aggregated: stats,
|
|
233
|
+
globalStats: this.globalStats
|
|
234
|
+
});
|
|
235
|
+
if (cleanup) {
|
|
236
|
+
this.agentStats.delete(agentId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// ===== Internal Methods =====
|
|
240
|
+
createEmptyStats() {
|
|
241
|
+
return {
|
|
242
|
+
totalInputTokens: 0,
|
|
243
|
+
totalOutputTokens: 0,
|
|
244
|
+
totalCacheCreationTokens: 0,
|
|
245
|
+
totalCacheReadTokens: 0,
|
|
246
|
+
grandTotalTokens: 0,
|
|
247
|
+
totalCostUSD: 0,
|
|
248
|
+
requestCount: 0,
|
|
249
|
+
byModel: /* @__PURE__ */ new Map()
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
aggregateInto(stats, record) {
|
|
253
|
+
stats.totalInputTokens += record.inputTokens;
|
|
254
|
+
stats.totalOutputTokens += record.outputTokens;
|
|
255
|
+
stats.totalCacheCreationTokens += record.cacheCreationTokens;
|
|
256
|
+
stats.totalCacheReadTokens += record.cacheReadTokens;
|
|
257
|
+
stats.grandTotalTokens += record.totalTokens;
|
|
258
|
+
stats.totalCostUSD += record.estimatedCostUSD;
|
|
259
|
+
stats.requestCount += 1;
|
|
260
|
+
if (!stats.firstRequestTime) {
|
|
261
|
+
stats.firstRequestTime = record.timestamp;
|
|
262
|
+
}
|
|
263
|
+
stats.lastRequestTime = record.timestamp;
|
|
264
|
+
const modelStats = stats.byModel.get(record.model);
|
|
265
|
+
if (modelStats) {
|
|
266
|
+
modelStats.inputTokens += record.inputTokens;
|
|
267
|
+
modelStats.outputTokens += record.outputTokens;
|
|
268
|
+
modelStats.totalTokens += record.totalTokens;
|
|
269
|
+
modelStats.estimatedCostUSD += record.estimatedCostUSD;
|
|
270
|
+
modelStats.requestCount += 1;
|
|
271
|
+
} else {
|
|
272
|
+
stats.byModel.set(record.model, {
|
|
273
|
+
model: record.model,
|
|
274
|
+
inputTokens: record.inputTokens,
|
|
275
|
+
outputTokens: record.outputTokens,
|
|
276
|
+
totalTokens: record.totalTokens,
|
|
277
|
+
estimatedCostUSD: record.estimatedCostUSD,
|
|
278
|
+
requestCount: 1
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
cloneStats(stats) {
|
|
283
|
+
return {
|
|
284
|
+
...stats,
|
|
285
|
+
byModel: new Map(stats.byModel)
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
emitEvent(event) {
|
|
289
|
+
this.emit("stats_update", event);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Reset all stats (for testing only)
|
|
293
|
+
*/
|
|
294
|
+
resetForTests() {
|
|
295
|
+
if (process.env.NODE_ENV !== "test") {
|
|
296
|
+
throw new Error("resetForTests can only be called in tests");
|
|
297
|
+
}
|
|
298
|
+
this.reset();
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Reset all statistics
|
|
302
|
+
*
|
|
303
|
+
* Called by costTracker.resetStateForTests() for backward compatibility.
|
|
304
|
+
*/
|
|
305
|
+
reset() {
|
|
306
|
+
this.globalStats = this.createEmptyStats();
|
|
307
|
+
this.agentStats.clear();
|
|
308
|
+
this.requestRecords.clear();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const tokenStatsManager = TokenStatsManagerImpl.getInstance();
|
|
312
|
+
function recordTokenUsage(usage, costUSD, model, context) {
|
|
313
|
+
tokenStatsManager.recordUsage(usage, costUSD, model, context);
|
|
314
|
+
}
|
|
315
|
+
function getGlobalTokenStats() {
|
|
316
|
+
return tokenStatsManager.getGlobalStats();
|
|
317
|
+
}
|
|
318
|
+
function getAgentTokenStats(agentId) {
|
|
319
|
+
return tokenStatsManager.getAgentStats(agentId);
|
|
320
|
+
}
|
|
321
|
+
function estimateTokenCount(text) {
|
|
322
|
+
return tokenStatsManager.estimateTokens(text);
|
|
323
|
+
}
|
|
324
|
+
export {
|
|
325
|
+
estimateTokenCount,
|
|
326
|
+
getAgentTokenStats,
|
|
327
|
+
getGlobalTokenStats,
|
|
328
|
+
recordTokenUsage,
|
|
329
|
+
tokenStatsManager
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=tokenStatsManager.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/tokenStatsManager.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Token Statistics Manager\n *\n * Centralized token statistics tracking for the entire application.\n * This is the single source of truth for all token usage data.\n *\n * Architecture:\n * - Singleton pattern for global access\n * - Event-driven updates for real-time UI\n * - Hierarchical aggregation (global \u2192 agent \u2192 request)\n * - Backward compatible with existing costTracker\n *\n * Usage:\n * ```typescript\n * import { tokenStatsManager, recordTokenUsage } from '@core/tokenStatsManager'\n *\n * // Record usage from API response\n * recordTokenUsage(\n * { inputTokens: 100, outputTokens: 50 },\n * 0.0015,\n * 'gpt-4',\n * { agentId: 'agent-123' }\n * )\n *\n * // Get global stats\n * const stats = tokenStatsManager.getGlobalStats()\n *\n * // Subscribe to updates\n * const unsubscribe = tokenStatsManager.onStatsUpdate((event) => {\n * console.log('Stats updated:', event)\n * })\n * ```\n */\n\nimport { EventEmitter } from 'events'\nimport type {\n TokenUsageRecord,\n AggregatedTokenStats,\n TokenStatsScope,\n TokenStatsEvent,\n TokenTrackingContext,\n RawTokenUsage,\n ModelTokenStats,\n} from './tokenStats'\nimport { DEFAULT_ESTIMATION_CONFIG } from './tokenStats'\n\n/**\n * TokenStatsManager - Centralized token statistics tracking\n */\nclass TokenStatsManagerImpl extends EventEmitter {\n private static instance: TokenStatsManagerImpl | null = null\n\n // Global aggregated stats\n private globalStats: AggregatedTokenStats = this.createEmptyStats()\n\n // Per-agent stats (agentId \u2192 stats)\n private agentStats: Map<string, AggregatedTokenStats> = new Map()\n\n // Per-request records (requestId \u2192 record) - for debugging, with LRU eviction\n private requestRecords: Map<string, TokenUsageRecord> = new Map()\n\n // Configuration\n private static readonly MAX_REQUEST_RECORDS = 1000\n\n private constructor() {\n super()\n this.setMaxListeners(100)\n }\n\n /**\n * Get the singleton instance\n */\n static getInstance(): TokenStatsManagerImpl {\n if (!TokenStatsManagerImpl.instance) {\n TokenStatsManagerImpl.instance = new TokenStatsManagerImpl()\n }\n return TokenStatsManagerImpl.instance\n }\n\n /**\n * Record token usage from an API response\n *\n * This is the PRIMARY entry point - called from claude.ts\n * after every API response.\n *\n * @param usage - Raw token usage from API\n * @param costUSD - Calculated cost in USD\n * @param model - Model name used\n * @param context - Optional tracking context (agentId, toolUseId)\n */\n recordUsage(\n usage: RawTokenUsage,\n costUSD: number,\n model: string,\n context?: TokenTrackingContext,\n ): void {\n const record: TokenUsageRecord = {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheCreationTokens: usage.cacheCreationTokens ?? 0,\n cacheReadTokens: usage.cacheReadTokens ?? 0,\n totalTokens: usage.inputTokens + usage.outputTokens,\n estimatedCostUSD: costUSD,\n source: 'api',\n timestamp: Date.now(),\n model,\n }\n\n // Update global stats\n this.aggregateInto(this.globalStats, record)\n\n // Update agent stats if in agent context\n if (context?.agentId) {\n let stats = this.agentStats.get(context.agentId)\n if (!stats) {\n stats = this.createEmptyStats()\n this.agentStats.set(context.agentId, stats)\n }\n this.aggregateInto(stats, record)\n }\n\n // Store request record (with LRU eviction)\n const requestId =\n context?.toolUseId ??\n `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n this.requestRecords.set(requestId, record)\n if (this.requestRecords.size > TokenStatsManagerImpl.MAX_REQUEST_RECORDS) {\n const oldestKey = this.requestRecords.keys().next().value\n if (oldestKey) this.requestRecords.delete(oldestKey)\n }\n\n // Emit event for UI updates\n const scope: TokenStatsScope = context?.agentId\n ? { type: 'agent', agentId: context.agentId }\n : { type: 'global' }\n\n this.emitEvent({\n eventType: 'usage_recorded',\n scope,\n usage: record,\n aggregated: context?.agentId\n ? this.agentStats.get(context.agentId)!\n : this.globalStats,\n globalStats: this.globalStats,\n })\n }\n\n /**\n * Estimate token count from text\n *\n * Uses a simple character-based estimation. This is a fallback\n * when the API doesn't return token counts.\n *\n * @param text - Text to estimate tokens for\n * @returns Estimated token count\n */\n estimateTokens(text: string): number {\n return Math.ceil(text.length / DEFAULT_ESTIMATION_CONFIG.charsPerToken)\n }\n\n /**\n * Record estimated usage when API doesn't return token counts\n *\n * This is used as a fallback for APIs that don't return usage data.\n *\n * @param inputText - Input text (prompt)\n * @param outputText - Output text (completion)\n * @param model - Model name\n * @param context - Optional tracking context\n */\n recordEstimatedUsage(\n inputText: string,\n outputText: string,\n model: string,\n context?: TokenTrackingContext,\n ): void {\n const inputTokens = this.estimateTokens(inputText)\n const outputTokens = this.estimateTokens(outputText)\n\n const costUSD =\n (inputTokens / 1_000_000) *\n DEFAULT_ESTIMATION_CONFIG.defaultInputCostPerMillion +\n (outputTokens / 1_000_000) *\n DEFAULT_ESTIMATION_CONFIG.defaultOutputCostPerMillion\n\n const record: TokenUsageRecord = {\n inputTokens,\n outputTokens,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n totalTokens: inputTokens + outputTokens,\n estimatedCostUSD: costUSD,\n source: 'estimated',\n timestamp: Date.now(),\n model,\n }\n\n // Update global stats\n this.aggregateInto(this.globalStats, record)\n\n // Update agent stats if in context\n if (context?.agentId) {\n let stats = this.agentStats.get(context.agentId)\n if (!stats) {\n stats = this.createEmptyStats()\n this.agentStats.set(context.agentId, stats)\n }\n this.aggregateInto(stats, record)\n }\n\n // Emit event\n this.emitEvent({\n eventType: 'usage_recorded',\n scope: { type: 'global' },\n usage: record,\n aggregated: this.globalStats,\n globalStats: this.globalStats,\n })\n }\n\n // ===== Getters =====\n\n /**\n * Get global aggregated statistics\n */\n getGlobalStats(): AggregatedTokenStats {\n return this.cloneStats(this.globalStats)\n }\n\n /**\n * Get statistics for a specific agent\n *\n * @param agentId - Agent ID to get stats for\n * @returns Agent stats or null if not found\n */\n getAgentStats(agentId: string): AggregatedTokenStats | null {\n const stats = this.agentStats.get(agentId)\n return stats ? this.cloneStats(stats) : null\n }\n\n /**\n * Get all agent statistics\n */\n getAllAgentStats(): Map<string, AggregatedTokenStats> {\n const result = new Map<string, AggregatedTokenStats>()\n for (const [agentId, stats] of this.agentStats) {\n result.set(agentId, this.cloneStats(stats))\n }\n return result\n }\n\n /**\n * Get a specific request record\n */\n getRequestRecord(requestId: string): TokenUsageRecord | null {\n return this.requestRecords.get(requestId) ?? null\n }\n\n // ===== Backward Compatibility Layer =====\n\n /**\n * Get total tokens (for costTracker.getTokenCounts compatibility)\n *\n * This method provides backward compatibility with the existing\n * costTracker.getTokenCounts() interface.\n */\n getTokenCounts(): {\n input: number\n output: number\n cacheCreation: number\n cacheRead: number\n total: number\n } {\n return {\n input: this.globalStats.totalInputTokens,\n output: this.globalStats.totalOutputTokens,\n cacheCreation: this.globalStats.totalCacheCreationTokens,\n cacheRead: this.globalStats.totalCacheReadTokens,\n total: this.globalStats.grandTotalTokens,\n }\n }\n\n // ===== Event Subscription =====\n\n /**\n * Subscribe to all stats updates\n *\n * @param callback - Called when any stats change\n * @returns Unsubscribe function\n */\n onStatsUpdate(callback: (event: TokenStatsEvent) => void): () => void {\n this.on('stats_update', callback)\n return () => this.off('stats_update', callback)\n }\n\n /**\n * Subscribe to updates for a specific agent\n *\n * @param agentId - Agent ID to subscribe to\n * @param callback - Called when agent stats change\n * @returns Unsubscribe function\n */\n onAgentStatsUpdate(\n agentId: string,\n callback: (stats: AggregatedTokenStats) => void,\n ): () => void {\n const handler = (event: TokenStatsEvent) => {\n if (event.scope.type === 'agent' && event.scope.agentId === agentId) {\n callback(event.aggregated)\n }\n }\n this.on('stats_update', handler)\n return () => this.off('stats_update', handler)\n }\n\n /**\n * Subscribe to global stats updates only\n *\n * @param callback - Called when global stats change\n * @returns Unsubscribe function\n */\n onGlobalStatsUpdate(\n callback: (stats: AggregatedTokenStats) => void,\n ): () => void {\n const handler = (event: TokenStatsEvent) => {\n callback(event.globalStats)\n }\n this.on('stats_update', handler)\n return () => this.off('stats_update', handler)\n }\n\n // ===== Agent Lifecycle =====\n\n /**\n * Mark an agent's scope as completed\n *\n * This emits a scope_completed event and optionally\n * cleans up the agent's stats from memory.\n *\n * @param agentId - Agent ID to complete\n * @param cleanup - Whether to remove from memory (default: false)\n */\n completeAgentScope(agentId: string, cleanup: boolean = false): void {\n const stats = this.agentStats.get(agentId)\n if (!stats) return\n\n this.emitEvent({\n eventType: 'scope_completed',\n scope: { type: 'agent', agentId },\n aggregated: stats,\n globalStats: this.globalStats,\n })\n\n if (cleanup) {\n this.agentStats.delete(agentId)\n }\n }\n\n // ===== Internal Methods =====\n\n private createEmptyStats(): AggregatedTokenStats {\n return {\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCacheCreationTokens: 0,\n totalCacheReadTokens: 0,\n grandTotalTokens: 0,\n totalCostUSD: 0,\n requestCount: 0,\n byModel: new Map(),\n }\n }\n\n private aggregateInto(\n stats: AggregatedTokenStats,\n record: TokenUsageRecord,\n ): void {\n stats.totalInputTokens += record.inputTokens\n stats.totalOutputTokens += record.outputTokens\n stats.totalCacheCreationTokens += record.cacheCreationTokens\n stats.totalCacheReadTokens += record.cacheReadTokens\n stats.grandTotalTokens += record.totalTokens\n stats.totalCostUSD += record.estimatedCostUSD\n stats.requestCount += 1\n\n if (!stats.firstRequestTime) {\n stats.firstRequestTime = record.timestamp\n }\n stats.lastRequestTime = record.timestamp\n\n // Update per-model breakdown\n const modelStats = stats.byModel.get(record.model)\n if (modelStats) {\n modelStats.inputTokens += record.inputTokens\n modelStats.outputTokens += record.outputTokens\n modelStats.totalTokens += record.totalTokens\n modelStats.estimatedCostUSD += record.estimatedCostUSD\n modelStats.requestCount += 1\n } else {\n stats.byModel.set(record.model, {\n model: record.model,\n inputTokens: record.inputTokens,\n outputTokens: record.outputTokens,\n totalTokens: record.totalTokens,\n estimatedCostUSD: record.estimatedCostUSD,\n requestCount: 1,\n })\n }\n }\n\n private cloneStats(stats: AggregatedTokenStats): AggregatedTokenStats {\n return {\n ...stats,\n byModel: new Map(stats.byModel),\n }\n }\n\n private emitEvent(event: TokenStatsEvent): void {\n this.emit('stats_update', event)\n }\n\n /**\n * Reset all stats (for testing only)\n */\n resetForTests(): void {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('resetForTests can only be called in tests')\n }\n this.reset()\n }\n\n /**\n * Reset all statistics\n *\n * Called by costTracker.resetStateForTests() for backward compatibility.\n */\n reset(): void {\n this.globalStats = this.createEmptyStats()\n this.agentStats.clear()\n this.requestRecords.clear()\n }\n}\n\n// Export singleton instance\nexport const tokenStatsManager = TokenStatsManagerImpl.getInstance()\n\n// ===== Convenience Functions =====\n\n/**\n * Record token usage from an API response\n *\n * This is the main function to call from claude.ts after each API response.\n */\nexport function recordTokenUsage(\n usage: RawTokenUsage,\n costUSD: number,\n model: string,\n context?: TokenTrackingContext,\n): void {\n tokenStatsManager.recordUsage(usage, costUSD, model, context)\n}\n\n/**\n * Get global token statistics\n */\nexport function getGlobalTokenStats(): AggregatedTokenStats {\n return tokenStatsManager.getGlobalStats()\n}\n\n/**\n * Get token statistics for a specific agent\n */\nexport function getAgentTokenStats(\n agentId: string,\n): AggregatedTokenStats | null {\n return tokenStatsManager.getAgentStats(agentId)\n}\n\n/**\n * Estimate token count from text\n */\nexport function estimateTokenCount(text: string): number {\n return tokenStatsManager.estimateTokens(text)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
class ToolExecutor {
|
|
2
|
+
permissionEngine;
|
|
3
|
+
constructor(permissionEngine) {
|
|
4
|
+
this.permissionEngine = permissionEngine;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Set the permission engine
|
|
8
|
+
*/
|
|
9
|
+
setPermissionEngine(engine) {
|
|
10
|
+
this.permissionEngine = engine;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Execute a tool
|
|
14
|
+
*/
|
|
15
|
+
async *execute(tool, input, context, options = {}) {
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
try {
|
|
18
|
+
if (!options.skipValidation) {
|
|
19
|
+
const validationResult = this.validateInput(tool, input, context);
|
|
20
|
+
if (!validationResult.result) {
|
|
21
|
+
yield {
|
|
22
|
+
type: "error",
|
|
23
|
+
error: new Error(
|
|
24
|
+
validationResult.message || "Input validation failed"
|
|
25
|
+
)
|
|
26
|
+
};
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!options.skipPermissionCheck && this.permissionEngine) {
|
|
31
|
+
const permissionResult = await this.checkPermission(
|
|
32
|
+
tool,
|
|
33
|
+
input,
|
|
34
|
+
context,
|
|
35
|
+
options.permissionContext
|
|
36
|
+
);
|
|
37
|
+
if (!permissionResult.allowed) {
|
|
38
|
+
yield {
|
|
39
|
+
type: "error",
|
|
40
|
+
error: new Error(permissionResult.reason || "Permission denied")
|
|
41
|
+
};
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (permissionResult.promptUser) {
|
|
45
|
+
yield {
|
|
46
|
+
type: "result",
|
|
47
|
+
resultForAssistant: permissionResult.message || "Permission required"
|
|
48
|
+
};
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const generator = tool.call(input, context);
|
|
53
|
+
if (options.timeout) {
|
|
54
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
55
|
+
setTimeout(
|
|
56
|
+
() => reject(
|
|
57
|
+
new Error(
|
|
58
|
+
`Tool execution timed out after ${options.timeout}ms`
|
|
59
|
+
)
|
|
60
|
+
),
|
|
61
|
+
options.timeout
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
for await (const result of generator) {
|
|
65
|
+
if (Date.now() - startTime > options.timeout) {
|
|
66
|
+
yield {
|
|
67
|
+
type: "error",
|
|
68
|
+
error: new Error(
|
|
69
|
+
`Tool execution timed out after ${options.timeout}ms`
|
|
70
|
+
)
|
|
71
|
+
};
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
yield result;
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
for await (const result of generator) {
|
|
78
|
+
yield result;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} catch (error) {
|
|
82
|
+
yield {
|
|
83
|
+
type: "error",
|
|
84
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validate tool input
|
|
90
|
+
*/
|
|
91
|
+
validateInput(tool, input, context) {
|
|
92
|
+
const schemaResult = tool.inputSchema.safeParse(input);
|
|
93
|
+
if (!schemaResult.success) {
|
|
94
|
+
return {
|
|
95
|
+
result: false,
|
|
96
|
+
message: `Input validation failed: ${schemaResult.error.message}`
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (tool.validateInput) {
|
|
100
|
+
const customResult = tool.validateInput(input, context);
|
|
101
|
+
if (customResult instanceof Promise) {
|
|
102
|
+
return { result: true };
|
|
103
|
+
}
|
|
104
|
+
return customResult;
|
|
105
|
+
}
|
|
106
|
+
return { result: true };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check tool permissions
|
|
110
|
+
*/
|
|
111
|
+
async checkPermission(tool, input, context, extra) {
|
|
112
|
+
if (!this.permissionEngine) {
|
|
113
|
+
return { allowed: true };
|
|
114
|
+
}
|
|
115
|
+
const permissionContext = {
|
|
116
|
+
tool,
|
|
117
|
+
input,
|
|
118
|
+
toolUseContext: context,
|
|
119
|
+
allowedTools: context.options?.allowedTools || [],
|
|
120
|
+
safeMode: context.options?.safeMode,
|
|
121
|
+
planMode: context.options?.planMode,
|
|
122
|
+
agentId: context.options?.agentId,
|
|
123
|
+
...extra
|
|
124
|
+
};
|
|
125
|
+
return this.permissionEngine.checkPermission(permissionContext);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let globalExecutor = null;
|
|
129
|
+
function getToolExecutor() {
|
|
130
|
+
if (!globalExecutor) {
|
|
131
|
+
globalExecutor = new ToolExecutor();
|
|
132
|
+
}
|
|
133
|
+
return globalExecutor;
|
|
134
|
+
}
|
|
135
|
+
function resetToolExecutor() {
|
|
136
|
+
globalExecutor = null;
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
ToolExecutor,
|
|
140
|
+
getToolExecutor,
|
|
141
|
+
resetToolExecutor
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/tools/executor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Tool Executor\n *\n * Handles tool execution with validation, permission checking, and error handling.\n */\n\nimport type {\n RegisterableTool,\n ToolExecutionContext,\n ToolExecutionResult,\n} from './types'\nimport type { PermissionEngine } from '../permissions/engine/permissionEngine'\nimport type { PermissionContext } from '../permissions/engine/types'\n\n/**\n * Execution options\n */\nexport interface ExecutionOptions {\n /** Skip permission check */\n skipPermissionCheck?: boolean\n\n /** Skip input validation */\n skipValidation?: boolean\n\n /** Timeout in milliseconds */\n timeout?: number\n\n /** Custom permission context data */\n permissionContext?: Partial<PermissionContext>\n}\n\n/**\n * Tool Executor\n *\n * Executes tools with proper validation and permission checking.\n */\nexport class ToolExecutor {\n private permissionEngine?: PermissionEngine\n\n constructor(permissionEngine?: PermissionEngine) {\n this.permissionEngine = permissionEngine\n }\n\n /**\n * Set the permission engine\n */\n setPermissionEngine(engine: PermissionEngine): void {\n this.permissionEngine = engine\n }\n\n /**\n * Execute a tool\n */\n async *execute<TInput, TOutput>(\n tool: RegisterableTool<TInput, TOutput>,\n input: TInput,\n context: ToolExecutionContext,\n options: ExecutionOptions = {},\n ): AsyncGenerator<ToolExecutionResult<TOutput>> {\n const startTime = Date.now()\n\n try {\n // Step 1: Validate input\n if (!options.skipValidation) {\n const validationResult = this.validateInput(tool, input, context)\n if (!validationResult.result) {\n yield {\n type: 'error',\n error: new Error(\n validationResult.message || 'Input validation failed',\n ),\n }\n return\n }\n }\n\n // Step 2: Check permissions\n if (!options.skipPermissionCheck && this.permissionEngine) {\n const permissionResult = await this.checkPermission(\n tool,\n input as Record<string, unknown>,\n context,\n options.permissionContext,\n )\n\n if (!permissionResult.allowed) {\n yield {\n type: 'error',\n error: new Error(permissionResult.reason || 'Permission denied'),\n }\n return\n }\n\n // Handle prompting user case\n if (permissionResult.promptUser) {\n yield {\n type: 'result',\n resultForAssistant:\n permissionResult.message || 'Permission required',\n }\n return\n }\n }\n\n // Step 3: Execute tool\n const generator = tool.call(input, context)\n\n // Step 4: Handle timeout if specified\n if (options.timeout) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () =>\n reject(\n new Error(\n `Tool execution timed out after ${options.timeout}ms`,\n ),\n ),\n options.timeout,\n )\n })\n\n // Yield results with timeout checking\n for await (const result of generator) {\n // Check if we've exceeded timeout\n if (Date.now() - startTime > options.timeout) {\n yield {\n type: 'error',\n error: new Error(\n `Tool execution timed out after ${options.timeout}ms`,\n ),\n }\n return\n }\n yield result\n }\n } else {\n // No timeout, just yield results\n for await (const result of generator) {\n yield result\n }\n }\n } catch (error) {\n yield {\n type: 'error',\n error: error instanceof Error ? error : new Error(String(error)),\n }\n }\n }\n\n /**\n * Validate tool input\n */\n private validateInput<TInput>(\n tool: RegisterableTool<TInput>,\n input: TInput,\n context: ToolExecutionContext,\n ): { result: boolean; message?: string } {\n // Schema validation\n const schemaResult = tool.inputSchema.safeParse(input)\n if (!schemaResult.success) {\n return {\n result: false,\n message: `Input validation failed: ${schemaResult.error.message}`,\n }\n }\n\n // Custom validation\n if (tool.validateInput) {\n const customResult = tool.validateInput(input, context)\n if (customResult instanceof Promise) {\n // For sync executor, we can't await here\n // This should be handled by execute() method\n return { result: true }\n }\n return customResult\n }\n\n return { result: true }\n }\n\n /**\n * Check tool permissions\n */\n private async checkPermission(\n tool: RegisterableTool,\n input: Record<string, unknown>,\n context: ToolExecutionContext,\n extra?: Partial<PermissionContext>,\n ): Promise<{\n allowed: boolean\n reason?: string\n message?: string\n promptUser?: boolean\n }> {\n if (!this.permissionEngine) {\n return { allowed: true }\n }\n\n const permissionContext: PermissionContext = {\n tool: tool as any,\n input,\n toolUseContext: context as any,\n allowedTools: (context.options?.allowedTools as string[]) || [],\n safeMode: context.options?.safeMode,\n planMode: context.options?.planMode,\n agentId: context.options?.agentId,\n ...extra,\n }\n\n return this.permissionEngine.checkPermission(permissionContext)\n }\n}\n\n// Global singleton instance\nlet globalExecutor: ToolExecutor | null = null\n\n/**\n * Get the global tool executor instance\n */\nexport function getToolExecutor(): ToolExecutor {\n if (!globalExecutor) {\n globalExecutor = new ToolExecutor()\n }\n return globalExecutor\n}\n\n/**\n * Reset the global tool executor (for testing)\n */\nexport function resetToolExecutor(): void {\n globalExecutor = null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ToolRegistry, getToolRegistry, resetToolRegistry } from "./registry.js";
|
|
2
|
+
import {
|
|
3
|
+
ToolExecutor,
|
|
4
|
+
getToolExecutor,
|
|
5
|
+
resetToolExecutor
|
|
6
|
+
} from "./executor.js";
|
|
7
|
+
export {
|
|
8
|
+
ToolExecutor,
|
|
9
|
+
ToolRegistry,
|
|
10
|
+
getToolExecutor,
|
|
11
|
+
getToolRegistry,
|
|
12
|
+
resetToolExecutor,
|
|
13
|
+
resetToolRegistry
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/tools/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Core Tools Module\n *\n * Tool registry, executor, and type definitions.\n */\n\n// Types\nexport type {\n ToolCategory,\n ToolMetadata,\n ToolExecutionContext,\n ToolExecutionResult,\n RegisterableTool,\n} from './types'\n\n// Registry\nexport { ToolRegistry, getToolRegistry, resetToolRegistry } from './registry'\n\n// Executor\nexport {\n ToolExecutor,\n getToolExecutor,\n resetToolExecutor,\n type ExecutionOptions,\n} from './executor'\n"],
|
|
5
|
+
"mappings": "AAgBA,SAAS,cAAc,iBAAiB,yBAAyB;AAGjE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|