@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,77 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { RAGService } from "@/services/rag/RAGService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
const ragListCollectionsSchema = z.object({
|
|
9
|
+
description: z
|
|
10
|
+
.string()
|
|
11
|
+
.trim()
|
|
12
|
+
.min(1, "Description is required and cannot be empty")
|
|
13
|
+
.describe(
|
|
14
|
+
"REQUIRED: A clear, concise description of why you're listing collections (5-10 words). Helps provide human-readable context for the operation."
|
|
15
|
+
),
|
|
16
|
+
include_stats: z
|
|
17
|
+
.boolean()
|
|
18
|
+
.nullable()
|
|
19
|
+
.default(false)
|
|
20
|
+
.describe("Whether to include per-collection statistics (total document count, your document count)"),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Core implementation of listing RAG collections
|
|
25
|
+
*/
|
|
26
|
+
async function executeListCollections(
|
|
27
|
+
input: z.infer<typeof ragListCollectionsSchema>,
|
|
28
|
+
context: ToolExecutionContext
|
|
29
|
+
): Promise<ToolResponse> {
|
|
30
|
+
const { include_stats = false } = input;
|
|
31
|
+
|
|
32
|
+
const ragService = RAGService.getInstance();
|
|
33
|
+
|
|
34
|
+
if (!include_stats) {
|
|
35
|
+
const collections = await ragService.listCollections();
|
|
36
|
+
return {
|
|
37
|
+
success: true,
|
|
38
|
+
collections_count: collections.length,
|
|
39
|
+
collections: collections,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Fetch stats for all collections with agent attribution
|
|
44
|
+
// getAllCollectionStats already calls listCollections internally
|
|
45
|
+
const agentPubkey = context.agent.pubkey;
|
|
46
|
+
const stats = await ragService.getAllCollectionStats(agentPubkey);
|
|
47
|
+
|
|
48
|
+
const collectionsWithStats = stats.map((s) => ({
|
|
49
|
+
name: s.name,
|
|
50
|
+
total_documents: s.totalDocCount,
|
|
51
|
+
agent_documents: s.agentDocCount,
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
collections_count: stats.length,
|
|
57
|
+
collections: collectionsWithStats,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* List all available RAG collections
|
|
63
|
+
*/
|
|
64
|
+
export function createRAGListCollectionsTool(context: ToolExecutionContext): AISdkTool {
|
|
65
|
+
return tool({
|
|
66
|
+
description: "List all available RAG collections in the system",
|
|
67
|
+
inputSchema: ragListCollectionsSchema,
|
|
68
|
+
execute: async (input: unknown) => {
|
|
69
|
+
return executeToolWithErrorHandling(
|
|
70
|
+
"rag_list_collections",
|
|
71
|
+
input as z.infer<typeof ragListCollectionsSchema>,
|
|
72
|
+
context,
|
|
73
|
+
executeListCollections
|
|
74
|
+
);
|
|
75
|
+
},
|
|
76
|
+
}) as AISdkTool;
|
|
77
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { type RAGQueryResult, RAGService } from "@/services/rag/RAGService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
const ragQuerySchema = z.object({
|
|
9
|
+
description: z
|
|
10
|
+
.string()
|
|
11
|
+
.trim()
|
|
12
|
+
.min(1, "Description is required and cannot be empty")
|
|
13
|
+
.describe(
|
|
14
|
+
"REQUIRED: A clear, concise description of why you're querying this collection (5-10 words). Helps provide human-readable context for the operation."
|
|
15
|
+
),
|
|
16
|
+
collection: z.string().describe("Name of the collection to query"),
|
|
17
|
+
query_text: z.string().describe("The text query for semantic search"),
|
|
18
|
+
top_k: z
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.min(1)
|
|
22
|
+
.max(100)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Number of top results to return (default: 5, range: 1-100)"),
|
|
25
|
+
include_metadata: z
|
|
26
|
+
.boolean()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Whether to include document metadata in results (default: true)"),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Formatted result for tool response
|
|
33
|
+
*/
|
|
34
|
+
interface FormattedQueryResult {
|
|
35
|
+
rank: number;
|
|
36
|
+
score: number;
|
|
37
|
+
content: string;
|
|
38
|
+
metadata?: Record<string, unknown>;
|
|
39
|
+
source?: string;
|
|
40
|
+
id?: string;
|
|
41
|
+
timestamp?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Format query results for response
|
|
46
|
+
*/
|
|
47
|
+
function formatResults(
|
|
48
|
+
results: RAGQueryResult[],
|
|
49
|
+
includeMetadata: boolean
|
|
50
|
+
): FormattedQueryResult[] {
|
|
51
|
+
return results.map((result, index) => ({
|
|
52
|
+
rank: index + 1,
|
|
53
|
+
score: result.score,
|
|
54
|
+
content:
|
|
55
|
+
result.document.content.length > 500
|
|
56
|
+
? `${result.document.content.substring(0, 500)}...`
|
|
57
|
+
: result.document.content,
|
|
58
|
+
...(includeMetadata && {
|
|
59
|
+
metadata: result.document.metadata,
|
|
60
|
+
source: result.document.source,
|
|
61
|
+
id: result.document.id,
|
|
62
|
+
timestamp: result.document.timestamp
|
|
63
|
+
? new Date(result.document.timestamp).toISOString()
|
|
64
|
+
: undefined,
|
|
65
|
+
}),
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Core implementation of RAG semantic search
|
|
71
|
+
*/
|
|
72
|
+
async function executeQuery(
|
|
73
|
+
input: z.infer<typeof ragQuerySchema>,
|
|
74
|
+
_context: ToolExecutionContext
|
|
75
|
+
): Promise<ToolResponse> {
|
|
76
|
+
const { collection, query_text } = input;
|
|
77
|
+
|
|
78
|
+
// Use provided top_k or default to 5
|
|
79
|
+
// The schema already validates the range (1-100) and integer constraint
|
|
80
|
+
const topK = input.top_k ?? 5;
|
|
81
|
+
const includeMetadata = input.include_metadata ?? true;
|
|
82
|
+
|
|
83
|
+
const ragService = RAGService.getInstance();
|
|
84
|
+
const results = await ragService.query(collection, query_text, topK);
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
collection: collection,
|
|
89
|
+
query: query_text,
|
|
90
|
+
results_count: results.length,
|
|
91
|
+
results: formatResults(results, includeMetadata),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Query a RAG collection using semantic search
|
|
97
|
+
*/
|
|
98
|
+
export function createRAGQueryTool(context: ToolExecutionContext): AISdkTool {
|
|
99
|
+
return tool({
|
|
100
|
+
description:
|
|
101
|
+
"Perform semantic search on a RAG collection. Returns the most relevant documents based on vector similarity to the query.",
|
|
102
|
+
inputSchema: ragQuerySchema,
|
|
103
|
+
execute: async (input: unknown) => {
|
|
104
|
+
return executeToolWithErrorHandling("rag_query", input as z.infer<typeof ragQuerySchema>, context, executeQuery);
|
|
105
|
+
},
|
|
106
|
+
}) as AISdkTool;
|
|
107
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Schema for creating a RAG subscription
|
|
10
|
+
*/
|
|
11
|
+
const ragSubscriptionCreateSchema = z.object({
|
|
12
|
+
subscriptionId: z
|
|
13
|
+
.string()
|
|
14
|
+
.describe('Unique identifier for the subscription (e.g., "ndk-updates", "market-data")'),
|
|
15
|
+
mcpServerId: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe(
|
|
18
|
+
'The ID of the installed MCP tool/server providing the resource (e.g., "nostr-provider")'
|
|
19
|
+
),
|
|
20
|
+
resourceUri: z
|
|
21
|
+
.string()
|
|
22
|
+
.describe(
|
|
23
|
+
'The MCP resource URI to subscribe to (e.g., "nostr://feed/pubkey/kinds", "file:///path/to/file"). ' +
|
|
24
|
+
"This must be an actual resource URI, NOT a tool name. If using a resource template, " +
|
|
25
|
+
"you must first expand it with parameters to get the actual URI."
|
|
26
|
+
),
|
|
27
|
+
ragCollection: z.string().describe("Name of the RAG collection where data will be stored"),
|
|
28
|
+
description: z.string().describe("Human-readable description of what this subscription does"),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Core implementation of creating a RAG subscription
|
|
33
|
+
*/
|
|
34
|
+
async function executeCreateSubscription(
|
|
35
|
+
input: z.infer<typeof ragSubscriptionCreateSchema>,
|
|
36
|
+
context: ToolExecutionContext
|
|
37
|
+
): Promise<ToolResponse> {
|
|
38
|
+
const { subscriptionId, mcpServerId, resourceUri, ragCollection, description } = input;
|
|
39
|
+
|
|
40
|
+
// Mandate agent identity - no compromises
|
|
41
|
+
if (!context.agent?.pubkey) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
"Agent identity is required. Cannot create subscription without valid agent pubkey."
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const agentPubkey = context.agent.pubkey;
|
|
47
|
+
|
|
48
|
+
// Get the service instance (already initialized at startup)
|
|
49
|
+
const subscriptionService = RagSubscriptionService.getInstance();
|
|
50
|
+
|
|
51
|
+
// Create the subscription
|
|
52
|
+
const subscription = await subscriptionService.createSubscription(
|
|
53
|
+
subscriptionId,
|
|
54
|
+
agentPubkey,
|
|
55
|
+
mcpServerId,
|
|
56
|
+
resourceUri,
|
|
57
|
+
ragCollection,
|
|
58
|
+
description
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
message: `Successfully created subscription '${subscriptionId}'`,
|
|
64
|
+
subscription: {
|
|
65
|
+
id: subscription.subscriptionId,
|
|
66
|
+
mcpServer: subscription.mcpServerId,
|
|
67
|
+
resource: subscription.resourceUri,
|
|
68
|
+
collection: subscription.ragCollection,
|
|
69
|
+
status: subscription.status,
|
|
70
|
+
description: subscription.description,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Create a persistent RAG subscription to stream data from MCP resources
|
|
77
|
+
*
|
|
78
|
+
* This tool creates a persistent subscription that:
|
|
79
|
+
* - Connects to an installed MCP server/tool
|
|
80
|
+
* - Subscribes to a specific resource
|
|
81
|
+
* - Automatically pipes updates to a RAG collection
|
|
82
|
+
* - Persists across TENEX restarts
|
|
83
|
+
*
|
|
84
|
+
* Example use cases:
|
|
85
|
+
* - Subscribe to a changelog from an NDK server
|
|
86
|
+
* - Stream market data into a trading knowledge base
|
|
87
|
+
* - Collect social media updates for analysis
|
|
88
|
+
*
|
|
89
|
+
* The subscription will remain active until explicitly deleted.
|
|
90
|
+
*/
|
|
91
|
+
export function createRAGSubscriptionCreateTool(context: ToolExecutionContext): AISdkTool {
|
|
92
|
+
return tool({
|
|
93
|
+
description:
|
|
94
|
+
"Create a persistent subscription to stream data from an MCP resource into a RAG collection. The subscription will automatically pipe all updates from the specified resource to the RAG collection and persist across restarts.",
|
|
95
|
+
inputSchema: ragSubscriptionCreateSchema,
|
|
96
|
+
execute: async (input: unknown) => {
|
|
97
|
+
return executeToolWithErrorHandling(
|
|
98
|
+
"rag_subscription_create",
|
|
99
|
+
input as z.infer<typeof ragSubscriptionCreateSchema>,
|
|
100
|
+
context,
|
|
101
|
+
executeCreateSubscription
|
|
102
|
+
);
|
|
103
|
+
},
|
|
104
|
+
}) as AISdkTool;
|
|
105
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Schema for deleting a RAG subscription
|
|
10
|
+
*/
|
|
11
|
+
const ragSubscriptionDeleteSchema = z.object({
|
|
12
|
+
subscriptionId: z.string().describe("The ID of the subscription to delete"),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Core implementation of deleting a RAG subscription
|
|
17
|
+
*/
|
|
18
|
+
async function executeDeleteSubscription(
|
|
19
|
+
input: z.infer<typeof ragSubscriptionDeleteSchema>,
|
|
20
|
+
context: ToolExecutionContext
|
|
21
|
+
): Promise<ToolResponse> {
|
|
22
|
+
const { subscriptionId } = input;
|
|
23
|
+
|
|
24
|
+
// Mandate agent identity - no compromises
|
|
25
|
+
if (!context.agent?.pubkey) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
"Agent identity is required. Cannot delete subscription without valid agent pubkey."
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
const agentPubkey = context.agent.pubkey;
|
|
31
|
+
|
|
32
|
+
// Get the service instance (already initialized at startup)
|
|
33
|
+
const subscriptionService = RagSubscriptionService.getInstance();
|
|
34
|
+
|
|
35
|
+
// Delete the subscription
|
|
36
|
+
const deleted = await subscriptionService.deleteSubscription(subscriptionId, agentPubkey);
|
|
37
|
+
|
|
38
|
+
if (!deleted) {
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
message: `Subscription '${subscriptionId}' not found or you don't have permission to delete it`,
|
|
42
|
+
error: "SUBSCRIPTION_NOT_FOUND",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
success: true,
|
|
48
|
+
message: `Successfully deleted subscription '${subscriptionId}'`,
|
|
49
|
+
subscriptionId: subscriptionId,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Delete a RAG subscription and stop data streaming
|
|
55
|
+
*
|
|
56
|
+
* This will:
|
|
57
|
+
* - Stop receiving updates from the MCP resource
|
|
58
|
+
* - Remove the subscription from persistent storage
|
|
59
|
+
* - Clean up any associated listeners
|
|
60
|
+
*
|
|
61
|
+
* Note: Previously ingested documents remain in the RAG collection.
|
|
62
|
+
* Only the subscription itself is deleted, not the data.
|
|
63
|
+
*
|
|
64
|
+
* You can only delete subscriptions that belong to your agent.
|
|
65
|
+
*/
|
|
66
|
+
export function createRAGSubscriptionDeleteTool(context: ToolExecutionContext): AISdkTool {
|
|
67
|
+
return tool({
|
|
68
|
+
description:
|
|
69
|
+
"Delete a RAG subscription to stop streaming data from an MCP resource. Previously ingested documents will remain in the RAG collection.",
|
|
70
|
+
inputSchema: ragSubscriptionDeleteSchema,
|
|
71
|
+
execute: async (input: unknown) => {
|
|
72
|
+
return executeToolWithErrorHandling(
|
|
73
|
+
"rag_subscription_delete",
|
|
74
|
+
input as z.infer<typeof ragSubscriptionDeleteSchema>,
|
|
75
|
+
context,
|
|
76
|
+
executeDeleteSubscription
|
|
77
|
+
);
|
|
78
|
+
},
|
|
79
|
+
}) as AISdkTool;
|
|
80
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Schema for getting a specific RAG subscription
|
|
10
|
+
*/
|
|
11
|
+
const ragSubscriptionGetSchema = z.object({
|
|
12
|
+
subscriptionId: z.string().describe("The ID of the subscription to retrieve"),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Calculate uptime for a subscription
|
|
17
|
+
*/
|
|
18
|
+
function calculateUptime(createdAt: number, status: string): string {
|
|
19
|
+
if (status !== "RUNNING") {
|
|
20
|
+
return "N/A";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const uptimeMs = Date.now() - createdAt;
|
|
24
|
+
const days = Math.floor(uptimeMs / (1000 * 60 * 60 * 24));
|
|
25
|
+
const hours = Math.floor((uptimeMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
26
|
+
const minutes = Math.floor((uptimeMs % (1000 * 60 * 60)) / (1000 * 60));
|
|
27
|
+
|
|
28
|
+
const parts = [];
|
|
29
|
+
if (days > 0) parts.push(`${days}d`);
|
|
30
|
+
if (hours > 0) parts.push(`${hours}h`);
|
|
31
|
+
if (minutes > 0 || parts.length === 0) parts.push(`${minutes}m`);
|
|
32
|
+
|
|
33
|
+
return parts.join(" ");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Core implementation of getting a RAG subscription
|
|
38
|
+
*/
|
|
39
|
+
async function executeGetSubscription(
|
|
40
|
+
input: z.infer<typeof ragSubscriptionGetSchema>,
|
|
41
|
+
context: ToolExecutionContext
|
|
42
|
+
): Promise<ToolResponse> {
|
|
43
|
+
const { subscriptionId } = input;
|
|
44
|
+
|
|
45
|
+
// Mandate agent identity - no compromises
|
|
46
|
+
if (!context.agent?.pubkey) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
"Agent identity is required. Cannot retrieve subscription without valid agent pubkey."
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
const agentPubkey = context.agent.pubkey;
|
|
52
|
+
|
|
53
|
+
// Get the service instance (already initialized at startup)
|
|
54
|
+
const subscriptionService = RagSubscriptionService.getInstance();
|
|
55
|
+
|
|
56
|
+
// Get the subscription
|
|
57
|
+
const subscription = await subscriptionService.getSubscription(subscriptionId, agentPubkey);
|
|
58
|
+
|
|
59
|
+
if (!subscription) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
message: `Subscription '${subscriptionId}' not found`,
|
|
63
|
+
error: "SUBSCRIPTION_NOT_FOUND",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Calculate uptime
|
|
68
|
+
const uptime = calculateUptime(subscription.createdAt, subscription.status);
|
|
69
|
+
|
|
70
|
+
// Format detailed response
|
|
71
|
+
const details = {
|
|
72
|
+
id: subscription.subscriptionId,
|
|
73
|
+
description: subscription.description,
|
|
74
|
+
status: subscription.status,
|
|
75
|
+
configuration: {
|
|
76
|
+
mcpServer: subscription.mcpServerId,
|
|
77
|
+
resource: subscription.resourceUri,
|
|
78
|
+
collection: subscription.ragCollection,
|
|
79
|
+
},
|
|
80
|
+
metrics: {
|
|
81
|
+
documentsProcessed: subscription.documentsProcessed,
|
|
82
|
+
uptime: uptime,
|
|
83
|
+
createdAt: new Date(subscription.createdAt).toISOString(),
|
|
84
|
+
updatedAt: new Date(subscription.updatedAt).toISOString(),
|
|
85
|
+
},
|
|
86
|
+
lastDocumentSnippet: subscription.lastDocumentIngested || null,
|
|
87
|
+
lastError: subscription.lastError || null,
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
success: true,
|
|
92
|
+
message: `Retrieved details for subscription '${subscriptionId}'`,
|
|
93
|
+
subscription: details,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get detailed information about a specific RAG subscription
|
|
99
|
+
*
|
|
100
|
+
* Returns comprehensive details including:
|
|
101
|
+
* - Current status and configuration
|
|
102
|
+
* - Processing metrics (documents processed, uptime)
|
|
103
|
+
* - Last ingested document snippet
|
|
104
|
+
* - Error information if any
|
|
105
|
+
* - Timestamps for creation and last update
|
|
106
|
+
*
|
|
107
|
+
* Use this to monitor the health and progress of a specific subscription.
|
|
108
|
+
*/
|
|
109
|
+
export function createRAGSubscriptionGetTool(context: ToolExecutionContext): AISdkTool {
|
|
110
|
+
return tool({
|
|
111
|
+
description:
|
|
112
|
+
"Get detailed status and metrics for a specific RAG subscription, including processing statistics and the last ingested document snippet.",
|
|
113
|
+
inputSchema: ragSubscriptionGetSchema,
|
|
114
|
+
execute: async (input: unknown) => {
|
|
115
|
+
return executeToolWithErrorHandling(
|
|
116
|
+
"rag_subscription_get",
|
|
117
|
+
input as z.infer<typeof ragSubscriptionGetSchema>,
|
|
118
|
+
context,
|
|
119
|
+
executeGetSubscription
|
|
120
|
+
);
|
|
121
|
+
},
|
|
122
|
+
}) as AISdkTool;
|
|
123
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Core implementation of listing RAG subscriptions
|
|
10
|
+
*/
|
|
11
|
+
async function executeListSubscriptions(
|
|
12
|
+
_input: unknown,
|
|
13
|
+
context: ToolExecutionContext
|
|
14
|
+
): Promise<ToolResponse> {
|
|
15
|
+
// Mandate agent identity - no compromises
|
|
16
|
+
if (!context.agent?.pubkey) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
"Agent identity is required. Cannot list subscriptions without valid agent pubkey."
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const agentPubkey = context.agent.pubkey;
|
|
22
|
+
|
|
23
|
+
// Get the service instance (already initialized at startup)
|
|
24
|
+
const subscriptionService = RagSubscriptionService.getInstance();
|
|
25
|
+
|
|
26
|
+
// List subscriptions for this agent
|
|
27
|
+
const subscriptions = await subscriptionService.listSubscriptions(agentPubkey);
|
|
28
|
+
|
|
29
|
+
// Single-pass statistics calculation with proper efficiency
|
|
30
|
+
const statistics = subscriptions.reduce(
|
|
31
|
+
(acc, sub) => {
|
|
32
|
+
// Format subscription while calculating statistics
|
|
33
|
+
acc.formattedSubscriptions.push({
|
|
34
|
+
id: sub.subscriptionId,
|
|
35
|
+
mcpServer: sub.mcpServerId,
|
|
36
|
+
resource: sub.resourceUri,
|
|
37
|
+
collection: sub.ragCollection,
|
|
38
|
+
status: sub.status,
|
|
39
|
+
documentsProcessed: sub.documentsProcessed,
|
|
40
|
+
description: sub.description,
|
|
41
|
+
createdAt: new Date(sub.createdAt).toISOString(),
|
|
42
|
+
updatedAt: new Date(sub.updatedAt).toISOString(),
|
|
43
|
+
lastError: sub.lastError,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Update counters in single pass
|
|
47
|
+
acc.total++;
|
|
48
|
+
acc.totalDocumentsProcessed += sub.documentsProcessed;
|
|
49
|
+
|
|
50
|
+
switch (sub.status) {
|
|
51
|
+
case "RUNNING":
|
|
52
|
+
acc.running++;
|
|
53
|
+
break;
|
|
54
|
+
case "ERROR":
|
|
55
|
+
acc.error++;
|
|
56
|
+
break;
|
|
57
|
+
case "STOPPED":
|
|
58
|
+
acc.stopped++;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return acc;
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
formattedSubscriptions: [] as Array<{
|
|
66
|
+
id: string;
|
|
67
|
+
mcpServer: string;
|
|
68
|
+
resource: string;
|
|
69
|
+
collection: string;
|
|
70
|
+
status: string;
|
|
71
|
+
documentsProcessed: number;
|
|
72
|
+
description: string;
|
|
73
|
+
createdAt: string;
|
|
74
|
+
updatedAt: string;
|
|
75
|
+
lastError?: string;
|
|
76
|
+
}>,
|
|
77
|
+
total: 0,
|
|
78
|
+
running: 0,
|
|
79
|
+
error: 0,
|
|
80
|
+
stopped: 0,
|
|
81
|
+
totalDocumentsProcessed: 0,
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
success: true,
|
|
87
|
+
message: `Found ${statistics.total} subscription(s)`,
|
|
88
|
+
subscriptions: statistics.formattedSubscriptions,
|
|
89
|
+
statistics: {
|
|
90
|
+
total: statistics.total,
|
|
91
|
+
running: statistics.running,
|
|
92
|
+
error: statistics.error,
|
|
93
|
+
stopped: statistics.stopped,
|
|
94
|
+
totalDocumentsProcessed: statistics.totalDocumentsProcessed,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* List all active RAG subscriptions for the current agent
|
|
101
|
+
*
|
|
102
|
+
* Returns a list of all subscriptions including:
|
|
103
|
+
* - Subscription ID and description
|
|
104
|
+
* - MCP server and resource information
|
|
105
|
+
* - Target RAG collection
|
|
106
|
+
* - Current status (RUNNING, ERROR, STOPPED)
|
|
107
|
+
* - Number of documents processed
|
|
108
|
+
* - Timestamps and error information
|
|
109
|
+
*
|
|
110
|
+
* Also provides aggregate statistics about all subscriptions.
|
|
111
|
+
*/
|
|
112
|
+
const ragSubscriptionListSchema = z.object({});
|
|
113
|
+
|
|
114
|
+
export function createRAGSubscriptionListTool(context: ToolExecutionContext): AISdkTool {
|
|
115
|
+
return tool({
|
|
116
|
+
description:
|
|
117
|
+
"List all active RAG subscriptions for the current agent, showing their status, configuration, and statistics.",
|
|
118
|
+
inputSchema: ragSubscriptionListSchema,
|
|
119
|
+
execute: async (input: unknown) => {
|
|
120
|
+
return executeToolWithErrorHandling(
|
|
121
|
+
"rag_subscription_list",
|
|
122
|
+
input,
|
|
123
|
+
context,
|
|
124
|
+
executeListSubscriptions
|
|
125
|
+
);
|
|
126
|
+
},
|
|
127
|
+
}) as AISdkTool;
|
|
128
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AISdkTool, ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { ReportService } from "@/services/reports";
|
|
3
|
+
import { getReportEmbeddingService } from "@/services/reports/ReportEmbeddingService";
|
|
4
|
+
import { getProjectContext } from "@/services/projects";
|
|
5
|
+
import { logger } from "@/utils/logger";
|
|
6
|
+
import { tool } from "ai";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
const reportDeleteSchema = z.object({
|
|
10
|
+
slug: z.string().describe("The slug identifier (d-tag) of the report to delete"),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
type ReportDeleteInput = z.infer<typeof reportDeleteSchema>;
|
|
14
|
+
|
|
15
|
+
interface ReportDeleteOutput {
|
|
16
|
+
success: boolean;
|
|
17
|
+
articleId: string;
|
|
18
|
+
slug: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Core implementation of report deletion functionality
|
|
24
|
+
*/
|
|
25
|
+
async function executeReportDelete(
|
|
26
|
+
input: ReportDeleteInput,
|
|
27
|
+
context: ToolExecutionContext
|
|
28
|
+
): Promise<ReportDeleteOutput> {
|
|
29
|
+
const { slug } = input;
|
|
30
|
+
|
|
31
|
+
logger.info("🗑️ Deleting report", {
|
|
32
|
+
slug,
|
|
33
|
+
agent: context.agent.name,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const reportService = new ReportService();
|
|
37
|
+
|
|
38
|
+
const articleId = await reportService.deleteReport(slug, context.agent);
|
|
39
|
+
|
|
40
|
+
// Remove from RAG index
|
|
41
|
+
try {
|
|
42
|
+
const projectCtx = getProjectContext();
|
|
43
|
+
const projectTagId = projectCtx.project.tagId();
|
|
44
|
+
const reportEmbeddingService = getReportEmbeddingService();
|
|
45
|
+
await reportEmbeddingService.removeReport(slug, projectTagId);
|
|
46
|
+
} catch (ragError) {
|
|
47
|
+
// Don't fail deletion if RAG cleanup fails
|
|
48
|
+
const ragMessage = ragError instanceof Error ? ragError.message : String(ragError);
|
|
49
|
+
logger.warn("Failed to remove report from RAG", { slug, error: ragMessage });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
logger.info("✅ Report deleted successfully", {
|
|
53
|
+
slug,
|
|
54
|
+
articleId,
|
|
55
|
+
agent: context.agent.name,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
articleId: `nostr:${articleId}`,
|
|
61
|
+
slug,
|
|
62
|
+
message: `Report "${slug}" marked as deleted`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Create an AI SDK tool for deleting reports
|
|
68
|
+
*/
|
|
69
|
+
export function createReportDeleteTool(context: ToolExecutionContext): AISdkTool {
|
|
70
|
+
return tool({
|
|
71
|
+
description: "Mark an NDKArticle report as deleted",
|
|
72
|
+
|
|
73
|
+
inputSchema: reportDeleteSchema,
|
|
74
|
+
|
|
75
|
+
execute: async (input: ReportDeleteInput) => {
|
|
76
|
+
return await executeReportDelete(input, context);
|
|
77
|
+
},
|
|
78
|
+
}) as AISdkTool;
|
|
79
|
+
}
|