@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,152 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import { logger } from "@/utils/logger";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* State persisted during graceful restart
|
|
8
|
+
*/
|
|
9
|
+
export interface RestartStateData {
|
|
10
|
+
/** Timestamp when restart was requested */
|
|
11
|
+
requestedAt: number;
|
|
12
|
+
/** List of project IDs that were booted at the time of restart */
|
|
13
|
+
bootedProjects: string[];
|
|
14
|
+
/** PID of the process that requested the restart */
|
|
15
|
+
pid: number;
|
|
16
|
+
/** Hostname for debugging */
|
|
17
|
+
hostname: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Manages restart state persistence for graceful restarts.
|
|
22
|
+
*
|
|
23
|
+
* When the daemon receives SIGHUP in supervised mode, it:
|
|
24
|
+
* 1. Persists the list of currently booted projects
|
|
25
|
+
* 2. Waits for all active RALs to complete
|
|
26
|
+
* 3. Exits cleanly (exit code 0)
|
|
27
|
+
*
|
|
28
|
+
* On startup, the daemon:
|
|
29
|
+
* 1. Checks for restart state file
|
|
30
|
+
* 2. If found, auto-boots the projects listed
|
|
31
|
+
* 3. Clears the restart state file
|
|
32
|
+
*/
|
|
33
|
+
export class RestartState {
|
|
34
|
+
private static readonly RESTART_STATE_FILE = "restart-state.json";
|
|
35
|
+
private daemonDir: string;
|
|
36
|
+
|
|
37
|
+
constructor(daemonDir: string) {
|
|
38
|
+
this.daemonDir = daemonDir;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get the path to the restart state file
|
|
43
|
+
*/
|
|
44
|
+
private getStatePath(): string {
|
|
45
|
+
return path.join(this.daemonDir, RestartState.RESTART_STATE_FILE);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Save restart state before graceful shutdown.
|
|
50
|
+
* Uses atomic write (write to temp file, then rename) to prevent corruption.
|
|
51
|
+
*/
|
|
52
|
+
async save(bootedProjects: string[]): Promise<void> {
|
|
53
|
+
const statePath = this.getStatePath();
|
|
54
|
+
const tempPath = `${statePath}.tmp.${process.pid}`;
|
|
55
|
+
|
|
56
|
+
const state: RestartStateData = {
|
|
57
|
+
requestedAt: Date.now(),
|
|
58
|
+
bootedProjects,
|
|
59
|
+
pid: process.pid,
|
|
60
|
+
hostname: os.hostname(),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
// Write to temp file first
|
|
65
|
+
await fs.writeFile(tempPath, JSON.stringify(state, null, 2), "utf-8");
|
|
66
|
+
|
|
67
|
+
// Atomic rename
|
|
68
|
+
await fs.rename(tempPath, statePath);
|
|
69
|
+
|
|
70
|
+
logger.info("[RestartState] Saved restart state", {
|
|
71
|
+
bootedProjectCount: bootedProjects.length,
|
|
72
|
+
statePath,
|
|
73
|
+
});
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// Clean up temp file on failure
|
|
76
|
+
try {
|
|
77
|
+
await fs.unlink(tempPath);
|
|
78
|
+
} catch {
|
|
79
|
+
// Ignore cleanup errors
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
logger.error("[RestartState] Failed to save restart state", {
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Load restart state if it exists.
|
|
91
|
+
* Returns null if no restart state file is present.
|
|
92
|
+
*/
|
|
93
|
+
async load(): Promise<RestartStateData | null> {
|
|
94
|
+
const statePath = this.getStatePath();
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const content = await fs.readFile(statePath, "utf-8");
|
|
98
|
+
const state: RestartStateData = JSON.parse(content);
|
|
99
|
+
|
|
100
|
+
logger.info("[RestartState] Loaded restart state", {
|
|
101
|
+
requestedAt: new Date(state.requestedAt).toISOString(),
|
|
102
|
+
bootedProjectCount: state.bootedProjects.length,
|
|
103
|
+
originalPid: state.pid,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return state;
|
|
107
|
+
} catch (error) {
|
|
108
|
+
const err = error as NodeJS.ErrnoException;
|
|
109
|
+
if (err.code === "ENOENT") {
|
|
110
|
+
// No restart state file - normal startup
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
logger.error("[RestartState] Failed to load restart state", {
|
|
115
|
+
error: error instanceof Error ? error.message : String(error),
|
|
116
|
+
});
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Clear restart state after successful processing.
|
|
123
|
+
*/
|
|
124
|
+
async clear(): Promise<void> {
|
|
125
|
+
const statePath = this.getStatePath();
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
await fs.unlink(statePath);
|
|
129
|
+
logger.debug("[RestartState] Cleared restart state file");
|
|
130
|
+
} catch (error) {
|
|
131
|
+
const err = error as NodeJS.ErrnoException;
|
|
132
|
+
if (err.code !== "ENOENT") {
|
|
133
|
+
logger.warn("[RestartState] Failed to clear restart state", {
|
|
134
|
+
error: error instanceof Error ? error.message : String(error),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Check if a restart state file exists
|
|
142
|
+
*/
|
|
143
|
+
async exists(): Promise<boolean> {
|
|
144
|
+
const statePath = this.getStatePath();
|
|
145
|
+
try {
|
|
146
|
+
await fs.stat(statePath);
|
|
147
|
+
return true;
|
|
148
|
+
} catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { logger } from "@/utils/logger";
|
|
2
|
+
import type { NDKProject } from "@nostr-dev-kit/ndk";
|
|
3
|
+
import { trace } from "@opentelemetry/api";
|
|
4
|
+
import { ProjectAlreadyRunningError } from "@/services/scheduling/errors";
|
|
5
|
+
import { ProjectRuntime } from "./ProjectRuntime";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Manages the lifecycle of project runtimes.
|
|
9
|
+
* Handles starting, stopping, restarting, and crash recovery for ProjectRuntime instances.
|
|
10
|
+
*
|
|
11
|
+
* This class extracts runtime management logic from the Daemon class,
|
|
12
|
+
* eliminating duplicate code and providing a focused responsibility.
|
|
13
|
+
*/
|
|
14
|
+
export class RuntimeLifecycle {
|
|
15
|
+
private activeRuntimes = new Map<string, ProjectRuntime>();
|
|
16
|
+
private startingRuntimes = new Map<string, Promise<ProjectRuntime>>();
|
|
17
|
+
|
|
18
|
+
constructor(private projectsBase: string) {}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get all active runtimes
|
|
22
|
+
*/
|
|
23
|
+
getActiveRuntimes(): Map<string, ProjectRuntime> {
|
|
24
|
+
return new Map(this.activeRuntimes);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get a specific runtime by project ID
|
|
29
|
+
*/
|
|
30
|
+
getRuntime(projectId: string): ProjectRuntime | undefined {
|
|
31
|
+
return this.activeRuntimes.get(projectId);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Check if a runtime is active
|
|
36
|
+
*/
|
|
37
|
+
isRuntimeActive(projectId: string): boolean {
|
|
38
|
+
return this.activeRuntimes.has(projectId);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Start a new runtime for a project.
|
|
43
|
+
* This is the single source of truth for runtime startup logic.
|
|
44
|
+
*
|
|
45
|
+
* @param projectId - The project ID
|
|
46
|
+
* @param project - The NDKProject instance
|
|
47
|
+
* @returns Promise resolving to the started ProjectRuntime
|
|
48
|
+
* @throws Error if startup fails
|
|
49
|
+
*/
|
|
50
|
+
async startRuntime(projectId: string, project: NDKProject): Promise<ProjectRuntime> {
|
|
51
|
+
// Check if already running
|
|
52
|
+
const existingRuntime = this.activeRuntimes.get(projectId);
|
|
53
|
+
if (existingRuntime) {
|
|
54
|
+
const status = existingRuntime.getStatus();
|
|
55
|
+
if (status.isRunning) {
|
|
56
|
+
throw new ProjectAlreadyRunningError(projectId);
|
|
57
|
+
}
|
|
58
|
+
// Runtime exists but is not running - remove it and allow restart
|
|
59
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.removing_stale", {
|
|
60
|
+
"project.id": projectId,
|
|
61
|
+
});
|
|
62
|
+
this.activeRuntimes.delete(projectId);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Check if already starting
|
|
66
|
+
const existingPromise = this.startingRuntimes.get(projectId);
|
|
67
|
+
if (existingPromise) {
|
|
68
|
+
return existingPromise;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const projectTitle = project.tagValue("title") || "Untitled";
|
|
72
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.starting", {
|
|
73
|
+
"project.id": projectId,
|
|
74
|
+
"project.title": projectTitle,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Create startup promise to prevent concurrent startups
|
|
78
|
+
const startupPromise = this.performStartup(project);
|
|
79
|
+
this.startingRuntimes.set(projectId, startupPromise);
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const runtime = await startupPromise;
|
|
83
|
+
this.activeRuntimes.set(projectId, runtime);
|
|
84
|
+
|
|
85
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.started", {
|
|
86
|
+
"project.id": projectId,
|
|
87
|
+
"project.title": projectTitle,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return runtime;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
logger.error(`Failed to start project runtime: ${projectId}`, {
|
|
93
|
+
error: error instanceof Error ? error.message : String(error),
|
|
94
|
+
});
|
|
95
|
+
throw error;
|
|
96
|
+
} finally {
|
|
97
|
+
// Always clean up the starting promise
|
|
98
|
+
this.startingRuntimes.delete(projectId);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Perform the actual runtime startup
|
|
104
|
+
* @param project - The NDKProject instance
|
|
105
|
+
* @returns Promise resolving to the started ProjectRuntime
|
|
106
|
+
*/
|
|
107
|
+
private async performStartup(project: NDKProject): Promise<ProjectRuntime> {
|
|
108
|
+
const newRuntime = new ProjectRuntime(project, this.projectsBase);
|
|
109
|
+
await newRuntime.start();
|
|
110
|
+
return newRuntime;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Stop a runtime gracefully
|
|
115
|
+
* @param projectId - The project ID to stop
|
|
116
|
+
* @throws Error if the runtime is not found
|
|
117
|
+
*/
|
|
118
|
+
async stopRuntime(projectId: string): Promise<void> {
|
|
119
|
+
const runtime = this.activeRuntimes.get(projectId);
|
|
120
|
+
if (!runtime) {
|
|
121
|
+
throw new Error(`Runtime not found: ${projectId}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopping", {
|
|
125
|
+
"project.id": projectId,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
await runtime.stop();
|
|
130
|
+
this.activeRuntimes.delete(projectId);
|
|
131
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopped", {
|
|
132
|
+
"project.id": projectId,
|
|
133
|
+
});
|
|
134
|
+
} catch (error) {
|
|
135
|
+
logger.error(`Error stopping project runtime: ${projectId}`, {
|
|
136
|
+
error: error instanceof Error ? error.message : String(error),
|
|
137
|
+
});
|
|
138
|
+
// Still remove from active runtimes even if stop fails
|
|
139
|
+
this.activeRuntimes.delete(projectId);
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Restart a runtime (stop and start again)
|
|
146
|
+
* @param projectId - The project ID to restart
|
|
147
|
+
* @param project - The NDKProject instance (needed for restart)
|
|
148
|
+
* @throws Error if the runtime is not found or restart fails
|
|
149
|
+
*/
|
|
150
|
+
async restartRuntime(projectId: string, project: NDKProject): Promise<ProjectRuntime> {
|
|
151
|
+
const runtime = this.activeRuntimes.get(projectId);
|
|
152
|
+
if (!runtime) {
|
|
153
|
+
throw new Error(`Runtime not found: ${projectId}`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.restarting", {
|
|
157
|
+
"project.id": projectId,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
// Stop the runtime
|
|
162
|
+
await runtime.stop();
|
|
163
|
+
this.activeRuntimes.delete(projectId);
|
|
164
|
+
|
|
165
|
+
// Start it again
|
|
166
|
+
return await this.startRuntime(projectId, project);
|
|
167
|
+
} catch (error) {
|
|
168
|
+
logger.error(`Failed to restart project runtime: ${projectId}`, {
|
|
169
|
+
error: error instanceof Error ? error.message : String(error),
|
|
170
|
+
});
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Handle a crashed runtime by cleaning it up
|
|
177
|
+
* @param projectId - The project ID that crashed
|
|
178
|
+
* @param runtime - The crashed runtime instance
|
|
179
|
+
*/
|
|
180
|
+
async handleRuntimeCrash(projectId: string, runtime: ProjectRuntime): Promise<void> {
|
|
181
|
+
logger.error(`Handling crashed runtime: ${projectId}`);
|
|
182
|
+
|
|
183
|
+
// Remove from active runtimes
|
|
184
|
+
this.activeRuntimes.delete(projectId);
|
|
185
|
+
|
|
186
|
+
// Best effort cleanup
|
|
187
|
+
try {
|
|
188
|
+
await runtime.stop();
|
|
189
|
+
} catch (cleanupError) {
|
|
190
|
+
logger.warn(`Failed to clean up crashed runtime: ${projectId}`, {
|
|
191
|
+
error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Stop all active runtimes (for shutdown)
|
|
198
|
+
*/
|
|
199
|
+
async stopAllRuntimes(): Promise<void> {
|
|
200
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopping_all", {
|
|
201
|
+
"runtimes.active_count": this.activeRuntimes.size,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
const stopPromises = Array.from(this.activeRuntimes.entries()).map(
|
|
205
|
+
async ([projectId, runtime]) => {
|
|
206
|
+
try {
|
|
207
|
+
await runtime.stop();
|
|
208
|
+
} catch (error) {
|
|
209
|
+
logger.error(`Error stopping runtime during shutdown: ${projectId}`, {
|
|
210
|
+
error: error instanceof Error ? error.message : String(error),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
await Promise.all(stopPromises);
|
|
217
|
+
this.activeRuntimes.clear();
|
|
218
|
+
|
|
219
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.all_stopped");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get statistics about managed runtimes
|
|
224
|
+
*/
|
|
225
|
+
getStats(): {
|
|
226
|
+
activeCount: number;
|
|
227
|
+
startingCount: number;
|
|
228
|
+
projectIds: string[];
|
|
229
|
+
} {
|
|
230
|
+
return {
|
|
231
|
+
activeCount: this.activeRuntimes.size,
|
|
232
|
+
startingCount: this.startingRuntimes.size,
|
|
233
|
+
projectIds: Array.from(this.activeRuntimes.keys()),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Check if any runtimes are currently starting
|
|
239
|
+
*/
|
|
240
|
+
hasStartingRuntimes(): boolean {
|
|
241
|
+
return this.startingRuntimes.size > 0;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Wait for all starting runtimes to complete
|
|
246
|
+
* Useful for graceful shutdown
|
|
247
|
+
*/
|
|
248
|
+
async waitForStartingRuntimes(): Promise<void> {
|
|
249
|
+
if (this.startingRuntimes.size === 0) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
trace.getActiveSpan()?.addEvent("runtime_lifecycle.waiting_for_starting", {
|
|
254
|
+
"runtimes.starting_count": this.startingRuntimes.size,
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
const promises = Array.from(this.startingRuntimes.values());
|
|
258
|
+
await Promise.allSettled(promises);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Get list of currently active project IDs.
|
|
263
|
+
* Used by graceful restart to persist which projects to auto-boot after restart.
|
|
264
|
+
*/
|
|
265
|
+
getActiveProjectIds(): string[] {
|
|
266
|
+
return Array.from(this.activeRuntimes.keys());
|
|
267
|
+
}
|
|
268
|
+
}
|