@tenex-chat/backend 0.9.1
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/README.md +194 -0
- package/dist/backend-wrapper.cjs +3 -0
- package/dist/src/index.js +331928 -0
- package/package.json +103 -0
- package/src/agents/AgentRegistry.ts +418 -0
- package/src/agents/AgentStorage.ts +1133 -0
- package/src/agents/ConfigResolver.ts +229 -0
- package/src/agents/agent-installer.ts +236 -0
- package/src/agents/agent-loader.ts +241 -0
- package/src/agents/constants.ts +82 -0
- package/src/agents/errors.ts +48 -0
- package/src/agents/execution/AgentExecutor.ts +561 -0
- package/src/agents/execution/ExecutionContextFactory.ts +112 -0
- package/src/agents/execution/MessageCompiler.ts +597 -0
- package/src/agents/execution/MessageSyncer.ts +100 -0
- package/src/agents/execution/PostCompletionChecker.ts +278 -0
- package/src/agents/execution/ProgressMonitor.ts +50 -0
- package/src/agents/execution/RALResolver.ts +177 -0
- package/src/agents/execution/SessionManager.ts +181 -0
- package/src/agents/execution/StreamCallbacks.ts +312 -0
- package/src/agents/execution/StreamExecutionHandler.ts +579 -0
- package/src/agents/execution/StreamSetup.ts +313 -0
- package/src/agents/execution/ToolEventHandlers.ts +239 -0
- package/src/agents/execution/ToolExecutionTracker.ts +498 -0
- package/src/agents/execution/ToolResultUtils.ts +97 -0
- package/src/agents/execution/ToolSupervisionWrapper.ts +174 -0
- package/src/agents/execution/constants.ts +16 -0
- package/src/agents/execution/index.ts +3 -0
- package/src/agents/execution/types.ts +96 -0
- package/src/agents/execution/utils.ts +26 -0
- package/src/agents/index.ts +4 -0
- package/src/agents/script-installer.ts +266 -0
- package/src/agents/supervision/SupervisorLLMService.ts +253 -0
- package/src/agents/supervision/SupervisorOrchestrator.ts +471 -0
- package/src/agents/supervision/heuristics/ConsecutiveToolsWithoutTodoHeuristic.ts +73 -0
- package/src/agents/supervision/heuristics/DelegationClaimHeuristic.ts +80 -0
- package/src/agents/supervision/heuristics/HeuristicRegistry.ts +114 -0
- package/src/agents/supervision/heuristics/PendingTodosHeuristic.ts +93 -0
- package/src/agents/supervision/heuristics/SilentAgentHeuristic.ts +54 -0
- package/src/agents/supervision/heuristics/index.ts +5 -0
- package/src/agents/supervision/index.ts +28 -0
- package/src/agents/supervision/registerHeuristics.ts +110 -0
- package/src/agents/supervision/supervisionHealthCheck.ts +123 -0
- package/src/agents/supervision/types.ts +171 -0
- package/src/agents/tool-names.ts +46 -0
- package/src/agents/tool-normalization.ts +184 -0
- package/src/agents/types/index.ts +2 -0
- package/src/agents/types/runtime.ts +74 -0
- package/src/agents/types/storage.ts +145 -0
- package/src/commands/agent/import/index.ts +6 -0
- package/src/commands/agent/import/openclaw-distiller.ts +57 -0
- package/src/commands/agent/import/openclaw-reader.ts +141 -0
- package/src/commands/agent/import/openclaw.ts +154 -0
- package/src/commands/agent/index.ts +6 -0
- package/src/commands/agent.ts +215 -0
- package/src/commands/daemon.ts +198 -0
- package/src/commands/doctor.ts +134 -0
- package/src/commands/setup/embed.ts +228 -0
- package/src/commands/setup/global-system-prompt.ts +223 -0
- package/src/commands/setup/image.ts +179 -0
- package/src/commands/setup/index.ts +16 -0
- package/src/commands/setup/interactive.ts +95 -0
- package/src/commands/setup/llm.ts +38 -0
- package/src/commands/setup/onboarding.ts +294 -0
- package/src/commands/setup/providers.ts +27 -0
- package/src/constants.ts +34 -0
- package/src/conversations/ConversationDiskReader.ts +148 -0
- package/src/conversations/ConversationRegistry.ts +728 -0
- package/src/conversations/ConversationStore.ts +868 -0
- package/src/conversations/MessageBuilder.ts +866 -0
- package/src/conversations/executionTime.ts +62 -0
- package/src/conversations/formatters/DelegationXmlFormatter.ts +64 -0
- package/src/conversations/formatters/ThreadedConversationFormatter.ts +303 -0
- package/src/conversations/formatters/index.ts +9 -0
- package/src/conversations/formatters/utils/MessageFormatter.ts +46 -0
- package/src/conversations/formatters/utils/TimestampFormatter.ts +56 -0
- package/src/conversations/formatters/utils/TreeBuilder.ts +131 -0
- package/src/conversations/formatters/utils/TreeRenderer.ts +49 -0
- package/src/conversations/index.ts +2 -0
- package/src/conversations/persistence/ToolMessageStorage.ts +143 -0
- package/src/conversations/search/ConversationIndexManager.ts +393 -0
- package/src/conversations/search/QueryParser.ts +114 -0
- package/src/conversations/search/SearchEngine.ts +175 -0
- package/src/conversations/search/SnippetExtractor.ts +345 -0
- package/src/conversations/search/embeddings/ConversationEmbeddingService.ts +484 -0
- package/src/conversations/search/embeddings/ConversationIndexingJob.ts +320 -0
- package/src/conversations/search/embeddings/IndexingStateManager.ts +338 -0
- package/src/conversations/search/embeddings/index.ts +18 -0
- package/src/conversations/search/index.ts +49 -0
- package/src/conversations/search/types.ts +124 -0
- package/src/conversations/services/CategoryManager.ts +160 -0
- package/src/conversations/services/ConversationResolver.ts +296 -0
- package/src/conversations/services/ConversationSummarizer.ts +234 -0
- package/src/conversations/services/MetadataDebounceManager.ts +188 -0
- package/src/conversations/services/index.ts +2 -0
- package/src/conversations/types.ts +148 -0
- package/src/conversations/utils/content-utils.ts +69 -0
- package/src/conversations/utils/image-placeholder.ts +281 -0
- package/src/conversations/utils/image-url-utils.ts +171 -0
- package/src/conversations/utils/multimodal-content.ts +90 -0
- package/src/conversations/utils/tool-result-truncator.ts +159 -0
- package/src/daemon/Daemon.ts +1883 -0
- package/src/daemon/ProjectRuntime.ts +657 -0
- package/src/daemon/RestartState.ts +152 -0
- package/src/daemon/RuntimeLifecycle.ts +268 -0
- package/src/daemon/SubscriptionManager.ts +305 -0
- package/src/daemon/UnixSocketTransport.ts +318 -0
- package/src/daemon/filters/SubscriptionFilterBuilder.ts +119 -0
- package/src/daemon/index.ts +9 -0
- package/src/daemon/routing/DaemonRouter.ts +491 -0
- package/src/daemon/types.ts +150 -0
- package/src/daemon/utils/routing-log.ts +76 -0
- package/src/daemon/utils/telemetry.ts +173 -0
- package/src/event-handler/agentDeletion.ts +383 -0
- package/src/event-handler/index.ts +749 -0
- package/src/event-handler/newConversation.ts +165 -0
- package/src/event-handler/project.ts +166 -0
- package/src/event-handler/reply.ts +18 -0
- package/src/events/NDKAgentDefinition.ts +292 -0
- package/src/events/NDKAgentLesson.ts +106 -0
- package/src/events/NDKEventMetadata.ts +34 -0
- package/src/events/NDKMCPTool.ts +60 -0
- package/src/events/NDKProjectStatus.ts +384 -0
- package/src/events/index.ts +4 -0
- package/src/index.ts +126 -0
- package/src/lib/agent-home.ts +334 -0
- package/src/lib/error-formatter.ts +200 -0
- package/src/lib/fs/filesystem.ts +128 -0
- package/src/lib/fs/index.ts +1 -0
- package/src/lib/json-parser.ts +30 -0
- package/src/lib/string.ts +15 -0
- package/src/lib/time.ts +74 -0
- package/src/llm/ChunkHandler.ts +277 -0
- package/src/llm/FinishHandler.ts +250 -0
- package/src/llm/LLMConfigEditor.ts +154 -0
- package/src/llm/LLMServiceFactory.ts +230 -0
- package/src/llm/MessageProcessor.ts +90 -0
- package/src/llm/RecordingState.ts +37 -0
- package/src/llm/StreamPublisher.ts +40 -0
- package/src/llm/TracingUtils.ts +77 -0
- package/src/llm/chunk-validators.ts +57 -0
- package/src/llm/constants.ts +6 -0
- package/src/llm/index.ts +12 -0
- package/src/llm/meta/MetaModelResolver.ts +352 -0
- package/src/llm/meta/index.ts +11 -0
- package/src/llm/middleware/flight-recorder.ts +188 -0
- package/src/llm/providers/MockProvider.ts +332 -0
- package/src/llm/providers/agent/ClaudeCodeProvider.ts +343 -0
- package/src/llm/providers/agent/ClaudeCodeToolsAdapter.ts +203 -0
- package/src/llm/providers/agent/CodexAppServerProvider.ts +214 -0
- package/src/llm/providers/agent/CodexAppServerToolsAdapter.ts +91 -0
- package/src/llm/providers/agent/index.ts +10 -0
- package/src/llm/providers/base/AgentProvider.ts +107 -0
- package/src/llm/providers/base/BaseProvider.ts +114 -0
- package/src/llm/providers/base/StandardProvider.ts +38 -0
- package/src/llm/providers/base/index.ts +9 -0
- package/src/llm/providers/index.ts +106 -0
- package/src/llm/providers/key-manager.ts +238 -0
- package/src/llm/providers/ollama-models.ts +105 -0
- package/src/llm/providers/openrouter-models.ts +102 -0
- package/src/llm/providers/provider-ids.ts +18 -0
- package/src/llm/providers/registry/ProviderRegistry.ts +414 -0
- package/src/llm/providers/registry/index.ts +7 -0
- package/src/llm/providers/standard/AnthropicProvider.ts +71 -0
- package/src/llm/providers/standard/OllamaProvider.ts +59 -0
- package/src/llm/providers/standard/OpenAIProvider.ts +44 -0
- package/src/llm/providers/standard/OpenRouterProvider.ts +103 -0
- package/src/llm/providers/standard/index.ts +10 -0
- package/src/llm/providers/types.ts +194 -0
- package/src/llm/providers/usage-metadata.ts +78 -0
- package/src/llm/service.ts +713 -0
- package/src/llm/types.ts +167 -0
- package/src/llm/utils/ConfigurationManager.ts +650 -0
- package/src/llm/utils/ConfigurationTester.ts +229 -0
- package/src/llm/utils/ModelSelector.ts +212 -0
- package/src/llm/utils/ProviderConfigUI.ts +177 -0
- package/src/llm/utils/claudeCodePromptCompiler.ts +141 -0
- package/src/llm/utils/codex-models.ts +53 -0
- package/src/llm/utils/context-window-cache.ts +30 -0
- package/src/llm/utils/models-dev-cache.ts +267 -0
- package/src/llm/utils/provider-setup.ts +50 -0
- package/src/llm/utils/tool-errors.ts +78 -0
- package/src/llm/utils/usage.ts +74 -0
- package/src/logging/EventRoutingLogger.ts +205 -0
- package/src/nostr/AgentEventDecoder.ts +357 -0
- package/src/nostr/AgentEventEncoder.ts +677 -0
- package/src/nostr/AgentProfilePublisher.ts +657 -0
- package/src/nostr/AgentPublisher.ts +437 -0
- package/src/nostr/BlossomService.ts +226 -0
- package/src/nostr/InterventionPublisher.ts +132 -0
- package/src/nostr/TagExtractor.ts +228 -0
- package/src/nostr/collectEvents.ts +83 -0
- package/src/nostr/constants.ts +38 -0
- package/src/nostr/encryption.ts +26 -0
- package/src/nostr/index.ts +31 -0
- package/src/nostr/keys.ts +17 -0
- package/src/nostr/kinds.ts +37 -0
- package/src/nostr/ndkClient.ts +72 -0
- package/src/nostr/relays.ts +43 -0
- package/src/nostr/trace-context.ts +39 -0
- package/src/nostr/types.ts +227 -0
- package/src/nostr/utils.ts +84 -0
- package/src/prompts/core/FragmentRegistry.ts +30 -0
- package/src/prompts/core/PromptBuilder.ts +98 -0
- package/src/prompts/core/index.ts +3 -0
- package/src/prompts/core/types.ts +13 -0
- package/src/prompts/fragments/00-global-system-prompt.ts +44 -0
- package/src/prompts/fragments/01-agent-identity.ts +69 -0
- package/src/prompts/fragments/02-agent-home-directory.ts +114 -0
- package/src/prompts/fragments/03-system-reminders-explanation.ts +14 -0
- package/src/prompts/fragments/04-relay-configuration.ts +38 -0
- package/src/prompts/fragments/05-delegation-chain.ts +45 -0
- package/src/prompts/fragments/06-agent-todos.ts +74 -0
- package/src/prompts/fragments/06-todo-usage-guidance.ts +34 -0
- package/src/prompts/fragments/07-meta-project-context.ts +234 -0
- package/src/prompts/fragments/08-active-conversations.ts +382 -0
- package/src/prompts/fragments/09-recent-conversations.ts +153 -0
- package/src/prompts/fragments/10-referenced-article.ts +21 -0
- package/src/prompts/fragments/11-nudges.ts +134 -0
- package/src/prompts/fragments/12-skills.ts +127 -0
- package/src/prompts/fragments/13-available-nudges.ts +122 -0
- package/src/prompts/fragments/15-available-agents.ts +53 -0
- package/src/prompts/fragments/16-stay-in-your-lane.ts +41 -0
- package/src/prompts/fragments/17-todo-before-delegation.ts +39 -0
- package/src/prompts/fragments/20-voice-mode.ts +62 -0
- package/src/prompts/fragments/22-scheduled-tasks.ts +175 -0
- package/src/prompts/fragments/24-retrieved-lessons.ts +26 -0
- package/src/prompts/fragments/25-rag-instructions.ts +333 -0
- package/src/prompts/fragments/26-mcp-resources.ts +237 -0
- package/src/prompts/fragments/27-memorized-reports.ts +77 -0
- package/src/prompts/fragments/28-agent-directed-monitoring.ts +32 -0
- package/src/prompts/fragments/29-rag-collections.ts +50 -0
- package/src/prompts/fragments/30-worktree-context.ts +98 -0
- package/src/prompts/fragments/31-agents-md-guidance.ts +96 -0
- package/src/prompts/fragments/32-process-metrics.ts +72 -0
- package/src/prompts/fragments/debug-mode.ts +48 -0
- package/src/prompts/fragments/delegation-completion.ts +44 -0
- package/src/prompts/fragments/index.ts +91 -0
- package/src/prompts/index.ts +21 -0
- package/src/prompts/utils/systemPromptBuilder.ts +777 -0
- package/src/scripts/migrate-prefix-index.ts +157 -0
- package/src/services/AgentDefinitionMonitor.ts +701 -0
- package/src/services/ConfigService.ts +723 -0
- package/src/services/CooldownRegistry.ts +199 -0
- package/src/services/LLMOperationsRegistry.ts +424 -0
- package/src/services/OwnerAgentListService.ts +354 -0
- package/src/services/PubkeyService.ts +308 -0
- package/src/services/agents/AgentMetadataStore.ts +72 -0
- package/src/services/agents/AgentResolution.ts +59 -0
- package/src/services/agents/EscalationService.ts +281 -0
- package/src/services/agents/NDKAgentDiscovery.ts +95 -0
- package/src/services/agents/index.ts +7 -0
- package/src/services/agents-md/AgentsMdService.ts +184 -0
- package/src/services/agents-md/SystemReminderInjector.ts +238 -0
- package/src/services/agents-md/index.ts +11 -0
- package/src/services/apns/APNsClient.ts +203 -0
- package/src/services/apns/APNsService.ts +358 -0
- package/src/services/apns/index.ts +11 -0
- package/src/services/apns/types.ts +80 -0
- package/src/services/compression/CompressionService.ts +445 -0
- package/src/services/compression/compression-schema.ts +28 -0
- package/src/services/compression/compression-types.ts +74 -0
- package/src/services/compression/compression-utils.ts +587 -0
- package/src/services/config/types.ts +394 -0
- package/src/services/dispatch/AgentDispatchService.ts +937 -0
- package/src/services/dispatch/AgentRouter.ts +181 -0
- package/src/services/dispatch/DelegationCompletionHandler.ts +232 -0
- package/src/services/embedding/EmbeddingProvider.ts +188 -0
- package/src/services/embedding/index.ts +5 -0
- package/src/services/event-context/EventContextService.ts +108 -0
- package/src/services/event-context/index.ts +2 -0
- package/src/services/heuristics/ContextBuilder.ts +106 -0
- package/src/services/heuristics/HeuristicEngine.ts +200 -0
- package/src/services/heuristics/formatters.ts +58 -0
- package/src/services/heuristics/index.ts +12 -0
- package/src/services/heuristics/rules/index.ts +25 -0
- package/src/services/heuristics/rules/todoBeforeDelegation.ts +69 -0
- package/src/services/heuristics/rules/todoReminderOnToolUse.ts +63 -0
- package/src/services/heuristics/types.ts +144 -0
- package/src/services/image/ImageGenerationService.ts +389 -0
- package/src/services/image/index.ts +12 -0
- package/src/services/intervention/InterventionService.ts +1352 -0
- package/src/services/intervention/index.ts +7 -0
- package/src/services/mcp/MCPManager.ts +683 -0
- package/src/services/mcp/McpNotificationDelivery.ts +139 -0
- package/src/services/mcp/McpSubscriptionService.ts +653 -0
- package/src/services/mcp/mcpInstaller.ts +130 -0
- package/src/services/nip46/Nip46SigningLog.ts +81 -0
- package/src/services/nip46/Nip46SigningService.ts +467 -0
- package/src/services/nip46/index.ts +4 -0
- package/src/services/nudge/NudgeService.ts +224 -0
- package/src/services/nudge/NudgeWhitelistService.ts +382 -0
- package/src/services/nudge/index.ts +5 -0
- package/src/services/nudge/types.ts +83 -0
- package/src/services/projects/ProjectContext.ts +672 -0
- package/src/services/projects/ProjectContextStore.ts +102 -0
- package/src/services/projects/index.ts +6 -0
- package/src/services/prompt-compiler/index.ts +15 -0
- package/src/services/prompt-compiler/prompt-compiler-service.ts +1143 -0
- package/src/services/pubkey-gate/PubkeyGateService.ts +93 -0
- package/src/services/pubkey-gate/index.ts +1 -0
- package/src/services/rag/EmbeddingProviderFactory.ts +292 -0
- package/src/services/rag/LanceDBMaintenanceService.ts +211 -0
- package/src/services/rag/RAGDatabaseService.ts +173 -0
- package/src/services/rag/RAGOperations.ts +682 -0
- package/src/services/rag/RAGService.ts +240 -0
- package/src/services/rag/RagSubscriptionService.ts +618 -0
- package/src/services/rag/rag-utils.ts +174 -0
- package/src/services/ral/PendingDelegationsRegistry.ts +168 -0
- package/src/services/ral/RALRegistry.ts +2782 -0
- package/src/services/ral/index.ts +4 -0
- package/src/services/ral/types.ts +292 -0
- package/src/services/reports/LocalReportStore.ts +380 -0
- package/src/services/reports/ReportEmbeddingService.ts +430 -0
- package/src/services/reports/ReportService.ts +440 -0
- package/src/services/reports/articleUtils.ts +52 -0
- package/src/services/reports/index.ts +7 -0
- package/src/services/scheduling/SchedulerService.ts +1057 -0
- package/src/services/scheduling/errors.ts +14 -0
- package/src/services/scheduling/index.ts +7 -0
- package/src/services/scheduling/utils.ts +77 -0
- package/src/services/search/SearchProviderRegistry.ts +78 -0
- package/src/services/search/UnifiedSearchService.ts +218 -0
- package/src/services/search/index.ts +47 -0
- package/src/services/search/projectFilter.ts +22 -0
- package/src/services/search/providers/ConversationSearchProvider.ts +48 -0
- package/src/services/search/providers/LessonSearchProvider.ts +75 -0
- package/src/services/search/providers/ReportSearchProvider.ts +49 -0
- package/src/services/search/types.ts +144 -0
- package/src/services/skill/SkillService.ts +482 -0
- package/src/services/skill/index.ts +2 -0
- package/src/services/skill/types.ts +70 -0
- package/src/services/status/OperationsStatusService.ts +276 -0
- package/src/services/status/ProjectStatusService.ts +522 -0
- package/src/services/status/index.ts +11 -0
- package/src/services/storage/PrefixKVStore.ts +242 -0
- package/src/services/storage/index.ts +1 -0
- package/src/services/system-reminder/SystemReminderUtils.ts +96 -0
- package/src/services/system-reminder/index.ts +7 -0
- package/src/services/trust-pubkeys/TrustPubkeyService.ts +325 -0
- package/src/services/trust-pubkeys/index.ts +2 -0
- package/src/telemetry/ConversationSpanManager.ts +111 -0
- package/src/telemetry/EventLoopMonitor.ts +206 -0
- package/src/telemetry/LLMSpanRegistry.ts +20 -0
- package/src/telemetry/NostrSpanProcessor.ts +89 -0
- package/src/telemetry/ToolCallSpanProcessor.ts +66 -0
- package/src/telemetry/diagnostics.ts +27 -0
- package/src/telemetry/setup.ts +120 -0
- package/src/tools/implementations/agents_discover.ts +121 -0
- package/src/tools/implementations/agents_hire.ts +127 -0
- package/src/tools/implementations/agents_list.ts +96 -0
- package/src/tools/implementations/agents_publish.ts +611 -0
- package/src/tools/implementations/agents_read.ts +173 -0
- package/src/tools/implementations/agents_write.ts +200 -0
- package/src/tools/implementations/ask.ts +411 -0
- package/src/tools/implementations/change_model.ts +141 -0
- package/src/tools/implementations/conversation_get.ts +661 -0
- package/src/tools/implementations/conversation_list.ts +377 -0
- package/src/tools/implementations/conversation_search.ts +370 -0
- package/src/tools/implementations/delegate.ts +327 -0
- package/src/tools/implementations/delegate_crossproject.ts +209 -0
- package/src/tools/implementations/delegate_followup.ts +300 -0
- package/src/tools/implementations/fs_edit.ts +162 -0
- package/src/tools/implementations/fs_glob.ts +182 -0
- package/src/tools/implementations/fs_grep.ts +513 -0
- package/src/tools/implementations/fs_read.ts +332 -0
- package/src/tools/implementations/fs_write.ts +113 -0
- package/src/tools/implementations/generate_image.ts +259 -0
- package/src/tools/implementations/home_fs.ts +515 -0
- package/src/tools/implementations/kill.ts +651 -0
- package/src/tools/implementations/learn.ts +166 -0
- package/src/tools/implementations/lesson-formatter.ts +38 -0
- package/src/tools/implementations/lesson_delete.ts +164 -0
- package/src/tools/implementations/lesson_get.ts +105 -0
- package/src/tools/implementations/lessons_list.ts +153 -0
- package/src/tools/implementations/mcp_resource_read.ts +161 -0
- package/src/tools/implementations/mcp_subscribe.ts +158 -0
- package/src/tools/implementations/mcp_subscription_stop.ts +85 -0
- package/src/tools/implementations/nostr_fetch.ts +149 -0
- package/src/tools/implementations/nostr_publish_as_user.ts +353 -0
- package/src/tools/implementations/project_list.ts +146 -0
- package/src/tools/implementations/rag_add_documents.ts +573 -0
- package/src/tools/implementations/rag_create_collection.ts +65 -0
- package/src/tools/implementations/rag_delete_collection.ts +68 -0
- package/src/tools/implementations/rag_list_collections.ts +77 -0
- package/src/tools/implementations/rag_query.ts +107 -0
- package/src/tools/implementations/rag_subscription_create.ts +105 -0
- package/src/tools/implementations/rag_subscription_delete.ts +80 -0
- package/src/tools/implementations/rag_subscription_get.ts +123 -0
- package/src/tools/implementations/rag_subscription_list.ts +128 -0
- package/src/tools/implementations/report_delete.ts +79 -0
- package/src/tools/implementations/report_read.ts +160 -0
- package/src/tools/implementations/report_write.ts +278 -0
- package/src/tools/implementations/reports_list.ts +77 -0
- package/src/tools/implementations/schedule_task.ts +104 -0
- package/src/tools/implementations/schedule_task_cancel.ts +62 -0
- package/src/tools/implementations/schedule_task_once.ts +128 -0
- package/src/tools/implementations/schedule_tasks_list.ts +79 -0
- package/src/tools/implementations/search.ts +160 -0
- package/src/tools/implementations/shell.ts +553 -0
- package/src/tools/implementations/todo.ts +260 -0
- package/src/tools/implementations/upload_blob.ts +381 -0
- package/src/tools/implementations/web_fetch.ts +153 -0
- package/src/tools/implementations/web_search.ts +250 -0
- package/src/tools/registry.ts +670 -0
- package/src/tools/types.ts +177 -0
- package/src/tools/utils.ts +256 -0
- package/src/types/event-ids.ts +320 -0
- package/src/types/index.ts +46 -0
- package/src/utils/agentFetcher.ts +107 -0
- package/src/utils/cli-error.ts +29 -0
- package/src/utils/conversation-id.ts +27 -0
- package/src/utils/conversation-utils.ts +1 -0
- package/src/utils/delegation-chain.ts +357 -0
- package/src/utils/error-handler.ts +42 -0
- package/src/utils/git/gitignore.ts +69 -0
- package/src/utils/git/index.ts +2 -0
- package/src/utils/git/initializeGitRepo.ts +204 -0
- package/src/utils/git/worktree.ts +260 -0
- package/src/utils/lessonFormatter.ts +70 -0
- package/src/utils/lessonTrust.ts +24 -0
- package/src/utils/lockfile.ts +123 -0
- package/src/utils/logger.ts +149 -0
- package/src/utils/nostr-entity-parser.ts +365 -0
- package/src/utils/process.ts +49 -0
- package/src/wrapper.ts +262 -0
- package/tsconfig.json +41 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolExecutionTracker - Manages tool execution lifecycle during LLM streaming.
|
|
3
|
+
*
|
|
4
|
+
* Tracks executions from start to completion, coordinating between async events and
|
|
5
|
+
* ensuring proper correlation between Nostr events, tool results, and persistence.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - Event Correlation: Matches tool results with their initial execution events
|
|
9
|
+
* - Nostr Publishing: Publishes tool execution announcements
|
|
10
|
+
* - Persistence: Stores tool messages for conversation history
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { isDelegateToolName, unwrapMcpToolName } from "@/agents/tool-names";
|
|
14
|
+
import { toolMessageStorage } from "@/conversations/persistence/ToolMessageStorage";
|
|
15
|
+
import type { EventContext } from "@/nostr/types";
|
|
16
|
+
import type { AgentPublisher } from "@/nostr/AgentPublisher";
|
|
17
|
+
import { PendingDelegationsRegistry } from "@/services/ral";
|
|
18
|
+
import type { AISdkTool } from "@/tools/types";
|
|
19
|
+
import { logger } from "@/utils/logger";
|
|
20
|
+
import type { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
21
|
+
import { trace } from "@opentelemetry/api";
|
|
22
|
+
import { extractErrorDetails, getHumanReadableContent } from "./ToolResultUtils";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Tools that publish addressable events and need delayed tool use event publishing.
|
|
26
|
+
* These tools return results containing addressable event references that should be
|
|
27
|
+
* tagged with 'a' tags on the tool use event.
|
|
28
|
+
*/
|
|
29
|
+
const ADDRESSABLE_EVENT_TOOLS = ["report_write"];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Check if a tool publishes addressable events that need delayed publishing.
|
|
33
|
+
* This includes both direct tool names and MCP-wrapped versions.
|
|
34
|
+
*/
|
|
35
|
+
function isAddressableEventTool(toolName: string): boolean {
|
|
36
|
+
const baseToolName = unwrapMcpToolName(toolName);
|
|
37
|
+
return ADDRESSABLE_EVENT_TOOLS.includes(baseToolName);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function needsDelayedPublishing(toolName: string): boolean {
|
|
41
|
+
return isDelegateToolName(toolName) || isAddressableEventTool(toolName);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Represents a tracked tool execution
|
|
46
|
+
*/
|
|
47
|
+
interface TrackedExecution {
|
|
48
|
+
/** Unique identifier for this tool call */
|
|
49
|
+
toolCallId: string;
|
|
50
|
+
/** Name of the tool being executed */
|
|
51
|
+
toolName: string;
|
|
52
|
+
/** Nostr event ID published when tool started (empty string for delegation tools with delayed publishing) */
|
|
53
|
+
toolEventId: string;
|
|
54
|
+
/** Input arguments passed to the tool */
|
|
55
|
+
input: unknown;
|
|
56
|
+
/** Output from the tool (available after completion) */
|
|
57
|
+
output?: unknown;
|
|
58
|
+
/** Whether the tool execution resulted in an error */
|
|
59
|
+
error?: boolean;
|
|
60
|
+
/** Whether the tool has completed execution */
|
|
61
|
+
completed: boolean;
|
|
62
|
+
/** Human-readable content for the tool event (stored for delayed publishing) */
|
|
63
|
+
humanContent?: string;
|
|
64
|
+
/** Event context for publishing (stored for delayed publishing) */
|
|
65
|
+
eventContext?: EventContext;
|
|
66
|
+
/** Agent publisher instance (stored for delayed publishing) */
|
|
67
|
+
agentPublisher?: AgentPublisher;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Options for tracking a new tool execution
|
|
72
|
+
*/
|
|
73
|
+
export interface TrackExecutionOptions {
|
|
74
|
+
/** Unique identifier for this tool call */
|
|
75
|
+
toolCallId: string;
|
|
76
|
+
/** Name of the tool being executed */
|
|
77
|
+
toolName: string;
|
|
78
|
+
/** Arguments passed to the tool */
|
|
79
|
+
args: unknown;
|
|
80
|
+
/** Available tools for human-readable content generation */
|
|
81
|
+
toolsObject: Record<string, AISdkTool>;
|
|
82
|
+
/** Publisher for Nostr events */
|
|
83
|
+
agentPublisher: AgentPublisher;
|
|
84
|
+
/** Context for event publishing */
|
|
85
|
+
eventContext: EventContext;
|
|
86
|
+
/** Cumulative usage from previous steps (if available) */
|
|
87
|
+
usage?: import("@/llm/types").LanguageModelUsageWithCostUsd;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Options for completing a tool execution
|
|
92
|
+
*/
|
|
93
|
+
export interface CompleteExecutionOptions {
|
|
94
|
+
/** Unique identifier for the tool call to complete */
|
|
95
|
+
toolCallId: string;
|
|
96
|
+
/** Result from the tool execution */
|
|
97
|
+
result: unknown;
|
|
98
|
+
/** Whether the execution resulted in an error */
|
|
99
|
+
error: boolean;
|
|
100
|
+
/** Public key of the agent that executed the tool */
|
|
101
|
+
agentPubkey: string;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Manages the lifecycle and state of tool executions during LLM streaming
|
|
106
|
+
*/
|
|
107
|
+
export class ToolExecutionTracker {
|
|
108
|
+
/**
|
|
109
|
+
* Internal storage for tracked executions
|
|
110
|
+
* Key: toolCallId, Value: execution state and metadata
|
|
111
|
+
*/
|
|
112
|
+
private executions = new Map<string, TrackedExecution>();
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Track a new tool execution when it starts
|
|
116
|
+
*
|
|
117
|
+
* This method is called when the LLM decides to execute a tool. It:
|
|
118
|
+
* 1. Generates human-readable content for the tool execution
|
|
119
|
+
* 2. Publishes a Nostr event announcing the tool execution (unless delegation tool)
|
|
120
|
+
* 3. Stores the execution state for later correlation with results
|
|
121
|
+
*
|
|
122
|
+
* For delegation tools (delegate, delegate_followup, ask, delegate_crossproject),
|
|
123
|
+
* publishing is delayed until completeExecution so the delegation event IDs can be included.
|
|
124
|
+
*
|
|
125
|
+
* @param options - Configuration for tracking the execution
|
|
126
|
+
* @returns Promise that resolves with the published Nostr event, or null for delegation tools
|
|
127
|
+
*
|
|
128
|
+
* @throws Will throw if Nostr event publishing fails
|
|
129
|
+
*/
|
|
130
|
+
async trackExecution(options: TrackExecutionOptions): Promise<NDKEvent | null> {
|
|
131
|
+
const { toolCallId, toolName, args, toolsObject, agentPublisher, eventContext, usage } = options;
|
|
132
|
+
|
|
133
|
+
logger.debug("[ToolExecutionTracker] Tracking new tool execution", {
|
|
134
|
+
toolName,
|
|
135
|
+
toolCallId,
|
|
136
|
+
currentTrackedCount: this.executions.size,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const activeSpan = trace.getActiveSpan();
|
|
140
|
+
if (activeSpan) {
|
|
141
|
+
// Truncate args for telemetry to prevent huge span attributes
|
|
142
|
+
const argsPreview =
|
|
143
|
+
typeof args === "object" && args !== null
|
|
144
|
+
? JSON.stringify(args).substring(0, 200)
|
|
145
|
+
: String(args).substring(0, 200);
|
|
146
|
+
|
|
147
|
+
activeSpan.addEvent("tool.execution_start", {
|
|
148
|
+
"tool.name": toolName,
|
|
149
|
+
"tool.call_id": toolCallId,
|
|
150
|
+
"tool.args_preview": argsPreview,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Generate human-readable content for the tool execution
|
|
155
|
+
const humanContent = getHumanReadableContent(toolName, args, toolsObject);
|
|
156
|
+
|
|
157
|
+
// Store the execution state BEFORE async operations to prevent race conditions
|
|
158
|
+
const execution: TrackedExecution = {
|
|
159
|
+
toolCallId,
|
|
160
|
+
toolName,
|
|
161
|
+
toolEventId: "", // Will be updated after publish (empty for delayed delegation tools)
|
|
162
|
+
input: args,
|
|
163
|
+
completed: false,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
this.executions.set(toolCallId, execution);
|
|
167
|
+
|
|
168
|
+
// For tools that need delayed publishing (delegation tools, addressable event tools),
|
|
169
|
+
// delay publishing until completion so we have the event IDs/references
|
|
170
|
+
if (needsDelayedPublishing(toolName)) {
|
|
171
|
+
// Store context for delayed publishing in completeExecution
|
|
172
|
+
execution.humanContent = humanContent;
|
|
173
|
+
execution.eventContext = eventContext;
|
|
174
|
+
execution.agentPublisher = agentPublisher;
|
|
175
|
+
|
|
176
|
+
const toolType = isDelegateToolName(toolName) ? "delegation" : "addressable event";
|
|
177
|
+
logger.debug(`[ToolExecutionTracker] ${toolType} tool tracked (delayed publishing)`, {
|
|
178
|
+
toolCallId,
|
|
179
|
+
toolName,
|
|
180
|
+
totalTracked: this.executions.size,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Publish the tool execution event to Nostr (async operation)
|
|
187
|
+
const toolEvent = await agentPublisher.toolUse(
|
|
188
|
+
{
|
|
189
|
+
toolName,
|
|
190
|
+
content: humanContent,
|
|
191
|
+
args,
|
|
192
|
+
usage,
|
|
193
|
+
},
|
|
194
|
+
eventContext
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// Update the execution with the actual event ID
|
|
198
|
+
execution.toolEventId = toolEvent.id;
|
|
199
|
+
|
|
200
|
+
logger.debug("[ToolExecutionTracker] Tool execution tracked", {
|
|
201
|
+
toolCallId,
|
|
202
|
+
toolName,
|
|
203
|
+
toolEventId: toolEvent.id,
|
|
204
|
+
totalTracked: this.executions.size,
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
return toolEvent;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Complete a tracked tool execution with its result
|
|
212
|
+
*
|
|
213
|
+
* This method is called when a tool finishes executing. It:
|
|
214
|
+
* 1. Retrieves the original execution metadata
|
|
215
|
+
* 2. Updates the execution state with results
|
|
216
|
+
* 3. Persists the complete tool message to filesystem
|
|
217
|
+
*
|
|
218
|
+
* @param options - Configuration for completing the execution
|
|
219
|
+
* @returns Promise that resolves with the tool event ID (for linking to ConversationStore messages)
|
|
220
|
+
*
|
|
221
|
+
* @remarks
|
|
222
|
+
* If the toolCallId is not found (e.g., due to a race condition or error),
|
|
223
|
+
* this method logs a warning but does not throw an error
|
|
224
|
+
*/
|
|
225
|
+
async completeExecution(options: CompleteExecutionOptions): Promise<string | undefined> {
|
|
226
|
+
const { toolCallId, result, error, agentPubkey } = options;
|
|
227
|
+
|
|
228
|
+
logger.debug("[ToolExecutionTracker] Completing tool execution", {
|
|
229
|
+
toolCallId,
|
|
230
|
+
error,
|
|
231
|
+
hasResult: result !== undefined,
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// Retrieve the tracked execution
|
|
235
|
+
const execution = this.executions.get(toolCallId);
|
|
236
|
+
|
|
237
|
+
if (!execution) {
|
|
238
|
+
logger.warn("[ToolExecutionTracker] Attempted to complete unknown tool execution", {
|
|
239
|
+
toolCallId,
|
|
240
|
+
availableExecutions: Array.from(this.executions.keys()),
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const activeSpan = trace.getActiveSpan();
|
|
244
|
+
if (activeSpan) {
|
|
245
|
+
activeSpan.addEvent("tool.execution_unknown", {
|
|
246
|
+
"tool.call_id": toolCallId,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Log errors explicitly for visibility
|
|
254
|
+
if (error) {
|
|
255
|
+
// Extract error details for better logging
|
|
256
|
+
const errorDetails = extractErrorDetails(result);
|
|
257
|
+
|
|
258
|
+
logger.error("[ToolExecutionTracker] Tool execution failed", {
|
|
259
|
+
toolName: execution.toolName,
|
|
260
|
+
toolCallId,
|
|
261
|
+
toolEventId: execution.toolEventId,
|
|
262
|
+
errorType: errorDetails?.type || "unknown",
|
|
263
|
+
errorMessage: errorDetails?.message || "No details available",
|
|
264
|
+
result,
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// IMPORTANT: Log error event in telemetry for trace analysis
|
|
268
|
+
const activeSpan = trace.getActiveSpan();
|
|
269
|
+
activeSpan?.addEvent("tool.execution_error", {
|
|
270
|
+
"tool.name": execution.toolName,
|
|
271
|
+
"tool.call_id": toolCallId,
|
|
272
|
+
"tool.error": true,
|
|
273
|
+
"tool.error_type": errorDetails?.type || "unknown",
|
|
274
|
+
"tool.error_message": (errorDetails?.message || "").substring(0, 200),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Update execution state
|
|
279
|
+
execution.output = result;
|
|
280
|
+
execution.error = error;
|
|
281
|
+
execution.completed = true;
|
|
282
|
+
|
|
283
|
+
// For tools with delayed publishing, publish the tool use event now with references
|
|
284
|
+
if (execution.toolEventId === "" && execution.agentPublisher && execution.eventContext) {
|
|
285
|
+
let referencedEventIds: string[] = [];
|
|
286
|
+
let referencedAddressableEvents: string[] = [];
|
|
287
|
+
|
|
288
|
+
const conversationId = execution.eventContext?.conversationId;
|
|
289
|
+
if (conversationId) {
|
|
290
|
+
if (isDelegateToolName(execution.toolName)) {
|
|
291
|
+
// Consume delegation event IDs from registry (registered in AgentPublisher.ask/delegate)
|
|
292
|
+
referencedEventIds = PendingDelegationsRegistry.consume(agentPubkey, conversationId);
|
|
293
|
+
} else if (isAddressableEventTool(execution.toolName)) {
|
|
294
|
+
// Consume addressable event references from registry (registered in report_write tool)
|
|
295
|
+
referencedAddressableEvents = PendingDelegationsRegistry.consumeAddressable(agentPubkey, conversationId);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Publish the delayed tool use event with references
|
|
300
|
+
const toolEvent = await execution.agentPublisher.toolUse(
|
|
301
|
+
{
|
|
302
|
+
toolName: execution.toolName,
|
|
303
|
+
content: execution.humanContent || `Executed ${execution.toolName}`,
|
|
304
|
+
args: execution.input,
|
|
305
|
+
referencedEventIds,
|
|
306
|
+
referencedAddressableEvents,
|
|
307
|
+
},
|
|
308
|
+
execution.eventContext
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
execution.toolEventId = toolEvent.id;
|
|
312
|
+
|
|
313
|
+
const logDetails: Record<string, unknown> = {
|
|
314
|
+
toolCallId,
|
|
315
|
+
toolName: execution.toolName,
|
|
316
|
+
toolEventId: toolEvent.id,
|
|
317
|
+
};
|
|
318
|
+
if (referencedEventIds.length > 0) {
|
|
319
|
+
logDetails.referencedEventIds = referencedEventIds;
|
|
320
|
+
}
|
|
321
|
+
if (referencedAddressableEvents.length > 0) {
|
|
322
|
+
logDetails.referencedAddressableEvents = referencedAddressableEvents;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
logger.debug("[ToolExecutionTracker] Tool event published with references", logDetails);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Add telemetry for tool completion
|
|
329
|
+
const activeSpan = trace.getActiveSpan();
|
|
330
|
+
if (activeSpan) {
|
|
331
|
+
// Truncate result for telemetry
|
|
332
|
+
const resultPreview =
|
|
333
|
+
typeof result === "object" && result !== null
|
|
334
|
+
? JSON.stringify(result).substring(0, 200)
|
|
335
|
+
: String(result).substring(0, 200);
|
|
336
|
+
|
|
337
|
+
activeSpan.addEvent("tool.execution_complete", {
|
|
338
|
+
"tool.name": execution.toolName,
|
|
339
|
+
"tool.call_id": toolCallId,
|
|
340
|
+
"tool.error": error,
|
|
341
|
+
"tool.result_preview": resultPreview,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Persist the complete tool message to filesystem
|
|
346
|
+
// This enables conversation reconstruction and audit trails
|
|
347
|
+
await toolMessageStorage.store(
|
|
348
|
+
execution.toolEventId,
|
|
349
|
+
{
|
|
350
|
+
toolCallId,
|
|
351
|
+
toolName: execution.toolName,
|
|
352
|
+
input: execution.input,
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
toolCallId,
|
|
356
|
+
toolName: execution.toolName,
|
|
357
|
+
output: result,
|
|
358
|
+
error,
|
|
359
|
+
},
|
|
360
|
+
agentPubkey
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
logger.debug("[ToolExecutionTracker] Tool execution completed and persisted", {
|
|
364
|
+
toolCallId,
|
|
365
|
+
toolName: execution.toolName,
|
|
366
|
+
toolEventId: execution.toolEventId,
|
|
367
|
+
error,
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// Return the tool event ID so callers can link it to ConversationStore messages
|
|
371
|
+
return execution.toolEventId;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Get the current state of a tracked execution
|
|
376
|
+
*
|
|
377
|
+
* @param toolCallId - Unique identifier of the tool call
|
|
378
|
+
* @returns The tracked execution or undefined if not found
|
|
379
|
+
*/
|
|
380
|
+
getExecution(toolCallId: string): TrackedExecution | undefined {
|
|
381
|
+
return this.executions.get(toolCallId);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Get all tracked executions
|
|
386
|
+
*
|
|
387
|
+
* @returns Map of all tracked executions
|
|
388
|
+
*/
|
|
389
|
+
getAllExecutions(): Map<string, TrackedExecution> {
|
|
390
|
+
return new Map(this.executions);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Check if a tool execution is being tracked
|
|
395
|
+
*
|
|
396
|
+
* @param toolCallId - Unique identifier of the tool call
|
|
397
|
+
* @returns True if the execution is being tracked
|
|
398
|
+
*/
|
|
399
|
+
isTracking(toolCallId: string): boolean {
|
|
400
|
+
return this.executions.has(toolCallId);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Get statistics about tracked executions
|
|
405
|
+
*
|
|
406
|
+
* @returns Object containing execution statistics
|
|
407
|
+
*/
|
|
408
|
+
getStats(): {
|
|
409
|
+
total: number;
|
|
410
|
+
pending: number;
|
|
411
|
+
completed: number;
|
|
412
|
+
failed: number;
|
|
413
|
+
} {
|
|
414
|
+
let pending = 0;
|
|
415
|
+
let completed = 0;
|
|
416
|
+
let failed = 0;
|
|
417
|
+
|
|
418
|
+
for (const execution of this.executions.values()) {
|
|
419
|
+
if (!execution.completed) {
|
|
420
|
+
pending++;
|
|
421
|
+
} else if (execution.error) {
|
|
422
|
+
failed++;
|
|
423
|
+
} else {
|
|
424
|
+
completed++;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
total: this.executions.size,
|
|
430
|
+
pending,
|
|
431
|
+
completed,
|
|
432
|
+
failed,
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Clear all tracked executions
|
|
438
|
+
*
|
|
439
|
+
* @remarks
|
|
440
|
+
* This should typically only be called between independent agent executions
|
|
441
|
+
* to prevent memory leaks from accumulating execution records
|
|
442
|
+
*/
|
|
443
|
+
clear(): void {
|
|
444
|
+
const previousSize = this.executions.size;
|
|
445
|
+
this.executions.clear();
|
|
446
|
+
|
|
447
|
+
logger.debug("[ToolExecutionTracker] Cleared all tracked executions", {
|
|
448
|
+
previousSize,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Get a summary of pending executions for debugging
|
|
454
|
+
*
|
|
455
|
+
* @returns Array of pending execution summaries
|
|
456
|
+
*/
|
|
457
|
+
getPendingExecutions(): Array<{
|
|
458
|
+
toolCallId: string;
|
|
459
|
+
toolName: string;
|
|
460
|
+
startedAt: string;
|
|
461
|
+
}> {
|
|
462
|
+
const pending: Array<{
|
|
463
|
+
toolCallId: string;
|
|
464
|
+
toolName: string;
|
|
465
|
+
startedAt: string;
|
|
466
|
+
}> = [];
|
|
467
|
+
|
|
468
|
+
for (const [toolCallId, execution] of this.executions) {
|
|
469
|
+
if (!execution.completed) {
|
|
470
|
+
pending.push({
|
|
471
|
+
toolCallId,
|
|
472
|
+
toolName: execution.toolName,
|
|
473
|
+
startedAt: execution.toolEventId.substring(0, 8), // First 8 chars of event ID
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return pending;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Get the names of recently executed tools.
|
|
483
|
+
* Returns the most recent tool names (up to 10) for diagnostics/context.
|
|
484
|
+
*
|
|
485
|
+
* @returns Array of tool names that have been executed
|
|
486
|
+
*/
|
|
487
|
+
getRecentToolNames(): string[] {
|
|
488
|
+
const toolNames: string[] = [];
|
|
489
|
+
|
|
490
|
+
// Get all tool names from tracked executions
|
|
491
|
+
for (const execution of this.executions.values()) {
|
|
492
|
+
toolNames.push(execution.toolName);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Return the most recent 10 (map preserves insertion order)
|
|
496
|
+
return toolNames.slice(-10);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { formatMcpToolName } from "@/agents/tool-names";
|
|
2
|
+
import type { AISdkTool } from "@/tools/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Error details extracted from tool results
|
|
6
|
+
*/
|
|
7
|
+
export interface ExtractedErrorDetails {
|
|
8
|
+
message: string;
|
|
9
|
+
type: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Extract error details from a tool result for better logging and telemetry.
|
|
14
|
+
* Handles various error result formats from AI SDK and shell tool.
|
|
15
|
+
*
|
|
16
|
+
* @param result - The tool result that may contain error information
|
|
17
|
+
* @returns Error details or null if not an error result
|
|
18
|
+
*/
|
|
19
|
+
export function extractErrorDetails(result: unknown): ExtractedErrorDetails | null {
|
|
20
|
+
if (typeof result !== "object" || result === null) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const res = result as Record<string, unknown>;
|
|
25
|
+
|
|
26
|
+
// AI SDK error-text format
|
|
27
|
+
if (res.type === "error-text" && typeof res.text === "string") {
|
|
28
|
+
return { message: res.text, type: "error-text" };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// AI SDK error-json format
|
|
32
|
+
if (res.type === "error-json" && typeof res.json === "object") {
|
|
33
|
+
const errorJson = res.json as Record<string, unknown>;
|
|
34
|
+
const message = errorJson.message || errorJson.error || JSON.stringify(errorJson);
|
|
35
|
+
return { message: String(message), type: "error-json" };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Shell tool structured error format
|
|
39
|
+
if (res.type === "shell-error") {
|
|
40
|
+
const shellError = res as {
|
|
41
|
+
error?: string;
|
|
42
|
+
exitCode?: number | null;
|
|
43
|
+
stderr?: string;
|
|
44
|
+
};
|
|
45
|
+
const message = shellError.error ||
|
|
46
|
+
shellError.stderr ||
|
|
47
|
+
`Exit code: ${shellError.exitCode}`;
|
|
48
|
+
return { message, type: "shell-error" };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Generic error object with message property
|
|
52
|
+
if (typeof res.error === "string") {
|
|
53
|
+
return { message: res.error, type: "generic" };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (typeof res.message === "string") {
|
|
57
|
+
return { message: res.message, type: "generic" };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generate human-readable content for a tool execution
|
|
65
|
+
*
|
|
66
|
+
* This method attempts to generate a user-friendly description of what the tool
|
|
67
|
+
* is doing by:
|
|
68
|
+
* 1. Checking if the tool has a custom getHumanReadableContent method
|
|
69
|
+
* 2. For MCP tools, formatting the tool name in a readable way
|
|
70
|
+
* 3. Falling back to a generic "Executing <toolname>" message
|
|
71
|
+
*
|
|
72
|
+
* @param toolName - Name of the tool being executed
|
|
73
|
+
* @param args - Arguments passed to the tool
|
|
74
|
+
* @param toolsObject - Available tools that may have custom formatters
|
|
75
|
+
* @returns Human-readable description of the tool execution
|
|
76
|
+
*/
|
|
77
|
+
export function getHumanReadableContent(
|
|
78
|
+
toolName: string,
|
|
79
|
+
args: unknown,
|
|
80
|
+
toolsObject: Record<string, AISdkTool>
|
|
81
|
+
): string {
|
|
82
|
+
// Check if the tool has a custom human-readable content generator
|
|
83
|
+
const tool = toolsObject[toolName];
|
|
84
|
+
const customContent = tool?.getHumanReadableContent?.(args);
|
|
85
|
+
|
|
86
|
+
if (customContent) {
|
|
87
|
+
return customContent;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Special formatting for MCP tools
|
|
91
|
+
if (toolName.startsWith("mcp__")) {
|
|
92
|
+
return `Executing ${formatMcpToolName(toolName)}`;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Default format
|
|
96
|
+
return `Executing ${toolName}`;
|
|
97
|
+
}
|