@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,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex App Server Provider
|
|
3
|
+
*
|
|
4
|
+
* OpenAI Codex using app-server mode with JSON-RPC for mid-execution
|
|
5
|
+
* message injection support.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
createCodexAppServer,
|
|
10
|
+
type CodexAppServerSettings,
|
|
11
|
+
type Session,
|
|
12
|
+
type McpServerConfigOrSdk,
|
|
13
|
+
} from "ai-sdk-provider-codex-app-server";
|
|
14
|
+
import type { LanguageModelUsage } from "ai";
|
|
15
|
+
import { logger } from "@/utils/logger";
|
|
16
|
+
import { trace } from "@opentelemetry/api";
|
|
17
|
+
import type { LanguageModelUsageWithCostUsd } from "../../types";
|
|
18
|
+
import type {
|
|
19
|
+
ProviderInitConfig,
|
|
20
|
+
ProviderMetadata,
|
|
21
|
+
ProviderRuntimeContext,
|
|
22
|
+
} from "../types";
|
|
23
|
+
import { AgentProvider, type AgentProviderFunction } from "../base/AgentProvider";
|
|
24
|
+
import { CodexAppServerToolsAdapter } from "./CodexAppServerToolsAdapter";
|
|
25
|
+
import { PROVIDER_IDS } from "../provider-ids";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Codex App Server-specific metadata structure
|
|
29
|
+
*/
|
|
30
|
+
interface CodexAppServerProviderMetadata {
|
|
31
|
+
costUsd?: number;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* AI SDK usage with optional extended fields
|
|
37
|
+
*/
|
|
38
|
+
interface ExtendedUsage extends LanguageModelUsage {
|
|
39
|
+
cachedInputTokens?: number;
|
|
40
|
+
reasoningTokens?: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Codex App Server provider implementation
|
|
45
|
+
*
|
|
46
|
+
* Unlike CodexCliProvider which uses one-shot execution, this provider
|
|
47
|
+
* uses app-server mode for persistent threads and mid-execution injection.
|
|
48
|
+
*/
|
|
49
|
+
export class CodexAppServerProvider extends AgentProvider {
|
|
50
|
+
static readonly METADATA: ProviderMetadata = AgentProvider.createMetadata(
|
|
51
|
+
PROVIDER_IDS.CODEX_APP_SERVER,
|
|
52
|
+
"Codex App Server",
|
|
53
|
+
"OpenAI Codex with app-server mode and mid-execution injection",
|
|
54
|
+
"agent",
|
|
55
|
+
"gpt-5.1-codex-max",
|
|
56
|
+
{
|
|
57
|
+
streaming: true,
|
|
58
|
+
toolCalling: true,
|
|
59
|
+
builtInTools: true,
|
|
60
|
+
sessionResumption: true,
|
|
61
|
+
requiresApiKey: false,
|
|
62
|
+
mcpSupport: true,
|
|
63
|
+
},
|
|
64
|
+
"https://openai.com/codex"
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
private currentSession: Session | null = null;
|
|
68
|
+
|
|
69
|
+
get metadata(): ProviderMetadata {
|
|
70
|
+
return CodexAppServerProvider.METADATA;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get the current session for mid-execution injection
|
|
75
|
+
*/
|
|
76
|
+
getSession(): Session | null {
|
|
77
|
+
return this.currentSession;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Create the Codex App Server provider function
|
|
82
|
+
*/
|
|
83
|
+
protected createProviderFunction(_config: ProviderInitConfig): AgentProviderFunction {
|
|
84
|
+
return createCodexAppServer({
|
|
85
|
+
defaultSettings: {},
|
|
86
|
+
}) as AgentProviderFunction;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Create the agent settings for Codex App Server
|
|
91
|
+
*/
|
|
92
|
+
protected createAgentSettings(
|
|
93
|
+
context: ProviderRuntimeContext,
|
|
94
|
+
_modelId: string
|
|
95
|
+
): CodexAppServerSettings {
|
|
96
|
+
trace.getActiveSpan()?.addEvent("llm_factory.creating_codex_app_server", {
|
|
97
|
+
"agent.name": context.agentName ?? "",
|
|
98
|
+
"session.id": context.sessionId ?? "",
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const toolNames = context.tools ? Object.keys(context.tools) : [];
|
|
102
|
+
const regularTools = toolNames.filter((name) => !name.startsWith("mcp__"));
|
|
103
|
+
|
|
104
|
+
logger.debug("[CodexAppServerProvider] Tool analysis", {
|
|
105
|
+
agentName: context.agentName,
|
|
106
|
+
totalToolNames: toolNames.length,
|
|
107
|
+
regularTools: regularTools.length,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Build mcpServers configuration - can include SdkMcpServer for in-process tools
|
|
111
|
+
const mcpServersConfig: Record<string, McpServerConfigOrSdk> = {};
|
|
112
|
+
|
|
113
|
+
// Create TENEX SDK MCP server if we have TENEX tools
|
|
114
|
+
if (context.tools && regularTools.length > 0) {
|
|
115
|
+
const tenexServer = CodexAppServerToolsAdapter.createSdkMcpServer(
|
|
116
|
+
context.tools,
|
|
117
|
+
{ agentName: context.agentName }
|
|
118
|
+
);
|
|
119
|
+
if (tenexServer) {
|
|
120
|
+
mcpServersConfig.tenex = tenexServer;
|
|
121
|
+
logger.debug("[CodexAppServerProvider] Added TENEX SDK MCP server", {
|
|
122
|
+
toolCount: regularTools.length,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Add configured MCP servers (stdio format)
|
|
128
|
+
const mcpConfig = context.mcpConfig;
|
|
129
|
+
if (mcpConfig?.enabled && mcpConfig.servers) {
|
|
130
|
+
for (const [serverName, serverConfig] of Object.entries(mcpConfig.servers)) {
|
|
131
|
+
mcpServersConfig[serverName] = {
|
|
132
|
+
transport: "stdio",
|
|
133
|
+
command: serverConfig.command,
|
|
134
|
+
args: serverConfig.args,
|
|
135
|
+
env: serverConfig.env,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
trace.getActiveSpan()?.addEvent("llm_factory.codex_app_server_mcp_added", {
|
|
140
|
+
"mcp.server_count": Object.keys(mcpConfig.servers).length,
|
|
141
|
+
"mcp.servers": Object.keys(mcpConfig.servers).join(", "),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const settings: CodexAppServerSettings = {
|
|
146
|
+
cwd: context.workingDirectory,
|
|
147
|
+
mcpServers: mcpServersConfig,
|
|
148
|
+
approvalMode: "on-failure",
|
|
149
|
+
sandboxMode: "workspace-write",
|
|
150
|
+
threadMode: "stateless",
|
|
151
|
+
reasoningEffort: context.reasoningEffort,
|
|
152
|
+
verbose: false,
|
|
153
|
+
logger: {
|
|
154
|
+
warn: (message: string) => logger.warn("[CodexAppServer]", message),
|
|
155
|
+
error: (message: string) => logger.error("[CodexAppServer]", message),
|
|
156
|
+
info: (message: string) => logger.info("[CodexAppServer]", message),
|
|
157
|
+
debug: (message: string) => logger.debug("[CodexAppServer]", message),
|
|
158
|
+
},
|
|
159
|
+
onSessionCreated: (session: Session) => {
|
|
160
|
+
this.currentSession = session;
|
|
161
|
+
logger.info("[CodexAppServerProvider] Session created", {
|
|
162
|
+
threadId: session.threadId,
|
|
163
|
+
reasoningEffort: context.reasoningEffort,
|
|
164
|
+
});
|
|
165
|
+
trace.getActiveSpan()?.addEvent("codex_app_server.session_created", {
|
|
166
|
+
"session.threadId": session.threadId,
|
|
167
|
+
"reasoning.effort": context.reasoningEffort ?? "default",
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
if (context.sessionId) {
|
|
173
|
+
settings.resume = context.sessionId;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return settings;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Codex App Server is always available (no API key required)
|
|
181
|
+
*/
|
|
182
|
+
isAvailable(): boolean {
|
|
183
|
+
return this._initialized;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Extract usage metadata from Codex App Server provider response
|
|
188
|
+
*/
|
|
189
|
+
static extractUsageMetadata(
|
|
190
|
+
model: string,
|
|
191
|
+
totalUsage: LanguageModelUsage | undefined,
|
|
192
|
+
providerMetadata: Record<string, unknown> | undefined
|
|
193
|
+
): LanguageModelUsageWithCostUsd {
|
|
194
|
+
const metadata = providerMetadata?.[PROVIDER_IDS.CODEX_APP_SERVER] as CodexAppServerProviderMetadata | undefined;
|
|
195
|
+
const extendedUsage = totalUsage as ExtendedUsage | undefined;
|
|
196
|
+
|
|
197
|
+
const inputTokens = totalUsage?.inputTokens;
|
|
198
|
+
const outputTokens = totalUsage?.outputTokens;
|
|
199
|
+
const totalTokens = totalUsage?.totalTokens ??
|
|
200
|
+
(inputTokens !== undefined && outputTokens !== undefined
|
|
201
|
+
? inputTokens + outputTokens
|
|
202
|
+
: undefined);
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
model,
|
|
206
|
+
inputTokens,
|
|
207
|
+
outputTokens,
|
|
208
|
+
totalTokens,
|
|
209
|
+
costUsd: metadata?.costUsd,
|
|
210
|
+
cachedInputTokens: extendedUsage?.cachedInputTokens,
|
|
211
|
+
reasoningTokens: extendedUsage?.reasoningTokens,
|
|
212
|
+
} as LanguageModelUsageWithCostUsd;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { AISdkTool } from "@/tools/types";
|
|
2
|
+
import { logger } from "@/utils/logger";
|
|
3
|
+
import { createSdkMcpServer, tool, type SdkMcpServer, type Tool, type ToolDefinition } from "ai-sdk-provider-codex-app-server";
|
|
4
|
+
import { z, type ZodRawShape } from "zod";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Converts TENEX tools to Codex App Server SDK MCP server format.
|
|
8
|
+
*
|
|
9
|
+
* This adapter uses createSdkMcpServer which handles HTTP server lifecycle
|
|
10
|
+
* automatically - the user API is identical to Claude Code's createSdkMcpServer.
|
|
11
|
+
*/
|
|
12
|
+
export class CodexAppServerToolsAdapter {
|
|
13
|
+
/**
|
|
14
|
+
* Create an SDK MCP server from TENEX tools
|
|
15
|
+
* Pass the result directly to mcpServers in provider settings.
|
|
16
|
+
*/
|
|
17
|
+
static createSdkMcpServer(
|
|
18
|
+
tools: Record<string, AISdkTool>,
|
|
19
|
+
context: { agentName?: string }
|
|
20
|
+
): SdkMcpServer | undefined {
|
|
21
|
+
const localTools = Object.entries(tools);
|
|
22
|
+
|
|
23
|
+
logger.debug("[CodexAppServerToolsAdapter] Input tools analysis:", {
|
|
24
|
+
totalTools: Object.keys(tools).length,
|
|
25
|
+
localToolsCount: localTools.length,
|
|
26
|
+
localToolNames: localTools.map(([name]) => name),
|
|
27
|
+
agentName: context.agentName,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if (localTools.length === 0) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const codexTools = this.convertTools(localTools, tools);
|
|
35
|
+
|
|
36
|
+
logger.info("[CodexAppServerToolsAdapter] Creating SDK MCP server:", {
|
|
37
|
+
serverName: "tenex",
|
|
38
|
+
toolCount: codexTools.length,
|
|
39
|
+
toolNames: localTools.map(([name]) => name),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return createSdkMcpServer({
|
|
43
|
+
name: "tenex",
|
|
44
|
+
tools: codexTools,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Convert TENEX tools to Codex Tool format
|
|
50
|
+
*/
|
|
51
|
+
private static convertTools(
|
|
52
|
+
localTools: [string, AISdkTool][],
|
|
53
|
+
allTools: Record<string, AISdkTool>
|
|
54
|
+
): Tool[] {
|
|
55
|
+
return localTools.map(([name, tenexTool]) => {
|
|
56
|
+
let zodSchema: unknown = z.object({});
|
|
57
|
+
|
|
58
|
+
if (tenexTool.inputSchema) {
|
|
59
|
+
const schema = tenexTool.inputSchema;
|
|
60
|
+
if (schema && typeof schema === "object" && "shape" in schema) {
|
|
61
|
+
const shape = (schema as z.ZodObject<ZodRawShape>).shape;
|
|
62
|
+
zodSchema = z.object(shape);
|
|
63
|
+
} else if (schema && typeof schema === "object" && !("_def" in schema)) {
|
|
64
|
+
zodSchema = z.object(schema as unknown as ZodRawShape);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return tool<unknown, unknown>({
|
|
69
|
+
name,
|
|
70
|
+
description: tenexTool.description || `Execute ${name}`,
|
|
71
|
+
parameters: zodSchema as ToolDefinition<unknown, unknown>["parameters"],
|
|
72
|
+
execute: async (args: unknown) => {
|
|
73
|
+
const executeTool = allTools[name];
|
|
74
|
+
if (!executeTool?.execute) {
|
|
75
|
+
throw new Error(`Tool ${name} not found or has no execute function`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
logger.debug(`[CodexAppServerToolsAdapter] Executing tool ${name}`);
|
|
79
|
+
|
|
80
|
+
const result = await executeTool.execute(args, {
|
|
81
|
+
abortSignal: new AbortController().signal,
|
|
82
|
+
toolCallId: "tool-call-" + Date.now(),
|
|
83
|
+
messages: [],
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Providers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all agent-based providers.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { ClaudeCodeProvider } from "./ClaudeCodeProvider";
|
|
8
|
+
export { ClaudeCodeToolsAdapter } from "./ClaudeCodeToolsAdapter";
|
|
9
|
+
export { CodexAppServerProvider } from "./CodexAppServerProvider";
|
|
10
|
+
export { CodexAppServerToolsAdapter } from "./CodexAppServerToolsAdapter";
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Provider - Base class for agent-based LLM providers
|
|
3
|
+
*
|
|
4
|
+
* Agent providers (like claude-code, codex-app-server) have their own
|
|
5
|
+
* execution model with built-in tools and session management.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { LanguageModel } from "ai";
|
|
9
|
+
import type {
|
|
10
|
+
ProviderInitConfig,
|
|
11
|
+
ProviderRuntimeContext,
|
|
12
|
+
ProviderModelResult,
|
|
13
|
+
} from "../types";
|
|
14
|
+
import { BaseProvider } from "./BaseProvider";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Configuration type for agent provider functions
|
|
18
|
+
*/
|
|
19
|
+
export type AgentProviderFunction<TSettings = unknown> = (
|
|
20
|
+
model: string,
|
|
21
|
+
options?: TSettings
|
|
22
|
+
) => LanguageModel;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Base class for agent-based providers
|
|
26
|
+
*
|
|
27
|
+
* Agent providers:
|
|
28
|
+
* - Have their own built-in tools
|
|
29
|
+
* - Support session resumption
|
|
30
|
+
* - Bypass the standard AI SDK registry
|
|
31
|
+
* - Create provider functions instead of provider instances
|
|
32
|
+
*/
|
|
33
|
+
export abstract class AgentProvider extends BaseProvider {
|
|
34
|
+
protected providerFunction: AgentProviderFunction | null = null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Agent providers don't use the standard provider instance
|
|
38
|
+
*/
|
|
39
|
+
getProviderInstance(): null {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the provider function for creating models
|
|
45
|
+
*/
|
|
46
|
+
getProviderFunction(): AgentProviderFunction | null {
|
|
47
|
+
return this.providerFunction;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Create the agent settings for the provider
|
|
52
|
+
* Must be implemented by subclasses
|
|
53
|
+
*/
|
|
54
|
+
protected abstract createAgentSettings(
|
|
55
|
+
context: ProviderRuntimeContext,
|
|
56
|
+
modelId: string
|
|
57
|
+
): unknown;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create the provider function
|
|
61
|
+
* Must be implemented by subclasses
|
|
62
|
+
*/
|
|
63
|
+
protected abstract createProviderFunction(config: ProviderInitConfig): AgentProviderFunction;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Initialize the agent provider
|
|
67
|
+
*/
|
|
68
|
+
async initialize(config: ProviderInitConfig): Promise<void> {
|
|
69
|
+
this.config = config;
|
|
70
|
+
this.providerFunction = this.createProviderFunction(config);
|
|
71
|
+
this._initialized = true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Agent providers don't create a standard provider instance
|
|
76
|
+
*/
|
|
77
|
+
protected createProviderInstance(_config: ProviderInitConfig): null {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Create a language model using the provider function
|
|
83
|
+
*/
|
|
84
|
+
createModel(modelId: string, context?: ProviderRuntimeContext): ProviderModelResult {
|
|
85
|
+
if (!this.providerFunction) {
|
|
86
|
+
throw new Error(`Provider ${this.metadata.id} not initialized`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const settings = this.createAgentSettings(context || {}, modelId);
|
|
90
|
+
const model = this.providerFunction(modelId, settings);
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
model,
|
|
94
|
+
providerFunction: this.providerFunction,
|
|
95
|
+
bypassRegistry: true,
|
|
96
|
+
agentSettings: settings,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Reset the provider state
|
|
102
|
+
*/
|
|
103
|
+
reset(): void {
|
|
104
|
+
super.reset();
|
|
105
|
+
this.providerFunction = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Provider - Abstract base class for all LLM providers
|
|
3
|
+
*
|
|
4
|
+
* Provides common functionality for provider implementations.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
ILLMProvider,
|
|
9
|
+
ProviderInitConfig,
|
|
10
|
+
ProviderMetadata,
|
|
11
|
+
ProviderRuntimeContext,
|
|
12
|
+
ProviderModelResult,
|
|
13
|
+
ProviderCapabilities,
|
|
14
|
+
ProviderCategory,
|
|
15
|
+
} from "../types";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Abstract base class for LLM providers
|
|
19
|
+
*/
|
|
20
|
+
export abstract class BaseProvider implements ILLMProvider {
|
|
21
|
+
protected config: ProviderInitConfig | null = null;
|
|
22
|
+
protected _initialized = false;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get provider metadata - must be implemented by subclasses
|
|
26
|
+
*/
|
|
27
|
+
abstract get metadata(): ProviderMetadata;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Create the underlying provider instance
|
|
31
|
+
* Called during initialization for standard providers
|
|
32
|
+
*/
|
|
33
|
+
protected abstract createProviderInstance(config: ProviderInitConfig): unknown | null;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Provider instance storage
|
|
37
|
+
*/
|
|
38
|
+
protected providerInstance: unknown | null = null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Initialize the provider with configuration
|
|
42
|
+
*/
|
|
43
|
+
async initialize(config: ProviderInitConfig): Promise<void> {
|
|
44
|
+
this.config = config;
|
|
45
|
+
this.providerInstance = this.createProviderInstance(config);
|
|
46
|
+
this._initialized = true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Check if the provider is initialized
|
|
51
|
+
*/
|
|
52
|
+
isInitialized(): boolean {
|
|
53
|
+
return this._initialized;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Check if the provider is available
|
|
58
|
+
*/
|
|
59
|
+
isAvailable(): boolean {
|
|
60
|
+
return this._initialized;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get the AI SDK provider instance
|
|
65
|
+
*/
|
|
66
|
+
getProviderInstance(): unknown | null {
|
|
67
|
+
return this.providerInstance;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Create a language model - must be implemented by subclasses
|
|
72
|
+
*/
|
|
73
|
+
abstract createModel(modelId: string, context?: ProviderRuntimeContext): ProviderModelResult;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Reset the provider state
|
|
77
|
+
*/
|
|
78
|
+
reset(): void {
|
|
79
|
+
this.config = null;
|
|
80
|
+
this.providerInstance = null;
|
|
81
|
+
this._initialized = false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Helper to create metadata
|
|
86
|
+
*/
|
|
87
|
+
protected static createMetadata(
|
|
88
|
+
id: string,
|
|
89
|
+
displayName: string,
|
|
90
|
+
description: string,
|
|
91
|
+
category: ProviderCategory,
|
|
92
|
+
defaultModel: string,
|
|
93
|
+
capabilities?: Partial<ProviderCapabilities>,
|
|
94
|
+
documentationUrl?: string
|
|
95
|
+
): ProviderMetadata {
|
|
96
|
+
return {
|
|
97
|
+
id,
|
|
98
|
+
displayName,
|
|
99
|
+
description,
|
|
100
|
+
category,
|
|
101
|
+
defaultModel,
|
|
102
|
+
documentationUrl,
|
|
103
|
+
capabilities: {
|
|
104
|
+
streaming: true,
|
|
105
|
+
toolCalling: true,
|
|
106
|
+
builtInTools: false,
|
|
107
|
+
sessionResumption: false,
|
|
108
|
+
requiresApiKey: true,
|
|
109
|
+
mcpSupport: false,
|
|
110
|
+
...capabilities,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Provider - Base class for standard AI SDK providers
|
|
3
|
+
*
|
|
4
|
+
* Standard providers use AI SDK's createProviderRegistry and follow
|
|
5
|
+
* the standard language model pattern.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ProviderRuntimeContext, ProviderModelResult } from "../types";
|
|
9
|
+
import { BaseProvider } from "./BaseProvider";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Base class for standard AI SDK providers
|
|
13
|
+
*
|
|
14
|
+
* Standard providers:
|
|
15
|
+
* - Use AI SDK's provider packages (@ai-sdk/openai, @ai-sdk/anthropic, etc.)
|
|
16
|
+
* - Are registered in createProviderRegistry
|
|
17
|
+
* - Use the registry.languageModel() pattern
|
|
18
|
+
*/
|
|
19
|
+
export abstract class StandardProvider extends BaseProvider {
|
|
20
|
+
/**
|
|
21
|
+
* Create a language model using the standard registry pattern
|
|
22
|
+
*/
|
|
23
|
+
createModel(modelId: string, _context?: ProviderRuntimeContext): ProviderModelResult {
|
|
24
|
+
if (!this.providerInstance) {
|
|
25
|
+
throw new Error(`Provider ${this.metadata.id} not initialized`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Standard providers get their model from the AI SDK registry
|
|
29
|
+
// The actual model creation is done by the registry in LLMService
|
|
30
|
+
const provider = this.providerInstance as { languageModel: (id: string) => unknown };
|
|
31
|
+
const model = provider.languageModel(modelId);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
model: model as import("ai").LanguageModel,
|
|
35
|
+
bypassRegistry: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Providers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports base classes for provider implementations.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { BaseProvider } from "./BaseProvider";
|
|
8
|
+
export { StandardProvider } from "./StandardProvider";
|
|
9
|
+
export { AgentProvider, type AgentProviderFunction } from "./AgentProvider";
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers Module
|
|
3
|
+
*
|
|
4
|
+
* This module provides a modular, extensible system for LLM providers.
|
|
5
|
+
* Each provider implements the ILLMProvider interface and registers
|
|
6
|
+
* itself with the ProviderRegistry.
|
|
7
|
+
*
|
|
8
|
+
* ## Architecture
|
|
9
|
+
*
|
|
10
|
+
* - **Standard Providers**: Use AI SDK's provider packages and createProviderRegistry
|
|
11
|
+
* Examples: OpenRouter, Anthropic, OpenAI, Ollama
|
|
12
|
+
*
|
|
13
|
+
* - **Agent Providers**: Have built-in tools and session management
|
|
14
|
+
* Examples: Claude Code, Codex CLI
|
|
15
|
+
*
|
|
16
|
+
* ## Adding a New Provider
|
|
17
|
+
*
|
|
18
|
+
* 1. Create a new provider class extending StandardProvider or AgentProvider
|
|
19
|
+
* 2. Implement the required abstract methods
|
|
20
|
+
* 3. Add the provider to the ALL_PROVIDERS array below
|
|
21
|
+
* 4. The provider will be automatically registered and available
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
// Export types
|
|
27
|
+
export * from "./types";
|
|
28
|
+
|
|
29
|
+
// Export provider ID constants
|
|
30
|
+
export { PROVIDER_IDS, type ProviderId } from "./provider-ids";
|
|
31
|
+
|
|
32
|
+
// Export base classes
|
|
33
|
+
export * from "./base";
|
|
34
|
+
|
|
35
|
+
// Export registry
|
|
36
|
+
export { ProviderRegistry, providerRegistry } from "./registry";
|
|
37
|
+
|
|
38
|
+
// Export key manager
|
|
39
|
+
export { KeyManager, keyManager, type KeyManagerConfig, resolveApiKey, hasApiKey } from "./key-manager";
|
|
40
|
+
|
|
41
|
+
// Export standard providers
|
|
42
|
+
export {
|
|
43
|
+
OpenRouterProvider,
|
|
44
|
+
AnthropicProvider,
|
|
45
|
+
OpenAIProvider,
|
|
46
|
+
OllamaProvider,
|
|
47
|
+
} from "./standard";
|
|
48
|
+
|
|
49
|
+
// Export agent providers
|
|
50
|
+
export { ClaudeCodeProvider, CodexAppServerProvider } from "./agent";
|
|
51
|
+
|
|
52
|
+
// Import for registration
|
|
53
|
+
import type { ProviderRegistration } from "./types";
|
|
54
|
+
import { OpenRouterProvider } from "./standard/OpenRouterProvider";
|
|
55
|
+
import { AnthropicProvider } from "./standard/AnthropicProvider";
|
|
56
|
+
import { OpenAIProvider } from "./standard/OpenAIProvider";
|
|
57
|
+
import { OllamaProvider } from "./standard/OllamaProvider";
|
|
58
|
+
import { ClaudeCodeProvider } from "./agent/ClaudeCodeProvider";
|
|
59
|
+
import { CodexAppServerProvider } from "./agent/CodexAppServerProvider";
|
|
60
|
+
import { providerRegistry } from "./registry";
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* All available provider registrations
|
|
64
|
+
*
|
|
65
|
+
* Each provider exposes static metadata to avoid wasteful instantiation.
|
|
66
|
+
* Add new providers to this array to make them available.
|
|
67
|
+
*/
|
|
68
|
+
export const ALL_PROVIDER_REGISTRATIONS: ProviderRegistration[] = [
|
|
69
|
+
// Standard providers
|
|
70
|
+
{
|
|
71
|
+
Provider: OpenRouterProvider,
|
|
72
|
+
metadata: OpenRouterProvider.METADATA,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
Provider: AnthropicProvider,
|
|
76
|
+
metadata: AnthropicProvider.METADATA,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
Provider: OpenAIProvider,
|
|
80
|
+
metadata: OpenAIProvider.METADATA,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
Provider: OllamaProvider,
|
|
84
|
+
metadata: OllamaProvider.METADATA,
|
|
85
|
+
},
|
|
86
|
+
// Agent providers
|
|
87
|
+
{
|
|
88
|
+
Provider: ClaudeCodeProvider,
|
|
89
|
+
metadata: ClaudeCodeProvider.METADATA,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
Provider: CodexAppServerProvider,
|
|
93
|
+
metadata: CodexAppServerProvider.METADATA,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Register all providers with the registry
|
|
99
|
+
* This is called automatically on module load
|
|
100
|
+
*/
|
|
101
|
+
export function registerAllProviders(): void {
|
|
102
|
+
providerRegistry.registerAll(ALL_PROVIDER_REGISTRATIONS);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Auto-register all providers on module load
|
|
106
|
+
registerAllProviders();
|