@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.
Files changed (427) hide show
  1. package/README.md +194 -0
  2. package/dist/backend-wrapper.cjs +3 -0
  3. package/dist/src/index.js +331928 -0
  4. package/package.json +103 -0
  5. package/src/agents/AgentRegistry.ts +418 -0
  6. package/src/agents/AgentStorage.ts +1133 -0
  7. package/src/agents/ConfigResolver.ts +229 -0
  8. package/src/agents/agent-installer.ts +236 -0
  9. package/src/agents/agent-loader.ts +241 -0
  10. package/src/agents/constants.ts +82 -0
  11. package/src/agents/errors.ts +48 -0
  12. package/src/agents/execution/AgentExecutor.ts +561 -0
  13. package/src/agents/execution/ExecutionContextFactory.ts +112 -0
  14. package/src/agents/execution/MessageCompiler.ts +597 -0
  15. package/src/agents/execution/MessageSyncer.ts +100 -0
  16. package/src/agents/execution/PostCompletionChecker.ts +278 -0
  17. package/src/agents/execution/ProgressMonitor.ts +50 -0
  18. package/src/agents/execution/RALResolver.ts +177 -0
  19. package/src/agents/execution/SessionManager.ts +181 -0
  20. package/src/agents/execution/StreamCallbacks.ts +312 -0
  21. package/src/agents/execution/StreamExecutionHandler.ts +579 -0
  22. package/src/agents/execution/StreamSetup.ts +313 -0
  23. package/src/agents/execution/ToolEventHandlers.ts +239 -0
  24. package/src/agents/execution/ToolExecutionTracker.ts +498 -0
  25. package/src/agents/execution/ToolResultUtils.ts +97 -0
  26. package/src/agents/execution/ToolSupervisionWrapper.ts +174 -0
  27. package/src/agents/execution/constants.ts +16 -0
  28. package/src/agents/execution/index.ts +3 -0
  29. package/src/agents/execution/types.ts +96 -0
  30. package/src/agents/execution/utils.ts +26 -0
  31. package/src/agents/index.ts +4 -0
  32. package/src/agents/script-installer.ts +266 -0
  33. package/src/agents/supervision/SupervisorLLMService.ts +253 -0
  34. package/src/agents/supervision/SupervisorOrchestrator.ts +471 -0
  35. package/src/agents/supervision/heuristics/ConsecutiveToolsWithoutTodoHeuristic.ts +73 -0
  36. package/src/agents/supervision/heuristics/DelegationClaimHeuristic.ts +80 -0
  37. package/src/agents/supervision/heuristics/HeuristicRegistry.ts +114 -0
  38. package/src/agents/supervision/heuristics/PendingTodosHeuristic.ts +93 -0
  39. package/src/agents/supervision/heuristics/SilentAgentHeuristic.ts +54 -0
  40. package/src/agents/supervision/heuristics/index.ts +5 -0
  41. package/src/agents/supervision/index.ts +28 -0
  42. package/src/agents/supervision/registerHeuristics.ts +110 -0
  43. package/src/agents/supervision/supervisionHealthCheck.ts +123 -0
  44. package/src/agents/supervision/types.ts +171 -0
  45. package/src/agents/tool-names.ts +46 -0
  46. package/src/agents/tool-normalization.ts +184 -0
  47. package/src/agents/types/index.ts +2 -0
  48. package/src/agents/types/runtime.ts +74 -0
  49. package/src/agents/types/storage.ts +145 -0
  50. package/src/commands/agent/import/index.ts +6 -0
  51. package/src/commands/agent/import/openclaw-distiller.ts +57 -0
  52. package/src/commands/agent/import/openclaw-reader.ts +141 -0
  53. package/src/commands/agent/import/openclaw.ts +154 -0
  54. package/src/commands/agent/index.ts +6 -0
  55. package/src/commands/agent.ts +215 -0
  56. package/src/commands/daemon.ts +198 -0
  57. package/src/commands/doctor.ts +134 -0
  58. package/src/commands/setup/embed.ts +228 -0
  59. package/src/commands/setup/global-system-prompt.ts +223 -0
  60. package/src/commands/setup/image.ts +179 -0
  61. package/src/commands/setup/index.ts +16 -0
  62. package/src/commands/setup/interactive.ts +95 -0
  63. package/src/commands/setup/llm.ts +38 -0
  64. package/src/commands/setup/onboarding.ts +294 -0
  65. package/src/commands/setup/providers.ts +27 -0
  66. package/src/constants.ts +34 -0
  67. package/src/conversations/ConversationDiskReader.ts +148 -0
  68. package/src/conversations/ConversationRegistry.ts +728 -0
  69. package/src/conversations/ConversationStore.ts +868 -0
  70. package/src/conversations/MessageBuilder.ts +866 -0
  71. package/src/conversations/executionTime.ts +62 -0
  72. package/src/conversations/formatters/DelegationXmlFormatter.ts +64 -0
  73. package/src/conversations/formatters/ThreadedConversationFormatter.ts +303 -0
  74. package/src/conversations/formatters/index.ts +9 -0
  75. package/src/conversations/formatters/utils/MessageFormatter.ts +46 -0
  76. package/src/conversations/formatters/utils/TimestampFormatter.ts +56 -0
  77. package/src/conversations/formatters/utils/TreeBuilder.ts +131 -0
  78. package/src/conversations/formatters/utils/TreeRenderer.ts +49 -0
  79. package/src/conversations/index.ts +2 -0
  80. package/src/conversations/persistence/ToolMessageStorage.ts +143 -0
  81. package/src/conversations/search/ConversationIndexManager.ts +393 -0
  82. package/src/conversations/search/QueryParser.ts +114 -0
  83. package/src/conversations/search/SearchEngine.ts +175 -0
  84. package/src/conversations/search/SnippetExtractor.ts +345 -0
  85. package/src/conversations/search/embeddings/ConversationEmbeddingService.ts +484 -0
  86. package/src/conversations/search/embeddings/ConversationIndexingJob.ts +320 -0
  87. package/src/conversations/search/embeddings/IndexingStateManager.ts +338 -0
  88. package/src/conversations/search/embeddings/index.ts +18 -0
  89. package/src/conversations/search/index.ts +49 -0
  90. package/src/conversations/search/types.ts +124 -0
  91. package/src/conversations/services/CategoryManager.ts +160 -0
  92. package/src/conversations/services/ConversationResolver.ts +296 -0
  93. package/src/conversations/services/ConversationSummarizer.ts +234 -0
  94. package/src/conversations/services/MetadataDebounceManager.ts +188 -0
  95. package/src/conversations/services/index.ts +2 -0
  96. package/src/conversations/types.ts +148 -0
  97. package/src/conversations/utils/content-utils.ts +69 -0
  98. package/src/conversations/utils/image-placeholder.ts +281 -0
  99. package/src/conversations/utils/image-url-utils.ts +171 -0
  100. package/src/conversations/utils/multimodal-content.ts +90 -0
  101. package/src/conversations/utils/tool-result-truncator.ts +159 -0
  102. package/src/daemon/Daemon.ts +1883 -0
  103. package/src/daemon/ProjectRuntime.ts +657 -0
  104. package/src/daemon/RestartState.ts +152 -0
  105. package/src/daemon/RuntimeLifecycle.ts +268 -0
  106. package/src/daemon/SubscriptionManager.ts +305 -0
  107. package/src/daemon/UnixSocketTransport.ts +318 -0
  108. package/src/daemon/filters/SubscriptionFilterBuilder.ts +119 -0
  109. package/src/daemon/index.ts +9 -0
  110. package/src/daemon/routing/DaemonRouter.ts +491 -0
  111. package/src/daemon/types.ts +150 -0
  112. package/src/daemon/utils/routing-log.ts +76 -0
  113. package/src/daemon/utils/telemetry.ts +173 -0
  114. package/src/event-handler/agentDeletion.ts +383 -0
  115. package/src/event-handler/index.ts +749 -0
  116. package/src/event-handler/newConversation.ts +165 -0
  117. package/src/event-handler/project.ts +166 -0
  118. package/src/event-handler/reply.ts +18 -0
  119. package/src/events/NDKAgentDefinition.ts +292 -0
  120. package/src/events/NDKAgentLesson.ts +106 -0
  121. package/src/events/NDKEventMetadata.ts +34 -0
  122. package/src/events/NDKMCPTool.ts +60 -0
  123. package/src/events/NDKProjectStatus.ts +384 -0
  124. package/src/events/index.ts +4 -0
  125. package/src/index.ts +126 -0
  126. package/src/lib/agent-home.ts +334 -0
  127. package/src/lib/error-formatter.ts +200 -0
  128. package/src/lib/fs/filesystem.ts +128 -0
  129. package/src/lib/fs/index.ts +1 -0
  130. package/src/lib/json-parser.ts +30 -0
  131. package/src/lib/string.ts +15 -0
  132. package/src/lib/time.ts +74 -0
  133. package/src/llm/ChunkHandler.ts +277 -0
  134. package/src/llm/FinishHandler.ts +250 -0
  135. package/src/llm/LLMConfigEditor.ts +154 -0
  136. package/src/llm/LLMServiceFactory.ts +230 -0
  137. package/src/llm/MessageProcessor.ts +90 -0
  138. package/src/llm/RecordingState.ts +37 -0
  139. package/src/llm/StreamPublisher.ts +40 -0
  140. package/src/llm/TracingUtils.ts +77 -0
  141. package/src/llm/chunk-validators.ts +57 -0
  142. package/src/llm/constants.ts +6 -0
  143. package/src/llm/index.ts +12 -0
  144. package/src/llm/meta/MetaModelResolver.ts +352 -0
  145. package/src/llm/meta/index.ts +11 -0
  146. package/src/llm/middleware/flight-recorder.ts +188 -0
  147. package/src/llm/providers/MockProvider.ts +332 -0
  148. package/src/llm/providers/agent/ClaudeCodeProvider.ts +343 -0
  149. package/src/llm/providers/agent/ClaudeCodeToolsAdapter.ts +203 -0
  150. package/src/llm/providers/agent/CodexAppServerProvider.ts +214 -0
  151. package/src/llm/providers/agent/CodexAppServerToolsAdapter.ts +91 -0
  152. package/src/llm/providers/agent/index.ts +10 -0
  153. package/src/llm/providers/base/AgentProvider.ts +107 -0
  154. package/src/llm/providers/base/BaseProvider.ts +114 -0
  155. package/src/llm/providers/base/StandardProvider.ts +38 -0
  156. package/src/llm/providers/base/index.ts +9 -0
  157. package/src/llm/providers/index.ts +106 -0
  158. package/src/llm/providers/key-manager.ts +238 -0
  159. package/src/llm/providers/ollama-models.ts +105 -0
  160. package/src/llm/providers/openrouter-models.ts +102 -0
  161. package/src/llm/providers/provider-ids.ts +18 -0
  162. package/src/llm/providers/registry/ProviderRegistry.ts +414 -0
  163. package/src/llm/providers/registry/index.ts +7 -0
  164. package/src/llm/providers/standard/AnthropicProvider.ts +71 -0
  165. package/src/llm/providers/standard/OllamaProvider.ts +59 -0
  166. package/src/llm/providers/standard/OpenAIProvider.ts +44 -0
  167. package/src/llm/providers/standard/OpenRouterProvider.ts +103 -0
  168. package/src/llm/providers/standard/index.ts +10 -0
  169. package/src/llm/providers/types.ts +194 -0
  170. package/src/llm/providers/usage-metadata.ts +78 -0
  171. package/src/llm/service.ts +713 -0
  172. package/src/llm/types.ts +167 -0
  173. package/src/llm/utils/ConfigurationManager.ts +650 -0
  174. package/src/llm/utils/ConfigurationTester.ts +229 -0
  175. package/src/llm/utils/ModelSelector.ts +212 -0
  176. package/src/llm/utils/ProviderConfigUI.ts +177 -0
  177. package/src/llm/utils/claudeCodePromptCompiler.ts +141 -0
  178. package/src/llm/utils/codex-models.ts +53 -0
  179. package/src/llm/utils/context-window-cache.ts +30 -0
  180. package/src/llm/utils/models-dev-cache.ts +267 -0
  181. package/src/llm/utils/provider-setup.ts +50 -0
  182. package/src/llm/utils/tool-errors.ts +78 -0
  183. package/src/llm/utils/usage.ts +74 -0
  184. package/src/logging/EventRoutingLogger.ts +205 -0
  185. package/src/nostr/AgentEventDecoder.ts +357 -0
  186. package/src/nostr/AgentEventEncoder.ts +677 -0
  187. package/src/nostr/AgentProfilePublisher.ts +657 -0
  188. package/src/nostr/AgentPublisher.ts +437 -0
  189. package/src/nostr/BlossomService.ts +226 -0
  190. package/src/nostr/InterventionPublisher.ts +132 -0
  191. package/src/nostr/TagExtractor.ts +228 -0
  192. package/src/nostr/collectEvents.ts +83 -0
  193. package/src/nostr/constants.ts +38 -0
  194. package/src/nostr/encryption.ts +26 -0
  195. package/src/nostr/index.ts +31 -0
  196. package/src/nostr/keys.ts +17 -0
  197. package/src/nostr/kinds.ts +37 -0
  198. package/src/nostr/ndkClient.ts +72 -0
  199. package/src/nostr/relays.ts +43 -0
  200. package/src/nostr/trace-context.ts +39 -0
  201. package/src/nostr/types.ts +227 -0
  202. package/src/nostr/utils.ts +84 -0
  203. package/src/prompts/core/FragmentRegistry.ts +30 -0
  204. package/src/prompts/core/PromptBuilder.ts +98 -0
  205. package/src/prompts/core/index.ts +3 -0
  206. package/src/prompts/core/types.ts +13 -0
  207. package/src/prompts/fragments/00-global-system-prompt.ts +44 -0
  208. package/src/prompts/fragments/01-agent-identity.ts +69 -0
  209. package/src/prompts/fragments/02-agent-home-directory.ts +114 -0
  210. package/src/prompts/fragments/03-system-reminders-explanation.ts +14 -0
  211. package/src/prompts/fragments/04-relay-configuration.ts +38 -0
  212. package/src/prompts/fragments/05-delegation-chain.ts +45 -0
  213. package/src/prompts/fragments/06-agent-todos.ts +74 -0
  214. package/src/prompts/fragments/06-todo-usage-guidance.ts +34 -0
  215. package/src/prompts/fragments/07-meta-project-context.ts +234 -0
  216. package/src/prompts/fragments/08-active-conversations.ts +382 -0
  217. package/src/prompts/fragments/09-recent-conversations.ts +153 -0
  218. package/src/prompts/fragments/10-referenced-article.ts +21 -0
  219. package/src/prompts/fragments/11-nudges.ts +134 -0
  220. package/src/prompts/fragments/12-skills.ts +127 -0
  221. package/src/prompts/fragments/13-available-nudges.ts +122 -0
  222. package/src/prompts/fragments/15-available-agents.ts +53 -0
  223. package/src/prompts/fragments/16-stay-in-your-lane.ts +41 -0
  224. package/src/prompts/fragments/17-todo-before-delegation.ts +39 -0
  225. package/src/prompts/fragments/20-voice-mode.ts +62 -0
  226. package/src/prompts/fragments/22-scheduled-tasks.ts +175 -0
  227. package/src/prompts/fragments/24-retrieved-lessons.ts +26 -0
  228. package/src/prompts/fragments/25-rag-instructions.ts +333 -0
  229. package/src/prompts/fragments/26-mcp-resources.ts +237 -0
  230. package/src/prompts/fragments/27-memorized-reports.ts +77 -0
  231. package/src/prompts/fragments/28-agent-directed-monitoring.ts +32 -0
  232. package/src/prompts/fragments/29-rag-collections.ts +50 -0
  233. package/src/prompts/fragments/30-worktree-context.ts +98 -0
  234. package/src/prompts/fragments/31-agents-md-guidance.ts +96 -0
  235. package/src/prompts/fragments/32-process-metrics.ts +72 -0
  236. package/src/prompts/fragments/debug-mode.ts +48 -0
  237. package/src/prompts/fragments/delegation-completion.ts +44 -0
  238. package/src/prompts/fragments/index.ts +91 -0
  239. package/src/prompts/index.ts +21 -0
  240. package/src/prompts/utils/systemPromptBuilder.ts +777 -0
  241. package/src/scripts/migrate-prefix-index.ts +157 -0
  242. package/src/services/AgentDefinitionMonitor.ts +701 -0
  243. package/src/services/ConfigService.ts +723 -0
  244. package/src/services/CooldownRegistry.ts +199 -0
  245. package/src/services/LLMOperationsRegistry.ts +424 -0
  246. package/src/services/OwnerAgentListService.ts +354 -0
  247. package/src/services/PubkeyService.ts +308 -0
  248. package/src/services/agents/AgentMetadataStore.ts +72 -0
  249. package/src/services/agents/AgentResolution.ts +59 -0
  250. package/src/services/agents/EscalationService.ts +281 -0
  251. package/src/services/agents/NDKAgentDiscovery.ts +95 -0
  252. package/src/services/agents/index.ts +7 -0
  253. package/src/services/agents-md/AgentsMdService.ts +184 -0
  254. package/src/services/agents-md/SystemReminderInjector.ts +238 -0
  255. package/src/services/agents-md/index.ts +11 -0
  256. package/src/services/apns/APNsClient.ts +203 -0
  257. package/src/services/apns/APNsService.ts +358 -0
  258. package/src/services/apns/index.ts +11 -0
  259. package/src/services/apns/types.ts +80 -0
  260. package/src/services/compression/CompressionService.ts +445 -0
  261. package/src/services/compression/compression-schema.ts +28 -0
  262. package/src/services/compression/compression-types.ts +74 -0
  263. package/src/services/compression/compression-utils.ts +587 -0
  264. package/src/services/config/types.ts +394 -0
  265. package/src/services/dispatch/AgentDispatchService.ts +937 -0
  266. package/src/services/dispatch/AgentRouter.ts +181 -0
  267. package/src/services/dispatch/DelegationCompletionHandler.ts +232 -0
  268. package/src/services/embedding/EmbeddingProvider.ts +188 -0
  269. package/src/services/embedding/index.ts +5 -0
  270. package/src/services/event-context/EventContextService.ts +108 -0
  271. package/src/services/event-context/index.ts +2 -0
  272. package/src/services/heuristics/ContextBuilder.ts +106 -0
  273. package/src/services/heuristics/HeuristicEngine.ts +200 -0
  274. package/src/services/heuristics/formatters.ts +58 -0
  275. package/src/services/heuristics/index.ts +12 -0
  276. package/src/services/heuristics/rules/index.ts +25 -0
  277. package/src/services/heuristics/rules/todoBeforeDelegation.ts +69 -0
  278. package/src/services/heuristics/rules/todoReminderOnToolUse.ts +63 -0
  279. package/src/services/heuristics/types.ts +144 -0
  280. package/src/services/image/ImageGenerationService.ts +389 -0
  281. package/src/services/image/index.ts +12 -0
  282. package/src/services/intervention/InterventionService.ts +1352 -0
  283. package/src/services/intervention/index.ts +7 -0
  284. package/src/services/mcp/MCPManager.ts +683 -0
  285. package/src/services/mcp/McpNotificationDelivery.ts +139 -0
  286. package/src/services/mcp/McpSubscriptionService.ts +653 -0
  287. package/src/services/mcp/mcpInstaller.ts +130 -0
  288. package/src/services/nip46/Nip46SigningLog.ts +81 -0
  289. package/src/services/nip46/Nip46SigningService.ts +467 -0
  290. package/src/services/nip46/index.ts +4 -0
  291. package/src/services/nudge/NudgeService.ts +224 -0
  292. package/src/services/nudge/NudgeWhitelistService.ts +382 -0
  293. package/src/services/nudge/index.ts +5 -0
  294. package/src/services/nudge/types.ts +83 -0
  295. package/src/services/projects/ProjectContext.ts +672 -0
  296. package/src/services/projects/ProjectContextStore.ts +102 -0
  297. package/src/services/projects/index.ts +6 -0
  298. package/src/services/prompt-compiler/index.ts +15 -0
  299. package/src/services/prompt-compiler/prompt-compiler-service.ts +1143 -0
  300. package/src/services/pubkey-gate/PubkeyGateService.ts +93 -0
  301. package/src/services/pubkey-gate/index.ts +1 -0
  302. package/src/services/rag/EmbeddingProviderFactory.ts +292 -0
  303. package/src/services/rag/LanceDBMaintenanceService.ts +211 -0
  304. package/src/services/rag/RAGDatabaseService.ts +173 -0
  305. package/src/services/rag/RAGOperations.ts +682 -0
  306. package/src/services/rag/RAGService.ts +240 -0
  307. package/src/services/rag/RagSubscriptionService.ts +618 -0
  308. package/src/services/rag/rag-utils.ts +174 -0
  309. package/src/services/ral/PendingDelegationsRegistry.ts +168 -0
  310. package/src/services/ral/RALRegistry.ts +2782 -0
  311. package/src/services/ral/index.ts +4 -0
  312. package/src/services/ral/types.ts +292 -0
  313. package/src/services/reports/LocalReportStore.ts +380 -0
  314. package/src/services/reports/ReportEmbeddingService.ts +430 -0
  315. package/src/services/reports/ReportService.ts +440 -0
  316. package/src/services/reports/articleUtils.ts +52 -0
  317. package/src/services/reports/index.ts +7 -0
  318. package/src/services/scheduling/SchedulerService.ts +1057 -0
  319. package/src/services/scheduling/errors.ts +14 -0
  320. package/src/services/scheduling/index.ts +7 -0
  321. package/src/services/scheduling/utils.ts +77 -0
  322. package/src/services/search/SearchProviderRegistry.ts +78 -0
  323. package/src/services/search/UnifiedSearchService.ts +218 -0
  324. package/src/services/search/index.ts +47 -0
  325. package/src/services/search/projectFilter.ts +22 -0
  326. package/src/services/search/providers/ConversationSearchProvider.ts +48 -0
  327. package/src/services/search/providers/LessonSearchProvider.ts +75 -0
  328. package/src/services/search/providers/ReportSearchProvider.ts +49 -0
  329. package/src/services/search/types.ts +144 -0
  330. package/src/services/skill/SkillService.ts +482 -0
  331. package/src/services/skill/index.ts +2 -0
  332. package/src/services/skill/types.ts +70 -0
  333. package/src/services/status/OperationsStatusService.ts +276 -0
  334. package/src/services/status/ProjectStatusService.ts +522 -0
  335. package/src/services/status/index.ts +11 -0
  336. package/src/services/storage/PrefixKVStore.ts +242 -0
  337. package/src/services/storage/index.ts +1 -0
  338. package/src/services/system-reminder/SystemReminderUtils.ts +96 -0
  339. package/src/services/system-reminder/index.ts +7 -0
  340. package/src/services/trust-pubkeys/TrustPubkeyService.ts +325 -0
  341. package/src/services/trust-pubkeys/index.ts +2 -0
  342. package/src/telemetry/ConversationSpanManager.ts +111 -0
  343. package/src/telemetry/EventLoopMonitor.ts +206 -0
  344. package/src/telemetry/LLMSpanRegistry.ts +20 -0
  345. package/src/telemetry/NostrSpanProcessor.ts +89 -0
  346. package/src/telemetry/ToolCallSpanProcessor.ts +66 -0
  347. package/src/telemetry/diagnostics.ts +27 -0
  348. package/src/telemetry/setup.ts +120 -0
  349. package/src/tools/implementations/agents_discover.ts +121 -0
  350. package/src/tools/implementations/agents_hire.ts +127 -0
  351. package/src/tools/implementations/agents_list.ts +96 -0
  352. package/src/tools/implementations/agents_publish.ts +611 -0
  353. package/src/tools/implementations/agents_read.ts +173 -0
  354. package/src/tools/implementations/agents_write.ts +200 -0
  355. package/src/tools/implementations/ask.ts +411 -0
  356. package/src/tools/implementations/change_model.ts +141 -0
  357. package/src/tools/implementations/conversation_get.ts +661 -0
  358. package/src/tools/implementations/conversation_list.ts +377 -0
  359. package/src/tools/implementations/conversation_search.ts +370 -0
  360. package/src/tools/implementations/delegate.ts +327 -0
  361. package/src/tools/implementations/delegate_crossproject.ts +209 -0
  362. package/src/tools/implementations/delegate_followup.ts +300 -0
  363. package/src/tools/implementations/fs_edit.ts +162 -0
  364. package/src/tools/implementations/fs_glob.ts +182 -0
  365. package/src/tools/implementations/fs_grep.ts +513 -0
  366. package/src/tools/implementations/fs_read.ts +332 -0
  367. package/src/tools/implementations/fs_write.ts +113 -0
  368. package/src/tools/implementations/generate_image.ts +259 -0
  369. package/src/tools/implementations/home_fs.ts +515 -0
  370. package/src/tools/implementations/kill.ts +651 -0
  371. package/src/tools/implementations/learn.ts +166 -0
  372. package/src/tools/implementations/lesson-formatter.ts +38 -0
  373. package/src/tools/implementations/lesson_delete.ts +164 -0
  374. package/src/tools/implementations/lesson_get.ts +105 -0
  375. package/src/tools/implementations/lessons_list.ts +153 -0
  376. package/src/tools/implementations/mcp_resource_read.ts +161 -0
  377. package/src/tools/implementations/mcp_subscribe.ts +158 -0
  378. package/src/tools/implementations/mcp_subscription_stop.ts +85 -0
  379. package/src/tools/implementations/nostr_fetch.ts +149 -0
  380. package/src/tools/implementations/nostr_publish_as_user.ts +353 -0
  381. package/src/tools/implementations/project_list.ts +146 -0
  382. package/src/tools/implementations/rag_add_documents.ts +573 -0
  383. package/src/tools/implementations/rag_create_collection.ts +65 -0
  384. package/src/tools/implementations/rag_delete_collection.ts +68 -0
  385. package/src/tools/implementations/rag_list_collections.ts +77 -0
  386. package/src/tools/implementations/rag_query.ts +107 -0
  387. package/src/tools/implementations/rag_subscription_create.ts +105 -0
  388. package/src/tools/implementations/rag_subscription_delete.ts +80 -0
  389. package/src/tools/implementations/rag_subscription_get.ts +123 -0
  390. package/src/tools/implementations/rag_subscription_list.ts +128 -0
  391. package/src/tools/implementations/report_delete.ts +79 -0
  392. package/src/tools/implementations/report_read.ts +160 -0
  393. package/src/tools/implementations/report_write.ts +278 -0
  394. package/src/tools/implementations/reports_list.ts +77 -0
  395. package/src/tools/implementations/schedule_task.ts +104 -0
  396. package/src/tools/implementations/schedule_task_cancel.ts +62 -0
  397. package/src/tools/implementations/schedule_task_once.ts +128 -0
  398. package/src/tools/implementations/schedule_tasks_list.ts +79 -0
  399. package/src/tools/implementations/search.ts +160 -0
  400. package/src/tools/implementations/shell.ts +553 -0
  401. package/src/tools/implementations/todo.ts +260 -0
  402. package/src/tools/implementations/upload_blob.ts +381 -0
  403. package/src/tools/implementations/web_fetch.ts +153 -0
  404. package/src/tools/implementations/web_search.ts +250 -0
  405. package/src/tools/registry.ts +670 -0
  406. package/src/tools/types.ts +177 -0
  407. package/src/tools/utils.ts +256 -0
  408. package/src/types/event-ids.ts +320 -0
  409. package/src/types/index.ts +46 -0
  410. package/src/utils/agentFetcher.ts +107 -0
  411. package/src/utils/cli-error.ts +29 -0
  412. package/src/utils/conversation-id.ts +27 -0
  413. package/src/utils/conversation-utils.ts +1 -0
  414. package/src/utils/delegation-chain.ts +357 -0
  415. package/src/utils/error-handler.ts +42 -0
  416. package/src/utils/git/gitignore.ts +69 -0
  417. package/src/utils/git/index.ts +2 -0
  418. package/src/utils/git/initializeGitRepo.ts +204 -0
  419. package/src/utils/git/worktree.ts +260 -0
  420. package/src/utils/lessonFormatter.ts +70 -0
  421. package/src/utils/lessonTrust.ts +24 -0
  422. package/src/utils/lockfile.ts +123 -0
  423. package/src/utils/logger.ts +149 -0
  424. package/src/utils/nostr-entity-parser.ts +365 -0
  425. package/src/utils/process.ts +49 -0
  426. package/src/wrapper.ts +262 -0
  427. package/tsconfig.json +41 -0
