@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,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfigResolver - Utility module for resolving effective agent configuration.
|
|
3
|
+
*
|
|
4
|
+
* Handles the merging of default config with project-scoped delta overrides.
|
|
5
|
+
*
|
|
6
|
+
* ## Tool Delta Syntax
|
|
7
|
+
* Project overrides can use delta syntax for tools:
|
|
8
|
+
* - "+tool" - add this tool on top of defaults
|
|
9
|
+
* - "-tool" - remove this tool from defaults
|
|
10
|
+
* - Plain "tool" (no prefix) - full replacement (entire list is the effective tools)
|
|
11
|
+
*
|
|
12
|
+
* If any tool uses delta syntax, the whole list is treated as delta.
|
|
13
|
+
* If no tool uses delta syntax, the whole list is a full replacement.
|
|
14
|
+
*
|
|
15
|
+
* ## Dedup Logic
|
|
16
|
+
* When a project override field is identical to the default, the override is cleared.
|
|
17
|
+
* This keeps overrides minimal and avoids redundant entries.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const resolver = new ConfigResolver({
|
|
21
|
+
* defaultConfig: { model: 'modelA', tools: ['tool1', 'tool2'] },
|
|
22
|
+
* projectConfigs: {
|
|
23
|
+
* projectA: { model: 'modelB', tools: ['-tool1', '+tool4'] },
|
|
24
|
+
* projectB: { tools: ['+tool5'] }
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // projectA: model=modelB, tools=[tool2, tool4]
|
|
29
|
+
* resolver.resolveEffectiveConfig('projectA');
|
|
30
|
+
*
|
|
31
|
+
* // projectB: model=modelA (default), tools=[tool1, tool2, tool5]
|
|
32
|
+
* resolver.resolveEffectiveConfig('projectB');
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import type { AgentDefaultConfig, AgentProjectConfig } from "@/agents/types";
|
|
36
|
+
export type { AgentDefaultConfig, AgentProjectConfig };
|
|
37
|
+
|
|
38
|
+
export interface ResolvedAgentConfig {
|
|
39
|
+
/** The effective model for this project context */
|
|
40
|
+
model?: string;
|
|
41
|
+
/** The effective tools list (fully resolved, no +/- prefixes) */
|
|
42
|
+
tools?: string[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Apply delta tools to a base tool list.
|
|
47
|
+
* "+tool" adds, "-tool" removes. Order: apply removals first, then additions.
|
|
48
|
+
*
|
|
49
|
+
* @param baseTools - The default tools to apply delta to
|
|
50
|
+
* @param delta - Array of tools with "+"/"-" prefixes
|
|
51
|
+
* @returns The resolved tool list
|
|
52
|
+
*/
|
|
53
|
+
export function applyToolsDelta(baseTools: string[], delta: string[]): string[] {
|
|
54
|
+
const removals = new Set(
|
|
55
|
+
delta.filter((t) => t.startsWith("-")).map((t) => t.slice(1))
|
|
56
|
+
);
|
|
57
|
+
const additions = delta.filter((t) => t.startsWith("+")).map((t) => t.slice(1));
|
|
58
|
+
|
|
59
|
+
const result = baseTools.filter((t) => !removals.has(t));
|
|
60
|
+
|
|
61
|
+
for (const tool of additions) {
|
|
62
|
+
if (!result.includes(tool)) {
|
|
63
|
+
result.push(tool);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Resolve the effective tools for a project given defaults and a project override.
|
|
72
|
+
*
|
|
73
|
+
* @param defaultTools - Default tools from agent's default config
|
|
74
|
+
* @param projectTools - Override from project config (may use delta syntax or be full replacement)
|
|
75
|
+
* @returns The effective tools list
|
|
76
|
+
*/
|
|
77
|
+
export function resolveEffectiveTools(
|
|
78
|
+
defaultTools: string[] | undefined,
|
|
79
|
+
projectTools: string[] | undefined
|
|
80
|
+
): string[] | undefined {
|
|
81
|
+
if (!projectTools || projectTools.length === 0) {
|
|
82
|
+
return defaultTools;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const base = defaultTools ?? [];
|
|
86
|
+
return applyToolsDelta(base, projectTools);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Resolve the effective model for a project given defaults and a project override.
|
|
91
|
+
*
|
|
92
|
+
* @param defaultModel - Default model from agent's default config
|
|
93
|
+
* @param projectModel - Override from project config
|
|
94
|
+
* @returns The effective model
|
|
95
|
+
*/
|
|
96
|
+
export function resolveEffectiveModel(
|
|
97
|
+
defaultModel: string | undefined,
|
|
98
|
+
projectModel: string | undefined
|
|
99
|
+
): string | undefined {
|
|
100
|
+
return projectModel ?? defaultModel;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Resolve the full effective config for an agent in a specific project context.
|
|
105
|
+
*/
|
|
106
|
+
export function resolveEffectiveConfig(
|
|
107
|
+
defaultConfig: AgentDefaultConfig,
|
|
108
|
+
projectConfig: AgentProjectConfig | undefined
|
|
109
|
+
): ResolvedAgentConfig {
|
|
110
|
+
const effectiveModel = resolveEffectiveModel(defaultConfig.model, projectConfig?.model);
|
|
111
|
+
const effectiveTools = resolveEffectiveTools(defaultConfig.tools, projectConfig?.tools);
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
model: effectiveModel,
|
|
115
|
+
tools: effectiveTools,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Compute the minimal delta representation of a full tool list relative to a set of defaults.
|
|
121
|
+
*
|
|
122
|
+
* This is the inverse of applyToolsDelta: given a desired full list and the current defaults,
|
|
123
|
+
* produce the smallest delta (+tool/-tool) that when applied to defaults yields the desired list.
|
|
124
|
+
*
|
|
125
|
+
* Used when storing project-scoped tool overrides: kind 24020 events carry a full list,
|
|
126
|
+
* but the storage layer stores deltas for project overrides.
|
|
127
|
+
*
|
|
128
|
+
* ## Algorithm
|
|
129
|
+
* - Tools in desired but NOT in defaults → "+tool" additions
|
|
130
|
+
* - Tools in defaults but NOT in desired → "-tool" removals
|
|
131
|
+
* - Tools in both → no entry needed (they're already in defaults)
|
|
132
|
+
*
|
|
133
|
+
* @param defaultTools - The agent's default tools list
|
|
134
|
+
* @param desiredTools - The full tool list to achieve
|
|
135
|
+
* @returns Delta array (may contain "+tool" and "-tool" entries), or empty array if no change
|
|
136
|
+
*/
|
|
137
|
+
export function computeToolsDelta(defaultTools: string[], desiredTools: string[]): string[] {
|
|
138
|
+
const defaultSet = new Set(defaultTools);
|
|
139
|
+
const desiredSet = new Set(desiredTools);
|
|
140
|
+
|
|
141
|
+
const delta: string[] = [];
|
|
142
|
+
|
|
143
|
+
// Tools to remove: in defaults but not in desired
|
|
144
|
+
for (const tool of defaultTools) {
|
|
145
|
+
if (!desiredSet.has(tool)) {
|
|
146
|
+
delta.push(`-${tool}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Tools to add: in desired but not in defaults
|
|
151
|
+
for (const tool of desiredTools) {
|
|
152
|
+
if (!defaultSet.has(tool)) {
|
|
153
|
+
delta.push(`+${tool}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return delta;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Deduplicate a project config against the default config.
|
|
162
|
+
*
|
|
163
|
+
* If a project override value is identical to the effective default, remove it
|
|
164
|
+
* from the override (it's redundant). This keeps overrides minimal.
|
|
165
|
+
*
|
|
166
|
+
* For tools: we compare the fully-resolved tool list. If the resolved tools
|
|
167
|
+
* equal the default tools, clear the project override.
|
|
168
|
+
*
|
|
169
|
+
* Also handles no-op delta dedup: if a stored delta becomes a no-op against
|
|
170
|
+
* the current defaults (e.g., "+tool" where tool is already in defaults),
|
|
171
|
+
* it is cleaned up since the user is explicitly confirming the tool should be available.
|
|
172
|
+
*
|
|
173
|
+
* @param defaultConfig - Agent's default config
|
|
174
|
+
* @param projectConfig - Project override config to deduplicate
|
|
175
|
+
* @returns Cleaned project config (may be empty object if all fields were identical to default)
|
|
176
|
+
*/
|
|
177
|
+
export function deduplicateProjectConfig(
|
|
178
|
+
defaultConfig: AgentDefaultConfig,
|
|
179
|
+
projectConfig: AgentProjectConfig
|
|
180
|
+
): AgentProjectConfig {
|
|
181
|
+
const cleaned: AgentProjectConfig = { ...projectConfig };
|
|
182
|
+
|
|
183
|
+
// Dedup model: if project model == default model, clear it
|
|
184
|
+
if (cleaned.model !== undefined && cleaned.model === defaultConfig.model) {
|
|
185
|
+
delete cleaned.model;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Dedup tools: resolve, normalize delta, and compare
|
|
189
|
+
if (cleaned.tools !== undefined) {
|
|
190
|
+
const defaultToolsResolved = defaultConfig.tools ?? [];
|
|
191
|
+
const resolvedProjectTools = resolveEffectiveTools(defaultConfig.tools, cleaned.tools);
|
|
192
|
+
|
|
193
|
+
// Compare resolved tools to default tools (order-insensitive)
|
|
194
|
+
if (arraysEqualUnordered(resolvedProjectTools ?? [], defaultToolsResolved)) {
|
|
195
|
+
delete cleaned.tools;
|
|
196
|
+
} else {
|
|
197
|
+
// Normalize: recompute the minimal delta from the fully-resolved tool list.
|
|
198
|
+
cleaned.tools = computeToolsDelta(defaultToolsResolved, resolvedProjectTools ?? []);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return cleaned;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Check if two arrays contain the same elements in the same order.
|
|
207
|
+
*/
|
|
208
|
+
export function arraysEqual<T>(a: T[], b: T[]): boolean {
|
|
209
|
+
if (a.length !== b.length) return false;
|
|
210
|
+
for (let i = 0; i < a.length; i++) {
|
|
211
|
+
if (a[i] !== b[i]) return false;
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Check if two arrays contain the same elements (order-independent).
|
|
218
|
+
* Used for tool list comparison where order doesn't matter for dedup.
|
|
219
|
+
*/
|
|
220
|
+
export function arraysEqualUnordered<T>(a: T[], b: T[]): boolean {
|
|
221
|
+
if (a.length !== b.length) return false;
|
|
222
|
+
const setA = new Set(a);
|
|
223
|
+
const setB = new Set(b);
|
|
224
|
+
if (setA.size !== setB.size) return false;
|
|
225
|
+
for (const item of setA) {
|
|
226
|
+
if (!setB.has(item)) return false;
|
|
227
|
+
}
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { agentStorage, createStoredAgent, type StoredAgent } from "@/agents/AgentStorage";
|
|
2
|
+
import { AgentNotFoundError, AgentValidationError } from "@/agents/errors";
|
|
3
|
+
import { installAgentScripts } from "@/agents/script-installer";
|
|
4
|
+
import { DEFAULT_AGENT_LLM_CONFIG } from "@/llm/constants";
|
|
5
|
+
import { getNDK } from "@/nostr";
|
|
6
|
+
import { logger } from "@/utils/logger";
|
|
7
|
+
import { toKebabCase } from "@/lib/string";
|
|
8
|
+
import type NDK from "@nostr-dev-kit/ndk";
|
|
9
|
+
import type { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
10
|
+
import { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
|
11
|
+
import { NDKAgentDefinition } from "@/events/NDKAgentDefinition";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* agent-installer - Pure Nostr operations for fetching agent definitions
|
|
15
|
+
*
|
|
16
|
+
* ## Responsibility
|
|
17
|
+
* Fetches agent definition events from Nostr relays and saves them to storage.
|
|
18
|
+
* - Fetches events by event ID
|
|
19
|
+
* - Validates event structure
|
|
20
|
+
* - Parses event into StoredAgent format
|
|
21
|
+
* - Generates private keys for agents
|
|
22
|
+
* - Installs bundled files from kind 1063 (NIP-94) events via e-tags
|
|
23
|
+
* - Saves to AgentStorage
|
|
24
|
+
*
|
|
25
|
+
* ## Architecture
|
|
26
|
+
* - **agent-installer** (this): Pure Nostr operations only
|
|
27
|
+
* - **script-installer**: Handles downloading and installing bundled scripts
|
|
28
|
+
* - **AgentStorage**: Handles persistence (uses this)
|
|
29
|
+
* - **agent-loader**: Orchestrates the full loading flow (uses this)
|
|
30
|
+
*
|
|
31
|
+
* ## Separation of Concerns
|
|
32
|
+
* This module is ONLY about Nostr:
|
|
33
|
+
* - No registry logic
|
|
34
|
+
* - No project logic
|
|
35
|
+
* - No in-memory state
|
|
36
|
+
* - Just: fetch → validate → parse → install scripts → save
|
|
37
|
+
*
|
|
38
|
+
* ## Usage
|
|
39
|
+
* Typically called by agent-loader when an agent is not found in storage.
|
|
40
|
+
* Can also be used standalone to pre-install agents.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // Install agent from Nostr
|
|
44
|
+
* const stored = await installAgentFromNostr('nostr:event123', 'my-agent');
|
|
45
|
+
* console.log('Installed:', stored.name);
|
|
46
|
+
*
|
|
47
|
+
* @see agent-loader for the complete loading orchestration
|
|
48
|
+
* @see AgentStorage for persistence operations
|
|
49
|
+
* @see script-installer for bundled script installation
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Validate that an NDK event is a valid agent definition event
|
|
54
|
+
*/
|
|
55
|
+
function validateAgentEvent(agentDef: NDKAgentDefinition): void {
|
|
56
|
+
// Check if event has required fields
|
|
57
|
+
if (!agentDef.id) {
|
|
58
|
+
throw new AgentValidationError("Agent event missing ID");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Check if event has a title tag (agents should have titles)
|
|
62
|
+
if (!agentDef.title || agentDef.title.trim() === "") {
|
|
63
|
+
throw new AgentValidationError("Agent event missing title tag");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Check if event has instructions
|
|
67
|
+
if (!agentDef.instructions || agentDef.instructions.trim() === "") {
|
|
68
|
+
logger.warn(`Agent event ${agentDef.id} has no instructions`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Parse an NDK agent definition event into StoredAgent data structure
|
|
74
|
+
*/
|
|
75
|
+
interface ParsedAgentEvent {
|
|
76
|
+
eventId: string;
|
|
77
|
+
slug: string;
|
|
78
|
+
name: string;
|
|
79
|
+
role: string;
|
|
80
|
+
description: string;
|
|
81
|
+
instructions: string;
|
|
82
|
+
useCriteria: string;
|
|
83
|
+
defaultConfig: { model: string; tools?: string[] };
|
|
84
|
+
definitionDTag?: string;
|
|
85
|
+
definitionAuthor?: string;
|
|
86
|
+
definitionCreatedAt?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function parseAgentEvent(event: NDKEvent, slug: string): ParsedAgentEvent {
|
|
90
|
+
// Wrap in NDKAgentDefinition to use proper accessors
|
|
91
|
+
const agentDef = NDKAgentDefinition.from(event);
|
|
92
|
+
|
|
93
|
+
// Validate before parsing
|
|
94
|
+
validateAgentEvent(agentDef);
|
|
95
|
+
|
|
96
|
+
const title = agentDef.title || "Unnamed Agent";
|
|
97
|
+
const description = agentDef.description || "";
|
|
98
|
+
const role = agentDef.role || "assistant";
|
|
99
|
+
const instructions = agentDef.instructions || "";
|
|
100
|
+
const useCriteria = agentDef.useCriteria || "";
|
|
101
|
+
|
|
102
|
+
// Extract definition tracking metadata for auto-upgrade monitoring
|
|
103
|
+
const definitionDTag = event.tagValue("d") || undefined;
|
|
104
|
+
const definitionAuthor = event.pubkey || undefined;
|
|
105
|
+
|
|
106
|
+
// Extract tool requirements from the agent definition event
|
|
107
|
+
const toolTags = event.tags
|
|
108
|
+
.filter((tag) => tag[0] === "tool" && tag[1])
|
|
109
|
+
.map((tag) => tag[1]);
|
|
110
|
+
|
|
111
|
+
if (toolTags.length > 0) {
|
|
112
|
+
logger.info(`Agent "${title}" requests access to ${toolTags.length} tool(s):`, toolTags);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
eventId: event.id,
|
|
117
|
+
slug,
|
|
118
|
+
name: title,
|
|
119
|
+
role,
|
|
120
|
+
description,
|
|
121
|
+
instructions,
|
|
122
|
+
useCriteria,
|
|
123
|
+
defaultConfig: {
|
|
124
|
+
model: DEFAULT_AGENT_LLM_CONFIG,
|
|
125
|
+
tools: toolTags.length > 0 ? toolTags : undefined,
|
|
126
|
+
},
|
|
127
|
+
definitionDTag,
|
|
128
|
+
definitionAuthor,
|
|
129
|
+
definitionCreatedAt: event.created_at,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Install an agent from an already-fetched NDKEvent.
|
|
135
|
+
*
|
|
136
|
+
* Core installation logic: validate → parse → generate keys → install scripts → save → return
|
|
137
|
+
*
|
|
138
|
+
* @param event - The NDKEvent containing the agent definition
|
|
139
|
+
* @param customSlug - Optional custom slug (defaults to kebab-case of agent name)
|
|
140
|
+
* @param ndk - Optional NDK instance (uses default if not provided, needed for script downloads)
|
|
141
|
+
* @returns The saved StoredAgent (with generated private key)
|
|
142
|
+
* @throws AgentValidationError if event structure is invalid
|
|
143
|
+
*/
|
|
144
|
+
export async function installAgentFromNostrEvent(
|
|
145
|
+
event: NDKEvent,
|
|
146
|
+
customSlug?: string,
|
|
147
|
+
ndk?: NDK
|
|
148
|
+
): Promise<StoredAgent> {
|
|
149
|
+
const ndkInstance = ndk || getNDK();
|
|
150
|
+
|
|
151
|
+
// Check if an agent with this eventId already exists
|
|
152
|
+
// This preserves user configuration (llmConfig, pmOverrides, etc.)
|
|
153
|
+
if (event.id) {
|
|
154
|
+
const existingAgent = await agentStorage.getAgentByEventId(event.id);
|
|
155
|
+
if (existingAgent) {
|
|
156
|
+
logger.debug(
|
|
157
|
+
`Agent with eventId ${event.id} already exists as "${existingAgent.slug}", ` +
|
|
158
|
+
`preserving existing configuration`
|
|
159
|
+
);
|
|
160
|
+
return existingAgent;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const agentDef = NDKAgentDefinition.from(event);
|
|
165
|
+
|
|
166
|
+
// Generate slug: prefer customSlug > event's d-tag > derived from title
|
|
167
|
+
const slug = customSlug || agentDef.slug || toKebabCase(agentDef.title || "unnamed-agent");
|
|
168
|
+
|
|
169
|
+
// Parse and validate the event into agent data
|
|
170
|
+
const agentData = parseAgentEvent(event, slug);
|
|
171
|
+
|
|
172
|
+
// Generate a new private key for this agent
|
|
173
|
+
const signer = NDKPrivateKeySigner.generate();
|
|
174
|
+
|
|
175
|
+
// Install bundled files from kind 1063 events (referenced via e-tags)
|
|
176
|
+
const fileETags = agentDef.getETags();
|
|
177
|
+
if (fileETags.length > 0) {
|
|
178
|
+
logger.info(`Agent "${agentData.name}" has ${fileETags.length} bundled file(s)`);
|
|
179
|
+
const fileResults = await installAgentScripts(fileETags, signer.pubkey, ndkInstance);
|
|
180
|
+
|
|
181
|
+
const failures = fileResults.filter((r) => !r.success);
|
|
182
|
+
if (failures.length > 0) {
|
|
183
|
+
logger.warn(`${failures.length} file(s) failed to install for agent "${agentData.name}"`, {
|
|
184
|
+
failures: failures.map((f) => ({ path: f.relativePath, error: f.error })),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const storedAgent = createStoredAgent({
|
|
190
|
+
nsec: signer.nsec,
|
|
191
|
+
slug: agentData.slug,
|
|
192
|
+
name: agentData.name,
|
|
193
|
+
role: agentData.role,
|
|
194
|
+
description: agentData.description,
|
|
195
|
+
instructions: agentData.instructions,
|
|
196
|
+
useCriteria: agentData.useCriteria,
|
|
197
|
+
defaultConfig: agentData.defaultConfig,
|
|
198
|
+
eventId: agentData.eventId,
|
|
199
|
+
definitionDTag: agentData.definitionDTag,
|
|
200
|
+
definitionAuthor: agentData.definitionAuthor,
|
|
201
|
+
definitionCreatedAt: agentData.definitionCreatedAt,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
await agentStorage.saveAgent(storedAgent);
|
|
205
|
+
logger.info(`Installed agent "${agentData.name}" (${slug}) from Nostr event ${event.id}`);
|
|
206
|
+
|
|
207
|
+
return storedAgent;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Fetch an agent definition event from Nostr by ID and install it.
|
|
212
|
+
*
|
|
213
|
+
* @param eventId - The Nostr event ID (with or without "nostr:" prefix)
|
|
214
|
+
* @param customSlug - Optional custom slug (defaults to kebab-case of agent name)
|
|
215
|
+
* @param ndk - Optional NDK instance (uses default if not provided)
|
|
216
|
+
* @returns The saved StoredAgent (with generated private key)
|
|
217
|
+
* @throws AgentNotFoundError if event not found on relays
|
|
218
|
+
* @throws AgentValidationError if event structure is invalid
|
|
219
|
+
*/
|
|
220
|
+
export async function installAgentFromNostr(
|
|
221
|
+
eventId: string,
|
|
222
|
+
customSlug?: string,
|
|
223
|
+
ndk?: NDK
|
|
224
|
+
): Promise<StoredAgent> {
|
|
225
|
+
const ndkInstance = ndk || getNDK();
|
|
226
|
+
const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
|
|
227
|
+
|
|
228
|
+
logger.debug(`Fetching agent event ${cleanEventId} from Nostr relays`);
|
|
229
|
+
const agentEvent = await ndkInstance.fetchEvent(cleanEventId, { groupable: false });
|
|
230
|
+
|
|
231
|
+
if (!agentEvent) {
|
|
232
|
+
throw new AgentNotFoundError(cleanEventId);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return installAgentFromNostrEvent(agentEvent, customSlug, ndkInstance);
|
|
236
|
+
}
|