@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,241 @@
|
|
|
1
|
+
import type { AgentRegistry } from "@/agents/AgentRegistry";
|
|
2
|
+
import { agentStorage, type StoredAgent } from "@/agents/AgentStorage";
|
|
3
|
+
import { installAgentFromNostr } from "@/agents/agent-installer";
|
|
4
|
+
import { AgentSlugConflictError } from "@/agents/errors";
|
|
5
|
+
import { processAgentTools } from "@/agents/tool-normalization";
|
|
6
|
+
import type { AgentInstance } from "@/agents/types";
|
|
7
|
+
import { AgentMetadataStore } from "@/services/agents";
|
|
8
|
+
import { DEFAULT_AGENT_LLM_CONFIG } from "@/llm/constants";
|
|
9
|
+
import type { MCPConfig } from "@/llm/providers/types";
|
|
10
|
+
import { AgentProfilePublisher } from "@/nostr/AgentProfilePublisher";
|
|
11
|
+
import { config } from "@/services/ConfigService";
|
|
12
|
+
import { logger } from "@/utils/logger";
|
|
13
|
+
import { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
|
14
|
+
import type { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Agent loading orchestration.
|
|
18
|
+
* Single entry point for loading agents into registry.
|
|
19
|
+
* Handles the complete flow: registry → storage → Nostr
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Create an AgentInstance from stored agent data.
|
|
24
|
+
* This is the hydration step from persistent data to runtime object.
|
|
25
|
+
* Exported for use in agent creation tools (e.g., agents_write).
|
|
26
|
+
*
|
|
27
|
+
* @param storedAgent - The stored agent data
|
|
28
|
+
* @param registry - The agent registry (used for metadata and LLM service creation)
|
|
29
|
+
* @param projectDTag - Optional project dTag for resolving project-scoped config
|
|
30
|
+
*/
|
|
31
|
+
export function createAgentInstance(
|
|
32
|
+
storedAgent: StoredAgent,
|
|
33
|
+
registry: AgentRegistry,
|
|
34
|
+
projectDTag?: string
|
|
35
|
+
): AgentInstance {
|
|
36
|
+
const signer = new NDKPrivateKeySigner(storedAgent.nsec);
|
|
37
|
+
const pubkey = signer.pubkey;
|
|
38
|
+
|
|
39
|
+
// Resolve effective configuration: projectOverrides[dTag] ?? default
|
|
40
|
+
const resolvedConfig = agentStorage.getEffectiveConfig(storedAgent, projectDTag);
|
|
41
|
+
const effectiveLLMConfig = resolvedConfig.model;
|
|
42
|
+
const effectiveTools = resolvedConfig.tools;
|
|
43
|
+
|
|
44
|
+
// Process tools using pure functions
|
|
45
|
+
const validToolNames = processAgentTools(effectiveTools || [], storedAgent.slug);
|
|
46
|
+
|
|
47
|
+
// Build agent-specific MCP config from stored mcpServers
|
|
48
|
+
const agentMcpConfig: MCPConfig | undefined = storedAgent.mcpServers
|
|
49
|
+
? {
|
|
50
|
+
enabled: true,
|
|
51
|
+
servers: storedAgent.mcpServers,
|
|
52
|
+
}
|
|
53
|
+
: undefined;
|
|
54
|
+
|
|
55
|
+
const agent: AgentInstance = {
|
|
56
|
+
name: storedAgent.name,
|
|
57
|
+
pubkey,
|
|
58
|
+
signer,
|
|
59
|
+
role: storedAgent.role,
|
|
60
|
+
description: storedAgent.description,
|
|
61
|
+
instructions: storedAgent.instructions,
|
|
62
|
+
useCriteria: storedAgent.useCriteria,
|
|
63
|
+
llmConfig: effectiveLLMConfig || DEFAULT_AGENT_LLM_CONFIG,
|
|
64
|
+
tools: validToolNames,
|
|
65
|
+
eventId: storedAgent.eventId,
|
|
66
|
+
slug: storedAgent.slug,
|
|
67
|
+
mcpServers: storedAgent.mcpServers,
|
|
68
|
+
pmOverrides: storedAgent.pmOverrides,
|
|
69
|
+
isPM: storedAgent.isPM,
|
|
70
|
+
projectOverrides: storedAgent.projectOverrides,
|
|
71
|
+
createMetadataStore: (conversationId: string) => {
|
|
72
|
+
const metadataPath = registry.getMetadataPath();
|
|
73
|
+
return new AgentMetadataStore(conversationId, storedAgent.slug, metadataPath);
|
|
74
|
+
},
|
|
75
|
+
createLLMService: (options) => {
|
|
76
|
+
// Merge passed mcpConfig with agent's own mcpConfig
|
|
77
|
+
// Agent-specific servers override project-level servers on name collision
|
|
78
|
+
// Project-level enabled flag takes precedence (default to true if not specified)
|
|
79
|
+
let mergedMcpConfig: MCPConfig | undefined;
|
|
80
|
+
if (options?.mcpConfig && agentMcpConfig) {
|
|
81
|
+
mergedMcpConfig = {
|
|
82
|
+
enabled: options.mcpConfig.enabled !== false,
|
|
83
|
+
servers: {
|
|
84
|
+
...options.mcpConfig.servers, // project-level first
|
|
85
|
+
...agentMcpConfig.servers, // agent-specific overrides
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
mergedMcpConfig = options?.mcpConfig || agentMcpConfig;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Use resolved config name if provided (for meta model resolution),
|
|
93
|
+
// otherwise use the agent's llmConfig
|
|
94
|
+
const configName = options?.resolvedConfigName || agent.llmConfig || DEFAULT_AGENT_LLM_CONFIG;
|
|
95
|
+
|
|
96
|
+
return config.createLLMService(
|
|
97
|
+
configName,
|
|
98
|
+
{
|
|
99
|
+
tools: options?.tools ?? {},
|
|
100
|
+
agentName: storedAgent.name,
|
|
101
|
+
sessionId: options?.sessionId,
|
|
102
|
+
workingDirectory: options?.workingDirectory ?? registry.getBasePath(),
|
|
103
|
+
mcpConfig: mergedMcpConfig,
|
|
104
|
+
conversationId: options?.conversationId,
|
|
105
|
+
onStreamStart: options?.onStreamStart,
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
},
|
|
109
|
+
sign: async (event: NDKEvent) => {
|
|
110
|
+
await event.sign(signer, { pTags: false });
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return agent;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Load an agent by eventId into the registry.
|
|
119
|
+
* This is the ONLY function needed for loading agents.
|
|
120
|
+
*
|
|
121
|
+
* Flow (no redundant checks):
|
|
122
|
+
* 1. Check if already in registry → return
|
|
123
|
+
* 2. Check storage → load and return
|
|
124
|
+
* 3. Not in storage → fetch from Nostr → save → load → return
|
|
125
|
+
*
|
|
126
|
+
* @param eventId - The Nostr event ID of the agent definition
|
|
127
|
+
* @param registry - The AgentRegistry to load the agent into
|
|
128
|
+
* @param customSlug - Optional custom slug for the agent
|
|
129
|
+
* @returns The loaded AgentInstance
|
|
130
|
+
* @throws Error if agent cannot be loaded
|
|
131
|
+
*/
|
|
132
|
+
export async function loadAgentIntoRegistry(
|
|
133
|
+
eventId: string,
|
|
134
|
+
registry: AgentRegistry,
|
|
135
|
+
customSlug?: string
|
|
136
|
+
): Promise<AgentInstance> {
|
|
137
|
+
// Clean event ID
|
|
138
|
+
const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
|
|
139
|
+
|
|
140
|
+
// Step 1: Check if already in registry by eventId
|
|
141
|
+
const existingByEventId = registry.getAgentByEventId(cleanEventId);
|
|
142
|
+
if (existingByEventId) {
|
|
143
|
+
logger.debug(`Agent ${cleanEventId} already loaded in registry as ${existingByEventId.slug}`);
|
|
144
|
+
return existingByEventId;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// If custom slug provided, also check by slug
|
|
148
|
+
if (customSlug) {
|
|
149
|
+
const existingBySlug = registry.getAgent(customSlug);
|
|
150
|
+
if (existingBySlug) {
|
|
151
|
+
if (existingBySlug.eventId === cleanEventId) {
|
|
152
|
+
logger.debug(`Agent ${customSlug} already loaded with same event ID`);
|
|
153
|
+
return existingBySlug;
|
|
154
|
+
}
|
|
155
|
+
throw new AgentSlugConflictError(customSlug, existingBySlug.eventId, cleanEventId);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Step 2: Check storage by eventId
|
|
160
|
+
let storedAgent = await agentStorage.getAgentByEventId(cleanEventId);
|
|
161
|
+
|
|
162
|
+
if (!storedAgent) {
|
|
163
|
+
// Step 3: Not in storage - fetch from Nostr and save
|
|
164
|
+
logger.debug(`Agent ${cleanEventId} not in storage, fetching from Nostr`);
|
|
165
|
+
storedAgent = await installAgentFromNostr(cleanEventId, customSlug);
|
|
166
|
+
} else {
|
|
167
|
+
logger.debug(`Agent ${cleanEventId} found in storage as ${storedAgent.slug}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// If custom slug provided and different from stored slug, update it
|
|
171
|
+
if (customSlug && storedAgent.slug !== customSlug) {
|
|
172
|
+
// Check if the custom slug is already taken by a different agent
|
|
173
|
+
const existingWithCustomSlug = await agentStorage.getAgentBySlug(customSlug);
|
|
174
|
+
if (existingWithCustomSlug) {
|
|
175
|
+
throw new AgentSlugConflictError(
|
|
176
|
+
customSlug,
|
|
177
|
+
existingWithCustomSlug.eventId,
|
|
178
|
+
cleanEventId
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Update slug
|
|
183
|
+
storedAgent.slug = customSlug;
|
|
184
|
+
await agentStorage.saveAgent(storedAgent);
|
|
185
|
+
logger.info(`Updated agent slug to ${customSlug}`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Ensure agent is associated with this project using storage method
|
|
189
|
+
const projectDTag = registry.getProjectDTag();
|
|
190
|
+
const signer = new NDKPrivateKeySigner(storedAgent.nsec);
|
|
191
|
+
const pubkey = signer.pubkey;
|
|
192
|
+
|
|
193
|
+
if (projectDTag) {
|
|
194
|
+
await agentStorage.addAgentToProject(pubkey, projectDTag);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Reload agent after project association to ensure fresh state
|
|
198
|
+
const freshAgent = await agentStorage.loadAgent(pubkey);
|
|
199
|
+
if (!freshAgent) {
|
|
200
|
+
throw new Error(`Agent ${storedAgent.slug} disappeared after project association`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Create instance and add to registry
|
|
204
|
+
// Pass projectDTag so project-scoped config can be resolved
|
|
205
|
+
const instance = createAgentInstance(freshAgent, registry, projectDTag);
|
|
206
|
+
registry.addAgent(instance);
|
|
207
|
+
|
|
208
|
+
// Publish kind:0 profile for this agent now that it's associated with the project
|
|
209
|
+
const ndkProject = registry.getNDKProject();
|
|
210
|
+
if (ndkProject) {
|
|
211
|
+
try {
|
|
212
|
+
const projectTitle = ndkProject.tagValue("title") || "Untitled Project";
|
|
213
|
+
const whitelistedPubkeys = config.getWhitelistedPubkeys(undefined, config.getConfig());
|
|
214
|
+
|
|
215
|
+
AgentProfilePublisher.publishAgentProfile(
|
|
216
|
+
signer,
|
|
217
|
+
freshAgent.name,
|
|
218
|
+
freshAgent.role,
|
|
219
|
+
projectTitle,
|
|
220
|
+
ndkProject,
|
|
221
|
+
freshAgent.eventId,
|
|
222
|
+
{
|
|
223
|
+
description: freshAgent.description,
|
|
224
|
+
instructions: freshAgent.instructions,
|
|
225
|
+
useCriteria: freshAgent.useCriteria,
|
|
226
|
+
},
|
|
227
|
+
whitelistedPubkeys
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
logger.debug(`Published kind:0 profile for agent ${freshAgent.name} on project ${projectDTag}`);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
logger.warn(`Failed to publish kind:0 profile for agent ${freshAgent.name}`, { error });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
logger.info(
|
|
237
|
+
`Loaded agent "${instance.name}" (${instance.slug}) into registry for project ${projectDTag}`
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
return instance;
|
|
241
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ToolName } from "@/tools/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core tools that ALL agents must have access to regardless of configuration.
|
|
5
|
+
* These are fundamental capabilities that every agent needs.
|
|
6
|
+
* NOT announced in 24010 events - auto-injected to all agents.
|
|
7
|
+
*/
|
|
8
|
+
export const CORE_AGENT_TOOLS: ToolName[] = [
|
|
9
|
+
"lesson_get", // All agents should access lessons
|
|
10
|
+
"lessons_list", // All agents should be able to list lessons
|
|
11
|
+
"lesson_learn", // All agents should be able to learn
|
|
12
|
+
"lesson_delete", // All agents should be able to delete their lessons
|
|
13
|
+
"reports_list", // All agents should see available reports
|
|
14
|
+
"report_read", // All agents should read reports
|
|
15
|
+
"report_write", // All agents should be able to write reports
|
|
16
|
+
"report_delete", // All agents should be able to delete reports
|
|
17
|
+
// Todo tool for task tracking
|
|
18
|
+
"todo_write", // All agents should be able to write/update todos
|
|
19
|
+
// Conversation tools for project introspection
|
|
20
|
+
"conversation_get", // All agents should access conversation details
|
|
21
|
+
"conversation_list", // All agents should list conversations
|
|
22
|
+
// Unified search across all project knowledge
|
|
23
|
+
"search", // All agents should be able to search across reports, conversations, and lessons
|
|
24
|
+
// Process control
|
|
25
|
+
"kill", // All agents should be able to terminate processes
|
|
26
|
+
// MCP resource reading and subscriptions (self-gating: only works if agent has MCP tools from that server)
|
|
27
|
+
"mcp_resource_read", // All agents can read MCP resources from servers they have tools for
|
|
28
|
+
"mcp_subscribe", // All agents can subscribe to MCP resource notifications
|
|
29
|
+
] as const;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Delegate tools that should be excluded from configuration and TenexProjectStatus events
|
|
33
|
+
*/
|
|
34
|
+
export const DELEGATE_TOOLS: ToolName[] = [
|
|
35
|
+
"ask",
|
|
36
|
+
"delegate",
|
|
37
|
+
"delegate_crossproject",
|
|
38
|
+
"delegate_followup",
|
|
39
|
+
] as const;
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Tools auto-injected at runtime based on capability (not announced in 24010).
|
|
44
|
+
* fs_read implies fs_glob + fs_grep; fs_write implies fs_edit.
|
|
45
|
+
*/
|
|
46
|
+
export const AUTO_INJECTED_TOOLS: ToolName[] = ["fs_edit", "fs_glob", "fs_grep"];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Context-sensitive tools that are auto-injected based on runtime conditions.
|
|
50
|
+
* These should NOT appear in TenexProjectStatus (24010) events since they're
|
|
51
|
+
* not configurable per-agent - they're injected based on execution context.
|
|
52
|
+
*/
|
|
53
|
+
export const CONTEXT_INJECTED_TOOLS: ToolName[] = [
|
|
54
|
+
// Meta model tool (injected when agent uses a meta model configuration)
|
|
55
|
+
"change_model",
|
|
56
|
+
// Home-scoped filesystem tools (injected when agent lacks fs_* tools)
|
|
57
|
+
"home_fs_read",
|
|
58
|
+
"home_fs_write",
|
|
59
|
+
"home_fs_grep",
|
|
60
|
+
// MCP subscription stop (injected when agent has active MCP subscriptions)
|
|
61
|
+
"mcp_subscription_stop",
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get the delegate tools for an agent
|
|
66
|
+
* This is the SINGLE source of truth for delegate tool assignment
|
|
67
|
+
*/
|
|
68
|
+
export function getDelegateToolsForAgent(): ToolName[] {
|
|
69
|
+
const tools: ToolName[] = [];
|
|
70
|
+
|
|
71
|
+
// All agents get ask tool
|
|
72
|
+
tools.push("ask");
|
|
73
|
+
|
|
74
|
+
// All agents get the unified delegate tool
|
|
75
|
+
tools.push("delegate");
|
|
76
|
+
|
|
77
|
+
// All agents get delegate_crossproject and delegate_followup
|
|
78
|
+
tools.push("delegate_crossproject");
|
|
79
|
+
tools.push("delegate_followup");
|
|
80
|
+
|
|
81
|
+
return tools;
|
|
82
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-specific error types for better error handling
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export class AgentError extends Error {
|
|
6
|
+
constructor(message: string) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "AgentError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class AgentNotFoundError extends AgentError {
|
|
13
|
+
constructor(
|
|
14
|
+
public readonly eventId: string,
|
|
15
|
+
message?: string
|
|
16
|
+
) {
|
|
17
|
+
super(
|
|
18
|
+
message ||
|
|
19
|
+
`Agent event ${eventId} not found on Nostr relays. The event may not have been published yet or your relays may not have it.`
|
|
20
|
+
);
|
|
21
|
+
this.name = "AgentNotFoundError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class AgentSlugConflictError extends AgentError {
|
|
26
|
+
constructor(
|
|
27
|
+
public readonly slug: string,
|
|
28
|
+
public readonly existingPubkey?: string,
|
|
29
|
+
public readonly attemptedPubkey?: string
|
|
30
|
+
) {
|
|
31
|
+
const message = `Agent slug conflict: slug "${slug}" already claimed by different agent`;
|
|
32
|
+
const details = existingPubkey && attemptedPubkey
|
|
33
|
+
? `\nExisting agent: ${existingPubkey.substring(0, 12)}...` +
|
|
34
|
+
`\nAttempted agent: ${attemptedPubkey.substring(0, 12)}...` +
|
|
35
|
+
`\n\nSuggestion: Remove the existing agent from overlapping projects or use a different slug.`
|
|
36
|
+
: "";
|
|
37
|
+
|
|
38
|
+
super(message + details);
|
|
39
|
+
this.name = "AgentSlugConflictError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class AgentValidationError extends AgentError {
|
|
44
|
+
constructor(message: string) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = "AgentValidationError";
|
|
47
|
+
}
|
|
48
|
+
}
|