@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,106 @@
|
|
|
1
|
+
import type NDK from "@nostr-dev-kit/ndk";
|
|
2
|
+
import { NDKEvent, type NDKRawEvent } from "@nostr-dev-kit/ndk";
|
|
3
|
+
|
|
4
|
+
export class NDKAgentLesson extends NDKEvent {
|
|
5
|
+
static kind = 4129;
|
|
6
|
+
static kinds = [4129];
|
|
7
|
+
|
|
8
|
+
constructor(ndk?: NDK, event?: NDKEvent | NDKRawEvent) {
|
|
9
|
+
super(ndk, event);
|
|
10
|
+
this.kind ??= 4129;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static from(event: NDKEvent): NDKAgentLesson {
|
|
14
|
+
return new NDKAgentLesson(event.ndk, event);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get title(): string | undefined {
|
|
18
|
+
return this.tagValue("title");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Title/description of what this lesson is about.
|
|
23
|
+
*/
|
|
24
|
+
set title(value: string | undefined) {
|
|
25
|
+
this.removeTag("title");
|
|
26
|
+
if (value) this.tags.push(["title", value]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The lesson content - what the agent learned.
|
|
31
|
+
* This is stored in the event content.
|
|
32
|
+
*/
|
|
33
|
+
get lesson(): string {
|
|
34
|
+
return this.content;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
set lesson(value: string) {
|
|
38
|
+
this.content = value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Set the agent that this lesson belongs to.
|
|
43
|
+
* @param agentEvent The NDKAgentDefinition event to reference
|
|
44
|
+
*/
|
|
45
|
+
set agentDefinitionId(agentDefinitionId: string) {
|
|
46
|
+
this.removeTag("e");
|
|
47
|
+
this.tags.push(["e", agentDefinitionId]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get the agent event ID this lesson belongs to.
|
|
52
|
+
*/
|
|
53
|
+
get agentDefinitionId(): string | undefined {
|
|
54
|
+
return this.tags.find((tag) => tag[0] === "e")?.[1];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Metacognition reasoning - why this lesson is worth learning
|
|
59
|
+
*/
|
|
60
|
+
get metacognition(): string | undefined {
|
|
61
|
+
return this.tagValue("metacognition");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
set metacognition(value: string | undefined) {
|
|
65
|
+
this.removeTag("metacognition");
|
|
66
|
+
if (value) this.tags.push(["metacognition", value]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Detailed version of the lesson with richer explanation
|
|
71
|
+
*/
|
|
72
|
+
get detailed(): string | undefined {
|
|
73
|
+
return this.tagValue("detailed");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
set detailed(value: string | undefined) {
|
|
77
|
+
this.removeTag("detailed");
|
|
78
|
+
if (value) this.tags.push(["detailed", value]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Category for filing this lesson
|
|
83
|
+
*/
|
|
84
|
+
get category(): string | undefined {
|
|
85
|
+
return this.tagValue("category");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
set category(value: string | undefined) {
|
|
89
|
+
this.removeTag("category");
|
|
90
|
+
if (value) this.tags.push(["category", value]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Hashtags for easier sorting and discovery
|
|
95
|
+
*/
|
|
96
|
+
get hashtags(): string[] {
|
|
97
|
+
return this.tags.filter((tag) => tag[0] === "t").map((tag) => tag[1]);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
set hashtags(values: string[]) {
|
|
101
|
+
this.tags = this.tags.filter((tag) => tag[0] !== "t");
|
|
102
|
+
for (const hashtag of values) {
|
|
103
|
+
this.tags.push(["t", hashtag]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* NDKEventMetadata - Kind 513
|
|
5
|
+
*
|
|
6
|
+
* Allows setting metadata about conversations:
|
|
7
|
+
* - ["e", "<event-id>"] - References the conversation
|
|
8
|
+
* - ["title", "title-of-the-conversation"] - Sets the conversation title
|
|
9
|
+
*/
|
|
10
|
+
export class NDKEventMetadata extends NDKEvent {
|
|
11
|
+
static kind = 513;
|
|
12
|
+
|
|
13
|
+
static from(event: NDKEvent): NDKEventMetadata {
|
|
14
|
+
return new NDKEventMetadata(event.ndk, event);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get conversationId(): string | undefined {
|
|
18
|
+
return this.tagValue("e");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
get title(): string | undefined {
|
|
22
|
+
return this.tagValue("title");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
set title(value: string) {
|
|
26
|
+
this.removeTag("title");
|
|
27
|
+
this.tags.push(["title", value]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
setConversationId(eventId: string): void {
|
|
31
|
+
this.removeTag("e");
|
|
32
|
+
this.tags.push(["e", eventId]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type NDK from "@nostr-dev-kit/ndk";
|
|
2
|
+
import { NDKEvent, type NDKRawEvent } from "@nostr-dev-kit/ndk";
|
|
3
|
+
|
|
4
|
+
export class NDKMCPTool extends NDKEvent {
|
|
5
|
+
static kind = 4200;
|
|
6
|
+
static kinds = [4200];
|
|
7
|
+
|
|
8
|
+
constructor(ndk?: NDK, event?: NDKEvent | NDKRawEvent) {
|
|
9
|
+
super(ndk, event);
|
|
10
|
+
this.kind ??= 4200;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static from(event: NDKEvent): NDKMCPTool {
|
|
14
|
+
return new NDKMCPTool(event.ndk, event);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
get name(): string | undefined {
|
|
18
|
+
return this.tagValue("name");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
set name(value: string | undefined) {
|
|
22
|
+
this.removeTag("name");
|
|
23
|
+
if (value) this.tags.push(["name", value]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get description(): string | undefined {
|
|
27
|
+
return this.tagValue("description");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
set description(value: string | undefined) {
|
|
31
|
+
this.removeTag("description");
|
|
32
|
+
if (value) this.tags.push(["description", value]);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get command(): string | undefined {
|
|
36
|
+
return this.tagValue("command");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
set command(value: string | undefined) {
|
|
40
|
+
this.removeTag("command");
|
|
41
|
+
if (value) this.tags.push(["command", value]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get image(): string | undefined {
|
|
45
|
+
return this.tagValue("image");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
set image(value: string | undefined) {
|
|
49
|
+
this.removeTag("image");
|
|
50
|
+
if (value) this.tags.push(["image", value]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get slug(): string {
|
|
54
|
+
const name = this.name || "unnamed";
|
|
55
|
+
return name
|
|
56
|
+
.toLowerCase()
|
|
57
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
58
|
+
.replace(/^-|-$/g, "");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import { NDKKind } from "@/nostr/kinds";
|
|
2
|
+
import type NDK from "@nostr-dev-kit/ndk";
|
|
3
|
+
import { NDKEvent, type NDKRawEvent } from "@nostr-dev-kit/ndk";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* NDKProjectStatus represents a TenexProjectStatus event
|
|
7
|
+
* Used to indicate project status including online agents and model configurations
|
|
8
|
+
*/
|
|
9
|
+
export class NDKProjectStatus extends NDKEvent {
|
|
10
|
+
static kind = NDKKind.TenexProjectStatus;
|
|
11
|
+
static kinds = [NDKKind.TenexProjectStatus];
|
|
12
|
+
|
|
13
|
+
constructor(ndk?: NDK, event?: NDKEvent | NDKRawEvent) {
|
|
14
|
+
super(ndk, event);
|
|
15
|
+
this.kind ??= NDKKind.TenexProjectStatus;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static from(event: NDKEvent): NDKProjectStatus {
|
|
19
|
+
return new NDKProjectStatus(event.ndk, event);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the project this status refers to
|
|
24
|
+
* Returns the value of the "a" tag (replaceable event reference)
|
|
25
|
+
*/
|
|
26
|
+
get projectReference(): string | undefined {
|
|
27
|
+
return this.tagValue("a");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Set the project this status refers to
|
|
32
|
+
* @param projectTagId The tag ID of the NDKProject event (format: kind:pubkey:dTag)
|
|
33
|
+
*/
|
|
34
|
+
set projectReference(projectTagId: string | undefined) {
|
|
35
|
+
this.removeTag("a");
|
|
36
|
+
if (projectTagId) {
|
|
37
|
+
this.tags.push(["a", projectTagId]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get all agent entries from this status event
|
|
43
|
+
* Returns an array of {pubkey, slug} objects
|
|
44
|
+
*/
|
|
45
|
+
get agents(): Array<{ pubkey: string; slug: string }> {
|
|
46
|
+
const agentTags = this.tags.filter((tag) => tag[0] === "agent" && tag[1] && tag[2]);
|
|
47
|
+
return agentTags.map((tag) => ({
|
|
48
|
+
pubkey: tag[1],
|
|
49
|
+
slug: tag[2],
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Add an agent to the status
|
|
55
|
+
* @param pubkey The agent's public key
|
|
56
|
+
* @param slug The agent's slug/identifier
|
|
57
|
+
*/
|
|
58
|
+
addAgent(pubkey: string, slug: string): void {
|
|
59
|
+
this.tags.push(["agent", pubkey, slug]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Remove an agent from the status
|
|
64
|
+
* @param pubkey The agent's public key to remove
|
|
65
|
+
*/
|
|
66
|
+
removeAgent(pubkey: string): void {
|
|
67
|
+
this.tags = this.tags.filter((tag) => !(tag[0] === "agent" && tag[1] === pubkey));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Clear all agents from the status
|
|
72
|
+
*/
|
|
73
|
+
clearAgents(): void {
|
|
74
|
+
this.tags = this.tags.filter((tag) => tag[0] !== "agent");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check if a specific agent is in the status
|
|
79
|
+
* @param pubkey The agent's public key
|
|
80
|
+
*/
|
|
81
|
+
hasAgent(pubkey: string): boolean {
|
|
82
|
+
return this.tags.some((tag) => tag[0] === "agent" && tag[1] === pubkey);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get all model configurations from this status event
|
|
87
|
+
* Returns an array of {modelSlug, agents} objects where agents is an array of agent slugs
|
|
88
|
+
*/
|
|
89
|
+
get models(): Array<{ modelSlug: string; agents: string[] }> {
|
|
90
|
+
const modelTags = this.tags.filter((tag) => tag[0] === "model" && tag[1]);
|
|
91
|
+
return modelTags.map((tag) => ({
|
|
92
|
+
modelSlug: tag[1],
|
|
93
|
+
agents: tag.slice(2).filter((a) => a), // Get all agent slugs from index 2 onwards
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Add a model with its agent access list
|
|
99
|
+
* @param modelSlug The model slug identifier (e.g., "gpt-4", "claude-3")
|
|
100
|
+
* @param agentSlugs Array of agent slugs that use this model
|
|
101
|
+
*/
|
|
102
|
+
addModel(modelSlug: string, agentSlugs: string[]): void {
|
|
103
|
+
// Remove existing model tag if it exists
|
|
104
|
+
this.removeModel(modelSlug);
|
|
105
|
+
// Add new model tag with all agent slugs
|
|
106
|
+
this.tags.push(["model", modelSlug, ...agentSlugs]);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Remove a model from the status
|
|
111
|
+
* @param modelSlug The model slug to remove
|
|
112
|
+
*/
|
|
113
|
+
removeModel(modelSlug: string): void {
|
|
114
|
+
this.tags = this.tags.filter((tag) => !(tag[0] === "model" && tag[1] === modelSlug));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Clear all model configurations from the status
|
|
119
|
+
*/
|
|
120
|
+
clearModels(): void {
|
|
121
|
+
this.tags = this.tags.filter((tag) => tag[0] !== "model");
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Check if a specific model exists
|
|
126
|
+
* @param modelSlug The model slug
|
|
127
|
+
*/
|
|
128
|
+
hasModel(modelSlug: string): boolean {
|
|
129
|
+
return this.tags.some((tag) => tag[0] === "model" && tag[1] === modelSlug);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get agents that use a specific model
|
|
134
|
+
* @param modelSlug The model slug
|
|
135
|
+
* @returns Array of agent slugs that use this model
|
|
136
|
+
*/
|
|
137
|
+
getModelAgents(modelSlug: string): string[] {
|
|
138
|
+
const modelTag = this.tags.find((tag) => tag[0] === "model" && tag[1] === modelSlug);
|
|
139
|
+
return modelTag ? modelTag.slice(2).filter((a) => a) : [];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Check if a specific agent uses a model
|
|
144
|
+
* @param modelSlug The model slug
|
|
145
|
+
* @param agentSlug The agent slug
|
|
146
|
+
*/
|
|
147
|
+
agentUsesModel(modelSlug: string, agentSlug: string): boolean {
|
|
148
|
+
const agents = this.getModelAgents(modelSlug);
|
|
149
|
+
return agents.includes(agentSlug);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Get all models used by a specific agent
|
|
154
|
+
* @param agentSlug The agent slug
|
|
155
|
+
* @returns Array of model slugs used by this agent
|
|
156
|
+
*/
|
|
157
|
+
getAgentModels(agentSlug: string): string[] {
|
|
158
|
+
return this.models
|
|
159
|
+
.filter((model) => model.agents.includes(agentSlug))
|
|
160
|
+
.map((model) => model.modelSlug);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Get the status message/content
|
|
165
|
+
*/
|
|
166
|
+
get status(): string {
|
|
167
|
+
return this.content;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Set the status message/content
|
|
172
|
+
*/
|
|
173
|
+
set status(value: string) {
|
|
174
|
+
this.content = value;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get all tools with their agent access information
|
|
179
|
+
* Returns an array of {toolName, agents} objects where agents is an array of agent slugs
|
|
180
|
+
*/
|
|
181
|
+
get tools(): Array<{ toolName: string; agents: string[] }> {
|
|
182
|
+
const toolTags = this.tags.filter((tag) => tag[0] === "tool" && tag[1]);
|
|
183
|
+
return toolTags.map((tag) => ({
|
|
184
|
+
toolName: tag[1],
|
|
185
|
+
agents: tag.slice(2).filter((a) => a), // Get all agent slugs from index 2 onwards
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Add a tool with its agent access list
|
|
191
|
+
* @param toolName The name of the tool
|
|
192
|
+
* @param agentSlugs Array of agent slugs that have access to this tool
|
|
193
|
+
*/
|
|
194
|
+
addTool(toolName: string, agentSlugs: string[]): void {
|
|
195
|
+
// Remove existing tool tag if it exists
|
|
196
|
+
this.removeTool(toolName);
|
|
197
|
+
// Add new tool tag with all agent slugs
|
|
198
|
+
this.tags.push(["tool", toolName, ...agentSlugs]);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Remove a tool from the status
|
|
203
|
+
* @param toolName The tool name to remove
|
|
204
|
+
*/
|
|
205
|
+
removeTool(toolName: string): void {
|
|
206
|
+
this.tags = this.tags.filter((tag) => !(tag[0] === "tool" && tag[1] === toolName));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Clear all tools from the status
|
|
211
|
+
*/
|
|
212
|
+
clearTools(): void {
|
|
213
|
+
this.tags = this.tags.filter((tag) => tag[0] !== "tool");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Check if a specific tool exists
|
|
218
|
+
* @param toolName The tool name
|
|
219
|
+
*/
|
|
220
|
+
hasTool(toolName: string): boolean {
|
|
221
|
+
return this.tags.some((tag) => tag[0] === "tool" && tag[1] === toolName);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get agents that have access to a specific tool
|
|
226
|
+
* @param toolName The tool name
|
|
227
|
+
* @returns Array of agent slugs that have access to this tool
|
|
228
|
+
*/
|
|
229
|
+
getToolAgents(toolName: string): string[] {
|
|
230
|
+
const toolTag = this.tags.find((tag) => tag[0] === "tool" && tag[1] === toolName);
|
|
231
|
+
return toolTag ? toolTag.slice(2).filter((a) => a) : [];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Check if a specific agent has access to a tool
|
|
236
|
+
* @param toolName The tool name
|
|
237
|
+
* @param agentSlug The agent slug
|
|
238
|
+
*/
|
|
239
|
+
agentHasTool(toolName: string, agentSlug: string): boolean {
|
|
240
|
+
const agents = this.getToolAgents(toolName);
|
|
241
|
+
return agents.includes(agentSlug);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Get all tools accessible by a specific agent
|
|
246
|
+
* @param agentSlug The agent slug
|
|
247
|
+
* @returns Array of tool names accessible by this agent
|
|
248
|
+
*/
|
|
249
|
+
getAgentTools(agentSlug: string): string[] {
|
|
250
|
+
return this.tools
|
|
251
|
+
.filter((tool) => tool.agents.includes(agentSlug))
|
|
252
|
+
.map((tool) => tool.toolName);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Get all worktrees from this status event
|
|
257
|
+
* Returns an array of branch names, with the first being the default branch
|
|
258
|
+
*/
|
|
259
|
+
get worktrees(): string[] {
|
|
260
|
+
const worktreeTags = this.tags.filter((tag) => tag[0] === "branch" && tag[1]);
|
|
261
|
+
return worktreeTags.map((tag) => tag[1]);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Add a worktree to the status
|
|
266
|
+
* @param branchName The branch name
|
|
267
|
+
*/
|
|
268
|
+
addWorktree(branchName: string): void {
|
|
269
|
+
this.tags.push(["branch", branchName]);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Get the default worktree (first worktree in the list)
|
|
274
|
+
*/
|
|
275
|
+
get defaultWorktree(): string | undefined {
|
|
276
|
+
return this.worktrees[0];
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// ========================================================================
|
|
280
|
+
// Scheduled Tasks
|
|
281
|
+
// ========================================================================
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Get all scheduled tasks from this status event
|
|
285
|
+
* Tag format: ["scheduled-task", id, title, schedule, targetAgent, type, lastRunTimestamp]
|
|
286
|
+
*/
|
|
287
|
+
get scheduledTasks(): Array<{
|
|
288
|
+
id: string;
|
|
289
|
+
title: string;
|
|
290
|
+
schedule: string;
|
|
291
|
+
/** Agent slug when resolvable, otherwise a truncated pubkey prefix */
|
|
292
|
+
targetAgent: string;
|
|
293
|
+
type: "cron" | "oneoff";
|
|
294
|
+
lastRun?: number;
|
|
295
|
+
}> {
|
|
296
|
+
const taskTags = this.tags.filter((tag) => tag[0] === "scheduled-task" && tag[1]);
|
|
297
|
+
return taskTags.map((tag) => {
|
|
298
|
+
const rawType = tag[5];
|
|
299
|
+
const type = rawType === "cron" || rawType === "oneoff" ? rawType : "cron";
|
|
300
|
+
const parsedLastRun = tag[6] ? Number(tag[6]) : NaN;
|
|
301
|
+
const lastRun = Number.isFinite(parsedLastRun) ? parsedLastRun : undefined;
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
id: tag[1],
|
|
305
|
+
title: tag[2] || "",
|
|
306
|
+
schedule: tag[3] || "",
|
|
307
|
+
targetAgent: tag[4] || "",
|
|
308
|
+
type,
|
|
309
|
+
lastRun,
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Add a scheduled task to the status
|
|
316
|
+
* @param id Task identifier
|
|
317
|
+
* @param title Human-readable task title
|
|
318
|
+
* @param schedule Cron expression or ISO timestamp
|
|
319
|
+
* @param targetAgent Agent slug or pubkey-prefix label for the target agent
|
|
320
|
+
* @param type Task type: "cron" or "oneoff"
|
|
321
|
+
* @param lastRun Optional last run Unix timestamp in seconds
|
|
322
|
+
*/
|
|
323
|
+
addScheduledTask(
|
|
324
|
+
id: string,
|
|
325
|
+
title: string,
|
|
326
|
+
schedule: string,
|
|
327
|
+
targetAgent: string,
|
|
328
|
+
type: "cron" | "oneoff",
|
|
329
|
+
lastRun?: number
|
|
330
|
+
): void {
|
|
331
|
+
this.tags.push([
|
|
332
|
+
"scheduled-task",
|
|
333
|
+
id,
|
|
334
|
+
title,
|
|
335
|
+
schedule,
|
|
336
|
+
targetAgent,
|
|
337
|
+
type,
|
|
338
|
+
lastRun !== undefined ? String(lastRun) : "",
|
|
339
|
+
]);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Remove a scheduled task from the status
|
|
344
|
+
* @param id The task ID to remove
|
|
345
|
+
*/
|
|
346
|
+
removeScheduledTask(id: string): void {
|
|
347
|
+
this.tags = this.tags.filter(
|
|
348
|
+
(tag) => !(tag[0] === "scheduled-task" && tag[1] === id)
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Clear all scheduled tasks from the status
|
|
354
|
+
*/
|
|
355
|
+
clearScheduledTasks(): void {
|
|
356
|
+
this.tags = this.tags.filter((tag) => tag[0] !== "scheduled-task");
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Check if a specific scheduled task exists
|
|
361
|
+
* @param id The task ID
|
|
362
|
+
*/
|
|
363
|
+
hasScheduledTask(id: string): boolean {
|
|
364
|
+
return this.tags.some((tag) => tag[0] === "scheduled-task" && tag[1] === id);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Get all scheduled tasks targeting a specific agent
|
|
369
|
+
* @param agentIdentifier The agent slug or truncated pubkey prefix
|
|
370
|
+
*/
|
|
371
|
+
getScheduledTasksForAgent(agentIdentifier: string): Array<{
|
|
372
|
+
id: string;
|
|
373
|
+
title: string;
|
|
374
|
+
schedule: string;
|
|
375
|
+
/** Agent slug when resolvable, otherwise a truncated pubkey prefix */
|
|
376
|
+
targetAgent: string;
|
|
377
|
+
type: "cron" | "oneoff";
|
|
378
|
+
lastRun?: number;
|
|
379
|
+
}> {
|
|
380
|
+
return this.scheduledTasks.filter(
|
|
381
|
+
(task) => task.targetAgent === agentIdentifier
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
}
|