@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,383 @@
1
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
2
+ import { NDKEvent as NDKEventClass } from "@nostr-dev-kit/ndk";
3
+ import { getNDK } from "@/nostr/ndkClient";
4
+ import { config } from "@/services/ConfigService";
5
+ import { getProjectContext } from "@/services/projects";
6
+ import { agentStorage } from "@/agents/AgentStorage";
7
+ import { Nip46SigningService, Nip46SigningLog } from "@/services/nip46";
8
+ import { formatAnyError } from "@/lib/error-formatter";
9
+ import { logger } from "@/utils/logger";
10
+ import { trace } from "@opentelemetry/api";
11
+
12
+ const DEBOUNCE_MS = 5000;
13
+
14
+ /**
15
+ * Per-project debounce state for 31933 updates after agent deletion.
16
+ * Batches rapid deletions into a single 31933 publish per project.
17
+ */
18
+ const projectUpdateTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();
19
+
20
+ /**
21
+ * Clear all pending debounce timers. Exported for test cleanup only.
22
+ * @internal
23
+ */
24
+ export function _testClearPendingTimers(): void {
25
+ for (const timer of projectUpdateTimers.values()) {
26
+ clearTimeout(timer);
27
+ }
28
+ projectUpdateTimers.clear();
29
+ }
30
+
31
+ /**
32
+ * Handle a kind 24030 agent deletion event.
33
+ *
34
+ * Supported scopes:
35
+ * - "project": Remove agent from a specific project (requires `a` tag with 31933 reference)
36
+ * - "global": Remove agent from all projects owned by the event author
37
+ *
38
+ * Processing order:
39
+ * 1. Parse & validate tags (p, r, a)
40
+ * 2. Authorize the event author (must be whitelisted project owner)
41
+ * 3. Remove agent from local state (storage + in-memory registry)
42
+ * 4. Debounced NIP-46-signed 31933 update (non-blocking side effect)
43
+ */
44
+ export async function handleAgentDeletion(event: NDKEvent): Promise<void> {
45
+ try {
46
+ // 1. Parse required tags
47
+ const agentPubkey = event.tagValue("p");
48
+ if (!agentPubkey) {
49
+ logger.warn("[AgentDeletion] Event missing required p tag (agent pubkey)", {
50
+ eventId: event.id?.substring(0, 12),
51
+ });
52
+ return;
53
+ }
54
+
55
+ const scope = event.tagValue("r");
56
+ if (!scope || (scope !== "project" && scope !== "global")) {
57
+ logger.warn("[AgentDeletion] Event missing or invalid r tag (scope)", {
58
+ eventId: event.id?.substring(0, 12),
59
+ scope,
60
+ });
61
+ return;
62
+ }
63
+
64
+ // 2. Authorization: event author must be a whitelisted pubkey
65
+ const whitelistedPubkeys = config.getWhitelistedPubkeys(undefined, config.getConfig());
66
+ if (!whitelistedPubkeys.includes(event.pubkey)) {
67
+ logger.warn("[AgentDeletion] Unauthorized — event author not whitelisted", {
68
+ eventId: event.id?.substring(0, 12),
69
+ author: event.pubkey.substring(0, 12),
70
+ });
71
+ return;
72
+ }
73
+
74
+ trace.getActiveSpan()?.addEvent("agent_deletion.received", {
75
+ "deletion.agent_pubkey": agentPubkey.substring(0, 12),
76
+ "deletion.scope": scope,
77
+ "deletion.author": event.pubkey.substring(0, 12),
78
+ });
79
+
80
+ // 3. Dispatch by scope
81
+ if (scope === "project") {
82
+ const aTag = event.tagValue("a");
83
+ if (!aTag) {
84
+ logger.warn("[AgentDeletion] Project-scoped deletion missing required a tag", {
85
+ eventId: event.id?.substring(0, 12),
86
+ });
87
+ return;
88
+ }
89
+ await handleProjectScopedDeletion(event, agentPubkey, aTag);
90
+ } else {
91
+ await handleGlobalDeletion(event, agentPubkey);
92
+ }
93
+ } catch (error) {
94
+ logger.error("[AgentDeletion] Failed to handle agent deletion event", {
95
+ eventId: event.id?.substring(0, 12),
96
+ error: formatAnyError(error),
97
+ });
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Remove an agent from a single project.
103
+ */
104
+ async function handleProjectScopedDeletion(
105
+ event: NDKEvent,
106
+ agentPubkey: string,
107
+ aTag: string,
108
+ ): Promise<void> {
109
+ // Parse the a-tag: "31933:<pubkey>:<d-tag>"
110
+ const parts = aTag.split(":");
111
+ if (parts.length < 3) {
112
+ logger.warn("[AgentDeletion] Invalid a-tag format", {
113
+ eventId: event.id?.substring(0, 12),
114
+ aTag,
115
+ });
116
+ return;
117
+ }
118
+ const projectDTag = parts.slice(2).join(":");
119
+
120
+ // Verify the a-tag references the currently loaded project
121
+ const projectContext = getProjectContext();
122
+ const currentProjectDTag = projectContext.project.dTag || projectContext.project.tagValue("d");
123
+ if (projectDTag !== currentProjectDTag) {
124
+ logger.debug("[AgentDeletion] Ignoring deletion for different project", {
125
+ eventId: event.id?.substring(0, 12),
126
+ targetProject: projectDTag,
127
+ currentProject: currentProjectDTag,
128
+ });
129
+ return;
130
+ }
131
+
132
+ // Verify event author matches the project owner
133
+ if (event.pubkey !== projectContext.project.pubkey) {
134
+ logger.warn("[AgentDeletion] Event author does not match project owner", {
135
+ eventId: event.id?.substring(0, 12),
136
+ eventAuthor: event.pubkey.substring(0, 12),
137
+ projectOwner: projectContext.project.pubkey.substring(0, 12),
138
+ });
139
+ return;
140
+ }
141
+
142
+ // Find the agent in the registry
143
+ const agent = projectContext.getAgentByPubkey(agentPubkey);
144
+ if (!agent) {
145
+ logger.warn("[AgentDeletion] Agent not found in project, no-op", {
146
+ agentPubkey: agentPubkey.substring(0, 12),
147
+ projectDTag,
148
+ });
149
+ return;
150
+ }
151
+
152
+ // Remove from local state (storage + in-memory + 14199 snapshot)
153
+ const removed = await projectContext.agentRegistry.removeAgentFromProject(agent.slug);
154
+
155
+ if (removed) {
156
+ logger.info("[AgentDeletion] Removed agent from project", {
157
+ agentSlug: agent.slug,
158
+ agentPubkey: agentPubkey.substring(0, 12),
159
+ projectDTag,
160
+ reason: event.content || undefined,
161
+ });
162
+
163
+ trace.getActiveSpan()?.addEvent("agent_deletion.removed", {
164
+ "deletion.agent_slug": agent.slug,
165
+ "deletion.project": projectDTag,
166
+ "deletion.scope": "project",
167
+ });
168
+
169
+ // Publish updated project status if available
170
+ if (projectContext.statusPublisher) {
171
+ await projectContext.statusPublisher.publishImmediately();
172
+ }
173
+
174
+ // Schedule debounced 31933 update
175
+ scheduleProjectEventUpdate(projectDTag, event.pubkey, agentPubkey);
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Remove an agent from all projects owned by the event author.
181
+ */
182
+ async function handleGlobalDeletion(
183
+ event: NDKEvent,
184
+ agentPubkey: string,
185
+ ): Promise<void> {
186
+ // Find all projects this agent belongs to
187
+ const projects = await agentStorage.getAgentProjects(agentPubkey);
188
+
189
+ if (projects.length === 0) {
190
+ logger.warn("[AgentDeletion] Agent has no project associations, no-op", {
191
+ agentPubkey: agentPubkey.substring(0, 12),
192
+ });
193
+ return;
194
+ }
195
+
196
+ const projectContext = getProjectContext();
197
+ const currentProjectDTag = projectContext.project.dTag || projectContext.project.tagValue("d");
198
+
199
+ let removedCount = 0;
200
+
201
+ for (const projectDTag of projects) {
202
+ // Only process if this is the currently loaded project
203
+ if (projectDTag !== currentProjectDTag) {
204
+ logger.debug("[AgentDeletion] Skipping deletion for non-loaded project", {
205
+ projectDTag,
206
+ currentProject: currentProjectDTag,
207
+ });
208
+ continue;
209
+ }
210
+
211
+ // Verify event author matches the project owner
212
+ if (event.pubkey !== projectContext.project.pubkey) {
213
+ logger.warn("[AgentDeletion] Event author does not match project owner, skipping", {
214
+ projectDTag,
215
+ eventAuthor: event.pubkey.substring(0, 12),
216
+ projectOwner: projectContext.project.pubkey.substring(0, 12),
217
+ });
218
+ continue;
219
+ }
220
+
221
+ const agent = projectContext.getAgentByPubkey(agentPubkey);
222
+ if (!agent) {
223
+ // Agent may have already been removed — handle gracefully
224
+ logger.debug("[AgentDeletion] Agent already absent from project registry", {
225
+ agentPubkey: agentPubkey.substring(0, 12),
226
+ projectDTag,
227
+ });
228
+ continue;
229
+ }
230
+
231
+ const removed = await projectContext.agentRegistry.removeAgentFromProject(agent.slug);
232
+ if (removed) {
233
+ removedCount++;
234
+ scheduleProjectEventUpdate(projectDTag, event.pubkey, agentPubkey);
235
+ }
236
+ }
237
+
238
+ if (removedCount > 0) {
239
+ logger.info("[AgentDeletion] Global deletion complete", {
240
+ agentPubkey: agentPubkey.substring(0, 12),
241
+ projectsAffected: removedCount,
242
+ totalProjects: projects.length,
243
+ reason: event.content || undefined,
244
+ });
245
+
246
+ trace.getActiveSpan()?.addEvent("agent_deletion.global_complete", {
247
+ "deletion.agent_pubkey": agentPubkey.substring(0, 12),
248
+ "deletion.projects_affected": removedCount,
249
+ "deletion.total_projects": projects.length,
250
+ });
251
+
252
+ // Publish updated project status if available
253
+ if (projectContext.statusPublisher) {
254
+ await projectContext.statusPublisher.publishImmediately();
255
+ }
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Schedule a debounced NIP-46-signed 31933 project event update.
261
+ *
262
+ * After local state is updated, we must publish an updated 31933 event
263
+ * with the deleted agent's tag removed. Without this, a daemon restart
264
+ * would reload agents from the stale 31933 event on relays.
265
+ *
266
+ * Debouncing batches rapid deletions into a single publish per project.
267
+ */
268
+ function scheduleProjectEventUpdate(
269
+ projectDTag: string,
270
+ ownerPubkey: string,
271
+ _removedAgentPubkey: string,
272
+ ): void {
273
+ const existing = projectUpdateTimers.get(projectDTag);
274
+ if (existing) {
275
+ clearTimeout(existing);
276
+ }
277
+
278
+ const timer = setTimeout(() => {
279
+ projectUpdateTimers.delete(projectDTag);
280
+ publishUpdatedProjectEvent(projectDTag, ownerPubkey).catch((error) => {
281
+ logger.warn("[AgentDeletion] Debounced 31933 update failed", {
282
+ projectDTag,
283
+ error: error instanceof Error ? error.message : String(error),
284
+ });
285
+ });
286
+ }, DEBOUNCE_MS);
287
+
288
+ projectUpdateTimers.set(projectDTag, timer);
289
+ }
290
+
291
+ /**
292
+ * Publish an updated kind 31933 project event with deleted agent tags removed.
293
+ *
294
+ * Follows the NIP-46 signing pattern from OwnerAgentListService:
295
+ * 1. Build updated event from current project state
296
+ * 2. Sign via NIP-46 if enabled
297
+ * 3. Publish to relays
298
+ */
299
+ async function publishUpdatedProjectEvent(
300
+ projectDTag: string,
301
+ ownerPubkey: string,
302
+ ): Promise<void> {
303
+ const projectContext = getProjectContext();
304
+ const currentProject = projectContext.project;
305
+ const currentProjectDTag = currentProject.dTag || currentProject.tagValue("d");
306
+
307
+ if (currentProjectDTag !== projectDTag) {
308
+ logger.debug("[AgentDeletion] Project no longer loaded, skipping 31933 update", {
309
+ projectDTag,
310
+ });
311
+ return;
312
+ }
313
+
314
+ // Get current agents in registry (post-deletion)
315
+ const currentAgents = projectContext.agentRegistry.getAllAgents();
316
+ const currentAgentEventIds = new Set(
317
+ currentAgents
318
+ .map((a) => a.eventId)
319
+ .filter((id): id is string => !!id)
320
+ );
321
+
322
+ // Rebuild the project event tags, filtering out removed agent tags
323
+ const updatedTags = currentProject.tags.filter((tag) => {
324
+ if (tag[0] === "agent") {
325
+ // Keep only agent tags that reference agents still in the registry
326
+ return tag[1] && currentAgentEventIds.has(tag[1]);
327
+ }
328
+ return true;
329
+ });
330
+
331
+ // Build the updated 31933 event
332
+ const ndk = getNDK();
333
+ const updatedEvent = new NDKEventClass(ndk, {
334
+ kind: 31933,
335
+ content: currentProject.content,
336
+ tags: updatedTags,
337
+ });
338
+
339
+ const nip46Service = Nip46SigningService.getInstance();
340
+
341
+ if (nip46Service.isEnabled()) {
342
+ const signingLog = Nip46SigningLog.getInstance();
343
+ const result = await nip46Service.signEvent(ownerPubkey, updatedEvent, "agent_deletion_31933");
344
+
345
+ if (result.outcome === "signed") {
346
+ try {
347
+ await updatedEvent.publish();
348
+ signingLog.log({
349
+ op: "event_published",
350
+ ownerPubkey: Nip46SigningLog.truncatePubkey(ownerPubkey),
351
+ eventKind: 31933,
352
+ signerType: "nip46",
353
+ eventId: updatedEvent.id,
354
+ });
355
+ logger.info("[AgentDeletion] Published owner-signed 31933 update", {
356
+ ownerPubkey: ownerPubkey.substring(0, 12),
357
+ projectDTag,
358
+ eventId: updatedEvent.id?.substring(0, 12),
359
+ agentTagCount: updatedTags.filter((t) => t[0] === "agent").length,
360
+ });
361
+ } catch (error) {
362
+ logger.warn("[AgentDeletion] Failed to publish 31933 update", {
363
+ ownerPubkey: ownerPubkey.substring(0, 12),
364
+ projectDTag,
365
+ error: error instanceof Error ? error.message : String(error),
366
+ });
367
+ }
368
+ return;
369
+ }
370
+
371
+ logger.warn("[AgentDeletion] Skipping 31933 publish — signing failed", {
372
+ ownerPubkey: ownerPubkey.substring(0, 12),
373
+ projectDTag,
374
+ outcome: result.outcome,
375
+ reason: "reason" in result ? result.reason : undefined,
376
+ });
377
+ } else {
378
+ logger.warn("[AgentDeletion] NIP-46 not enabled — 31933 update skipped", {
379
+ projectDTag,
380
+ note: "Stale 31933 on relays will re-introduce deleted agents on daemon restart",
381
+ });
382
+ }
383
+ }