@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,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Event IDs - Branded types for type-safe ID handling
|
|
3
|
+
*
|
|
4
|
+
* This module provides branded types to prevent bugs where functions receive
|
|
5
|
+
* wrong ID formats. The three main ID categories are:
|
|
6
|
+
*
|
|
7
|
+
* 1. FullEventId (64-char hex) - Full Nostr event IDs and conversation IDs
|
|
8
|
+
* 2. ShortEventId (12-char hex) - Shortened IDs for display and user input
|
|
9
|
+
* 3. ShellTaskId (7-char alphanumeric) - Background shell task identifiers
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Create typed IDs
|
|
14
|
+
* const fullId = createFullEventId("a1b2c3..."); // 64 chars
|
|
15
|
+
* const shortId = createShortEventId("a1b2c3d4e5f6"); // 12 chars
|
|
16
|
+
*
|
|
17
|
+
* // Type guards
|
|
18
|
+
* if (isFullEventId(input)) {
|
|
19
|
+
* // input is FullEventId
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* // Conversion
|
|
23
|
+
* const short = shortenEventId(fullId); // FullEventId -> ShortEventId
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Branded Types
|
|
29
|
+
// =============================================================================
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 64-character lowercase hex string (Nostr event ID / conversation ID)
|
|
33
|
+
*
|
|
34
|
+
* This is the canonical format for:
|
|
35
|
+
* - Nostr event IDs
|
|
36
|
+
* - Conversation IDs
|
|
37
|
+
* - Delegation IDs
|
|
38
|
+
* - Agent pubkeys (technically different semantic, same format)
|
|
39
|
+
*/
|
|
40
|
+
export type FullEventId = string & { readonly __brand: "FullEventId" };
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 12-character lowercase hex string (shortened event ID for display)
|
|
44
|
+
*
|
|
45
|
+
* Used for:
|
|
46
|
+
* - User-facing display (logs, UI, tool outputs)
|
|
47
|
+
* - User input (when typing IDs manually)
|
|
48
|
+
* - Prefix lookups via PrefixKVStore
|
|
49
|
+
*
|
|
50
|
+
* Provides 48 bits of entropy (2^48 ≈ 281 trillion combinations),
|
|
51
|
+
* giving very low collision probability for typical conversation volumes.
|
|
52
|
+
*/
|
|
53
|
+
export type ShortEventId = string & { readonly __brand: "ShortEventId" };
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 7-character alphanumeric string (shell background task ID)
|
|
57
|
+
*
|
|
58
|
+
* Generated via Math.random().toString(36).substring(2, 9)
|
|
59
|
+
* Used only for background shell task tracking (in-memory, per-process)
|
|
60
|
+
*/
|
|
61
|
+
export type ShellTaskId = string & { readonly __brand: "ShellTaskId" };
|
|
62
|
+
|
|
63
|
+
// =============================================================================
|
|
64
|
+
// Union Types
|
|
65
|
+
// =============================================================================
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Any event ID format (full or short)
|
|
69
|
+
* Use when a function accepts either format and will resolve internally
|
|
70
|
+
*/
|
|
71
|
+
export type AnyEventId = FullEventId | ShortEventId;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Any task/target ID format
|
|
75
|
+
* Use for kill tool and similar commands that accept multiple ID types
|
|
76
|
+
*/
|
|
77
|
+
export type AnyTaskId = FullEventId | ShortEventId | ShellTaskId;
|
|
78
|
+
|
|
79
|
+
// =============================================================================
|
|
80
|
+
// Constants
|
|
81
|
+
// =============================================================================
|
|
82
|
+
|
|
83
|
+
/** Length of a full event ID (64 hex characters) */
|
|
84
|
+
export const FULL_EVENT_ID_LENGTH = 64;
|
|
85
|
+
|
|
86
|
+
/** Length of a short event ID prefix (12 hex characters) */
|
|
87
|
+
export const SHORT_EVENT_ID_LENGTH = 12;
|
|
88
|
+
|
|
89
|
+
/** Length of a shell task ID (7 alphanumeric characters) */
|
|
90
|
+
export const SHELL_TASK_ID_LENGTH = 7;
|
|
91
|
+
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Type Guards
|
|
94
|
+
// =============================================================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Check if a string is a valid full event ID format (64-char lowercase hex)
|
|
98
|
+
*/
|
|
99
|
+
export function isFullEventId(id: string): id is FullEventId {
|
|
100
|
+
return /^[0-9a-f]{64}$/.test(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Check if a string is a valid short event ID format (12-char lowercase hex)
|
|
105
|
+
*/
|
|
106
|
+
export function isShortEventId(id: string): id is ShortEventId {
|
|
107
|
+
return /^[0-9a-f]{12}$/.test(id);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if a string is a valid shell task ID format (7-char alphanumeric)
|
|
112
|
+
*/
|
|
113
|
+
export function isShellTaskId(id: string): id is ShellTaskId {
|
|
114
|
+
return /^[a-z0-9]{7}$/.test(id);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Detect the type of an ID string
|
|
119
|
+
*
|
|
120
|
+
* @returns The detected type, or null if the format is not recognized
|
|
121
|
+
*/
|
|
122
|
+
export function detectIdType(id: string): "full" | "short" | "shell" | null {
|
|
123
|
+
const normalized = id.toLowerCase();
|
|
124
|
+
|
|
125
|
+
if (isFullEventId(normalized)) {
|
|
126
|
+
return "full";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (isShortEventId(normalized)) {
|
|
130
|
+
return "short";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (isShellTaskId(normalized)) {
|
|
134
|
+
return "shell";
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// =============================================================================
|
|
141
|
+
// Factory Functions
|
|
142
|
+
// =============================================================================
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Create a FullEventId from a string, with validation
|
|
146
|
+
*
|
|
147
|
+
* @throws Error if the input is not a valid 64-char hex string
|
|
148
|
+
*/
|
|
149
|
+
export function createFullEventId(id: string): FullEventId {
|
|
150
|
+
const normalized = id.toLowerCase();
|
|
151
|
+
|
|
152
|
+
if (!isFullEventId(normalized)) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
`Invalid FullEventId: expected 64-char lowercase hex string, got "${id.substring(0, 20)}..." (length: ${id.length})`
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return normalized;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Create a ShortEventId from a string, with validation
|
|
163
|
+
*
|
|
164
|
+
* @throws Error if the input is not a valid 12-char hex string
|
|
165
|
+
*/
|
|
166
|
+
export function createShortEventId(id: string): ShortEventId {
|
|
167
|
+
const normalized = id.toLowerCase();
|
|
168
|
+
|
|
169
|
+
if (!isShortEventId(normalized)) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
`Invalid ShortEventId: expected 12-char lowercase hex string, got "${id}" (length: ${id.length})`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return normalized;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Create a ShellTaskId from a string, with validation
|
|
180
|
+
*
|
|
181
|
+
* @throws Error if the input is not a valid 7-char alphanumeric string
|
|
182
|
+
*/
|
|
183
|
+
export function createShellTaskId(id: string): ShellTaskId {
|
|
184
|
+
const normalized = id.toLowerCase();
|
|
185
|
+
|
|
186
|
+
if (!isShellTaskId(normalized)) {
|
|
187
|
+
throw new Error(
|
|
188
|
+
`Invalid ShellTaskId: expected 7-char lowercase alphanumeric string, got "${id}" (length: ${id.length})`
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return normalized;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Attempt to create a FullEventId, returning null on failure instead of throwing
|
|
197
|
+
*/
|
|
198
|
+
export function tryCreateFullEventId(id: string): FullEventId | null {
|
|
199
|
+
const normalized = id.toLowerCase();
|
|
200
|
+
return isFullEventId(normalized) ? normalized : null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Attempt to create a ShortEventId, returning null on failure instead of throwing
|
|
205
|
+
*/
|
|
206
|
+
export function tryCreateShortEventId(id: string): ShortEventId | null {
|
|
207
|
+
const normalized = id.toLowerCase();
|
|
208
|
+
return isShortEventId(normalized) ? normalized : null;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Attempt to create a ShellTaskId, returning null on failure instead of throwing
|
|
213
|
+
*/
|
|
214
|
+
export function tryCreateShellTaskId(id: string): ShellTaskId | null {
|
|
215
|
+
const normalized = id.toLowerCase();
|
|
216
|
+
return isShellTaskId(normalized) ? normalized : null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// =============================================================================
|
|
220
|
+
// Conversion Functions
|
|
221
|
+
// =============================================================================
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Shorten a full event ID to a short event ID (first 12 characters)
|
|
225
|
+
*/
|
|
226
|
+
export function shortenEventId(fullId: FullEventId): ShortEventId {
|
|
227
|
+
return fullId.substring(0, SHORT_EVENT_ID_LENGTH) as ShortEventId;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Convert any typed ID back to a raw string
|
|
232
|
+
* Useful for interfacing with external APIs that expect plain strings
|
|
233
|
+
*/
|
|
234
|
+
export function toRawString(id: AnyEventId | ShellTaskId): string {
|
|
235
|
+
return id as string;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// =============================================================================
|
|
239
|
+
// Assertion Functions
|
|
240
|
+
// =============================================================================
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Assert that a string is a valid FullEventId (already lowercase)
|
|
244
|
+
*
|
|
245
|
+
* NOTE: This assertion is STRICT - it requires the string to already be
|
|
246
|
+
* lowercase. If you have potentially uppercase input, use createFullEventId()
|
|
247
|
+
* which normalizes and returns the typed ID.
|
|
248
|
+
*
|
|
249
|
+
* @throws Error if the assertion fails (not 64-char lowercase hex)
|
|
250
|
+
*/
|
|
251
|
+
export function assertFullEventId(id: string): asserts id is FullEventId {
|
|
252
|
+
if (!isFullEventId(id)) {
|
|
253
|
+
throw new Error(
|
|
254
|
+
`Assertion failed: expected FullEventId (64-char lowercase hex), got "${id.substring(0, 20)}..." (length: ${id.length}). Use createFullEventId() to normalize uppercase input.`
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Assert that a string is a valid ShortEventId (already lowercase)
|
|
261
|
+
*
|
|
262
|
+
* NOTE: This assertion is STRICT - it requires the string to already be
|
|
263
|
+
* lowercase. If you have potentially uppercase input, use createShortEventId()
|
|
264
|
+
* which normalizes and returns the typed ID.
|
|
265
|
+
*
|
|
266
|
+
* @throws Error if the assertion fails (not 12-char lowercase hex)
|
|
267
|
+
*/
|
|
268
|
+
export function assertShortEventId(id: string): asserts id is ShortEventId {
|
|
269
|
+
if (!isShortEventId(id)) {
|
|
270
|
+
throw new Error(
|
|
271
|
+
`Assertion failed: expected ShortEventId (12-char lowercase hex), got "${id}" (length: ${id.length}). Use createShortEventId() to normalize uppercase input.`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Assert that a string is a valid ShellTaskId (already lowercase)
|
|
278
|
+
*
|
|
279
|
+
* NOTE: This assertion is STRICT - it requires the string to already be
|
|
280
|
+
* lowercase. If you have potentially uppercase input, use createShellTaskId()
|
|
281
|
+
* which normalizes and returns the typed ID.
|
|
282
|
+
*
|
|
283
|
+
* @throws Error if the assertion fails (not 7-char lowercase alphanumeric)
|
|
284
|
+
*/
|
|
285
|
+
export function assertShellTaskId(id: string): asserts id is ShellTaskId {
|
|
286
|
+
if (!isShellTaskId(id)) {
|
|
287
|
+
throw new Error(
|
|
288
|
+
`Assertion failed: expected ShellTaskId (7-char lowercase alphanumeric), got "${id}" (length: ${id.length}). Use createShellTaskId() to normalize uppercase input.`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// =============================================================================
|
|
294
|
+
// Utility Functions
|
|
295
|
+
// =============================================================================
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Parse an ID from user input, detecting its type
|
|
299
|
+
*
|
|
300
|
+
* @returns Object with typed ID and detected type, or null if unrecognized
|
|
301
|
+
*/
|
|
302
|
+
export function parseEventId(
|
|
303
|
+
input: string
|
|
304
|
+
): { id: FullEventId; type: "full" } | { id: ShortEventId; type: "short" } | { id: ShellTaskId; type: "shell" } | null {
|
|
305
|
+
const normalized = input.trim().toLowerCase();
|
|
306
|
+
|
|
307
|
+
if (isFullEventId(normalized)) {
|
|
308
|
+
return { id: normalized, type: "full" };
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (isShortEventId(normalized)) {
|
|
312
|
+
return { id: normalized, type: "short" };
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (isShellTaskId(normalized)) {
|
|
316
|
+
return { id: normalized, type: "shell" };
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types barrel export
|
|
3
|
+
*
|
|
4
|
+
* Centralized exports for all custom types used throughout the system.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Event ID types and utilities
|
|
8
|
+
export {
|
|
9
|
+
// Branded types
|
|
10
|
+
type FullEventId,
|
|
11
|
+
type ShortEventId,
|
|
12
|
+
type ShellTaskId,
|
|
13
|
+
type AnyEventId,
|
|
14
|
+
type AnyTaskId,
|
|
15
|
+
|
|
16
|
+
// Constants
|
|
17
|
+
FULL_EVENT_ID_LENGTH,
|
|
18
|
+
SHORT_EVENT_ID_LENGTH,
|
|
19
|
+
SHELL_TASK_ID_LENGTH,
|
|
20
|
+
|
|
21
|
+
// Type guards
|
|
22
|
+
isFullEventId,
|
|
23
|
+
isShortEventId,
|
|
24
|
+
isShellTaskId,
|
|
25
|
+
detectIdType,
|
|
26
|
+
|
|
27
|
+
// Factory functions
|
|
28
|
+
createFullEventId,
|
|
29
|
+
createShortEventId,
|
|
30
|
+
createShellTaskId,
|
|
31
|
+
tryCreateFullEventId,
|
|
32
|
+
tryCreateShortEventId,
|
|
33
|
+
tryCreateShellTaskId,
|
|
34
|
+
|
|
35
|
+
// Conversion functions
|
|
36
|
+
shortenEventId,
|
|
37
|
+
toRawString,
|
|
38
|
+
|
|
39
|
+
// Assertion functions
|
|
40
|
+
assertFullEventId,
|
|
41
|
+
assertShortEventId,
|
|
42
|
+
assertShellTaskId,
|
|
43
|
+
|
|
44
|
+
// Utility functions
|
|
45
|
+
parseEventId,
|
|
46
|
+
} from "./event-ids";
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type NDK from "@nostr-dev-kit/ndk";
|
|
2
|
+
import type { NDKEvent } from "@nostr-dev-kit/ndk";
|
|
3
|
+
import { NDKAgentDefinition, type ETagReference } from "@/events/NDKAgentDefinition";
|
|
4
|
+
import { logger } from "./logger";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Represents the parsed data from an agent definition event.
|
|
8
|
+
* Contains all fields needed to instantiate or display an agent.
|
|
9
|
+
*/
|
|
10
|
+
export interface AgentDefinitionData {
|
|
11
|
+
/** The Nostr event ID of the agent definition */
|
|
12
|
+
id: string;
|
|
13
|
+
/** The slug identifier (d-tag) for versioning */
|
|
14
|
+
slug: string | undefined;
|
|
15
|
+
/** Display name of the agent */
|
|
16
|
+
title: string;
|
|
17
|
+
/** Short one-liner description */
|
|
18
|
+
description: string;
|
|
19
|
+
/** Extended markdown description from content field */
|
|
20
|
+
markdownDescription: string | undefined;
|
|
21
|
+
/** The agent's role/personality */
|
|
22
|
+
role: string;
|
|
23
|
+
/** Detailed operational instructions */
|
|
24
|
+
instructions: string;
|
|
25
|
+
/** Criteria for when to use this agent */
|
|
26
|
+
useCriteria: string;
|
|
27
|
+
/** Version number of the agent definition */
|
|
28
|
+
version: number;
|
|
29
|
+
/** Unix timestamp when the event was created */
|
|
30
|
+
created_at: number | undefined;
|
|
31
|
+
/** Pubkey of the agent definition author */
|
|
32
|
+
pubkey: string;
|
|
33
|
+
/** References to bundled file metadata events */
|
|
34
|
+
fileETags: ETagReference[];
|
|
35
|
+
/** Reference to the source agent if this is a fork */
|
|
36
|
+
forkSource: ETagReference | undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Fetches an agent event from Nostr
|
|
41
|
+
* @param eventId - The ID of the event containing the agent
|
|
42
|
+
* @param ndk - The NDK instance to use for fetching
|
|
43
|
+
* @returns The agent event or null if not found
|
|
44
|
+
*/
|
|
45
|
+
export async function fetchAgent(eventId: string, ndk: NDK): Promise<NDKEvent | null> {
|
|
46
|
+
try {
|
|
47
|
+
// Strip "nostr:" prefix if present
|
|
48
|
+
const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
|
|
49
|
+
|
|
50
|
+
const event = await ndk.fetchEvent(cleanEventId, { groupable: false });
|
|
51
|
+
|
|
52
|
+
if (!event) {
|
|
53
|
+
logger.debug(`Agent event not found: ${cleanEventId}`);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return event;
|
|
58
|
+
} catch (error) {
|
|
59
|
+
logger.error(`Failed to fetch agent event: ${eventId}`, error);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Fetches an agent definition from a Nostr event
|
|
66
|
+
* @param eventId - The ID of the event containing the agent definition
|
|
67
|
+
* @param ndk - The NDK instance to use for fetching
|
|
68
|
+
* @returns The agent definition data or null if not found
|
|
69
|
+
*/
|
|
70
|
+
export async function fetchAgentDefinition(
|
|
71
|
+
eventId: string,
|
|
72
|
+
ndk: NDK
|
|
73
|
+
): Promise<AgentDefinitionData | null> {
|
|
74
|
+
try {
|
|
75
|
+
// Strip "nostr:" prefix if present
|
|
76
|
+
const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
|
|
77
|
+
|
|
78
|
+
const event = await ndk.fetchEvent(cleanEventId, { groupable: false });
|
|
79
|
+
|
|
80
|
+
if (!event) {
|
|
81
|
+
logger.warning(`Agent event not found: ${cleanEventId}`);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Use NDKAgentDefinition for proper parsing
|
|
86
|
+
const agentDef = NDKAgentDefinition.from(event);
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
id: event.id,
|
|
90
|
+
slug: agentDef.slug,
|
|
91
|
+
title: agentDef.title || "Unnamed Agent",
|
|
92
|
+
description: agentDef.description || "",
|
|
93
|
+
markdownDescription: agentDef.markdownDescription,
|
|
94
|
+
role: agentDef.role || "assistant",
|
|
95
|
+
instructions: agentDef.instructions || "",
|
|
96
|
+
useCriteria: agentDef.useCriteria || "",
|
|
97
|
+
version: agentDef.version,
|
|
98
|
+
created_at: event.created_at,
|
|
99
|
+
pubkey: event.pubkey,
|
|
100
|
+
fileETags: agentDef.getFileETags(),
|
|
101
|
+
forkSource: agentDef.getForkSource(),
|
|
102
|
+
};
|
|
103
|
+
} catch (error) {
|
|
104
|
+
logger.error(`Failed to fetch agent event: ${eventId}`, error);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { formatAnyError } from "@/lib/error-formatter";
|
|
2
|
+
import { logger } from "./logger";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Centralized CLI error handler that ensures consistent error logging and exit behavior
|
|
6
|
+
* @param error - The error object or message
|
|
7
|
+
* @param context - Optional context for better error reporting
|
|
8
|
+
* @param exitCode - The process exit code (default: 1)
|
|
9
|
+
*/
|
|
10
|
+
export function handleCliError(error: unknown, context?: string, exitCode = 1): never {
|
|
11
|
+
const errorMessage = formatAnyError(error);
|
|
12
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
13
|
+
|
|
14
|
+
// Log error with context
|
|
15
|
+
if (context) {
|
|
16
|
+
logger.error(`${context}: ${errorMessage}`);
|
|
17
|
+
} else {
|
|
18
|
+
logger.error(errorMessage);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Log stack trace in debug mode
|
|
22
|
+
if (errorStack && process.env.DEBUG) {
|
|
23
|
+
logger.debug(errorStack);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Exit with specified code
|
|
27
|
+
process.exit(exitCode);
|
|
28
|
+
}
|
|
29
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation ID Utilities
|
|
3
|
+
*
|
|
4
|
+
* Centralized utilities for handling conversation IDs throughout the system.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { PREFIX_LENGTH } from "@/utils/nostr-entity-parser";
|
|
8
|
+
import type { ShortEventId, FullEventId } from "@/types/event-ids";
|
|
9
|
+
import { SHORT_EVENT_ID_LENGTH } from "@/types/event-ids";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Shorten a conversation ID for Jaeger span attributes.
|
|
13
|
+
* Uses the standard PREFIX_LENGTH (12 characters) for consistency across all traces.
|
|
14
|
+
* This makes Jaeger UI more readable with reduced length and low collision risk.
|
|
15
|
+
*
|
|
16
|
+
* Note: 12 hex characters provides 48 bits of entropy (2^48 ≈ 281 trillion combinations),
|
|
17
|
+
* which gives very low collision probability for typical conversation volumes.
|
|
18
|
+
*
|
|
19
|
+
* @param conversationId - Full conversation ID (can be typed FullEventId or plain string)
|
|
20
|
+
* @returns Shortened ID (first 12 characters) as ShortEventId
|
|
21
|
+
*/
|
|
22
|
+
export function shortenConversationId(conversationId: string | FullEventId): ShortEventId {
|
|
23
|
+
return conversationId.substring(0, SHORT_EVENT_ID_LENGTH).toLowerCase() as ShortEventId;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Re-export PREFIX_LENGTH for backward compatibility
|
|
27
|
+
export { PREFIX_LENGTH };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Conversation utility functions
|