@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,171 @@
|
|
|
1
|
+
import type { ModelMessage, ToolSet } from "ai";
|
|
2
|
+
import type { TodoStatus } from "../../services/ral/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* When heuristic checks run relative to agent execution
|
|
6
|
+
*/
|
|
7
|
+
export type HeuristicTiming = "pre-tool-execution" | "post-completion";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Result of a heuristic detection check
|
|
11
|
+
*/
|
|
12
|
+
export interface HeuristicDetection {
|
|
13
|
+
/** Whether the heuristic condition was triggered */
|
|
14
|
+
triggered: boolean;
|
|
15
|
+
/** Human-readable reason for the detection */
|
|
16
|
+
reason?: string;
|
|
17
|
+
/** Additional evidence that led to the detection */
|
|
18
|
+
evidence?: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Result of LLM verification of a heuristic detection
|
|
23
|
+
*/
|
|
24
|
+
export interface VerificationResult {
|
|
25
|
+
/** Whether the detection was confirmed as a real violation */
|
|
26
|
+
verdict: "ok" | "violation";
|
|
27
|
+
/** Explanation of the verdict */
|
|
28
|
+
explanation: string;
|
|
29
|
+
/** Optional message to inject for correction */
|
|
30
|
+
correctionMessage?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Action to take when a violation is confirmed
|
|
35
|
+
*/
|
|
36
|
+
export interface CorrectionAction {
|
|
37
|
+
/** Type of correction to apply */
|
|
38
|
+
type: "inject-message" | "block-tool" | "suppress-publish";
|
|
39
|
+
/** Correction message to provide to the agent. Used for inject-message type and
|
|
40
|
+
* for suppress-publish type when reEngage is true (to guide the agent on what to fix). */
|
|
41
|
+
message?: string;
|
|
42
|
+
/** Whether to re-engage the agent after correction */
|
|
43
|
+
reEngage: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Context provided to the supervisor LLM for verification
|
|
48
|
+
*/
|
|
49
|
+
export interface SupervisionContext {
|
|
50
|
+
/** Agent identifier slug */
|
|
51
|
+
agentSlug: string;
|
|
52
|
+
/** Agent's Nostr public key */
|
|
53
|
+
agentPubkey: string;
|
|
54
|
+
/** The agent's system prompt */
|
|
55
|
+
systemPrompt: string;
|
|
56
|
+
/** Full conversation history */
|
|
57
|
+
conversationHistory: ModelMessage[];
|
|
58
|
+
/** Tools available to the agent */
|
|
59
|
+
availableTools: ToolSet;
|
|
60
|
+
/** ID of the heuristic that triggered */
|
|
61
|
+
triggeringHeuristic: string;
|
|
62
|
+
/** Detection result from the heuristic */
|
|
63
|
+
detection: HeuristicDetection;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* State tracking for supervision of an execution
|
|
68
|
+
*/
|
|
69
|
+
export interface SupervisionState {
|
|
70
|
+
/** Number of retry attempts made */
|
|
71
|
+
retryCount: number;
|
|
72
|
+
/** Maximum allowed retries */
|
|
73
|
+
maxRetries: number;
|
|
74
|
+
/** ID of the last triggered heuristic */
|
|
75
|
+
lastHeuristicTriggered?: string;
|
|
76
|
+
/** Set of heuristic IDs that have been enforced in this execution (in-memory only) */
|
|
77
|
+
enforcedHeuristics: Set<string>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Context for post-completion heuristic checks
|
|
82
|
+
*/
|
|
83
|
+
export interface PostCompletionContext {
|
|
84
|
+
/** Agent identifier slug */
|
|
85
|
+
agentSlug: string;
|
|
86
|
+
/** Agent's Nostr public key */
|
|
87
|
+
agentPubkey: string;
|
|
88
|
+
/** The final message content from the agent */
|
|
89
|
+
messageContent: string;
|
|
90
|
+
/** Names of tools that were called during execution */
|
|
91
|
+
toolCallsMade: string[];
|
|
92
|
+
/** The agent's system prompt */
|
|
93
|
+
systemPrompt: string;
|
|
94
|
+
/** Full conversation history */
|
|
95
|
+
conversationHistory: ModelMessage[];
|
|
96
|
+
/** Tools available to the agent */
|
|
97
|
+
availableTools: ToolSet;
|
|
98
|
+
/** Whether the agent has already been nudged about todo usage in this conversation */
|
|
99
|
+
hasBeenNudgedAboutTodos: boolean;
|
|
100
|
+
/** The agent's todo items (for detailed inspection by heuristics) */
|
|
101
|
+
todos: Array<{ id: string; title: string; status: TodoStatus; description?: string }>;
|
|
102
|
+
/** Number of pending delegations the agent is waiting for (0 if none) */
|
|
103
|
+
pendingDelegationCount: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Context for pre-tool execution heuristic checks
|
|
108
|
+
*/
|
|
109
|
+
export interface PreToolContext {
|
|
110
|
+
/** Agent identifier slug */
|
|
111
|
+
agentSlug: string;
|
|
112
|
+
/** Agent's Nostr public key */
|
|
113
|
+
agentPubkey: string;
|
|
114
|
+
/** Name of the tool about to be executed */
|
|
115
|
+
toolName: string;
|
|
116
|
+
/** Arguments passed to the tool */
|
|
117
|
+
toolArgs: unknown;
|
|
118
|
+
/** The agent's system prompt */
|
|
119
|
+
systemPrompt: string;
|
|
120
|
+
/** Full conversation history */
|
|
121
|
+
conversationHistory: ModelMessage[];
|
|
122
|
+
/** Tools available to the agent */
|
|
123
|
+
availableTools: ToolSet;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Base interface for all heuristics
|
|
128
|
+
*/
|
|
129
|
+
export interface Heuristic<TContext> {
|
|
130
|
+
/** Unique identifier for the heuristic */
|
|
131
|
+
id: string;
|
|
132
|
+
/** Human-readable name */
|
|
133
|
+
name: string;
|
|
134
|
+
/** When this heuristic runs */
|
|
135
|
+
timing: HeuristicTiming;
|
|
136
|
+
/** Optional filter to only run for specific tools (pre-tool-execution only) */
|
|
137
|
+
toolFilter?: string[];
|
|
138
|
+
/** Skip LLM verification and apply correction directly on detection (for low-stakes nudges) */
|
|
139
|
+
skipVerification?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Detect if the heuristic condition is met
|
|
142
|
+
* @param context - The context to check
|
|
143
|
+
* @returns Detection result indicating if triggered
|
|
144
|
+
*/
|
|
145
|
+
detect(context: TContext): Promise<HeuristicDetection>;
|
|
146
|
+
/**
|
|
147
|
+
* Build the prompt for the supervisor LLM to verify the detection
|
|
148
|
+
* @param context - The context that triggered detection
|
|
149
|
+
* @param detection - The detection result
|
|
150
|
+
* @returns Prompt string for the LLM
|
|
151
|
+
*/
|
|
152
|
+
buildVerificationPrompt(context: TContext, detection: HeuristicDetection): string;
|
|
153
|
+
/**
|
|
154
|
+
* Build the correction message to inject back to the agent
|
|
155
|
+
* @param context - The original context
|
|
156
|
+
* @param verification - The LLM verification result
|
|
157
|
+
* @returns Message to inject
|
|
158
|
+
*/
|
|
159
|
+
buildCorrectionMessage(context: TContext, verification: VerificationResult): string;
|
|
160
|
+
/**
|
|
161
|
+
* Get the correction action to take
|
|
162
|
+
* @param verification - The LLM verification result
|
|
163
|
+
* @returns The correction action
|
|
164
|
+
*/
|
|
165
|
+
getCorrectionAction(verification: VerificationResult): CorrectionAction;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Maximum number of supervision retries before giving up
|
|
170
|
+
*/
|
|
171
|
+
export const MAX_SUPERVISION_RETRIES = 3;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ToolName } from "@/tools/types";
|
|
2
|
+
import { DELEGATE_TOOLS } from "./constants";
|
|
3
|
+
|
|
4
|
+
export type McpToolNameParts = {
|
|
5
|
+
serverName: string;
|
|
6
|
+
toolName: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function parseMcpToolName(toolName: string): McpToolNameParts | null {
|
|
10
|
+
if (!toolName.startsWith("mcp__")) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const parts = toolName.split("__");
|
|
15
|
+
if (parts.length < 3) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const serverName = parts[1];
|
|
20
|
+
const parsedToolName = parts.slice(2).join("__");
|
|
21
|
+
|
|
22
|
+
if (!serverName || !parsedToolName) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { serverName, toolName: parsedToolName };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function unwrapMcpToolName(toolName: string): string {
|
|
30
|
+
const parsed = parseMcpToolName(toolName);
|
|
31
|
+
return parsed ? parsed.toolName : toolName;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function formatMcpToolName(toolName: string): string {
|
|
35
|
+
const parsed = parseMcpToolName(toolName);
|
|
36
|
+
if (!parsed) {
|
|
37
|
+
return toolName;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return `${parsed.serverName}'s ${parsed.toolName.replace(/_/g, " ")}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function isDelegateToolName(toolName: string): boolean {
|
|
44
|
+
const baseName = unwrapMcpToolName(toolName);
|
|
45
|
+
return DELEGATE_TOOLS.includes(baseName as ToolName);
|
|
46
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import type { MCPManager } from "@/services/mcp/MCPManager";
|
|
2
|
+
import { isValidToolName } from "@/tools/registry";
|
|
3
|
+
import type { ToolName } from "@/tools/types";
|
|
4
|
+
import { logger } from "@/utils/logger";
|
|
5
|
+
import { CORE_AGENT_TOOLS, DELEGATE_TOOLS, getDelegateToolsForAgent } from "./constants";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* tool-normalization - Pure functions for processing agent tool lists
|
|
9
|
+
*
|
|
10
|
+
* ## Responsibility
|
|
11
|
+
* Centralizes all tool assignment logic that was previously scattered across:
|
|
12
|
+
* - AgentRegistry
|
|
13
|
+
* - agent-loader
|
|
14
|
+
* - Agent creation tools
|
|
15
|
+
*
|
|
16
|
+
* ## What it does
|
|
17
|
+
* Takes a raw tool list + agent context → returns final validated tool list:
|
|
18
|
+
* 1. Filter out delegate tools (managed separately)
|
|
19
|
+
* 2. Add appropriate delegate tools
|
|
20
|
+
* 3. Add core tools (all agents get these)
|
|
21
|
+
* 4. Validate tool names
|
|
22
|
+
* 5. Resolve MCP tools (check availability)
|
|
23
|
+
* 6. Return final deduplicated list
|
|
24
|
+
*
|
|
25
|
+
* ## Pure Functions
|
|
26
|
+
* All functions here are stateless and side-effect free:
|
|
27
|
+
* - Same input = same output
|
|
28
|
+
* - No external state
|
|
29
|
+
* - No mutations
|
|
30
|
+
* - Easy to test
|
|
31
|
+
*
|
|
32
|
+
* ## Usage
|
|
33
|
+
* Called during AgentInstance creation in agent-loader.ts:
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const finalTools = processAgentTools(storedAgent.tools, storedAgent.slug);
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @see agent-loader for usage in instance creation
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Normalize agent tools by applying business rules:
|
|
43
|
+
* 1. Filter out delegate tools (they're managed separately)
|
|
44
|
+
* 2. Add appropriate delegate tools
|
|
45
|
+
* 3. Ensure all core tools are included
|
|
46
|
+
*/
|
|
47
|
+
export function normalizeAgentTools(requestedTools: string[]): string[] {
|
|
48
|
+
// Filter out delegation tools
|
|
49
|
+
const toolNames = requestedTools.filter((tool) => {
|
|
50
|
+
const typedTool = tool as ToolName;
|
|
51
|
+
return !DELEGATE_TOOLS.includes(typedTool);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Add delegation tools
|
|
55
|
+
const delegateTools = getDelegateToolsForAgent();
|
|
56
|
+
toolNames.push(...delegateTools);
|
|
57
|
+
|
|
58
|
+
// Ensure core tools are included
|
|
59
|
+
for (const coreTool of CORE_AGENT_TOOLS) {
|
|
60
|
+
if (!toolNames.includes(coreTool)) {
|
|
61
|
+
toolNames.push(coreTool);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return toolNames;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Validate and filter tools, separating valid tools from MCP tool requests.
|
|
70
|
+
*
|
|
71
|
+
* ## Warning: Unrecognized tools are logged
|
|
72
|
+
* Tools that are neither valid static tools nor MCP tools are logged as warnings.
|
|
73
|
+
*/
|
|
74
|
+
export function validateAndSeparateTools(toolNames: string[]): {
|
|
75
|
+
validTools: string[];
|
|
76
|
+
mcpToolRequests: string[];
|
|
77
|
+
} {
|
|
78
|
+
const validTools: string[] = [];
|
|
79
|
+
const mcpToolRequests: string[] = [];
|
|
80
|
+
const droppedTools: string[] = [];
|
|
81
|
+
|
|
82
|
+
for (const toolName of toolNames) {
|
|
83
|
+
if (isValidToolName(toolName)) {
|
|
84
|
+
validTools.push(toolName);
|
|
85
|
+
} else if (toolName.startsWith("mcp__")) {
|
|
86
|
+
mcpToolRequests.push(toolName);
|
|
87
|
+
} else {
|
|
88
|
+
// Track dropped tools to warn about them
|
|
89
|
+
droppedTools.push(toolName);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Warn about dropped tools
|
|
94
|
+
if (droppedTools.length > 0) {
|
|
95
|
+
logger.warn(
|
|
96
|
+
`[tool-normalization] Dropping ${droppedTools.length} unrecognized tool(s): ${droppedTools.join(", ")}`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return { validTools, mcpToolRequests };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Resolve MCP tools - check if requested MCP tools are available
|
|
105
|
+
* Returns array of available MCP tool names
|
|
106
|
+
*
|
|
107
|
+
* If mcpManager is not provided, returns all requested MCP tools without validation.
|
|
108
|
+
* This allows agent loading to proceed before MCP is initialized - actual tool
|
|
109
|
+
* availability is checked at execution time in getToolsObject.
|
|
110
|
+
*/
|
|
111
|
+
export function resolveMCPTools(mcpToolRequests: string[], agentSlug: string, mcpManager?: MCPManager): string[] {
|
|
112
|
+
if (mcpToolRequests.length === 0) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// If no MCPManager available, keep all MCP tool requests - they'll be validated at execution time
|
|
117
|
+
if (!mcpManager) {
|
|
118
|
+
return mcpToolRequests;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const availableMcpTools: string[] = [];
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
const allMcpTools = mcpManager.getCachedTools();
|
|
125
|
+
for (const toolName of mcpToolRequests) {
|
|
126
|
+
if (allMcpTools[toolName]) {
|
|
127
|
+
availableMcpTools.push(toolName);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
logger.debug(`Could not load MCP tools for agent "${agentSlug}":`, error);
|
|
132
|
+
// Return all requested tools on error - validation will happen at execution time
|
|
133
|
+
return mcpToolRequests;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return availableMcpTools;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Expand filesystem capability groups:
|
|
141
|
+
* - fs_read implies fs_glob + fs_grep (reading without searching is impractical)
|
|
142
|
+
* - fs_write implies fs_edit (writing without editing is impractical)
|
|
143
|
+
*
|
|
144
|
+
* This is a pure expansion — it never removes tools, only adds implied ones.
|
|
145
|
+
* Does not mutate the input array.
|
|
146
|
+
*/
|
|
147
|
+
export function expandFsCapabilities(tools: string[]): string[] {
|
|
148
|
+
const expanded = [...tools];
|
|
149
|
+
|
|
150
|
+
if (expanded.includes("fs_read")) {
|
|
151
|
+
if (!expanded.includes("fs_glob")) expanded.push("fs_glob");
|
|
152
|
+
if (!expanded.includes("fs_grep")) expanded.push("fs_grep");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (expanded.includes("fs_write")) {
|
|
156
|
+
if (!expanded.includes("fs_edit")) expanded.push("fs_edit");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return expanded;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Complete tool processing pipeline:
|
|
164
|
+
* 1. Normalize (add core, delegate, filter)
|
|
165
|
+
* 2. Validate
|
|
166
|
+
* 3. Resolve MCP tools
|
|
167
|
+
* Returns final list of valid, available tool names
|
|
168
|
+
*
|
|
169
|
+
* @param mcpManager - Optional MCPManager for validating MCP tools. If not provided,
|
|
170
|
+
* MCP tool names are kept without validation (validated at execution time).
|
|
171
|
+
*/
|
|
172
|
+
export function processAgentTools(requestedTools: string[], agentSlug: string, mcpManager?: MCPManager): string[] {
|
|
173
|
+
// Step 1: Normalize
|
|
174
|
+
const normalized = normalizeAgentTools(requestedTools);
|
|
175
|
+
|
|
176
|
+
// Step 2: Validate and separate
|
|
177
|
+
const { validTools, mcpToolRequests } = validateAndSeparateTools(normalized);
|
|
178
|
+
|
|
179
|
+
// Step 3: Resolve MCP tools
|
|
180
|
+
const mcpTools = resolveMCPTools(mcpToolRequests, agentSlug, mcpManager);
|
|
181
|
+
|
|
182
|
+
// Combine and return
|
|
183
|
+
return [...validTools, ...mcpTools];
|
|
184
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { AgentMetadataStore } from "@/services/agents";
|
|
2
|
+
import type { LLMService } from "@/llm/service";
|
|
3
|
+
import type { MCPConfig, MCPServerConfig } from "@/llm/providers/types";
|
|
4
|
+
import type { OnStreamStartCallback } from "@/llm/types";
|
|
5
|
+
import type { NDKEvent, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
|
|
6
|
+
import type { Tool as CoreTool } from "ai";
|
|
7
|
+
import type { AgentProjectConfig } from "./storage";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Simplified agent representation for UI display and selection.
|
|
11
|
+
*/
|
|
12
|
+
export interface AgentSummary {
|
|
13
|
+
name: string;
|
|
14
|
+
role: string;
|
|
15
|
+
pubkey: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Complete agent configuration and identity used during execution.
|
|
20
|
+
*/
|
|
21
|
+
export interface AgentInstance {
|
|
22
|
+
name: string;
|
|
23
|
+
pubkey: string;
|
|
24
|
+
signer: NDKPrivateKeySigner;
|
|
25
|
+
role: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
instructions?: string;
|
|
28
|
+
customInstructions?: string; // Custom system prompt instructions
|
|
29
|
+
useCriteria?: string;
|
|
30
|
+
llmConfig: string;
|
|
31
|
+
tools: string[];
|
|
32
|
+
eventId?: string;
|
|
33
|
+
slug: string;
|
|
34
|
+
useAISDKAgent?: boolean; // Feature flag: use AI SDK Agent class instead of traditional AgentExecutor
|
|
35
|
+
maxAgentSteps?: number; // Maximum steps for AI SDK Agent agentic loop (default: 10)
|
|
36
|
+
/** Agent-specific MCP server configurations */
|
|
37
|
+
mcpServers?: Record<string, MCPServerConfig>;
|
|
38
|
+
/**
|
|
39
|
+
* Project-scoped PM override flags.
|
|
40
|
+
* Key is project dTag, value is true if this agent is PM for that project.
|
|
41
|
+
*/
|
|
42
|
+
pmOverrides?: Record<string, boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Global PM designation flag.
|
|
45
|
+
* When true, this agent is designated as PM for ALL projects where it exists.
|
|
46
|
+
* Set via kind 24020 TenexAgentConfigUpdate event with ["pm"] tag (without a-tag).
|
|
47
|
+
* Takes precedence over pmOverrides and project tag designations.
|
|
48
|
+
*/
|
|
49
|
+
isPM?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Per-project configuration overrides.
|
|
52
|
+
* Key is project dTag, value contains project-specific settings including isPM.
|
|
53
|
+
* Set via kind 24020 TenexAgentConfigUpdate events WITH an a-tag specifying the project.
|
|
54
|
+
*/
|
|
55
|
+
projectOverrides?: Record<string, AgentProjectConfig>;
|
|
56
|
+
createMetadataStore(conversationId: string): AgentMetadataStore;
|
|
57
|
+
createLLMService(options?: {
|
|
58
|
+
tools?: Record<string, CoreTool>;
|
|
59
|
+
sessionId?: string;
|
|
60
|
+
workingDirectory?: string;
|
|
61
|
+
/** MCP configuration to pass to the provider */
|
|
62
|
+
mcpConfig?: MCPConfig;
|
|
63
|
+
/** Conversation ID for OpenRouter correlation */
|
|
64
|
+
conversationId?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Override the config name to use (for meta model resolution).
|
|
67
|
+
* If provided, uses this config instead of the agent's llmConfig.
|
|
68
|
+
*/
|
|
69
|
+
resolvedConfigName?: string;
|
|
70
|
+
/** Callback invoked when Claude Code stream starts, providing the message injector */
|
|
71
|
+
onStreamStart?: OnStreamStartCallback;
|
|
72
|
+
}): LLMService;
|
|
73
|
+
sign(event: NDKEvent): Promise<void>;
|
|
74
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { MCPServerConfig } from "@/llm/providers/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default agent configuration block.
|
|
5
|
+
* Stored under the `default` key in agent JSON files.
|
|
6
|
+
* A 24020 event with no a-tag writes to this block.
|
|
7
|
+
*/
|
|
8
|
+
export interface AgentDefaultConfig {
|
|
9
|
+
/** Default LLM model configuration string (e.g., "anthropic:claude-sonnet-4") */
|
|
10
|
+
model?: string;
|
|
11
|
+
/** Default tools list for this agent */
|
|
12
|
+
tools?: string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Per-project configuration override block.
|
|
17
|
+
* Stored under `projectOverrides[projectDTag]` in agent JSON files.
|
|
18
|
+
* A 24020 event with an a-tag writes to this block.
|
|
19
|
+
*
|
|
20
|
+
* Tools can use delta syntax:
|
|
21
|
+
* - "+tool" adds a tool on top of defaults
|
|
22
|
+
* - "-tool" removes a tool from defaults
|
|
23
|
+
* - Plain "tool" (no prefix) = full replacement list
|
|
24
|
+
*/
|
|
25
|
+
export interface AgentProjectConfig {
|
|
26
|
+
/** Project-specific model override (when set, overrides default.model) */
|
|
27
|
+
model?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Project-specific tools.
|
|
30
|
+
* Can be a full replacement list or a delta (using +/- prefix).
|
|
31
|
+
* If any entry has +/- prefix, treated as delta applied to default tools.
|
|
32
|
+
* Empty array or undefined means: use defaults.
|
|
33
|
+
*/
|
|
34
|
+
tools?: string[];
|
|
35
|
+
/**
|
|
36
|
+
* Project-scoped PM designation.
|
|
37
|
+
* When true, this agent is designated as PM for this specific project.
|
|
38
|
+
* Set via kind 24020 event with ["pm"] tag and an a-tag.
|
|
39
|
+
*/
|
|
40
|
+
isPM?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Project-scoped configuration for an agent (legacy schema).
|
|
45
|
+
* Used by agents written before the new `default`/`projectOverrides` schema.
|
|
46
|
+
*
|
|
47
|
+
* @deprecated Prefer `AgentProjectConfig` with `projectOverrides` field.
|
|
48
|
+
*/
|
|
49
|
+
export interface ProjectScopedConfig {
|
|
50
|
+
/** Project-scoped LLM configuration string. */
|
|
51
|
+
llmConfig?: string;
|
|
52
|
+
/** Project-scoped tools list. */
|
|
53
|
+
tools?: string[];
|
|
54
|
+
/** Project-scoped PM designation. */
|
|
55
|
+
isPM?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Agent data stored in JSON files (.tenex/agents/*.json).
|
|
60
|
+
*/
|
|
61
|
+
export interface StoredAgentData {
|
|
62
|
+
name: string;
|
|
63
|
+
role: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
instructions?: string;
|
|
66
|
+
useCriteria?: string;
|
|
67
|
+
/** Agent-specific MCP server configurations */
|
|
68
|
+
mcpServers?: Record<string, MCPServerConfig>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The d-tag of the source agent definition event (kind:4199).
|
|
72
|
+
* Used by AgentDefinitionMonitor to detect when a newer version
|
|
73
|
+
* of the same definition is published.
|
|
74
|
+
* Backward-compatible: agents without this field are silently ignored.
|
|
75
|
+
*/
|
|
76
|
+
definitionDTag?: string;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The pubkey of the author of the source agent definition event.
|
|
80
|
+
* Used by AgentDefinitionMonitor to verify that incoming definition
|
|
81
|
+
* updates come from the original (or whitelisted) author.
|
|
82
|
+
*/
|
|
83
|
+
definitionAuthor?: string;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The `created_at` timestamp of the source agent definition event.
|
|
87
|
+
* Used by AgentDefinitionMonitor to ensure only strictly newer
|
|
88
|
+
* definition events trigger upgrades, preventing rollbacks from
|
|
89
|
+
* older events arriving out of order.
|
|
90
|
+
*/
|
|
91
|
+
definitionCreatedAt?: number;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Legacy top-level LLM config field.
|
|
95
|
+
* @deprecated Use `default.model` instead.
|
|
96
|
+
*/
|
|
97
|
+
llmConfig?: string;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Legacy top-level tools field.
|
|
101
|
+
* @deprecated Use `default.tools` instead.
|
|
102
|
+
*/
|
|
103
|
+
tools?: string[];
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Default configuration block.
|
|
107
|
+
* Written by kind 24020 events WITHOUT an a-tag.
|
|
108
|
+
* Fields here are the global fallback when no project-specific override exists.
|
|
109
|
+
*/
|
|
110
|
+
default?: AgentDefaultConfig;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Per-project configuration overrides.
|
|
114
|
+
* Key is project dTag, value is the project-specific delta override.
|
|
115
|
+
* Written by kind 24020 events WITH an a-tag.
|
|
116
|
+
*
|
|
117
|
+
* Tools stored here use delta syntax ("+tool" / "-tool") or full replacement.
|
|
118
|
+
* See ConfigResolver for resolution logic.
|
|
119
|
+
*/
|
|
120
|
+
projectOverrides?: Record<string, AgentProjectConfig>;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Legacy project-scoped configurations (old schema).
|
|
124
|
+
* @deprecated Use `projectOverrides` instead.
|
|
125
|
+
*/
|
|
126
|
+
projectConfigs?: Record<string, ProjectScopedConfig>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Agent configuration including sensitive data from the registry.
|
|
131
|
+
*/
|
|
132
|
+
export interface AgentConfig extends StoredAgentData {
|
|
133
|
+
nsec: string;
|
|
134
|
+
eventId?: string;
|
|
135
|
+
pubkey?: string;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Agent configuration used during creation flows where nsec may be provided later.
|
|
140
|
+
*/
|
|
141
|
+
export interface AgentConfigOptionalNsec extends StoredAgentData {
|
|
142
|
+
nsec?: string;
|
|
143
|
+
eventId?: string;
|
|
144
|
+
pubkey?: string;
|
|
145
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { llmServiceFactory } from "@/llm/LLMServiceFactory";
|
|
3
|
+
import type { LLMConfiguration } from "@/services/config/types";
|
|
4
|
+
import type { OpenClawWorkspaceFiles } from "./openclaw-reader";
|
|
5
|
+
|
|
6
|
+
const DistilledIdentitySchema = z.object({
|
|
7
|
+
name: z.string(),
|
|
8
|
+
description: z.string(),
|
|
9
|
+
role: z.string(),
|
|
10
|
+
useCriteria: z.string(),
|
|
11
|
+
instructions: z.string(),
|
|
12
|
+
});
|
|
13
|
+
export type DistilledAgentIdentity = z.infer<typeof DistilledIdentitySchema>;
|
|
14
|
+
|
|
15
|
+
export function buildDistillationPrompt(files: OpenClawWorkspaceFiles): string {
|
|
16
|
+
const sections: string[] = [];
|
|
17
|
+
|
|
18
|
+
if (files.soul) {
|
|
19
|
+
sections.push(`<SOUL.md>\n${files.soul}\n</SOUL.md>`);
|
|
20
|
+
}
|
|
21
|
+
if (files.identity) {
|
|
22
|
+
sections.push(`<IDENTITY.md>\n${files.identity}\n</IDENTITY.md>`);
|
|
23
|
+
}
|
|
24
|
+
if (files.agents) {
|
|
25
|
+
sections.push(`<AGENTS.md>\n${files.agents}\n</AGENTS.md>`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return `You are extracting a portable agent identity from an OpenClaw installation.
|
|
29
|
+
Given these workspace files, return a JSON object with exactly these fields:
|
|
30
|
+
|
|
31
|
+
- name: the agent's display name (string)
|
|
32
|
+
- description: one-sentence description of who this agent is (string)
|
|
33
|
+
- role: short phrase describing expertise/personality, e.g. "personal AI assistant" (string)
|
|
34
|
+
- useCriteria: when this agent should be selected over others (string)
|
|
35
|
+
- instructions: a clean, platform-agnostic system prompt capturing the agent's
|
|
36
|
+
personality, behavioral guidelines, and identity. Discard anything specific
|
|
37
|
+
to OpenClaw: heartbeat polling, HEARTBEAT_OK responses, workspace file reading
|
|
38
|
+
rituals, emoji reaction guidance, silence tokens, tool-specific commands,
|
|
39
|
+
and memory file management instructions. (string)
|
|
40
|
+
|
|
41
|
+
${sections.join("\n\n")}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function distillAgentIdentity(
|
|
45
|
+
files: OpenClawWorkspaceFiles,
|
|
46
|
+
llmConfig: LLMConfiguration
|
|
47
|
+
): Promise<DistilledAgentIdentity> {
|
|
48
|
+
const service = llmServiceFactory.createService(llmConfig);
|
|
49
|
+
const prompt = buildDistillationPrompt(files);
|
|
50
|
+
|
|
51
|
+
const { object } = await service.generateObject(
|
|
52
|
+
[{ role: "user", content: prompt }],
|
|
53
|
+
DistilledIdentitySchema
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return object;
|
|
57
|
+
}
|