@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,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReportEmbeddingService - Semantic search for reports
|
|
3
|
+
*
|
|
4
|
+
* Indexes NDKArticle reports (kind:30023) into a project-scoped RAG collection
|
|
5
|
+
* for semantic discovery. Follows the same patterns as ConversationEmbeddingService.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Project-scoped: reports are tagged with projectId for isolation
|
|
9
|
+
* - Index on write: called from report_write tool after successful publish
|
|
10
|
+
* - Upsert semantics: re-indexing updates existing documents (by slug + projectId)
|
|
11
|
+
* - Graceful degradation: RAG failures don't break report writes
|
|
12
|
+
* - Nostr remains authoritative source; RAG is just a search layer
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { logger } from "@/utils/logger";
|
|
16
|
+
import { RAGService, type RAGDocument, type RAGQueryResult } from "@/services/rag/RAGService";
|
|
17
|
+
import type { ReportInfo } from "./ReportService";
|
|
18
|
+
|
|
19
|
+
/** Collection name for report embeddings */
|
|
20
|
+
const REPORT_COLLECTION = "project_reports";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Result from semantic search on reports
|
|
24
|
+
*/
|
|
25
|
+
export interface ReportSearchResult {
|
|
26
|
+
slug: string;
|
|
27
|
+
projectId: string;
|
|
28
|
+
title: string;
|
|
29
|
+
summary?: string;
|
|
30
|
+
author: string;
|
|
31
|
+
publishedAt?: number;
|
|
32
|
+
hashtags?: string[];
|
|
33
|
+
relevanceScore: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Options for semantic search on reports
|
|
38
|
+
*/
|
|
39
|
+
export interface ReportSearchOptions {
|
|
40
|
+
limit?: number;
|
|
41
|
+
minScore?: number;
|
|
42
|
+
projectId?: string; // Required for project isolation; 'ALL' for cross-project
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Service for managing report embeddings and semantic search.
|
|
47
|
+
*
|
|
48
|
+
* Reports are indexed with their projectId in metadata, enabling
|
|
49
|
+
* project-scoped queries via SQL prefilter during vector search.
|
|
50
|
+
*/
|
|
51
|
+
export class ReportEmbeddingService {
|
|
52
|
+
private static instance: ReportEmbeddingService | null = null;
|
|
53
|
+
private ragService: RAGService;
|
|
54
|
+
private initialized = false;
|
|
55
|
+
private initializationPromise: Promise<void> | null = null;
|
|
56
|
+
|
|
57
|
+
private constructor() {
|
|
58
|
+
this.ragService = RAGService.getInstance();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get singleton instance
|
|
63
|
+
*/
|
|
64
|
+
public static getInstance(): ReportEmbeddingService {
|
|
65
|
+
if (!ReportEmbeddingService.instance) {
|
|
66
|
+
ReportEmbeddingService.instance = new ReportEmbeddingService();
|
|
67
|
+
}
|
|
68
|
+
return ReportEmbeddingService.instance;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Initialize the service (creates collection if needed).
|
|
73
|
+
* Clears initializationPromise on failure to allow retries.
|
|
74
|
+
*/
|
|
75
|
+
public async initialize(): Promise<void> {
|
|
76
|
+
if (this.initialized) return;
|
|
77
|
+
if (this.initializationPromise) return this.initializationPromise;
|
|
78
|
+
|
|
79
|
+
this.initializationPromise = this.doInitialize();
|
|
80
|
+
try {
|
|
81
|
+
await this.initializationPromise;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
this.initializationPromise = null;
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private async doInitialize(): Promise<void> {
|
|
89
|
+
try {
|
|
90
|
+
logger.debug("Initializing ReportEmbeddingService");
|
|
91
|
+
|
|
92
|
+
const collections = await this.ragService.listCollections();
|
|
93
|
+
if (!collections.includes(REPORT_COLLECTION)) {
|
|
94
|
+
await this.ragService.createCollection(REPORT_COLLECTION);
|
|
95
|
+
logger.info(`Created report embeddings collection: ${REPORT_COLLECTION}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.initialized = true;
|
|
99
|
+
logger.info("ReportEmbeddingService initialized successfully");
|
|
100
|
+
} catch (error) {
|
|
101
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
102
|
+
logger.error("Failed to initialize ReportEmbeddingService", { error: message });
|
|
103
|
+
throw new Error(`ReportEmbeddingService initialization failed: ${message}`, {
|
|
104
|
+
cause: error,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Ensure service is initialized before operations
|
|
111
|
+
*/
|
|
112
|
+
private async ensureInitialized(): Promise<void> {
|
|
113
|
+
if (!this.initialized) {
|
|
114
|
+
await this.initialize();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Build a stable document ID for a report within a project.
|
|
120
|
+
* Uses projectId + slug to ensure uniqueness and enable upserts.
|
|
121
|
+
*/
|
|
122
|
+
private buildDocumentId(projectId: string, slug: string): string {
|
|
123
|
+
return `report_${projectId}_${slug}`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Build embedding content from report fields.
|
|
128
|
+
* Combines title, summary, and content for richer semantic matching.
|
|
129
|
+
*/
|
|
130
|
+
private buildEmbeddingContent(report: {
|
|
131
|
+
title?: string;
|
|
132
|
+
summary?: string;
|
|
133
|
+
content?: string;
|
|
134
|
+
hashtags?: string[];
|
|
135
|
+
}): string {
|
|
136
|
+
const parts: string[] = [];
|
|
137
|
+
|
|
138
|
+
if (report.title) {
|
|
139
|
+
parts.push(`Title: ${report.title}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (report.summary) {
|
|
143
|
+
parts.push(`Summary: ${report.summary}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (report.content) {
|
|
147
|
+
// Truncate very long content to avoid excessive embedding costs
|
|
148
|
+
const truncated =
|
|
149
|
+
report.content.length > 2000
|
|
150
|
+
? report.content.substring(0, 2000) + "..."
|
|
151
|
+
: report.content;
|
|
152
|
+
parts.push(`Content: ${truncated}`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (report.hashtags && report.hashtags.length > 0) {
|
|
156
|
+
parts.push(`Tags: ${report.hashtags.join(", ")}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return parts.join("\n\n");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Index a report into the RAG collection.
|
|
164
|
+
*
|
|
165
|
+
* Called from report_write after successful Nostr publish.
|
|
166
|
+
* Uses upsert semantics: if a report with the same slug already exists
|
|
167
|
+
* in the project, it is updated rather than duplicated.
|
|
168
|
+
*
|
|
169
|
+
* @param report Report data to index
|
|
170
|
+
* @param projectId Project scope for isolation
|
|
171
|
+
* @param agentPubkey Author's pubkey for attribution
|
|
172
|
+
* @param agentName Author's display name
|
|
173
|
+
* @returns true if indexing succeeded, false otherwise
|
|
174
|
+
*/
|
|
175
|
+
public async indexReport(
|
|
176
|
+
report: {
|
|
177
|
+
slug: string;
|
|
178
|
+
title: string;
|
|
179
|
+
summary?: string;
|
|
180
|
+
content: string;
|
|
181
|
+
hashtags?: string[];
|
|
182
|
+
publishedAt?: number;
|
|
183
|
+
},
|
|
184
|
+
projectId: string,
|
|
185
|
+
agentPubkey: string,
|
|
186
|
+
agentName?: string
|
|
187
|
+
): Promise<boolean> {
|
|
188
|
+
await this.ensureInitialized();
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
const documentId = this.buildDocumentId(projectId, report.slug);
|
|
192
|
+
const embeddingContent = this.buildEmbeddingContent(report);
|
|
193
|
+
|
|
194
|
+
if (!embeddingContent.trim()) {
|
|
195
|
+
logger.debug("No content to embed for report", { slug: report.slug });
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Delete existing document before inserting (upsert semantics)
|
|
200
|
+
try {
|
|
201
|
+
await this.ragService.deleteDocumentById(REPORT_COLLECTION, documentId);
|
|
202
|
+
} catch {
|
|
203
|
+
// Document might not exist - that's fine
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const document: RAGDocument = {
|
|
207
|
+
id: documentId,
|
|
208
|
+
content: embeddingContent,
|
|
209
|
+
metadata: {
|
|
210
|
+
slug: report.slug,
|
|
211
|
+
projectId,
|
|
212
|
+
title: report.title || "",
|
|
213
|
+
summary: report.summary || "",
|
|
214
|
+
hashtags: report.hashtags,
|
|
215
|
+
agentPubkey,
|
|
216
|
+
agentName: agentName || "",
|
|
217
|
+
type: "report",
|
|
218
|
+
publishedAt: report.publishedAt ?? Math.floor(Date.now() / 1000),
|
|
219
|
+
},
|
|
220
|
+
timestamp: Date.now(),
|
|
221
|
+
source: "report",
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
await this.ragService.addDocuments(REPORT_COLLECTION, [document]);
|
|
225
|
+
|
|
226
|
+
logger.info("📝 Report indexed in RAG", {
|
|
227
|
+
slug: report.slug,
|
|
228
|
+
projectId,
|
|
229
|
+
documentId,
|
|
230
|
+
agentName,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
return true;
|
|
234
|
+
} catch (error) {
|
|
235
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
236
|
+
logger.warn("Failed to index report in RAG", {
|
|
237
|
+
slug: report.slug,
|
|
238
|
+
projectId,
|
|
239
|
+
error: message,
|
|
240
|
+
});
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Remove a report from the RAG collection.
|
|
247
|
+
* Called when a report is deleted.
|
|
248
|
+
*/
|
|
249
|
+
public async removeReport(slug: string, projectId: string): Promise<void> {
|
|
250
|
+
try {
|
|
251
|
+
// Check if the collection exists before attempting deletion.
|
|
252
|
+
// Avoids ensureInitialized() which would create the collection as a side-effect.
|
|
253
|
+
const collections = await this.ragService.listCollections();
|
|
254
|
+
if (!collections.includes(REPORT_COLLECTION)) {
|
|
255
|
+
logger.debug("Report collection does not exist, nothing to remove", {
|
|
256
|
+
slug,
|
|
257
|
+
projectId,
|
|
258
|
+
});
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const documentId = this.buildDocumentId(projectId, slug);
|
|
263
|
+
await this.ragService.deleteDocumentById(REPORT_COLLECTION, documentId);
|
|
264
|
+
logger.info("🗑️ Report removed from RAG", { slug, projectId, documentId });
|
|
265
|
+
} catch (error) {
|
|
266
|
+
logger.debug("Could not remove report from RAG (may not exist)", {
|
|
267
|
+
slug,
|
|
268
|
+
projectId,
|
|
269
|
+
error,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Build SQL prefilter for project isolation.
|
|
276
|
+
* Applied DURING vector search, not after, to ensure proper project boundaries.
|
|
277
|
+
*/
|
|
278
|
+
private buildProjectFilter(projectId?: string): string | undefined {
|
|
279
|
+
if (!projectId || projectId.toLowerCase() === "all") {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
const escapedProjectId = projectId.replace(/'/g, "''");
|
|
283
|
+
return `metadata LIKE '%"projectId":"${escapedProjectId}"%'`;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Perform semantic search on reports within a project.
|
|
288
|
+
*
|
|
289
|
+
* @param query Natural language search query
|
|
290
|
+
* @param options Search options including project isolation
|
|
291
|
+
* @returns Array of matching reports with relevance scores
|
|
292
|
+
*/
|
|
293
|
+
public async semanticSearch(
|
|
294
|
+
query: string,
|
|
295
|
+
options: ReportSearchOptions = {}
|
|
296
|
+
): Promise<ReportSearchResult[]> {
|
|
297
|
+
await this.ensureInitialized();
|
|
298
|
+
|
|
299
|
+
const { limit = 10, minScore = 0.3, projectId } = options;
|
|
300
|
+
|
|
301
|
+
try {
|
|
302
|
+
logger.info("🔍 Report semantic search", { query, limit, minScore, projectId });
|
|
303
|
+
|
|
304
|
+
const filter = this.buildProjectFilter(projectId);
|
|
305
|
+
|
|
306
|
+
const results = await this.ragService.queryWithFilter(
|
|
307
|
+
REPORT_COLLECTION,
|
|
308
|
+
query,
|
|
309
|
+
limit * 2, // Request more to account for minScore filtering
|
|
310
|
+
filter
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
const searchResults: ReportSearchResult[] = results
|
|
314
|
+
.filter((result: RAGQueryResult) => result.score >= minScore)
|
|
315
|
+
.slice(0, limit)
|
|
316
|
+
.map((result: RAGQueryResult) => this.transformResult(result));
|
|
317
|
+
|
|
318
|
+
logger.info("✅ Report semantic search complete", {
|
|
319
|
+
query,
|
|
320
|
+
found: searchResults.length,
|
|
321
|
+
limit,
|
|
322
|
+
projectFilter: filter || "none",
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
return searchResults;
|
|
326
|
+
} catch (error) {
|
|
327
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
328
|
+
logger.error("Report semantic search failed", { query, error: message });
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Transform RAG result to ReportSearchResult
|
|
335
|
+
*/
|
|
336
|
+
private transformResult(result: RAGQueryResult): ReportSearchResult {
|
|
337
|
+
const metadata = result.document.metadata || {};
|
|
338
|
+
|
|
339
|
+
return {
|
|
340
|
+
slug: String(metadata.slug || ""),
|
|
341
|
+
projectId: String(metadata.projectId || ""),
|
|
342
|
+
title: String(metadata.title || ""),
|
|
343
|
+
summary: String(metadata.summary || ""),
|
|
344
|
+
author: String(metadata.agentPubkey || ""),
|
|
345
|
+
publishedAt: metadata.publishedAt ? Number(metadata.publishedAt) : undefined,
|
|
346
|
+
hashtags: Array.isArray(metadata.hashtags) ? metadata.hashtags as string[] : undefined,
|
|
347
|
+
relevanceScore: result.score,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Get the collection name for report embeddings.
|
|
353
|
+
*/
|
|
354
|
+
public getCollectionName(): string {
|
|
355
|
+
return REPORT_COLLECTION;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Index multiple existing reports (bulk operation).
|
|
360
|
+
* Useful for backfilling the RAG collection with existing reports.
|
|
361
|
+
*
|
|
362
|
+
* @param reports Array of ReportInfo objects
|
|
363
|
+
* @param projectId Project scope for isolation
|
|
364
|
+
* @returns Number of successfully indexed reports
|
|
365
|
+
*/
|
|
366
|
+
public async indexExistingReports(
|
|
367
|
+
reports: ReportInfo[],
|
|
368
|
+
projectId: string
|
|
369
|
+
): Promise<number> {
|
|
370
|
+
await this.ensureInitialized();
|
|
371
|
+
|
|
372
|
+
let indexed = 0;
|
|
373
|
+
for (const report of reports) {
|
|
374
|
+
if (report.isDeleted) continue;
|
|
375
|
+
if (!report.content) continue;
|
|
376
|
+
|
|
377
|
+
const success = await this.indexReport(
|
|
378
|
+
{
|
|
379
|
+
slug: report.slug,
|
|
380
|
+
title: report.title || "",
|
|
381
|
+
summary: report.summary,
|
|
382
|
+
content: report.content,
|
|
383
|
+
hashtags: report.hashtags,
|
|
384
|
+
publishedAt: report.publishedAt,
|
|
385
|
+
},
|
|
386
|
+
projectId,
|
|
387
|
+
report.author
|
|
388
|
+
);
|
|
389
|
+
|
|
390
|
+
if (success) indexed++;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
logger.info("📝 Bulk report indexing complete", {
|
|
394
|
+
projectId,
|
|
395
|
+
total: reports.length,
|
|
396
|
+
indexed,
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
return indexed;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Clear all report embeddings
|
|
404
|
+
*/
|
|
405
|
+
public async clearIndex(): Promise<void> {
|
|
406
|
+
try {
|
|
407
|
+
await this.ragService.deleteCollection(REPORT_COLLECTION);
|
|
408
|
+
logger.info("Cleared report embeddings index");
|
|
409
|
+
} catch (error) {
|
|
410
|
+
logger.debug("No report index to clear or error clearing", { error });
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
this.initialized = false;
|
|
414
|
+
this.initializationPromise = null;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Reset singleton instance (for testing)
|
|
419
|
+
*/
|
|
420
|
+
public static resetInstance(): void {
|
|
421
|
+
if (ReportEmbeddingService.instance) {
|
|
422
|
+
ReportEmbeddingService.instance = null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/** Lazy getter to avoid eagerly initializing at module load time */
|
|
428
|
+
export function getReportEmbeddingService(): ReportEmbeddingService {
|
|
429
|
+
return ReportEmbeddingService.getInstance();
|
|
430
|
+
}
|