@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,430 @@
1
+ /**
2
+ * ReportEmbeddingService - Semantic search for reports
3
+ *
4
+ * Indexes NDKArticle reports (kind:30023) into a project-scoped RAG collection
5
+ * for semantic discovery. Follows the same patterns as ConversationEmbeddingService.
6
+ *
7
+ * Key features:
8
+ * - Project-scoped: reports are tagged with projectId for isolation
9
+ * - Index on write: called from report_write tool after successful publish
10
+ * - Upsert semantics: re-indexing updates existing documents (by slug + projectId)
11
+ * - Graceful degradation: RAG failures don't break report writes
12
+ * - Nostr remains authoritative source; RAG is just a search layer
13
+ */
14
+
15
+ import { logger } from "@/utils/logger";
16
+ import { RAGService, type RAGDocument, type RAGQueryResult } from "@/services/rag/RAGService";
17
+ import type { ReportInfo } from "./ReportService";
18
+
19
+ /** Collection name for report embeddings */
20
+ const REPORT_COLLECTION = "project_reports";
21
+
22
+ /**
23
+ * Result from semantic search on reports
24
+ */
25
+ export interface ReportSearchResult {
26
+ slug: string;
27
+ projectId: string;
28
+ title: string;
29
+ summary?: string;
30
+ author: string;
31
+ publishedAt?: number;
32
+ hashtags?: string[];
33
+ relevanceScore: number;
34
+ }
35
+
36
+ /**
37
+ * Options for semantic search on reports
38
+ */
39
+ export interface ReportSearchOptions {
40
+ limit?: number;
41
+ minScore?: number;
42
+ projectId?: string; // Required for project isolation; 'ALL' for cross-project
43
+ }
44
+
45
+ /**
46
+ * Service for managing report embeddings and semantic search.
47
+ *
48
+ * Reports are indexed with their projectId in metadata, enabling
49
+ * project-scoped queries via SQL prefilter during vector search.
50
+ */
51
+ export class ReportEmbeddingService {
52
+ private static instance: ReportEmbeddingService | null = null;
53
+ private ragService: RAGService;
54
+ private initialized = false;
55
+ private initializationPromise: Promise<void> | null = null;
56
+
57
+ private constructor() {
58
+ this.ragService = RAGService.getInstance();
59
+ }
60
+
61
+ /**
62
+ * Get singleton instance
63
+ */
64
+ public static getInstance(): ReportEmbeddingService {
65
+ if (!ReportEmbeddingService.instance) {
66
+ ReportEmbeddingService.instance = new ReportEmbeddingService();
67
+ }
68
+ return ReportEmbeddingService.instance;
69
+ }
70
+
71
+ /**
72
+ * Initialize the service (creates collection if needed).
73
+ * Clears initializationPromise on failure to allow retries.
74
+ */
75
+ public async initialize(): Promise<void> {
76
+ if (this.initialized) return;
77
+ if (this.initializationPromise) return this.initializationPromise;
78
+
79
+ this.initializationPromise = this.doInitialize();
80
+ try {
81
+ await this.initializationPromise;
82
+ } catch (error) {
83
+ this.initializationPromise = null;
84
+ throw error;
85
+ }
86
+ }
87
+
88
+ private async doInitialize(): Promise<void> {
89
+ try {
90
+ logger.debug("Initializing ReportEmbeddingService");
91
+
92
+ const collections = await this.ragService.listCollections();
93
+ if (!collections.includes(REPORT_COLLECTION)) {
94
+ await this.ragService.createCollection(REPORT_COLLECTION);
95
+ logger.info(`Created report embeddings collection: ${REPORT_COLLECTION}`);
96
+ }
97
+
98
+ this.initialized = true;
99
+ logger.info("ReportEmbeddingService initialized successfully");
100
+ } catch (error) {
101
+ const message = error instanceof Error ? error.message : String(error);
102
+ logger.error("Failed to initialize ReportEmbeddingService", { error: message });
103
+ throw new Error(`ReportEmbeddingService initialization failed: ${message}`, {
104
+ cause: error,
105
+ });
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Ensure service is initialized before operations
111
+ */
112
+ private async ensureInitialized(): Promise<void> {
113
+ if (!this.initialized) {
114
+ await this.initialize();
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Build a stable document ID for a report within a project.
120
+ * Uses projectId + slug to ensure uniqueness and enable upserts.
121
+ */
122
+ private buildDocumentId(projectId: string, slug: string): string {
123
+ return `report_${projectId}_${slug}`;
124
+ }
125
+
126
+ /**
127
+ * Build embedding content from report fields.
128
+ * Combines title, summary, and content for richer semantic matching.
129
+ */
130
+ private buildEmbeddingContent(report: {
131
+ title?: string;
132
+ summary?: string;
133
+ content?: string;
134
+ hashtags?: string[];
135
+ }): string {
136
+ const parts: string[] = [];
137
+
138
+ if (report.title) {
139
+ parts.push(`Title: ${report.title}`);
140
+ }
141
+
142
+ if (report.summary) {
143
+ parts.push(`Summary: ${report.summary}`);
144
+ }
145
+
146
+ if (report.content) {
147
+ // Truncate very long content to avoid excessive embedding costs
148
+ const truncated =
149
+ report.content.length > 2000
150
+ ? report.content.substring(0, 2000) + "..."
151
+ : report.content;
152
+ parts.push(`Content: ${truncated}`);
153
+ }
154
+
155
+ if (report.hashtags && report.hashtags.length > 0) {
156
+ parts.push(`Tags: ${report.hashtags.join(", ")}`);
157
+ }
158
+
159
+ return parts.join("\n\n");
160
+ }
161
+
162
+ /**
163
+ * Index a report into the RAG collection.
164
+ *
165
+ * Called from report_write after successful Nostr publish.
166
+ * Uses upsert semantics: if a report with the same slug already exists
167
+ * in the project, it is updated rather than duplicated.
168
+ *
169
+ * @param report Report data to index
170
+ * @param projectId Project scope for isolation
171
+ * @param agentPubkey Author's pubkey for attribution
172
+ * @param agentName Author's display name
173
+ * @returns true if indexing succeeded, false otherwise
174
+ */
175
+ public async indexReport(
176
+ report: {
177
+ slug: string;
178
+ title: string;
179
+ summary?: string;
180
+ content: string;
181
+ hashtags?: string[];
182
+ publishedAt?: number;
183
+ },
184
+ projectId: string,
185
+ agentPubkey: string,
186
+ agentName?: string
187
+ ): Promise<boolean> {
188
+ await this.ensureInitialized();
189
+
190
+ try {
191
+ const documentId = this.buildDocumentId(projectId, report.slug);
192
+ const embeddingContent = this.buildEmbeddingContent(report);
193
+
194
+ if (!embeddingContent.trim()) {
195
+ logger.debug("No content to embed for report", { slug: report.slug });
196
+ return false;
197
+ }
198
+
199
+ // Delete existing document before inserting (upsert semantics)
200
+ try {
201
+ await this.ragService.deleteDocumentById(REPORT_COLLECTION, documentId);
202
+ } catch {
203
+ // Document might not exist - that's fine
204
+ }
205
+
206
+ const document: RAGDocument = {
207
+ id: documentId,
208
+ content: embeddingContent,
209
+ metadata: {
210
+ slug: report.slug,
211
+ projectId,
212
+ title: report.title || "",
213
+ summary: report.summary || "",
214
+ hashtags: report.hashtags,
215
+ agentPubkey,
216
+ agentName: agentName || "",
217
+ type: "report",
218
+ publishedAt: report.publishedAt ?? Math.floor(Date.now() / 1000),
219
+ },
220
+ timestamp: Date.now(),
221
+ source: "report",
222
+ };
223
+
224
+ await this.ragService.addDocuments(REPORT_COLLECTION, [document]);
225
+
226
+ logger.info("📝 Report indexed in RAG", {
227
+ slug: report.slug,
228
+ projectId,
229
+ documentId,
230
+ agentName,
231
+ });
232
+
233
+ return true;
234
+ } catch (error) {
235
+ const message = error instanceof Error ? error.message : String(error);
236
+ logger.warn("Failed to index report in RAG", {
237
+ slug: report.slug,
238
+ projectId,
239
+ error: message,
240
+ });
241
+ return false;
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Remove a report from the RAG collection.
247
+ * Called when a report is deleted.
248
+ */
249
+ public async removeReport(slug: string, projectId: string): Promise<void> {
250
+ try {
251
+ // Check if the collection exists before attempting deletion.
252
+ // Avoids ensureInitialized() which would create the collection as a side-effect.
253
+ const collections = await this.ragService.listCollections();
254
+ if (!collections.includes(REPORT_COLLECTION)) {
255
+ logger.debug("Report collection does not exist, nothing to remove", {
256
+ slug,
257
+ projectId,
258
+ });
259
+ return;
260
+ }
261
+
262
+ const documentId = this.buildDocumentId(projectId, slug);
263
+ await this.ragService.deleteDocumentById(REPORT_COLLECTION, documentId);
264
+ logger.info("🗑️ Report removed from RAG", { slug, projectId, documentId });
265
+ } catch (error) {
266
+ logger.debug("Could not remove report from RAG (may not exist)", {
267
+ slug,
268
+ projectId,
269
+ error,
270
+ });
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Build SQL prefilter for project isolation.
276
+ * Applied DURING vector search, not after, to ensure proper project boundaries.
277
+ */
278
+ private buildProjectFilter(projectId?: string): string | undefined {
279
+ if (!projectId || projectId.toLowerCase() === "all") {
280
+ return undefined;
281
+ }
282
+ const escapedProjectId = projectId.replace(/'/g, "''");
283
+ return `metadata LIKE '%"projectId":"${escapedProjectId}"%'`;
284
+ }
285
+
286
+ /**
287
+ * Perform semantic search on reports within a project.
288
+ *
289
+ * @param query Natural language search query
290
+ * @param options Search options including project isolation
291
+ * @returns Array of matching reports with relevance scores
292
+ */
293
+ public async semanticSearch(
294
+ query: string,
295
+ options: ReportSearchOptions = {}
296
+ ): Promise<ReportSearchResult[]> {
297
+ await this.ensureInitialized();
298
+
299
+ const { limit = 10, minScore = 0.3, projectId } = options;
300
+
301
+ try {
302
+ logger.info("🔍 Report semantic search", { query, limit, minScore, projectId });
303
+
304
+ const filter = this.buildProjectFilter(projectId);
305
+
306
+ const results = await this.ragService.queryWithFilter(
307
+ REPORT_COLLECTION,
308
+ query,
309
+ limit * 2, // Request more to account for minScore filtering
310
+ filter
311
+ );
312
+
313
+ const searchResults: ReportSearchResult[] = results
314
+ .filter((result: RAGQueryResult) => result.score >= minScore)
315
+ .slice(0, limit)
316
+ .map((result: RAGQueryResult) => this.transformResult(result));
317
+
318
+ logger.info("✅ Report semantic search complete", {
319
+ query,
320
+ found: searchResults.length,
321
+ limit,
322
+ projectFilter: filter || "none",
323
+ });
324
+
325
+ return searchResults;
326
+ } catch (error) {
327
+ const message = error instanceof Error ? error.message : String(error);
328
+ logger.error("Report semantic search failed", { query, error: message });
329
+ return [];
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Transform RAG result to ReportSearchResult
335
+ */
336
+ private transformResult(result: RAGQueryResult): ReportSearchResult {
337
+ const metadata = result.document.metadata || {};
338
+
339
+ return {
340
+ slug: String(metadata.slug || ""),
341
+ projectId: String(metadata.projectId || ""),
342
+ title: String(metadata.title || ""),
343
+ summary: String(metadata.summary || ""),
344
+ author: String(metadata.agentPubkey || ""),
345
+ publishedAt: metadata.publishedAt ? Number(metadata.publishedAt) : undefined,
346
+ hashtags: Array.isArray(metadata.hashtags) ? metadata.hashtags as string[] : undefined,
347
+ relevanceScore: result.score,
348
+ };
349
+ }
350
+
351
+ /**
352
+ * Get the collection name for report embeddings.
353
+ */
354
+ public getCollectionName(): string {
355
+ return REPORT_COLLECTION;
356
+ }
357
+
358
+ /**
359
+ * Index multiple existing reports (bulk operation).
360
+ * Useful for backfilling the RAG collection with existing reports.
361
+ *
362
+ * @param reports Array of ReportInfo objects
363
+ * @param projectId Project scope for isolation
364
+ * @returns Number of successfully indexed reports
365
+ */
366
+ public async indexExistingReports(
367
+ reports: ReportInfo[],
368
+ projectId: string
369
+ ): Promise<number> {
370
+ await this.ensureInitialized();
371
+
372
+ let indexed = 0;
373
+ for (const report of reports) {
374
+ if (report.isDeleted) continue;
375
+ if (!report.content) continue;
376
+
377
+ const success = await this.indexReport(
378
+ {
379
+ slug: report.slug,
380
+ title: report.title || "",
381
+ summary: report.summary,
382
+ content: report.content,
383
+ hashtags: report.hashtags,
384
+ publishedAt: report.publishedAt,
385
+ },
386
+ projectId,
387
+ report.author
388
+ );
389
+
390
+ if (success) indexed++;
391
+ }
392
+
393
+ logger.info("📝 Bulk report indexing complete", {
394
+ projectId,
395
+ total: reports.length,
396
+ indexed,
397
+ });
398
+
399
+ return indexed;
400
+ }
401
+
402
+ /**
403
+ * Clear all report embeddings
404
+ */
405
+ public async clearIndex(): Promise<void> {
406
+ try {
407
+ await this.ragService.deleteCollection(REPORT_COLLECTION);
408
+ logger.info("Cleared report embeddings index");
409
+ } catch (error) {
410
+ logger.debug("No report index to clear or error clearing", { error });
411
+ }
412
+
413
+ this.initialized = false;
414
+ this.initializationPromise = null;
415
+ }
416
+
417
+ /**
418
+ * Reset singleton instance (for testing)
419
+ */
420
+ public static resetInstance(): void {
421
+ if (ReportEmbeddingService.instance) {
422
+ ReportEmbeddingService.instance = null;
423
+ }
424
+ }
425
+ }
426
+
427
+ /** Lazy getter to avoid eagerly initializing at module load time */
428
+ export function getReportEmbeddingService(): ReportEmbeddingService {
429
+ return ReportEmbeddingService.getInstance();
430
+ }