@@ -0,0 +1,238 @@
1
+ /**
2
+ * API Key Manager - Handles multi-key rotation, health tracking, and fallback
3
+ *
4
+ * This module provides key management for providers that have multiple API keys.
5
+ * It supports:
6
+ * - Random key selection from a pool of healthy keys
7
+ * - Failure tracking with configurable time windows
8
+ * - Temporary key disabling when failure threshold is exceeded
9
+ * - Automatic re-enabling after the disable window expires
10
+ *
11
+ * @module
12
+ */
13
+
14
+ import { logger } from "@/utils/logger";
15
+
16
+ /**
17
+ * Clock interface for injectable time source (enables deterministic testing)
18
+ */
19
+ export interface Clock {
20
+ now(): number;
21
+ }
22
+
23
+ const systemClock: Clock = { now: () => Date.now() };
24
+
25
+ /**
26
+ * Configuration for key health tracking
27
+ */
28
+ export interface KeyManagerConfig {
29
+ /** Time window (ms) for counting failures. Failures older than this are ignored. Default: 60000 (1 min) */
30
+ failureWindowMs: number;
31
+ /** Number of failures within the window that triggers temporary disabling. Default: 3 */
32
+ failureThreshold: number;
33
+ /** How long (ms) a key stays disabled after hitting the threshold. Default: 300000 (5 min) */
34
+ disableDurationMs: number;
35
+ /** Injectable clock for testing. Defaults to system clock. */
36
+ clock?: Clock;
37
+ }
38
+
39
+ const DEFAULT_CONFIG: KeyManagerConfig = {
40
+ failureWindowMs: 60_000,
41
+ failureThreshold: 3,
42
+ disableDurationMs: 300_000,
43
+ };
44
+
45
+ /**
46
+ * Health state for a single API key
47
+ */
48
+ interface KeyHealth {
49
+ /** Timestamps of recent failures */
50
+ failures: number[];
51
+ /** When the key becomes re-enabled (0 = not disabled) */
52
+ disabledUntil: number;
53
+ }
54
+
55
+ /**
56
+ * Manages API key pools, health tracking, and selection for LLM providers.
57
+ *
58
+ * Each provider can have one or more API keys. The manager tracks failures
59
+ * per key and temporarily disables keys that fail too often, allowing
60
+ * automatic fallback to healthy keys.
61
+ */
62
+ export class KeyManager {
63
+ private keys: Map<string, string[]> = new Map();
64
+ private health: Map<string, KeyHealth> = new Map();
65
+ private config: KeyManagerConfig;
66
+ private clock: Clock;
67
+
68
+ constructor(config?: Partial<KeyManagerConfig>) {
69
+ this.config = { ...DEFAULT_CONFIG, ...config };
70
+ this.clock = config?.clock ?? systemClock;
71
+ }
72
+
73
+ /**
74
+ * Register API keys for a provider.
75
+ * Normalizes single keys to arrays for uniform handling.
76
+ */
77
+ registerKeys(providerId: string, apiKey: string | string[]): void {
78
+ const keys = Array.isArray(apiKey) ? [...apiKey] : [apiKey];
79
+ if (keys.length === 0) {
80
+ return;
81
+ }
82
+ this.keys.set(providerId, keys);
83
+
84
+ // Initialize health tracking for new keys
85
+ for (const key of keys) {
86
+ const healthKey = this.healthKey(providerId, key);
87
+ if (!this.health.has(healthKey)) {
88
+ this.health.set(healthKey, { failures: [], disabledUntil: 0 });
89
+ }
90
+ }
91
+
92
+ if (keys.length > 1) {
93
+ logger.debug(`[KeyManager] Registered ${keys.length} keys for provider "${providerId}"`);
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Select a random healthy key for a provider.
99
+ * Returns undefined if no healthy keys are available.
100
+ */
101
+ selectKey(providerId: string): string | undefined {
102
+ const keys = this.keys.get(providerId);
103
+ if (!keys || keys.length === 0) {
104
+ return undefined;
105
+ }
106
+
107
+ const healthy = keys.filter(key => this.isKeyHealthy(providerId, key));
108
+
109
+ if (healthy.length === 0) {
110
+ logger.warn(`[KeyManager] No healthy keys available for provider "${providerId}", trying all keys`);
111
+ // Fall back to all keys when everything is disabled — better than nothing
112
+ return keys[Math.floor(Math.random() * keys.length)];
113
+ }
114
+
115
+ return healthy[Math.floor(Math.random() * healthy.length)];
116
+ }
117
+
118
+ /**
119
+ * Report a key failure. If the failure threshold is reached within the
120
+ * configured window, the key is temporarily disabled.
121
+ */
122
+ reportFailure(providerId: string, apiKey: string): void {
123
+ const hKey = this.healthKey(providerId, apiKey);
124
+ const health = this.health.get(hKey);
125
+ if (!health) {
126
+ return;
127
+ }
128
+
129
+ const now = this.clock.now();
130
+ health.failures.push(now);
131
+
132
+ // Prune old failures outside the window
133
+ this.pruneFailures(health, now);
134
+
135
+ if (health.failures.length >= this.config.failureThreshold) {
136
+ health.disabledUntil = now + this.config.disableDurationMs;
137
+ const keyPreview = apiKey.slice(0, 8) + "...";
138
+ logger.warn(
139
+ `[KeyManager] Key ${keyPreview} for "${providerId}" temporarily disabled ` +
140
+ `(${health.failures.length} failures in ${this.config.failureWindowMs}ms window). ` +
141
+ `Re-enables in ${this.config.disableDurationMs / 1000}s`
142
+ );
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Check whether a provider has multiple keys registered
148
+ */
149
+ hasMultipleKeys(providerId: string): boolean {
150
+ const keys = this.keys.get(providerId);
151
+ return !!keys && keys.length > 1;
152
+ }
153
+
154
+ /**
155
+ * Get the number of currently healthy keys for a provider
156
+ */
157
+ getHealthyKeyCount(providerId: string): number {
158
+ const keys = this.keys.get(providerId);
159
+ if (!keys) return 0;
160
+ return keys.filter(key => this.isKeyHealthy(providerId, key)).length;
161
+ }
162
+
163
+ /**
164
+ * Get all registered provider IDs
165
+ */
166
+ getRegisteredProviders(): string[] {
167
+ return Array.from(this.keys.keys());
168
+ }
169
+
170
+ /**
171
+ * Reset all state (for testing)
172
+ */
173
+ reset(): void {
174
+ this.keys.clear();
175
+ this.health.clear();
176
+ }
177
+
178
+ /**
179
+ * Check if a specific key is currently healthy (not temporarily disabled)
180
+ */
181
+ private isKeyHealthy(providerId: string, apiKey: string): boolean {
182
+ const hKey = this.healthKey(providerId, apiKey);
183
+ const health = this.health.get(hKey);
184
+ if (!health) return true;
185
+
186
+ const now = this.clock.now();
187
+
188
+ // Re-enable if disable period has passed
189
+ if (health.disabledUntil > 0 && now >= health.disabledUntil) {
190
+ health.disabledUntil = 0;
191
+ health.failures = [];
192
+ return true;
193
+ }
194
+
195
+ return health.disabledUntil === 0;
196
+ }
197
+
198
+ /**
199
+ * Remove failures outside the tracking window
200
+ */
201
+ private pruneFailures(health: KeyHealth, now: number): void {
202
+ const cutoff = now - this.config.failureWindowMs;
203
+ health.failures = health.failures.filter(ts => ts > cutoff);
204
+ }
205
+
206
+ /**
207
+ * Create a composite key for the health map
208
+ */
209
+ private healthKey(providerId: string, apiKey: string): string {
210
+ return `${providerId}:${apiKey}`;
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Singleton instance shared across the application
216
+ */
217
+ export const keyManager = new KeyManager();
218
+
219
+ /**
220
+ * Resolve an API key that may be a single string or an array.
221
+ * For services that only need a single key (embeddings, image gen),
222
+ * this returns the first key from an array or the string itself.
223
+ */
224
+ export function resolveApiKey(apiKey: string | string[] | undefined): string | undefined {
225
+ if (!apiKey) return undefined;
226
+ if (Array.isArray(apiKey)) return apiKey[0];
227
+ return apiKey;
228
+ }
229
+
230
+ /**
231
+ * Check whether an API key value represents a configured, usable key.
232
+ * Handles string, string[], undefined, and empty values.
233
+ */
234
+ export function hasApiKey(apiKey: string | string[] | undefined): boolean {
235
+ if (!apiKey) return false;
236
+ if (Array.isArray(apiKey)) return apiKey.some(k => k.length > 0);
237
+ return apiKey.length > 0 && apiKey !== "none";
238
+ }
@@ -0,0 +1,105 @@
1
+ import { logger } from "@/utils/logger";
2
+
3
+ export interface OllamaModel {
4
+ name: string;
5
+ size: string;
6
+ modified: string;
7
+ digest: string;
8
+ }
9
+
10
+ /**
11
+ * Fetch available models from local Ollama instance
12
+ */
13
+ export async function fetchOllamaModels(): Promise<OllamaModel[]> {
14
+ try {
15
+ const baseUrl = process.env.OLLAMA_BASE_URL || "http://localhost:11434";
16
+ const response = await fetch(`${baseUrl}/api/tags`, {
17
+ method: "GET",
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ },
21
+ });
22
+
23
+ if (!response.ok) {
24
+ logger.warn(`Failed to fetch Ollama models: ${response.status}`);
25
+ return [];
26
+ }
27
+
28
+ interface OllamaResponse {
29
+ models?: Array<{
30
+ name: string;
31
+ size: number;
32
+ modified_at: string;
33
+ digest: string;
34
+ }>;
35
+ }
36
+
37
+ const data = (await response.json()) as OllamaResponse;
38
+ const models = data.models || [];
39
+
40
+ logger.debug(`Fetched ${models.length} Ollama models`);
41
+
42
+ return models.map((model) => ({
43
+ name: model.name,
44
+ size: formatSize(model.size),
45
+ modified: model.modified_at,
46
+ digest: model.digest,
47
+ }));
48
+ } catch (error) {
49
+ logger.warn("Failed to fetch Ollama models", {
50
+ error: error instanceof Error ? error.message : String(error),
51
+ });
52
+ return [];
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Format bytes to human readable size
58
+ */
59
+ function formatSize(bytes: number): string {
60
+ if (!bytes) return "unknown";
61
+ const gb = bytes / (1024 * 1024 * 1024);
62
+ if (gb >= 1) {
63
+ return `${gb.toFixed(1)}GB`;
64
+ }
65
+ const mb = bytes / (1024 * 1024);
66
+ return `${mb.toFixed(0)}MB`;
67
+ }
68
+
69
+ /**
70
+ * Get popular Ollama models for quick selection
71
+ */
72
+ export function getPopularOllamaModels(): Record<string, string[]> {
73
+ return {
74
+ "Small Models (< 4GB)": [
75
+ "llama3.2:1b",
76
+ "llama3.2:3b",
77
+ "phi3:mini",
78
+ "gemma2:2b",
79
+ "qwen2.5:1.5b",
80
+ "qwen2.5:3b",
81
+ ],
82
+ "Medium Models (4-8GB)": [
83
+ "llama3.1:8b",
84
+ "mistral:7b",
85
+ "gemma2:9b",
86
+ "qwen2.5:7b",
87
+ "deepseek-coder-v2:16b",
88
+ ],
89
+ "Large Models (> 8GB)": [
90
+ "llama3.1:70b",
91
+ "mixtral:8x7b",
92
+ "qwen2.5:14b",
93
+ "qwen2.5:32b",
94
+ "qwen2.5:72b",
95
+ "deepseek-coder-v2:236b",
96
+ ],
97
+ "Specialized Models": [
98
+ "codellama:7b",
99
+ "codellama:13b",
100
+ "starcoder2:3b",
101
+ "starcoder2:7b",
102
+ "sqlcoder:7b",
103
+ ],
104
+ };
105
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * OpenRouter model fetching utilities
3
+ */
4
+
5
+ export interface OpenRouterModel {
6
+ id: string;
7
+ name: string;
8
+ description?: string;
9
+ context_length: number;
10
+ pricing: {
11
+ prompt: string;
12
+ completion: string;
13
+ };
14
+ top_provider?: {
15
+ max_completion_tokens?: number;
16
+ };
17
+ }
18
+
19
+ export interface OpenRouterModelsResponse {
20
+ data: OpenRouterModel[];
21
+ }
22
+
23
+ /**
24
+ * Fetch available models from OpenRouter API
25
+ */
26
+ export async function fetchOpenRouterModels(): Promise<OpenRouterModel[]> {
27
+ try {
28
+ const response = await fetch("https://openrouter.ai/api/v1/models", {
29
+ headers: {
30
+ Accept: "application/json",
31
+ },
32
+ });
33
+
34
+ if (!response.ok) {
35
+ throw new Error(`Failed to fetch models: ${response.statusText}`);
36
+ }
37
+
38
+ const data = (await response.json()) as OpenRouterModelsResponse;
39
+
40
+ // Sort models by popularity/relevance (you can customize this)
41
+ return data.data.sort((a, b) => {
42
+ // Prioritize commonly used models
43
+ const priority = [
44
+ "openai/gpt-4",
45
+ "openai/gpt-4-turbo",
46
+ "anthropic/claude-3-5-sonnet",
47
+ "anthropic/claude-3-opus",
48
+ "google/gemini-2.0-flash",
49
+ "google/gemini-pro",
50
+ ];
51
+
52
+ const aIndex = priority.indexOf(a.id);
53
+ const bIndex = priority.indexOf(b.id);
54
+
55
+ if (aIndex !== -1 && bIndex !== -1) return aIndex - bIndex;
56
+ if (aIndex !== -1) return -1;
57
+ if (bIndex !== -1) return 1;
58
+
59
+ return a.name.localeCompare(b.name);
60
+ });
61
+ } catch (error) {
62
+ console.error("Error fetching OpenRouter models:", error);
63
+ return [];
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Get popular models grouped by provider
69
+ */
70
+ export function getPopularModels(): Record<string, string[]> {
71
+ return {
72
+ OpenAI: [
73
+ "openai/gpt-4",
74
+ "openai/gpt-4-turbo",
75
+ "openai/gpt-3.5-turbo",
76
+ "openai/o1-preview",
77
+ "openai/o1-mini",
78
+ ],
79
+ Anthropic: [
80
+ "anthropic/claude-3-5-sonnet",
81
+ "anthropic/claude-3-opus",
82
+ "anthropic/claude-3-haiku",
83
+ "anthropic/claude-3-5-haiku",
84
+ ],
85
+ Google: [
86
+ "google/gemini-2.0-flash-thinking-exp",
87
+ "google/gemini-2.0-flash-exp",
88
+ "google/gemini-pro",
89
+ "google/gemini-pro-1.5",
90
+ ],
91
+ Meta: [
92
+ "meta-llama/llama-3.1-405b-instruct",
93
+ "meta-llama/llama-3.1-70b-instruct",
94
+ "meta-llama/llama-3.1-8b-instruct",
95
+ ],
96
+ Mistral: [
97
+ "mistralai/mistral-large",
98
+ "mistralai/mixtral-8x22b-instruct",
99
+ "mistralai/mixtral-8x7b-instruct",
100
+ ],
101
+ };
102
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Provider ID constants
3
+ *
4
+ * These constants are the canonical source of truth for provider IDs.
5
+ * Use these instead of magic strings to prevent typos and mismatches.
6
+ */
7
+
8
+ export const PROVIDER_IDS = {
9
+ CLAUDE_CODE: "claude-code",
10
+ CODEX_APP_SERVER: "codex-app-server",
11
+ OPENROUTER: "openrouter",
12
+ ANTHROPIC: "anthropic",
13
+ OPENAI: "openai",
14
+ OLLAMA: "ollama",
15
+ MOCK: "mock",
16
+ } as const;
17
+
18
+ export type ProviderId = (typeof PROVIDER_IDS)[keyof typeof PROVIDER_IDS];