@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,276 @@
|
|
|
1
|
+
import { NDKKind } from "@/nostr/kinds";
|
|
2
|
+
import { getNDK } from "@/nostr/ndkClient";
|
|
3
|
+
import {
|
|
4
|
+
type ProjectContext,
|
|
5
|
+
projectContextStore,
|
|
6
|
+
} from "@/services/projects";
|
|
7
|
+
import { formatAnyError } from "@/lib/error-formatter";
|
|
8
|
+
import { logger } from "@/utils/logger";
|
|
9
|
+
import { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
10
|
+
import { RALRegistry } from "@/services/ral";
|
|
11
|
+
import type { RALRegistryEntry } from "@/services/ral";
|
|
12
|
+
import { config } from "@/services/ConfigService";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* OperationsStatusService handles publishing of LLM operation status events to Nostr.
|
|
16
|
+
*
|
|
17
|
+
* Publishes one event per conversation (thread root), with:
|
|
18
|
+
* - One e-tag for the conversation ID (thread root event)
|
|
19
|
+
* - Uppercase P-tags for whitelisted human users from config.json
|
|
20
|
+
* - Lowercase p-tags for agents actively streaming (isStreaming: true OR activeTools.size > 0)
|
|
21
|
+
* - One a-tag for the project reference
|
|
22
|
+
*
|
|
23
|
+
* Note: The e-tag points to the conversation/thread root ID (not individual message IDs),
|
|
24
|
+
* allowing clients to look up working agents by conversation ID.
|
|
25
|
+
*
|
|
26
|
+
* SEMANTICS CHANGE: p-tags now only include agents that are actively streaming or running tools.
|
|
27
|
+
* Agents waiting on delegations no longer appear in p-tags.
|
|
28
|
+
*
|
|
29
|
+
* MULTI-PROJECT ISOLATION: Each OperationsStatusService instance is scoped to a specific project.
|
|
30
|
+
* It filters RALRegistry events by projectId and wraps publishes in AsyncLocalStorage context.
|
|
31
|
+
*/
|
|
32
|
+
export class OperationsStatusService {
|
|
33
|
+
private debounceTimer?: NodeJS.Timeout;
|
|
34
|
+
private unsubscribe?: () => void;
|
|
35
|
+
private publishedConversations = new Set<string>(); // Track which conversations we've published status for
|
|
36
|
+
private lastPublishedAgents = new Map<string, Set<string>>(); // Track which agents were published per conversation
|
|
37
|
+
private isPublishing = false; // Guard against concurrent publishNow() calls
|
|
38
|
+
|
|
39
|
+
constructor(
|
|
40
|
+
private registry: RALRegistry,
|
|
41
|
+
private projectId: string,
|
|
42
|
+
private projectContext: ProjectContext,
|
|
43
|
+
private debounceMs = 1000
|
|
44
|
+
) {}
|
|
45
|
+
|
|
46
|
+
start(): void {
|
|
47
|
+
// Guard against multiple start() calls
|
|
48
|
+
if (this.unsubscribe) {
|
|
49
|
+
logger.warn("[OperationsStatusService] Already started, ignoring duplicate start()");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Subscribe to registry 'updated' events - filter by projectId for multi-project isolation
|
|
54
|
+
const handler = (eventProjectId: string, conversationId: string) => {
|
|
55
|
+
// CRITICAL: Only process events for THIS project
|
|
56
|
+
if (eventProjectId !== this.projectId) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Track the conversation so it's included in the next publish cycle
|
|
60
|
+
this.publishedConversations.add(conversationId);
|
|
61
|
+
this.schedulePublish();
|
|
62
|
+
};
|
|
63
|
+
this.registry.on("updated", handler);
|
|
64
|
+
this.unsubscribe = () => {
|
|
65
|
+
this.registry.off("updated", handler);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Publish initial state (wrapped in project context)
|
|
69
|
+
this.publishNow().catch((err) => {
|
|
70
|
+
logger.error("[OperationsStatusService] Failed to publish initial state", {
|
|
71
|
+
error: formatAnyError(err),
|
|
72
|
+
projectId: this.projectId.substring(0, 20),
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
stop(): void {
|
|
78
|
+
if (this.unsubscribe) {
|
|
79
|
+
this.unsubscribe();
|
|
80
|
+
this.unsubscribe = undefined;
|
|
81
|
+
}
|
|
82
|
+
if (this.debounceTimer) {
|
|
83
|
+
clearTimeout(this.debounceTimer);
|
|
84
|
+
this.debounceTimer = undefined;
|
|
85
|
+
}
|
|
86
|
+
// Clear state to prevent stale data on restart
|
|
87
|
+
this.publishedConversations.clear();
|
|
88
|
+
this.lastPublishedAgents.clear();
|
|
89
|
+
this.isPublishing = false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private schedulePublish(): void {
|
|
93
|
+
// Clear existing timer
|
|
94
|
+
if (this.debounceTimer) {
|
|
95
|
+
clearTimeout(this.debounceTimer);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Schedule new publish
|
|
99
|
+
this.debounceTimer = setTimeout(() => {
|
|
100
|
+
this.publishNow().catch((err) => {
|
|
101
|
+
logger.error("[OperationsStatusService] Failed to publish status", {
|
|
102
|
+
error: formatAnyError(err),
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}, this.debounceMs);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Determine if an agent is "active" for status publishing purposes.
|
|
110
|
+
* Active means: isStreaming === true OR activeTools.size > 0
|
|
111
|
+
*/
|
|
112
|
+
private isAgentActive(entry: RALRegistryEntry): boolean {
|
|
113
|
+
return entry.isStreaming || entry.activeTools.size > 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private async publishNow(): Promise<void> {
|
|
117
|
+
// Guard against concurrent publishes (can cause race conditions)
|
|
118
|
+
if (this.isPublishing) {
|
|
119
|
+
logger.debug("[OperationsStatusService] Publish already in progress, skipping");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
this.isPublishing = true;
|
|
124
|
+
try {
|
|
125
|
+
// Wrap the entire publish operation in project context for proper ALS context
|
|
126
|
+
await projectContextStore.run(this.projectContext, () => this.doPublish());
|
|
127
|
+
} finally {
|
|
128
|
+
this.isPublishing = false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Actual publish logic - must be called within projectContextStore.run()
|
|
134
|
+
*/
|
|
135
|
+
private async doPublish(): Promise<void> {
|
|
136
|
+
const projectCtx = this.projectContext;
|
|
137
|
+
|
|
138
|
+
// Get all conversations we need to check (currently tracked)
|
|
139
|
+
const conversationsToCheck = new Set(this.publishedConversations);
|
|
140
|
+
|
|
141
|
+
// Process each conversation
|
|
142
|
+
const conversationsToCleanup = new Set<string>();
|
|
143
|
+
const activeConversations = new Map<string, Set<string>>(); // conversationId -> set of active agent pubkeys
|
|
144
|
+
|
|
145
|
+
for (const conversationId of conversationsToCheck) {
|
|
146
|
+
const entries = this.registry.getConversationEntries(conversationId);
|
|
147
|
+
const activeAgentPubkeys = new Set<string>();
|
|
148
|
+
|
|
149
|
+
for (const entry of entries) {
|
|
150
|
+
// CRITICAL: Only include entries for THIS project (multi-project isolation)
|
|
151
|
+
if (entry.projectId !== this.projectId) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (this.isAgentActive(entry)) {
|
|
155
|
+
activeAgentPubkeys.add(entry.agentPubkey);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (activeAgentPubkeys.size > 0) {
|
|
160
|
+
activeConversations.set(conversationId, activeAgentPubkeys);
|
|
161
|
+
} else {
|
|
162
|
+
// No active agents - mark for cleanup
|
|
163
|
+
conversationsToCleanup.add(conversationId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Log current state for debugging
|
|
168
|
+
if (activeConversations.size > 0 || conversationsToCleanup.size > 0) {
|
|
169
|
+
logger.debug("[OperationsStatusService] Current state", {
|
|
170
|
+
activeConversations: Array.from(activeConversations.keys()).map((id) => id.substring(0, 8)),
|
|
171
|
+
previouslyPublished: Array.from(this.publishedConversations).map((id) => id.substring(0, 8)),
|
|
172
|
+
toCleanup: Array.from(conversationsToCleanup).map((id) => id.substring(0, 8)),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Publish status for active conversations
|
|
177
|
+
for (const [conversationId, agentPubkeys] of activeConversations) {
|
|
178
|
+
try {
|
|
179
|
+
// Only publish if agents changed
|
|
180
|
+
if (this.hasAgentsChanged(conversationId, agentPubkeys)) {
|
|
181
|
+
await this.publishConversationStatus(conversationId, agentPubkeys, projectCtx);
|
|
182
|
+
this.publishedConversations.add(conversationId);
|
|
183
|
+
this.lastPublishedAgents.set(conversationId, new Set(agentPubkeys));
|
|
184
|
+
}
|
|
185
|
+
} catch (err) {
|
|
186
|
+
logger.error("[OperationsStatusService] Failed to publish conversation status", {
|
|
187
|
+
conversationId: conversationId.substring(0, 8),
|
|
188
|
+
error: formatAnyError(err),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Publish cleanup events (empty p-tags) for idle conversations
|
|
194
|
+
for (const conversationId of conversationsToCleanup) {
|
|
195
|
+
try {
|
|
196
|
+
logger.debug("[OperationsStatusService] Publishing cleanup event", {
|
|
197
|
+
conversationId: conversationId.substring(0, 8),
|
|
198
|
+
});
|
|
199
|
+
await this.publishConversationStatus(conversationId, new Set(), projectCtx);
|
|
200
|
+
this.publishedConversations.delete(conversationId);
|
|
201
|
+
this.lastPublishedAgents.delete(conversationId);
|
|
202
|
+
} catch (err) {
|
|
203
|
+
logger.error("[OperationsStatusService] Failed to publish cleanup status", {
|
|
204
|
+
conversationId: conversationId.substring(0, 8),
|
|
205
|
+
error: formatAnyError(err),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const totalActiveAgents = Array.from(activeConversations.values())
|
|
211
|
+
.reduce((sum, agents) => sum + agents.size, 0);
|
|
212
|
+
|
|
213
|
+
logger.debug("[OperationsStatusService] Published status", {
|
|
214
|
+
activeConversations: activeConversations.size,
|
|
215
|
+
cleanedConversations: conversationsToCleanup.size,
|
|
216
|
+
totalActiveAgents,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private hasAgentsChanged(conversationId: string, currentAgents: Set<string>): boolean {
|
|
221
|
+
const lastAgents = this.lastPublishedAgents.get(conversationId);
|
|
222
|
+
if (!lastAgents) return true;
|
|
223
|
+
|
|
224
|
+
if (lastAgents.size !== currentAgents.size) return true;
|
|
225
|
+
|
|
226
|
+
for (const agent of currentAgents) {
|
|
227
|
+
if (!lastAgents.has(agent)) return true;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private async publishConversationStatus(
|
|
234
|
+
conversationId: string,
|
|
235
|
+
agentPubkeys: Set<string>,
|
|
236
|
+
projectCtx: ProjectContext
|
|
237
|
+
): Promise<void> {
|
|
238
|
+
const event = new NDKEvent(getNDK());
|
|
239
|
+
event.kind = NDKKind.TenexOperationsStatus;
|
|
240
|
+
|
|
241
|
+
// Content is empty - runtime is now tracked in agent publisher events
|
|
242
|
+
event.content = "";
|
|
243
|
+
|
|
244
|
+
// Single e-tag for the conversation (thread root)
|
|
245
|
+
event.tag(["e", conversationId]);
|
|
246
|
+
|
|
247
|
+
// Uppercase P-tags for whitelisted human users from config
|
|
248
|
+
const whitelistedPubkeys = config.getWhitelistedPubkeys(undefined, config.getConfig());
|
|
249
|
+
for (const pubkey of whitelistedPubkeys) {
|
|
250
|
+
event.tag(["P", pubkey]);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Lowercase p-tags for actively streaming agents only
|
|
254
|
+
for (const pubkey of agentPubkeys) {
|
|
255
|
+
event.tag(["p", pubkey]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// A-tag for the project
|
|
259
|
+
event.tag(projectCtx.project.tagReference());
|
|
260
|
+
|
|
261
|
+
// Sign with backend signer and publish
|
|
262
|
+
const backendSigner = await config.getBackendSigner();
|
|
263
|
+
await event.sign(backendSigner, { pTags: false });
|
|
264
|
+
await event.publish();
|
|
265
|
+
|
|
266
|
+
const isCleanup = agentPubkeys.size === 0;
|
|
267
|
+
logger.debug("[OperationsStatusService] Published conversation status", {
|
|
268
|
+
conversationId: conversationId.substring(0, 8),
|
|
269
|
+
whitelistedUsers: whitelistedPubkeys.map((p) => p.substring(0, 8)),
|
|
270
|
+
agentCount: agentPubkeys.size,
|
|
271
|
+
type: isCleanup ? "cleanup" : "active",
|
|
272
|
+
pTags: Array.from(agentPubkeys).map((p) => p.substring(0, 8)),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
}
|