@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,440 @@
1
+ import type { AgentInstance } from "@/agents/types";
2
+ import { getNDK } from "@/nostr";
3
+ import { getProjectContext } from "@/services/projects";
4
+ import { logger } from "@/utils/logger";
5
+ import type NDK from "@nostr-dev-kit/ndk";
6
+ import { NDKArticle } from "@nostr-dev-kit/ndk";
7
+ import { nip19 } from "nostr-tools";
8
+ import { articleToReportInfo } from "./articleUtils";
9
+
10
+ export interface ReportData {
11
+ slug: string;
12
+ title: string;
13
+ summary: string;
14
+ content: string;
15
+ hashtags?: string[];
16
+ memorize?: boolean;
17
+ memorizeTeam?: boolean;
18
+ }
19
+
20
+ export interface ReportInfo {
21
+ id: string;
22
+ slug: string;
23
+ title?: string;
24
+ summary?: string;
25
+ content?: string;
26
+ /** Author's hex pubkey (64-character lowercase hex string) */
27
+ author: string;
28
+ publishedAt?: number;
29
+ hashtags?: string[];
30
+ projectReference?: string;
31
+ isDeleted?: boolean;
32
+ isMemorized?: boolean;
33
+ isMemorizedTeam?: boolean;
34
+ }
35
+
36
+ export interface ReportSummary {
37
+ id: string;
38
+ slug: string;
39
+ title?: string;
40
+ summary?: string;
41
+ author: string;
42
+ publishedAt?: number;
43
+ hashtags?: string[];
44
+ }
45
+
46
+ export interface WriteReportResult {
47
+ /** The naddr-encoded article ID (e.g., "naddr1...") */
48
+ encodedId: string;
49
+ /** The addressable event reference for a-tagging (format: "30023:pubkey:d-tag") */
50
+ addressableRef: string;
51
+ }
52
+
53
+ type ReportAuthor = Pick<AgentInstance, "pubkey" | "signer" | "sign">;
54
+
55
+ /**
56
+ * Centralized service for managing NDKArticle reports
57
+ * Handles creation, reading, listing, and deletion of reports
58
+ */
59
+ export class ReportService {
60
+ private ndk: NDK;
61
+
62
+ constructor(ndk?: NDK) {
63
+ const ndkInstance = ndk || getNDK();
64
+ if (!ndkInstance) {
65
+ throw new Error("NDK instance not available");
66
+ }
67
+ this.ndk = ndkInstance;
68
+ }
69
+
70
+ /**
71
+ * Write or update a report
72
+ * @returns WriteReportResult containing both the encoded ID and addressable reference
73
+ */
74
+ async writeReport(data: ReportData, agent: ReportAuthor): Promise<WriteReportResult> {
75
+ const projectCtx = getProjectContext();
76
+ if (!projectCtx?.project) {
77
+ throw new Error("No project context available");
78
+ }
79
+
80
+ if (!agent.signer) {
81
+ throw new Error("Agent signer required to publish reports");
82
+ }
83
+
84
+ const article = new NDKArticle(this.ndk);
85
+
86
+ // Set the d-tag explicitly to the provided slug
87
+ article.dTag = data.slug;
88
+
89
+ // Set article properties
90
+ article.title = data.title;
91
+ article.summary = data.summary;
92
+ article.content = data.content;
93
+ article.published_at = Math.floor(Date.now() / 1000);
94
+
95
+ // Add hashtags if provided
96
+ if (data.hashtags && data.hashtags.length > 0) {
97
+ article.tags.push(...data.hashtags.map((tag) => ["t", tag]));
98
+ }
99
+
100
+ // Add memorize tag if requested - this marks the report for system prompt injection
101
+ if (data.memorize) {
102
+ article.tags.push(["t", "memorize"]);
103
+ }
104
+
105
+ // Add memorize_team tag if requested - this marks the report for ALL agents' system prompts
106
+ if (data.memorizeTeam) {
107
+ article.tags.push(["t", "memorize_team"]);
108
+ }
109
+
110
+ // Tag the current project using a-tag
111
+ const projectTagId = projectCtx.project.tagId();
112
+ article.tags.push(["a", projectTagId]);
113
+
114
+ // Note: We don't add a p-tag for the author because the event.pubkey
115
+ // already identifies who authored/signed the event. P-tags are for
116
+ // tagging OTHER users (mentions, collaborators, etc.), not yourself.
117
+
118
+ // Sign and publish the article
119
+ await agent.sign(article);
120
+ await article.publish();
121
+
122
+ // Build the addressable reference for a-tagging: "30023:pubkey:d-tag"
123
+ // NDKArticle is kind 30023
124
+ const addressableRef = `30023:${agent.pubkey}:${data.slug}`;
125
+
126
+ return {
127
+ encodedId: article.encode(),
128
+ addressableRef,
129
+ };
130
+ }
131
+
132
+ /**
133
+ * Read a report by slug or naddr
134
+ * First tries the cache, then falls back to NDK fetch if not found.
135
+ *
136
+ * Reports are project-scoped: any agent can read any report in the project.
137
+ * When searching by slug, we filter by project tag (#a) to find reports
138
+ * belonging to the current project regardless of author.
139
+ */
140
+ async readReport(identifier: string): Promise<ReportInfo | null> {
141
+ const projectCtx = getProjectContext();
142
+
143
+ // First, try to find in cache
144
+ if (identifier.startsWith("naddr1")) {
145
+ // Decode the naddr to extract slug and author
146
+ const decoded = nip19.decode(identifier);
147
+ if (decoded.type === "naddr" && decoded.data.kind === 30023) {
148
+ const cachedReport = projectCtx.getReport(decoded.data.pubkey, decoded.data.identifier);
149
+ if (cachedReport) {
150
+ logger.debug("📰 Report found in cache (by naddr)", { slug: decoded.data.identifier });
151
+ return cachedReport;
152
+ }
153
+ }
154
+ } else {
155
+ // Try to find by slug across all authors in the project
156
+ const cachedReport = projectCtx.getReportBySlug(identifier);
157
+ if (cachedReport) {
158
+ logger.debug("📰 Report found in cache (by slug)", { slug: identifier });
159
+ return cachedReport;
160
+ }
161
+ }
162
+
163
+ // Cache miss - fall back to NDK fetch
164
+ logger.debug("📰 Report not in cache, fetching from NDK", { identifier });
165
+
166
+ let article: NDKArticle | null = null;
167
+
168
+ // Check if identifier is an naddr
169
+ if (identifier.startsWith("naddr1")) {
170
+ // Decode the naddr to get the event
171
+ const decoded = nip19.decode(identifier);
172
+ if (decoded.type === "naddr" && decoded.data.kind === 30023) {
173
+ // Fetch the specific article
174
+ const filter = {
175
+ kinds: [30023],
176
+ authors: [decoded.data.pubkey],
177
+ "#d": [decoded.data.identifier],
178
+ };
179
+
180
+ const events = await this.ndk.fetchEvents(filter);
181
+ if (events.size > 0) {
182
+ const event = Array.from(events)[0];
183
+ article = NDKArticle.from(event);
184
+ }
185
+ }
186
+ } else {
187
+ // Treat as a slug - search for articles with this d-tag in the current project
188
+ // Use project tag (#a) to scope the search to this project
189
+ const projectTagId = projectCtx.project.tagId();
190
+ const filter = {
191
+ kinds: [30023],
192
+ "#d": [identifier],
193
+ "#a": [projectTagId],
194
+ };
195
+
196
+ const events = await this.ndk.fetchEvents(filter);
197
+ if (events.size > 0) {
198
+ // If multiple reports with same slug exist (different authors),
199
+ // return the most recently published one
200
+ const sortedEvents = Array.from(events).sort((a, b) =>
201
+ (b.created_at || 0) - (a.created_at || 0)
202
+ );
203
+ article = NDKArticle.from(sortedEvents[0]);
204
+ }
205
+ }
206
+
207
+ if (!article) {
208
+ return null;
209
+ }
210
+
211
+ const reportInfo = articleToReportInfo(article);
212
+
213
+ // Add to cache for future lookups
214
+ projectCtx.addReport(reportInfo);
215
+
216
+ return reportInfo;
217
+ }
218
+
219
+ /**
220
+ * List reports from project agents
221
+ * Uses cached reports for fast lookup
222
+ * @param agentPubkeys Optional array of hex pubkeys to filter by (must be 64-char hex, not npub)
223
+ */
224
+ async listReports(agentPubkeys?: string[]): Promise<ReportSummary[]> {
225
+ const projectCtx = getProjectContext();
226
+ if (!projectCtx?.project) {
227
+ throw new Error("No project context available");
228
+ }
229
+
230
+ // Get reports from cache
231
+ let cachedReports = projectCtx.getAllReports();
232
+
233
+ // Filter by agent pubkeys if provided
234
+ // report.author is already a hex pubkey (see articleUtils.ts)
235
+ if (agentPubkeys && agentPubkeys.length > 0) {
236
+ const pubkeySet = new Set(agentPubkeys);
237
+ cachedReports = cachedReports.filter((report) => pubkeySet.has(report.author));
238
+ }
239
+
240
+ // Filter out deleted reports and convert to ReportSummary
241
+ const reports: ReportSummary[] = cachedReports
242
+ .filter((report) => !report.isDeleted)
243
+ .map((report) => ({
244
+ id: report.id,
245
+ slug: report.slug,
246
+ title: report.title,
247
+ summary: report.summary,
248
+ author: report.author,
249
+ publishedAt: report.publishedAt,
250
+ hashtags: report.hashtags,
251
+ }));
252
+
253
+ // Sort reports by published date (newest first)
254
+ reports.sort((a, b) => (b.publishedAt || 0) - (a.publishedAt || 0));
255
+
256
+ logger.debug("📰 Listed reports from cache", {
257
+ total: reports.length,
258
+ cacheSize: projectCtx.reports.size,
259
+ });
260
+
261
+ return reports;
262
+ }
263
+
264
+ /**
265
+ * Delete a report by marking it as deleted
266
+ */
267
+ async deleteReport(slug: string, agent: ReportAuthor): Promise<string> {
268
+ const projectCtx = getProjectContext();
269
+ if (!projectCtx?.project) {
270
+ throw new Error("No project context available");
271
+ }
272
+
273
+ if (!agent.signer) {
274
+ throw new Error("Agent signer required to delete reports");
275
+ }
276
+
277
+ // First, find the existing article
278
+ const filter = {
279
+ kinds: [30023],
280
+ authors: [agent.pubkey],
281
+ "#d": [slug],
282
+ };
283
+
284
+ const events = await this.ndk.fetchEvents(filter);
285
+ if (events.size === 0) {
286
+ throw new Error(`No report found with slug: ${slug}`);
287
+ }
288
+
289
+ const event = Array.from(events)[0];
290
+ const article = NDKArticle.from(event);
291
+
292
+ // Create a new version with empty content and deleted tag
293
+ const deletedArticle = new NDKArticle(this.ndk);
294
+
295
+ // Preserve the d-tag
296
+ deletedArticle.dTag = slug;
297
+
298
+ // Set minimal properties
299
+ deletedArticle.title = article.title || "Deleted Report";
300
+ deletedArticle.summary = "This report has been deleted";
301
+ deletedArticle.content = "";
302
+ deletedArticle.published_at = Math.floor(Date.now() / 1000);
303
+
304
+ // Add the deleted tag
305
+ deletedArticle.tags.push(["deleted"]);
306
+
307
+ // Preserve the project tag
308
+ const projectTagId = projectCtx.project.tagId();
309
+ deletedArticle.tags.push(["a", projectTagId]);
310
+
311
+ // Note: We don't add a p-tag for the author because the event.pubkey
312
+ // already identifies who authored/signed the event.
313
+
314
+ // Sign and publish the updated article
315
+ await agent.sign(deletedArticle);
316
+ await deletedArticle.publish();
317
+
318
+ logger.info("🗑️ Report marked as deleted", {
319
+ slug,
320
+ articleId: deletedArticle.encode(),
321
+ });
322
+
323
+ return deletedArticle.encode();
324
+ }
325
+
326
+ /**
327
+ * Get all agent pubkeys from the project context
328
+ */
329
+ getAllProjectAgentPubkeys(): string[] {
330
+ const projectCtx = getProjectContext();
331
+ if (!projectCtx) {
332
+ return [];
333
+ }
334
+
335
+ const agentPubkeys: string[] = [];
336
+
337
+ // Add project manager pubkey
338
+ if (projectCtx.projectManager) {
339
+ agentPubkeys.push(projectCtx.projectManager.pubkey);
340
+ }
341
+
342
+ // Add all other agents
343
+ if (projectCtx.agents) {
344
+ for (const agent of projectCtx.agents.values()) {
345
+ if (!agentPubkeys.includes(agent.pubkey)) {
346
+ agentPubkeys.push(agent.pubkey);
347
+ }
348
+ }
349
+ }
350
+
351
+ return agentPubkeys;
352
+ }
353
+
354
+ /**
355
+ * Get memorized reports for a specific agent.
356
+ * Returns reports that have the "memorize" tag authored by that agent.
357
+ * Uses cached reports for instant lookup.
358
+ */
359
+ getMemorizedReportsForAgent(agentPubkey: string): ReportInfo[] {
360
+ const projectCtx = getProjectContext();
361
+ if (!projectCtx?.project) {
362
+ throw new Error("No project context available");
363
+ }
364
+
365
+ // Get memorized reports for this agent from cache
366
+ const reports = projectCtx.getMemorizedReportsForAgent(agentPubkey);
367
+
368
+ // Filter out deleted reports (should already be excluded, but double-check)
369
+ const activeReports = reports.filter((report) => !report.isDeleted);
370
+
371
+ // Sort by published date (oldest first - so they appear in chronological order in the prompt)
372
+ activeReports.sort((a, b) => (a.publishedAt || 0) - (b.publishedAt || 0));
373
+
374
+ logger.debug("📚 Retrieved memorized reports from cache", {
375
+ agentPubkey: agentPubkey.substring(0, 16),
376
+ count: activeReports.length,
377
+ slugs: activeReports.map((r) => r.slug),
378
+ });
379
+
380
+ return activeReports;
381
+ }
382
+
383
+ /**
384
+ * Get all memorized reports for any agent.
385
+ * Useful for project-wide memorized knowledge.
386
+ */
387
+ getAllMemorizedReports(): ReportInfo[] {
388
+ const projectCtx = getProjectContext();
389
+ if (!projectCtx?.project) {
390
+ throw new Error("No project context available");
391
+ }
392
+
393
+ // Get all memorized reports from cache
394
+ const reports = projectCtx.getMemorizedReports();
395
+
396
+ // Filter out deleted reports
397
+ const activeReports = reports.filter((report) => !report.isDeleted);
398
+
399
+ // Sort by published date (oldest first)
400
+ activeReports.sort((a, b) => (a.publishedAt || 0) - (b.publishedAt || 0));
401
+
402
+ return activeReports;
403
+ }
404
+
405
+ /**
406
+ * Get team-memorized reports (reports tagged with memorize_team=true).
407
+ * These reports are injected into ALL agents' system prompts.
408
+ * Uses cached reports for instant lookup.
409
+ */
410
+ getTeamMemorizedReports(): ReportInfo[] {
411
+ const projectCtx = getProjectContext();
412
+ if (!projectCtx?.project) {
413
+ throw new Error("No project context available");
414
+ }
415
+
416
+ // Get team-memorized reports from cache
417
+ const reports = projectCtx.getTeamMemorizedReports();
418
+
419
+ // Filter out deleted reports (should already be excluded, but double-check)
420
+ const activeReports = reports.filter((report) => !report.isDeleted);
421
+
422
+ // Sort by published date (oldest first - so they appear in chronological order in the prompt)
423
+ activeReports.sort((a, b) => (a.publishedAt || 0) - (b.publishedAt || 0));
424
+
425
+ logger.debug("📚 Retrieved team-memorized reports from cache", {
426
+ count: activeReports.length,
427
+ slugs: activeReports.map((r) => r.slug),
428
+ });
429
+
430
+ return activeReports;
431
+ }
432
+
433
+ /**
434
+ * Get report cache statistics for monitoring
435
+ */
436
+ getCacheStats(): { total: number; memorized: number; byAuthor: Record<string, number> } {
437
+ const projectCtx = getProjectContext();
438
+ return projectCtx.getReportCacheStats();
439
+ }
440
+ }
@@ -0,0 +1,52 @@
1
+ import type { NDKArticle } from "@nostr-dev-kit/ndk";
2
+ import type { ReportInfo } from "./ReportService";
3
+
4
+ /**
5
+ * Centralized utility for converting NDKArticle to ReportInfo.
6
+ * This is the single source of truth for article-to-report conversion,
7
+ * used by both ReportService and ProjectContext.
8
+ */
9
+ export function articleToReportInfo(article: NDKArticle): ReportInfo {
10
+ // Extract hashtags from tags (excluding the "memorize" and "memorize_team" tags)
11
+ const hashtags = article.tags
12
+ .filter((tag: string[]) => tag[0] === "t" && tag[1] !== "memorize" && tag[1] !== "memorize_team")
13
+ .map((tag: string[]) => tag[1]);
14
+
15
+ // Extract project reference if present
16
+ const projectTag = article.tags.find(
17
+ (tag: string[]) => tag[0] === "a" && tag[1]?.includes(":31933:")
18
+ );
19
+ const projectReference = projectTag ? projectTag[1] : undefined;
20
+
21
+ // Check if deleted
22
+ const isDeleted = article.tags.some((tag: string[]) => tag[0] === "deleted");
23
+
24
+ // Check if memorized (for the authoring agent only)
25
+ const isMemorized = article.tags.some(
26
+ (tag: string[]) => tag[0] === "t" && tag[1] === "memorize"
27
+ );
28
+
29
+ // Check if team-memorized (for ALL agents in the project)
30
+ const isMemorizedTeam = article.tags.some(
31
+ (tag: string[]) => tag[0] === "t" && tag[1] === "memorize_team"
32
+ );
33
+
34
+ // Get author hex pubkey directly from the event
35
+ // Internal data should always use hex format, not npub
36
+ const authorPubkey = article.pubkey;
37
+
38
+ return {
39
+ id: `nostr:${article.encode()}`,
40
+ slug: article.dTag || "",
41
+ title: article.title,
42
+ summary: article.summary,
43
+ content: article.content,
44
+ author: authorPubkey,
45
+ publishedAt: article.published_at,
46
+ hashtags: hashtags.length > 0 ? hashtags : undefined,
47
+ projectReference,
48
+ isDeleted,
49
+ isMemorized,
50
+ isMemorizedTeam,
51
+ };
52
+ }
@@ -0,0 +1,7 @@
1
+ export type { ReportData, ReportInfo, ReportSummary, WriteReportResult } from "./ReportService";
2
+ export { ReportService } from "./ReportService";
3
+ export { articleToReportInfo } from "./articleUtils";
4
+ export type { LocalReportMetadata } from "./LocalReportStore";
5
+ export { LocalReportStore, getLocalReportStore, createLocalReportStore, InvalidSlugError } from "./LocalReportStore";
6
+ export type { ReportSearchResult, ReportSearchOptions } from "./ReportEmbeddingService";
7
+ export { ReportEmbeddingService, getReportEmbeddingService } from "./ReportEmbeddingService";