@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,77 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { RAGService } from "@/services/rag/RAGService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ const ragListCollectionsSchema = z.object({
9
+ description: z
10
+ .string()
11
+ .trim()
12
+ .min(1, "Description is required and cannot be empty")
13
+ .describe(
14
+ "REQUIRED: A clear, concise description of why you're listing collections (5-10 words). Helps provide human-readable context for the operation."
15
+ ),
16
+ include_stats: z
17
+ .boolean()
18
+ .nullable()
19
+ .default(false)
20
+ .describe("Whether to include per-collection statistics (total document count, your document count)"),
21
+ });
22
+
23
+ /**
24
+ * Core implementation of listing RAG collections
25
+ */
26
+ async function executeListCollections(
27
+ input: z.infer<typeof ragListCollectionsSchema>,
28
+ context: ToolExecutionContext
29
+ ): Promise<ToolResponse> {
30
+ const { include_stats = false } = input;
31
+
32
+ const ragService = RAGService.getInstance();
33
+
34
+ if (!include_stats) {
35
+ const collections = await ragService.listCollections();
36
+ return {
37
+ success: true,
38
+ collections_count: collections.length,
39
+ collections: collections,
40
+ };
41
+ }
42
+
43
+ // Fetch stats for all collections with agent attribution
44
+ // getAllCollectionStats already calls listCollections internally
45
+ const agentPubkey = context.agent.pubkey;
46
+ const stats = await ragService.getAllCollectionStats(agentPubkey);
47
+
48
+ const collectionsWithStats = stats.map((s) => ({
49
+ name: s.name,
50
+ total_documents: s.totalDocCount,
51
+ agent_documents: s.agentDocCount,
52
+ }));
53
+
54
+ return {
55
+ success: true,
56
+ collections_count: stats.length,
57
+ collections: collectionsWithStats,
58
+ };
59
+ }
60
+
61
+ /**
62
+ * List all available RAG collections
63
+ */
64
+ export function createRAGListCollectionsTool(context: ToolExecutionContext): AISdkTool {
65
+ return tool({
66
+ description: "List all available RAG collections in the system",
67
+ inputSchema: ragListCollectionsSchema,
68
+ execute: async (input: unknown) => {
69
+ return executeToolWithErrorHandling(
70
+ "rag_list_collections",
71
+ input as z.infer<typeof ragListCollectionsSchema>,
72
+ context,
73
+ executeListCollections
74
+ );
75
+ },
76
+ }) as AISdkTool;
77
+ }
@@ -0,0 +1,107 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { type RAGQueryResult, RAGService } from "@/services/rag/RAGService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ const ragQuerySchema = z.object({
9
+ description: z
10
+ .string()
11
+ .trim()
12
+ .min(1, "Description is required and cannot be empty")
13
+ .describe(
14
+ "REQUIRED: A clear, concise description of why you're querying this collection (5-10 words). Helps provide human-readable context for the operation."
15
+ ),
16
+ collection: z.string().describe("Name of the collection to query"),
17
+ query_text: z.string().describe("The text query for semantic search"),
18
+ top_k: z
19
+ .number()
20
+ .int()
21
+ .min(1)
22
+ .max(100)
23
+ .optional()
24
+ .describe("Number of top results to return (default: 5, range: 1-100)"),
25
+ include_metadata: z
26
+ .boolean()
27
+ .optional()
28
+ .describe("Whether to include document metadata in results (default: true)"),
29
+ });
30
+
31
+ /**
32
+ * Formatted result for tool response
33
+ */
34
+ interface FormattedQueryResult {
35
+ rank: number;
36
+ score: number;
37
+ content: string;
38
+ metadata?: Record<string, unknown>;
39
+ source?: string;
40
+ id?: string;
41
+ timestamp?: string;
42
+ }
43
+
44
+ /**
45
+ * Format query results for response
46
+ */
47
+ function formatResults(
48
+ results: RAGQueryResult[],
49
+ includeMetadata: boolean
50
+ ): FormattedQueryResult[] {
51
+ return results.map((result, index) => ({
52
+ rank: index + 1,
53
+ score: result.score,
54
+ content:
55
+ result.document.content.length > 500
56
+ ? `${result.document.content.substring(0, 500)}...`
57
+ : result.document.content,
58
+ ...(includeMetadata && {
59
+ metadata: result.document.metadata,
60
+ source: result.document.source,
61
+ id: result.document.id,
62
+ timestamp: result.document.timestamp
63
+ ? new Date(result.document.timestamp).toISOString()
64
+ : undefined,
65
+ }),
66
+ }));
67
+ }
68
+
69
+ /**
70
+ * Core implementation of RAG semantic search
71
+ */
72
+ async function executeQuery(
73
+ input: z.infer<typeof ragQuerySchema>,
74
+ _context: ToolExecutionContext
75
+ ): Promise<ToolResponse> {
76
+ const { collection, query_text } = input;
77
+
78
+ // Use provided top_k or default to 5
79
+ // The schema already validates the range (1-100) and integer constraint
80
+ const topK = input.top_k ?? 5;
81
+ const includeMetadata = input.include_metadata ?? true;
82
+
83
+ const ragService = RAGService.getInstance();
84
+ const results = await ragService.query(collection, query_text, topK);
85
+
86
+ return {
87
+ success: true,
88
+ collection: collection,
89
+ query: query_text,
90
+ results_count: results.length,
91
+ results: formatResults(results, includeMetadata),
92
+ };
93
+ }
94
+
95
+ /**
96
+ * Query a RAG collection using semantic search
97
+ */
98
+ export function createRAGQueryTool(context: ToolExecutionContext): AISdkTool {
99
+ return tool({
100
+ description:
101
+ "Perform semantic search on a RAG collection. Returns the most relevant documents based on vector similarity to the query.",
102
+ inputSchema: ragQuerySchema,
103
+ execute: async (input: unknown) => {
104
+ return executeToolWithErrorHandling("rag_query", input as z.infer<typeof ragQuerySchema>, context, executeQuery);
105
+ },
106
+ }) as AISdkTool;
107
+ }
@@ -0,0 +1,105 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ /**
9
+ * Schema for creating a RAG subscription
10
+ */
11
+ const ragSubscriptionCreateSchema = z.object({
12
+ subscriptionId: z
13
+ .string()
14
+ .describe('Unique identifier for the subscription (e.g., "ndk-updates", "market-data")'),
15
+ mcpServerId: z
16
+ .string()
17
+ .describe(
18
+ 'The ID of the installed MCP tool/server providing the resource (e.g., "nostr-provider")'
19
+ ),
20
+ resourceUri: z
21
+ .string()
22
+ .describe(
23
+ 'The MCP resource URI to subscribe to (e.g., "nostr://feed/pubkey/kinds", "file:///path/to/file"). ' +
24
+ "This must be an actual resource URI, NOT a tool name. If using a resource template, " +
25
+ "you must first expand it with parameters to get the actual URI."
26
+ ),
27
+ ragCollection: z.string().describe("Name of the RAG collection where data will be stored"),
28
+ description: z.string().describe("Human-readable description of what this subscription does"),
29
+ });
30
+
31
+ /**
32
+ * Core implementation of creating a RAG subscription
33
+ */
34
+ async function executeCreateSubscription(
35
+ input: z.infer<typeof ragSubscriptionCreateSchema>,
36
+ context: ToolExecutionContext
37
+ ): Promise<ToolResponse> {
38
+ const { subscriptionId, mcpServerId, resourceUri, ragCollection, description } = input;
39
+
40
+ // Mandate agent identity - no compromises
41
+ if (!context.agent?.pubkey) {
42
+ throw new Error(
43
+ "Agent identity is required. Cannot create subscription without valid agent pubkey."
44
+ );
45
+ }
46
+ const agentPubkey = context.agent.pubkey;
47
+
48
+ // Get the service instance (already initialized at startup)
49
+ const subscriptionService = RagSubscriptionService.getInstance();
50
+
51
+ // Create the subscription
52
+ const subscription = await subscriptionService.createSubscription(
53
+ subscriptionId,
54
+ agentPubkey,
55
+ mcpServerId,
56
+ resourceUri,
57
+ ragCollection,
58
+ description
59
+ );
60
+
61
+ return {
62
+ success: true,
63
+ message: `Successfully created subscription '${subscriptionId}'`,
64
+ subscription: {
65
+ id: subscription.subscriptionId,
66
+ mcpServer: subscription.mcpServerId,
67
+ resource: subscription.resourceUri,
68
+ collection: subscription.ragCollection,
69
+ status: subscription.status,
70
+ description: subscription.description,
71
+ },
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Create a persistent RAG subscription to stream data from MCP resources
77
+ *
78
+ * This tool creates a persistent subscription that:
79
+ * - Connects to an installed MCP server/tool
80
+ * - Subscribes to a specific resource
81
+ * - Automatically pipes updates to a RAG collection
82
+ * - Persists across TENEX restarts
83
+ *
84
+ * Example use cases:
85
+ * - Subscribe to a changelog from an NDK server
86
+ * - Stream market data into a trading knowledge base
87
+ * - Collect social media updates for analysis
88
+ *
89
+ * The subscription will remain active until explicitly deleted.
90
+ */
91
+ export function createRAGSubscriptionCreateTool(context: ToolExecutionContext): AISdkTool {
92
+ return tool({
93
+ description:
94
+ "Create a persistent subscription to stream data from an MCP resource into a RAG collection. The subscription will automatically pipe all updates from the specified resource to the RAG collection and persist across restarts.",
95
+ inputSchema: ragSubscriptionCreateSchema,
96
+ execute: async (input: unknown) => {
97
+ return executeToolWithErrorHandling(
98
+ "rag_subscription_create",
99
+ input as z.infer<typeof ragSubscriptionCreateSchema>,
100
+ context,
101
+ executeCreateSubscription
102
+ );
103
+ },
104
+ }) as AISdkTool;
105
+ }
@@ -0,0 +1,80 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ /**
9
+ * Schema for deleting a RAG subscription
10
+ */
11
+ const ragSubscriptionDeleteSchema = z.object({
12
+ subscriptionId: z.string().describe("The ID of the subscription to delete"),
13
+ });
14
+
15
+ /**
16
+ * Core implementation of deleting a RAG subscription
17
+ */
18
+ async function executeDeleteSubscription(
19
+ input: z.infer<typeof ragSubscriptionDeleteSchema>,
20
+ context: ToolExecutionContext
21
+ ): Promise<ToolResponse> {
22
+ const { subscriptionId } = input;
23
+
24
+ // Mandate agent identity - no compromises
25
+ if (!context.agent?.pubkey) {
26
+ throw new Error(
27
+ "Agent identity is required. Cannot delete subscription without valid agent pubkey."
28
+ );
29
+ }
30
+ const agentPubkey = context.agent.pubkey;
31
+
32
+ // Get the service instance (already initialized at startup)
33
+ const subscriptionService = RagSubscriptionService.getInstance();
34
+
35
+ // Delete the subscription
36
+ const deleted = await subscriptionService.deleteSubscription(subscriptionId, agentPubkey);
37
+
38
+ if (!deleted) {
39
+ return {
40
+ success: false,
41
+ message: `Subscription '${subscriptionId}' not found or you don't have permission to delete it`,
42
+ error: "SUBSCRIPTION_NOT_FOUND",
43
+ };
44
+ }
45
+
46
+ return {
47
+ success: true,
48
+ message: `Successfully deleted subscription '${subscriptionId}'`,
49
+ subscriptionId: subscriptionId,
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Delete a RAG subscription and stop data streaming
55
+ *
56
+ * This will:
57
+ * - Stop receiving updates from the MCP resource
58
+ * - Remove the subscription from persistent storage
59
+ * - Clean up any associated listeners
60
+ *
61
+ * Note: Previously ingested documents remain in the RAG collection.
62
+ * Only the subscription itself is deleted, not the data.
63
+ *
64
+ * You can only delete subscriptions that belong to your agent.
65
+ */
66
+ export function createRAGSubscriptionDeleteTool(context: ToolExecutionContext): AISdkTool {
67
+ return tool({
68
+ description:
69
+ "Delete a RAG subscription to stop streaming data from an MCP resource. Previously ingested documents will remain in the RAG collection.",
70
+ inputSchema: ragSubscriptionDeleteSchema,
71
+ execute: async (input: unknown) => {
72
+ return executeToolWithErrorHandling(
73
+ "rag_subscription_delete",
74
+ input as z.infer<typeof ragSubscriptionDeleteSchema>,
75
+ context,
76
+ executeDeleteSubscription
77
+ );
78
+ },
79
+ }) as AISdkTool;
80
+ }
@@ -0,0 +1,123 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ /**
9
+ * Schema for getting a specific RAG subscription
10
+ */
11
+ const ragSubscriptionGetSchema = z.object({
12
+ subscriptionId: z.string().describe("The ID of the subscription to retrieve"),
13
+ });
14
+
15
+ /**
16
+ * Calculate uptime for a subscription
17
+ */
18
+ function calculateUptime(createdAt: number, status: string): string {
19
+ if (status !== "RUNNING") {
20
+ return "N/A";
21
+ }
22
+
23
+ const uptimeMs = Date.now() - createdAt;
24
+ const days = Math.floor(uptimeMs / (1000 * 60 * 60 * 24));
25
+ const hours = Math.floor((uptimeMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
26
+ const minutes = Math.floor((uptimeMs % (1000 * 60 * 60)) / (1000 * 60));
27
+
28
+ const parts = [];
29
+ if (days > 0) parts.push(`${days}d`);
30
+ if (hours > 0) parts.push(`${hours}h`);
31
+ if (minutes > 0 || parts.length === 0) parts.push(`${minutes}m`);
32
+
33
+ return parts.join(" ");
34
+ }
35
+
36
+ /**
37
+ * Core implementation of getting a RAG subscription
38
+ */
39
+ async function executeGetSubscription(
40
+ input: z.infer<typeof ragSubscriptionGetSchema>,
41
+ context: ToolExecutionContext
42
+ ): Promise<ToolResponse> {
43
+ const { subscriptionId } = input;
44
+
45
+ // Mandate agent identity - no compromises
46
+ if (!context.agent?.pubkey) {
47
+ throw new Error(
48
+ "Agent identity is required. Cannot retrieve subscription without valid agent pubkey."
49
+ );
50
+ }
51
+ const agentPubkey = context.agent.pubkey;
52
+
53
+ // Get the service instance (already initialized at startup)
54
+ const subscriptionService = RagSubscriptionService.getInstance();
55
+
56
+ // Get the subscription
57
+ const subscription = await subscriptionService.getSubscription(subscriptionId, agentPubkey);
58
+
59
+ if (!subscription) {
60
+ return {
61
+ success: false,
62
+ message: `Subscription '${subscriptionId}' not found`,
63
+ error: "SUBSCRIPTION_NOT_FOUND",
64
+ };
65
+ }
66
+
67
+ // Calculate uptime
68
+ const uptime = calculateUptime(subscription.createdAt, subscription.status);
69
+
70
+ // Format detailed response
71
+ const details = {
72
+ id: subscription.subscriptionId,
73
+ description: subscription.description,
74
+ status: subscription.status,
75
+ configuration: {
76
+ mcpServer: subscription.mcpServerId,
77
+ resource: subscription.resourceUri,
78
+ collection: subscription.ragCollection,
79
+ },
80
+ metrics: {
81
+ documentsProcessed: subscription.documentsProcessed,
82
+ uptime: uptime,
83
+ createdAt: new Date(subscription.createdAt).toISOString(),
84
+ updatedAt: new Date(subscription.updatedAt).toISOString(),
85
+ },
86
+ lastDocumentSnippet: subscription.lastDocumentIngested || null,
87
+ lastError: subscription.lastError || null,
88
+ };
89
+
90
+ return {
91
+ success: true,
92
+ message: `Retrieved details for subscription '${subscriptionId}'`,
93
+ subscription: details,
94
+ };
95
+ }
96
+
97
+ /**
98
+ * Get detailed information about a specific RAG subscription
99
+ *
100
+ * Returns comprehensive details including:
101
+ * - Current status and configuration
102
+ * - Processing metrics (documents processed, uptime)
103
+ * - Last ingested document snippet
104
+ * - Error information if any
105
+ * - Timestamps for creation and last update
106
+ *
107
+ * Use this to monitor the health and progress of a specific subscription.
108
+ */
109
+ export function createRAGSubscriptionGetTool(context: ToolExecutionContext): AISdkTool {
110
+ return tool({
111
+ description:
112
+ "Get detailed status and metrics for a specific RAG subscription, including processing statistics and the last ingested document snippet.",
113
+ inputSchema: ragSubscriptionGetSchema,
114
+ execute: async (input: unknown) => {
115
+ return executeToolWithErrorHandling(
116
+ "rag_subscription_get",
117
+ input as z.infer<typeof ragSubscriptionGetSchema>,
118
+ context,
119
+ executeGetSubscription
120
+ );
121
+ },
122
+ }) as AISdkTool;
123
+ }
@@ -0,0 +1,128 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { RagSubscriptionService } from "@/services/rag/RagSubscriptionService";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { type ToolResponse, executeToolWithErrorHandling } from "@/tools/utils";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+
8
+ /**
9
+ * Core implementation of listing RAG subscriptions
10
+ */
11
+ async function executeListSubscriptions(
12
+ _input: unknown,
13
+ context: ToolExecutionContext
14
+ ): Promise<ToolResponse> {
15
+ // Mandate agent identity - no compromises
16
+ if (!context.agent?.pubkey) {
17
+ throw new Error(
18
+ "Agent identity is required. Cannot list subscriptions without valid agent pubkey."
19
+ );
20
+ }
21
+ const agentPubkey = context.agent.pubkey;
22
+
23
+ // Get the service instance (already initialized at startup)
24
+ const subscriptionService = RagSubscriptionService.getInstance();
25
+
26
+ // List subscriptions for this agent
27
+ const subscriptions = await subscriptionService.listSubscriptions(agentPubkey);
28
+
29
+ // Single-pass statistics calculation with proper efficiency
30
+ const statistics = subscriptions.reduce(
31
+ (acc, sub) => {
32
+ // Format subscription while calculating statistics
33
+ acc.formattedSubscriptions.push({
34
+ id: sub.subscriptionId,
35
+ mcpServer: sub.mcpServerId,
36
+ resource: sub.resourceUri,
37
+ collection: sub.ragCollection,
38
+ status: sub.status,
39
+ documentsProcessed: sub.documentsProcessed,
40
+ description: sub.description,
41
+ createdAt: new Date(sub.createdAt).toISOString(),
42
+ updatedAt: new Date(sub.updatedAt).toISOString(),
43
+ lastError: sub.lastError,
44
+ });
45
+
46
+ // Update counters in single pass
47
+ acc.total++;
48
+ acc.totalDocumentsProcessed += sub.documentsProcessed;
49
+
50
+ switch (sub.status) {
51
+ case "RUNNING":
52
+ acc.running++;
53
+ break;
54
+ case "ERROR":
55
+ acc.error++;
56
+ break;
57
+ case "STOPPED":
58
+ acc.stopped++;
59
+ break;
60
+ }
61
+
62
+ return acc;
63
+ },
64
+ {
65
+ formattedSubscriptions: [] as Array<{
66
+ id: string;
67
+ mcpServer: string;
68
+ resource: string;
69
+ collection: string;
70
+ status: string;
71
+ documentsProcessed: number;
72
+ description: string;
73
+ createdAt: string;
74
+ updatedAt: string;
75
+ lastError?: string;
76
+ }>,
77
+ total: 0,
78
+ running: 0,
79
+ error: 0,
80
+ stopped: 0,
81
+ totalDocumentsProcessed: 0,
82
+ }
83
+ );
84
+
85
+ return {
86
+ success: true,
87
+ message: `Found ${statistics.total} subscription(s)`,
88
+ subscriptions: statistics.formattedSubscriptions,
89
+ statistics: {
90
+ total: statistics.total,
91
+ running: statistics.running,
92
+ error: statistics.error,
93
+ stopped: statistics.stopped,
94
+ totalDocumentsProcessed: statistics.totalDocumentsProcessed,
95
+ },
96
+ };
97
+ }
98
+
99
+ /**
100
+ * List all active RAG subscriptions for the current agent
101
+ *
102
+ * Returns a list of all subscriptions including:
103
+ * - Subscription ID and description
104
+ * - MCP server and resource information
105
+ * - Target RAG collection
106
+ * - Current status (RUNNING, ERROR, STOPPED)
107
+ * - Number of documents processed
108
+ * - Timestamps and error information
109
+ *
110
+ * Also provides aggregate statistics about all subscriptions.
111
+ */
112
+ const ragSubscriptionListSchema = z.object({});
113
+
114
+ export function createRAGSubscriptionListTool(context: ToolExecutionContext): AISdkTool {
115
+ return tool({
116
+ description:
117
+ "List all active RAG subscriptions for the current agent, showing their status, configuration, and statistics.",
118
+ inputSchema: ragSubscriptionListSchema,
119
+ execute: async (input: unknown) => {
120
+ return executeToolWithErrorHandling(
121
+ "rag_subscription_list",
122
+ input,
123
+ context,
124
+ executeListSubscriptions
125
+ );
126
+ },
127
+ }) as AISdkTool;
128
+ }
@@ -0,0 +1,79 @@
1
+ import type { AISdkTool, ToolExecutionContext } from "@/tools/types";
2
+ import { ReportService } from "@/services/reports";
3
+ import { getReportEmbeddingService } from "@/services/reports/ReportEmbeddingService";
4
+ import { getProjectContext } from "@/services/projects";
5
+ import { logger } from "@/utils/logger";
6
+ import { tool } from "ai";
7
+ import { z } from "zod";
8
+
9
+ const reportDeleteSchema = z.object({
10
+ slug: z.string().describe("The slug identifier (d-tag) of the report to delete"),
11
+ });
12
+
13
+ type ReportDeleteInput = z.infer<typeof reportDeleteSchema>;
14
+
15
+ interface ReportDeleteOutput {
16
+ success: boolean;
17
+ articleId: string;
18
+ slug: string;
19
+ message: string;
20
+ }
21
+
22
+ /**
23
+ * Core implementation of report deletion functionality
24
+ */
25
+ async function executeReportDelete(
26
+ input: ReportDeleteInput,
27
+ context: ToolExecutionContext
28
+ ): Promise<ReportDeleteOutput> {
29
+ const { slug } = input;
30
+
31
+ logger.info("🗑️ Deleting report", {
32
+ slug,
33
+ agent: context.agent.name,
34
+ });
35
+
36
+ const reportService = new ReportService();
37
+
38
+ const articleId = await reportService.deleteReport(slug, context.agent);
39
+
40
+ // Remove from RAG index
41
+ try {
42
+ const projectCtx = getProjectContext();
43
+ const projectTagId = projectCtx.project.tagId();
44
+ const reportEmbeddingService = getReportEmbeddingService();
45
+ await reportEmbeddingService.removeReport(slug, projectTagId);
46
+ } catch (ragError) {
47
+ // Don't fail deletion if RAG cleanup fails
48
+ const ragMessage = ragError instanceof Error ? ragError.message : String(ragError);
49
+ logger.warn("Failed to remove report from RAG", { slug, error: ragMessage });
50
+ }
51
+
52
+ logger.info("✅ Report deleted successfully", {
53
+ slug,
54
+ articleId,
55
+ agent: context.agent.name,
56
+ });
57
+
58
+ return {
59
+ success: true,
60
+ articleId: `nostr:${articleId}`,
61
+ slug,
62
+ message: `Report "${slug}" marked as deleted`,
63
+ };
64
+ }
65
+
66
+ /**
67
+ * Create an AI SDK tool for deleting reports
68
+ */
69
+ export function createReportDeleteTool(context: ToolExecutionContext): AISdkTool {
70
+ return tool({
71
+ description: "Mark an NDKArticle report as deleted",
72
+
73
+ inputSchema: reportDeleteSchema,
74
+
75
+ execute: async (input: ReportDeleteInput) => {
76
+ return await executeReportDelete(input, context);
77
+ },
78
+ }) as AISdkTool;
79
+ }