@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,177 @@
|
|
|
1
|
+
import type { AgentInstance } from "@/agents/types";
|
|
2
|
+
import type { ConversationStore } from "@/conversations/ConversationStore";
|
|
3
|
+
import type { AgentPublisher } from "@/nostr/AgentPublisher";
|
|
4
|
+
import type { MCPManager } from "@/services/mcp/MCPManager";
|
|
5
|
+
import type { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
6
|
+
import type { Tool as CoreTool } from "ai";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Tool names available in the system.
|
|
10
|
+
* Keep this list in sync with implementations registered in the tool registry.
|
|
11
|
+
*/
|
|
12
|
+
export type ToolName =
|
|
13
|
+
| "fs_read"
|
|
14
|
+
| "fs_write"
|
|
15
|
+
| "fs_edit"
|
|
16
|
+
| "fs_glob"
|
|
17
|
+
| "fs_grep"
|
|
18
|
+
| "home_fs_read"
|
|
19
|
+
| "home_fs_write"
|
|
20
|
+
| "home_fs_grep"
|
|
21
|
+
| "conversation_get"
|
|
22
|
+
| "conversation_list"
|
|
23
|
+
| "lesson_learn"
|
|
24
|
+
| "lesson_get"
|
|
25
|
+
| "lesson_delete"
|
|
26
|
+
| "lessons_list"
|
|
27
|
+
| "shell"
|
|
28
|
+
| "agents_discover"
|
|
29
|
+
| "agents_hire"
|
|
30
|
+
| "agents_list"
|
|
31
|
+
| "agents_read"
|
|
32
|
+
| "agents_write"
|
|
33
|
+
| "agents_publish"
|
|
34
|
+
| "delegate"
|
|
35
|
+
| "delegate_followup"
|
|
36
|
+
| "ask"
|
|
37
|
+
| "project_list"
|
|
38
|
+
| "delegate_crossproject"
|
|
39
|
+
| "report_write"
|
|
40
|
+
| "report_read"
|
|
41
|
+
| "reports_list"
|
|
42
|
+
| "report_delete"
|
|
43
|
+
| "schedule_task"
|
|
44
|
+
| "schedule_task_once"
|
|
45
|
+
| "schedule_tasks_list"
|
|
46
|
+
| "schedule_task_cancel"
|
|
47
|
+
| "upload_blob"
|
|
48
|
+
| "rag_create_collection"
|
|
49
|
+
| "rag_add_documents"
|
|
50
|
+
| "rag_query"
|
|
51
|
+
| "rag_delete_collection"
|
|
52
|
+
| "rag_list_collections"
|
|
53
|
+
| "rag_subscription_create"
|
|
54
|
+
| "rag_subscription_list"
|
|
55
|
+
| "rag_subscription_get"
|
|
56
|
+
| "rag_subscription_delete"
|
|
57
|
+
| "mcp_resource_read"
|
|
58
|
+
| "mcp_subscribe"
|
|
59
|
+
| "mcp_subscription_stop"
|
|
60
|
+
| "conversation_search"
|
|
61
|
+
| "todo_write"
|
|
62
|
+
| "web_fetch"
|
|
63
|
+
| "web_search"
|
|
64
|
+
| "nostr_fetch"
|
|
65
|
+
| "nostr_publish_as_user"
|
|
66
|
+
| "search"
|
|
67
|
+
| "change_model"
|
|
68
|
+
| "kill"
|
|
69
|
+
| "generate_image";
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* AI SDK tool with optional human-readable formatter and side effect declaration.
|
|
73
|
+
*/
|
|
74
|
+
export type AISdkTool<TInput = unknown, TOutput = unknown> = CoreTool<TInput, TOutput> & {
|
|
75
|
+
getHumanReadableContent?: (args: TInput) => string;
|
|
76
|
+
/**
|
|
77
|
+
* Whether this tool has side effects (modifies state, writes files, sends messages, etc.)
|
|
78
|
+
* Default is true (assume side effects unless explicitly declared false).
|
|
79
|
+
* Read-only tools (queries, reads) should set this to false.
|
|
80
|
+
*/
|
|
81
|
+
hasSideEffects?: boolean;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Minimal agent surface needed by tools.
|
|
86
|
+
*/
|
|
87
|
+
export type ToolAgentInfo = Pick<
|
|
88
|
+
AgentInstance,
|
|
89
|
+
"name" | "pubkey" | "slug" | "signer" | "sign" | "llmConfig" | "tools"
|
|
90
|
+
>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Base execution environment - available before RAL/publisher setup.
|
|
94
|
+
* This is the minimal context available at any lifecycle stage.
|
|
95
|
+
*/
|
|
96
|
+
export interface ExecutionEnvironment {
|
|
97
|
+
agent: ToolAgentInfo;
|
|
98
|
+
conversationId: string;
|
|
99
|
+
/**
|
|
100
|
+
* Project directory (normal git repository root).
|
|
101
|
+
* Example: ~/tenex/{dTag}
|
|
102
|
+
*/
|
|
103
|
+
projectBasePath: string;
|
|
104
|
+
/**
|
|
105
|
+
* Working directory for code execution.
|
|
106
|
+
* - Default branch: same as projectBasePath (~/tenex/{dTag})
|
|
107
|
+
* - Feature branch: ~/tenex/{dTag}/.worktrees/feature_branch/
|
|
108
|
+
*/
|
|
109
|
+
workingDirectory: string;
|
|
110
|
+
/**
|
|
111
|
+
* Current git branch name.
|
|
112
|
+
* Example: "master", "feature/branch-name", "research/foo"
|
|
113
|
+
*/
|
|
114
|
+
currentBranch: string;
|
|
115
|
+
triggeringEvent: NDKEvent;
|
|
116
|
+
/**
|
|
117
|
+
* Access to conversation state. May return undefined before full execution setup.
|
|
118
|
+
*/
|
|
119
|
+
getConversation: () => ConversationStore | undefined;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Runtime tool context - available after prepareExecution().
|
|
124
|
+
* Tools that publish events or need RAL state use this type.
|
|
125
|
+
* All runtime dependencies are REQUIRED, not optional.
|
|
126
|
+
*/
|
|
127
|
+
export interface ToolExecutionContext extends ExecutionEnvironment {
|
|
128
|
+
agentPublisher: AgentPublisher;
|
|
129
|
+
ralNumber: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Extended context for tools that require conversation state.
|
|
134
|
+
* Tools like todo_write, conversation_get (current conversation) need this.
|
|
135
|
+
*/
|
|
136
|
+
export interface ConversationToolContext extends ToolExecutionContext {
|
|
137
|
+
getConversation: () => ConversationStore;
|
|
138
|
+
conversationStore: ConversationStore;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Full registry context for tool selection/injection logic.
|
|
143
|
+
* Used by getToolsObject() during actual execution.
|
|
144
|
+
* Extends ConversationToolContext because normal execution always has a conversation.
|
|
145
|
+
*/
|
|
146
|
+
export interface ToolRegistryContext extends ConversationToolContext {
|
|
147
|
+
mcpManager?: MCPManager;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface ToolError {
|
|
151
|
+
kind: "validation" | "execution" | "system";
|
|
152
|
+
message: string;
|
|
153
|
+
field?: string;
|
|
154
|
+
tool?: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface ToolExecutionResult {
|
|
158
|
+
success: boolean;
|
|
159
|
+
duration: number;
|
|
160
|
+
toolName: string;
|
|
161
|
+
toolArgs: Record<string, unknown>;
|
|
162
|
+
output?: unknown;
|
|
163
|
+
error?: ToolError;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Tool factory for tools that work without conversation context (MCP-safe).
|
|
168
|
+
*/
|
|
169
|
+
export type ToolFactory = (context: ToolExecutionContext) => AISdkTool<unknown, unknown>;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Tool factory for tools that require conversation context.
|
|
173
|
+
* These tools are filtered out when no conversation is available (e.g., MCP).
|
|
174
|
+
*/
|
|
175
|
+
export type ConversationToolFactory = (
|
|
176
|
+
context: ConversationToolContext
|
|
177
|
+
) => AISdkTool<unknown, unknown>;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
2
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
3
|
+
import { handleError } from "@/utils/error-handler";
|
|
4
|
+
import { logger } from "@/utils/logger";
|
|
5
|
+
import { trace } from "@opentelemetry/api";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Resolves and validates a file path to ensure it stays within the project boundaries.
|
|
9
|
+
*
|
|
10
|
+
* @param filePath - The file path to validate (can be absolute or relative)
|
|
11
|
+
* @param projectPath - The root project path
|
|
12
|
+
* @returns The resolved absolute path if valid
|
|
13
|
+
* @throws Error if the path would escape the project directory
|
|
14
|
+
*/
|
|
15
|
+
export function resolveAndValidatePath(filePath: string, projectPath: string): string {
|
|
16
|
+
// Validate projectPath is not empty - this would resolve to process.cwd()
|
|
17
|
+
if (!projectPath) {
|
|
18
|
+
const span = trace.getActiveSpan();
|
|
19
|
+
span?.setAttributes({
|
|
20
|
+
"path.error": "projectPath_empty",
|
|
21
|
+
"path.file_path": filePath,
|
|
22
|
+
"path.project_path": projectPath || "(empty)",
|
|
23
|
+
});
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Cannot resolve path "${filePath}": projectPath is empty. ` +
|
|
26
|
+
"This indicates a bug in the execution context - workingDirectory was not set."
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const fullPath = isAbsolute(filePath) ? filePath : resolve(projectPath, filePath);
|
|
31
|
+
const relativePath = relative(projectPath, fullPath);
|
|
32
|
+
|
|
33
|
+
// Add trace attributes for debugging
|
|
34
|
+
const span = trace.getActiveSpan();
|
|
35
|
+
span?.addEvent("path.resolved", {
|
|
36
|
+
"path.input": filePath,
|
|
37
|
+
"path.project": projectPath,
|
|
38
|
+
"path.resolved": fullPath,
|
|
39
|
+
"path.relative": relativePath,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (relativePath.startsWith("..")) {
|
|
43
|
+
throw new Error(`Path outside project directory: ${filePath}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return fullPath;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Standard response format for tool execution
|
|
51
|
+
*/
|
|
52
|
+
export interface ToolResponse {
|
|
53
|
+
success: boolean;
|
|
54
|
+
message?: string;
|
|
55
|
+
error?: string;
|
|
56
|
+
data?: unknown;
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Base class for tool execution errors
|
|
62
|
+
*/
|
|
63
|
+
export class ToolExecutionError extends Error {
|
|
64
|
+
constructor(
|
|
65
|
+
message: string,
|
|
66
|
+
public readonly toolName: string,
|
|
67
|
+
public readonly cause?: Error
|
|
68
|
+
) {
|
|
69
|
+
super(message);
|
|
70
|
+
this.name = "ToolExecutionError";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Standard wrapper for tool execution with error handling
|
|
76
|
+
* Provides consistent error handling and response formatting
|
|
77
|
+
*/
|
|
78
|
+
export async function executeToolWithErrorHandling<TInput>(
|
|
79
|
+
toolName: string,
|
|
80
|
+
input: TInput,
|
|
81
|
+
context: ToolExecutionContext,
|
|
82
|
+
executeFn: (input: TInput, context: ToolExecutionContext) => Promise<ToolResponse>
|
|
83
|
+
): Promise<string> {
|
|
84
|
+
logger.debug(`Executing tool: ${toolName}`, { input });
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const result = await executeFn(input, context);
|
|
88
|
+
|
|
89
|
+
if (!result.success) {
|
|
90
|
+
logger.warn(`Tool execution failed: ${toolName}`, {
|
|
91
|
+
error: result.error,
|
|
92
|
+
input,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return JSON.stringify(result, null, 2);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
// Use project's error handling utilities
|
|
99
|
+
const errorMessage = handleError(error, `Tool execution failed: ${toolName}`, {
|
|
100
|
+
logLevel: "error",
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Return standardized error response
|
|
104
|
+
const errorResponse: ToolResponse = {
|
|
105
|
+
success: false,
|
|
106
|
+
error: errorMessage,
|
|
107
|
+
toolName,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
return JSON.stringify(errorResponse, null, 2);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Validate required fields in tool input
|
|
116
|
+
*/
|
|
117
|
+
export function validateRequiredFields<T extends Record<string, unknown>>(
|
|
118
|
+
input: T,
|
|
119
|
+
requiredFields: (keyof T)[],
|
|
120
|
+
toolName: string
|
|
121
|
+
): void {
|
|
122
|
+
const missingFields = requiredFields.filter(
|
|
123
|
+
(field) => input[field] === undefined || input[field] === null
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
if (missingFields.length > 0) {
|
|
127
|
+
throw new ToolExecutionError(
|
|
128
|
+
`Missing required fields: ${missingFields.join(", ")}`,
|
|
129
|
+
toolName
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Parse and validate numeric input with constraints
|
|
136
|
+
*/
|
|
137
|
+
export function parseNumericInput(
|
|
138
|
+
value: number | undefined,
|
|
139
|
+
defaultValue: number,
|
|
140
|
+
constraints?: {
|
|
141
|
+
min?: number;
|
|
142
|
+
max?: number;
|
|
143
|
+
integer?: boolean;
|
|
144
|
+
}
|
|
145
|
+
): number {
|
|
146
|
+
const result = value ?? defaultValue;
|
|
147
|
+
|
|
148
|
+
if (constraints) {
|
|
149
|
+
if (constraints.min !== undefined && result < constraints.min) {
|
|
150
|
+
throw new Error(`Value ${result} is less than minimum ${constraints.min}`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (constraints.max !== undefined && result > constraints.max) {
|
|
154
|
+
throw new Error(`Value ${result} is greater than maximum ${constraints.max}`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (constraints.integer && !Number.isInteger(result)) {
|
|
158
|
+
throw new Error(`Value ${result} must be an integer`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// =============================================================================
|
|
166
|
+
// Expected Error Handling Contract
|
|
167
|
+
// =============================================================================
|
|
168
|
+
//
|
|
169
|
+
// PRINCIPLE:
|
|
170
|
+
// - Expected failures (ENOENT, EACCES, "not found", etc.) → Return error-text object
|
|
171
|
+
// - Unexpected failures (null pointer, invariant violation) → Throw exception
|
|
172
|
+
//
|
|
173
|
+
// RATIONALE:
|
|
174
|
+
// When tools throw exceptions, the AI SDK wraps them in tool-error chunks.
|
|
175
|
+
// However, OpenRouter/Gemini providers don't always convert these properly,
|
|
176
|
+
// causing silent stream failures. Returning error-text objects ensures the
|
|
177
|
+
// error is properly communicated back to the LLM.
|
|
178
|
+
// =============================================================================
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Expected error result type - AI SDK format for tool errors
|
|
182
|
+
* This format is recognized by ChunkHandler and ToolResultUtils
|
|
183
|
+
*/
|
|
184
|
+
export interface ExpectedErrorResult {
|
|
185
|
+
type: "error-text";
|
|
186
|
+
text: string;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Expected filesystem error codes that should return error-text instead of throwing
|
|
191
|
+
*/
|
|
192
|
+
const EXPECTED_FS_ERROR_CODES = new Set(["ENOENT", "EACCES", "EISDIR", "EPERM", "ENOTDIR"]);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Check if an error is an expected filesystem error (file not found, permission denied, etc.)
|
|
196
|
+
* These should return error-text objects rather than throwing exceptions.
|
|
197
|
+
*/
|
|
198
|
+
export function isExpectedFsError(error: unknown): boolean {
|
|
199
|
+
if (error instanceof Error) {
|
|
200
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
201
|
+
return code !== undefined && EXPECTED_FS_ERROR_CODES.has(code);
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Check if an HTTP status code is an expected error (all 4xx client errors)
|
|
208
|
+
* This includes 400-499 range: bad request, unauthorized, forbidden, not found, etc.
|
|
209
|
+
*/
|
|
210
|
+
export function isExpectedHttpError(status: number): boolean {
|
|
211
|
+
return status >= 400 && status < 500;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Check if an error message indicates an expected "not found" condition
|
|
216
|
+
*/
|
|
217
|
+
export function isExpectedNotFoundError(error: unknown): boolean {
|
|
218
|
+
if (error instanceof Error) {
|
|
219
|
+
const message = error.message.toLowerCase();
|
|
220
|
+
return (
|
|
221
|
+
message.includes("not found") ||
|
|
222
|
+
message.includes("does not exist") ||
|
|
223
|
+
message.includes("no such") ||
|
|
224
|
+
message.includes("cannot find")
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Create an expected error result object (error-text format)
|
|
232
|
+
* Use this when a tool encounters an expected failure condition.
|
|
233
|
+
*/
|
|
234
|
+
export function createExpectedError(message: string): ExpectedErrorResult {
|
|
235
|
+
return { type: "error-text", text: message };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get a human-readable description of a filesystem error code
|
|
240
|
+
*/
|
|
241
|
+
export function getFsErrorDescription(code: string | undefined): string {
|
|
242
|
+
switch (code) {
|
|
243
|
+
case "ENOENT":
|
|
244
|
+
return "File or directory not found";
|
|
245
|
+
case "EACCES":
|
|
246
|
+
return "Permission denied";
|
|
247
|
+
case "EISDIR":
|
|
248
|
+
return "Expected a file but found a directory";
|
|
249
|
+
case "EPERM":
|
|
250
|
+
return "Operation not permitted";
|
|
251
|
+
case "ENOTDIR":
|
|
252
|
+
return "Expected a directory but found a file";
|
|
253
|
+
default:
|
|
254
|
+
return "Filesystem error";
|
|
255
|
+
}
|
|
256
|
+
}
|