@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,377 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/tools/types";
|
|
2
|
+
import { ConversationStore } from "@/conversations/ConversationStore";
|
|
3
|
+
import type { AISdkTool } from "@/tools/types";
|
|
4
|
+
import { logger } from "@/utils/logger";
|
|
5
|
+
import { tool } from "ai";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { PREFIX_LENGTH } from "@/utils/nostr-entity-parser";
|
|
8
|
+
import { getPubkeyService } from "@/services/PubkeyService";
|
|
9
|
+
import { resolveAgentSlug } from "@/services/agents/AgentResolution";
|
|
10
|
+
import { parseNostrUser } from "@/utils/nostr-entity-parser";
|
|
11
|
+
|
|
12
|
+
const conversationListSchema = z.object({
|
|
13
|
+
projectId: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe(
|
|
17
|
+
"Project ID to list conversations from. Pass 'ALL' to list from all projects. " +
|
|
18
|
+
"If not specified, lists conversations from the current project only."
|
|
19
|
+
),
|
|
20
|
+
limit: z
|
|
21
|
+
.number()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Maximum number of conversations to return. Defaults to 50."),
|
|
24
|
+
fromTime: z
|
|
25
|
+
.number()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Only include conversations with activity on or after this Unix timestamp (seconds)."),
|
|
28
|
+
toTime: z
|
|
29
|
+
.number()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Only include conversations with activity on or before this Unix timestamp (seconds)."),
|
|
32
|
+
with: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe(
|
|
36
|
+
"Filter to conversations where this actor was active. " +
|
|
37
|
+
"Accepts an agent slug (e.g., 'claude-code') or a pubkey (hex or npub format)."
|
|
38
|
+
),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
type ConversationListInput = z.infer<typeof conversationListSchema>;
|
|
42
|
+
|
|
43
|
+
interface ConversationSummary {
|
|
44
|
+
/** Shortened event ID (12 characters) */
|
|
45
|
+
id: string;
|
|
46
|
+
projectId?: string;
|
|
47
|
+
title?: string;
|
|
48
|
+
/** Full summary (not truncated) */
|
|
49
|
+
summary?: string;
|
|
50
|
+
messageCount: number;
|
|
51
|
+
createdAt?: number;
|
|
52
|
+
lastActivity?: number;
|
|
53
|
+
/** Names of participants in this conversation (resolved via PubkeyService) */
|
|
54
|
+
participants: string[];
|
|
55
|
+
/** Shortened event IDs of delegations that occurred in this conversation */
|
|
56
|
+
delegations: string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface ConversationListOutput {
|
|
60
|
+
success: boolean;
|
|
61
|
+
conversations: ConversationSummary[];
|
|
62
|
+
total: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Shorten a full 64-char event ID to the standard prefix length
|
|
67
|
+
*/
|
|
68
|
+
function shortenEventId(fullId: string): string {
|
|
69
|
+
return fullId.substring(0, PREFIX_LENGTH);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Extract unique participant pubkeys from conversation messages (direct participants only)
|
|
74
|
+
*/
|
|
75
|
+
function extractParticipantPubkeys(conversation: ConversationStore): string[] {
|
|
76
|
+
const messages = conversation.getAllMessages();
|
|
77
|
+
const pubkeys = new Set<string>();
|
|
78
|
+
|
|
79
|
+
for (const message of messages) {
|
|
80
|
+
// Add the message author
|
|
81
|
+
pubkeys.add(message.pubkey);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return Array.from(pubkeys);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Extract delegation conversation IDs from delegation markers
|
|
89
|
+
*/
|
|
90
|
+
function extractDelegationIds(conversation: ConversationStore): string[] {
|
|
91
|
+
const messages = conversation.getAllMessages();
|
|
92
|
+
const delegationIds: string[] = [];
|
|
93
|
+
|
|
94
|
+
for (const message of messages) {
|
|
95
|
+
if (message.messageType === "delegation-marker" && message.delegationMarker) {
|
|
96
|
+
delegationIds.push(message.delegationMarker.delegationConversationId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return delegationIds;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Resolve pubkeys to display names using PubkeyService (sync version for performance)
|
|
105
|
+
*/
|
|
106
|
+
function resolveParticipantNames(pubkeys: string[]): string[] {
|
|
107
|
+
const pubkeyService = getPubkeyService();
|
|
108
|
+
return pubkeys.map(pk => pubkeyService.getNameSync(pk));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function summarizeConversation(conversation: ConversationStore, projectId?: string): ConversationSummary {
|
|
112
|
+
const messages = conversation.getAllMessages();
|
|
113
|
+
const firstMessage = messages[0];
|
|
114
|
+
const lastMessage = messages[messages.length - 1];
|
|
115
|
+
const metadata = conversation.metadata;
|
|
116
|
+
|
|
117
|
+
// Extract participants and delegations
|
|
118
|
+
const participantPubkeys = extractParticipantPubkeys(conversation);
|
|
119
|
+
const participantNames = resolveParticipantNames(participantPubkeys);
|
|
120
|
+
const delegationIds = extractDelegationIds(conversation);
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
id: shortenEventId(conversation.id),
|
|
124
|
+
projectId,
|
|
125
|
+
title: metadata.title ?? conversation.title,
|
|
126
|
+
summary: metadata.summary,
|
|
127
|
+
messageCount: messages.length,
|
|
128
|
+
createdAt: firstMessage?.timestamp,
|
|
129
|
+
lastActivity: lastMessage?.timestamp,
|
|
130
|
+
participants: participantNames,
|
|
131
|
+
delegations: delegationIds.map(shortenEventId),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
interface LoadedConversation {
|
|
136
|
+
store: ConversationStore;
|
|
137
|
+
projectId: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function loadConversationsForProject(
|
|
141
|
+
projectId: string,
|
|
142
|
+
isCurrentProject: boolean
|
|
143
|
+
): LoadedConversation[] {
|
|
144
|
+
const conversations: LoadedConversation[] = [];
|
|
145
|
+
const conversationIds = isCurrentProject
|
|
146
|
+
? ConversationStore.listConversationIdsFromDisk()
|
|
147
|
+
: ConversationStore.listConversationIdsFromDiskForProject(projectId);
|
|
148
|
+
|
|
149
|
+
for (const id of conversationIds) {
|
|
150
|
+
try {
|
|
151
|
+
let store: ConversationStore;
|
|
152
|
+
if (isCurrentProject) {
|
|
153
|
+
// Use cached version for current project
|
|
154
|
+
store = ConversationStore.getOrLoad(id);
|
|
155
|
+
} else {
|
|
156
|
+
// Load fresh for external projects
|
|
157
|
+
store = new ConversationStore(ConversationStore.getBasePath());
|
|
158
|
+
store.load(projectId, id);
|
|
159
|
+
}
|
|
160
|
+
conversations.push({ store, projectId });
|
|
161
|
+
} catch (err) {
|
|
162
|
+
logger.debug("Failed to load conversation", { id, projectId, error: err });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return conversations;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Check if a value looks like a pubkey (hex or npub format) rather than a slug.
|
|
170
|
+
* This is used to determine if slug resolution should be attempted.
|
|
171
|
+
*/
|
|
172
|
+
function looksLikePubkey(value: string): boolean {
|
|
173
|
+
const trimmed = value.trim();
|
|
174
|
+
// 64-char hex pubkey
|
|
175
|
+
if (/^[0-9a-fA-F]{64}$/.test(trimmed)) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
// npub or nprofile format
|
|
179
|
+
if (trimmed.startsWith("npub1") || trimmed.startsWith("nprofile1")) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Resolve the 'with' parameter to a pubkey.
|
|
187
|
+
* Accepts agent slugs (single project only) or pubkeys (hex or npub format).
|
|
188
|
+
*
|
|
189
|
+
* @param withValue - The value to resolve
|
|
190
|
+
* @param isAllProjects - Whether projectId="all" was specified
|
|
191
|
+
* @throws Error if the value cannot be resolved to a pubkey
|
|
192
|
+
*/
|
|
193
|
+
function resolveWithParameter(withValue: string, isAllProjects: boolean): string {
|
|
194
|
+
const trimmed = withValue.trim();
|
|
195
|
+
|
|
196
|
+
// If it looks like a pubkey, try to parse it directly
|
|
197
|
+
if (looksLikePubkey(trimmed)) {
|
|
198
|
+
const parsedPubkey = parseNostrUser(trimmed);
|
|
199
|
+
if (parsedPubkey) {
|
|
200
|
+
return parsedPubkey;
|
|
201
|
+
}
|
|
202
|
+
throw new Error(
|
|
203
|
+
`Failed to resolve 'with' parameter: "${withValue}". ` +
|
|
204
|
+
`The value looks like a pubkey but could not be parsed. ` +
|
|
205
|
+
`Please provide a valid 64-character hex pubkey or npub format.`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// It looks like a slug - check if we're in all-projects mode
|
|
210
|
+
if (isAllProjects) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
`Agent slugs are not supported when projectId='all'. ` +
|
|
213
|
+
`The slug "${withValue}" can only be resolved within the current project. ` +
|
|
214
|
+
`Please provide a pubkey (hex or npub format) instead.`
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Try to resolve as agent slug (single project only)
|
|
219
|
+
const agentResult = resolveAgentSlug(trimmed);
|
|
220
|
+
if (agentResult.pubkey) {
|
|
221
|
+
return agentResult.pubkey;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Slug resolution failed - provide helpful error with available slugs
|
|
225
|
+
const availableSlugsMsg = agentResult.availableSlugs.length > 0
|
|
226
|
+
? ` Available agent slugs in this project: ${agentResult.availableSlugs.join(", ")}.`
|
|
227
|
+
: "";
|
|
228
|
+
|
|
229
|
+
throw new Error(
|
|
230
|
+
`Failed to resolve 'with' parameter: "${withValue}". ` +
|
|
231
|
+
`Could not find an agent with this slug or parse it as a pubkey.${availableSlugsMsg}`
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Check if a conversation has a specific pubkey as a participant
|
|
237
|
+
*/
|
|
238
|
+
function conversationHasParticipant(conversation: ConversationStore, pubkey: string): boolean {
|
|
239
|
+
const messages = conversation.getAllMessages();
|
|
240
|
+
for (const message of messages) {
|
|
241
|
+
if (message.pubkey === pubkey) {
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function executeConversationList(
|
|
249
|
+
input: ConversationListInput,
|
|
250
|
+
context: ToolExecutionContext
|
|
251
|
+
): Promise<ConversationListOutput> {
|
|
252
|
+
const limit = input.limit ?? 50;
|
|
253
|
+
const { fromTime, toTime, projectId: requestedProjectId } = input;
|
|
254
|
+
const withParam = input.with;
|
|
255
|
+
|
|
256
|
+
const currentProjectId = ConversationStore.getProjectId();
|
|
257
|
+
|
|
258
|
+
// Normalize projectId: case-insensitive "all" check
|
|
259
|
+
const normalizedRequestedProjectId = requestedProjectId?.toLowerCase() === "all" ? "all" : requestedProjectId;
|
|
260
|
+
|
|
261
|
+
// Default to current project if not specified (NOT all projects)
|
|
262
|
+
const effectiveProjectId = normalizedRequestedProjectId ?? currentProjectId;
|
|
263
|
+
|
|
264
|
+
// Determine if we're querying all projects
|
|
265
|
+
const isAllProjects = effectiveProjectId === "all";
|
|
266
|
+
|
|
267
|
+
// Resolve the 'with' parameter to a pubkey if provided
|
|
268
|
+
// This will throw an error if resolution fails, preventing silent fallback to unfiltered results
|
|
269
|
+
let withPubkey: string | null = null;
|
|
270
|
+
if (withParam) {
|
|
271
|
+
withPubkey = resolveWithParameter(withParam, isAllProjects);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
logger.info("📋 Listing conversations", {
|
|
275
|
+
limit,
|
|
276
|
+
fromTime,
|
|
277
|
+
toTime,
|
|
278
|
+
projectId: effectiveProjectId,
|
|
279
|
+
with: withParam,
|
|
280
|
+
withPubkey: withPubkey ? shortenEventId(withPubkey) : undefined,
|
|
281
|
+
agent: context.agent.name,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Load conversations based on projectId parameter
|
|
285
|
+
let allConversations: LoadedConversation[] = [];
|
|
286
|
+
|
|
287
|
+
if (effectiveProjectId === "all") {
|
|
288
|
+
// Only load from all projects when explicitly requested with "ALL"
|
|
289
|
+
const projectIds = ConversationStore.listProjectIdsFromDisk();
|
|
290
|
+
for (const pid of projectIds) {
|
|
291
|
+
const isCurrentProject = pid === currentProjectId;
|
|
292
|
+
const projectConversations = loadConversationsForProject(pid, isCurrentProject);
|
|
293
|
+
allConversations.push(...projectConversations);
|
|
294
|
+
}
|
|
295
|
+
} else if (effectiveProjectId) {
|
|
296
|
+
// Load from specific project (current project by default)
|
|
297
|
+
const isCurrentProject = effectiveProjectId === currentProjectId;
|
|
298
|
+
allConversations = loadConversationsForProject(effectiveProjectId, isCurrentProject);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Filter by date range if specified
|
|
302
|
+
let filtered = allConversations;
|
|
303
|
+
if (fromTime !== undefined || toTime !== undefined) {
|
|
304
|
+
filtered = allConversations.filter(({ store }) => {
|
|
305
|
+
const lastActivity = store.getLastActivityTime();
|
|
306
|
+
if (fromTime !== undefined && lastActivity < fromTime) return false;
|
|
307
|
+
if (toTime !== undefined && lastActivity > toTime) return false;
|
|
308
|
+
return true;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Filter by 'with' parameter if specified and resolved
|
|
313
|
+
if (withPubkey) {
|
|
314
|
+
filtered = filtered.filter(({ store }) => conversationHasParticipant(store, withPubkey));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Sort by last activity (most recent first)
|
|
318
|
+
const sorted = [...filtered].sort((a, b) => {
|
|
319
|
+
return b.store.getLastActivityTime() - a.store.getLastActivityTime();
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
const limited = sorted.slice(0, limit);
|
|
323
|
+
const summaries = limited.map(({ store, projectId }) => summarizeConversation(store, projectId));
|
|
324
|
+
|
|
325
|
+
logger.info("✅ Conversations listed", {
|
|
326
|
+
total: allConversations.length,
|
|
327
|
+
filtered: filtered.length,
|
|
328
|
+
returned: summaries.length,
|
|
329
|
+
projectId: effectiveProjectId,
|
|
330
|
+
with: withParam,
|
|
331
|
+
agent: context.agent.name,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
return {
|
|
335
|
+
success: true,
|
|
336
|
+
conversations: summaries,
|
|
337
|
+
total: filtered.length,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export function createConversationListTool(context: ToolExecutionContext): AISdkTool {
|
|
342
|
+
const aiTool = tool({
|
|
343
|
+
description:
|
|
344
|
+
"List conversations for this project with summary information including ID, title, summary, participants, delegations, message count, and timestamps. Results are sorted by most recent activity. Supports optional date range filtering with fromTime/toTime (Unix timestamps in seconds). Use the 'with' parameter to filter to conversations where a specific actor was active. Use this to discover available conversations before retrieving specific ones with conversation_get.",
|
|
345
|
+
|
|
346
|
+
inputSchema: conversationListSchema,
|
|
347
|
+
|
|
348
|
+
execute: async (input: ConversationListInput) => {
|
|
349
|
+
return await executeConversationList(input, context);
|
|
350
|
+
},
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
Object.defineProperty(aiTool, "getHumanReadableContent", {
|
|
354
|
+
value: (input: ConversationListInput) => {
|
|
355
|
+
const { projectId, limit, fromTime, toTime } = input;
|
|
356
|
+
const withParam = input.with;
|
|
357
|
+
const parts: string[] = [];
|
|
358
|
+
if (projectId?.toLowerCase() === "all") {
|
|
359
|
+
parts.push("all projects");
|
|
360
|
+
} else if (projectId) {
|
|
361
|
+
parts.push(`project=${projectId}`);
|
|
362
|
+
}
|
|
363
|
+
if (withParam) parts.push(`with=${withParam}`);
|
|
364
|
+
if (limit) parts.push(`limit=${limit}`);
|
|
365
|
+
if (fromTime) parts.push(`from=${new Date(fromTime * 1000).toISOString()}`);
|
|
366
|
+
if (toTime) parts.push(`to=${new Date(toTime * 1000).toISOString()}`);
|
|
367
|
+
|
|
368
|
+
return parts.length > 0
|
|
369
|
+
? `Listing conversations (${parts.join(", ")})`
|
|
370
|
+
: "Listing conversations";
|
|
371
|
+
},
|
|
372
|
+
enumerable: false,
|
|
373
|
+
configurable: true,
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
return aiTool as AISdkTool;
|
|
377
|
+
}
|