@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,498 @@
1
+ /**
2
+ * ToolExecutionTracker - Manages tool execution lifecycle during LLM streaming.
3
+ *
4
+ * Tracks executions from start to completion, coordinating between async events and
5
+ * ensuring proper correlation between Nostr events, tool results, and persistence.
6
+ *
7
+ * Responsibilities:
8
+ * - Event Correlation: Matches tool results with their initial execution events
9
+ * - Nostr Publishing: Publishes tool execution announcements
10
+ * - Persistence: Stores tool messages for conversation history
11
+ */
12
+
13
+ import { isDelegateToolName, unwrapMcpToolName } from "@/agents/tool-names";
14
+ import { toolMessageStorage } from "@/conversations/persistence/ToolMessageStorage";
15
+ import type { EventContext } from "@/nostr/types";
16
+ import type { AgentPublisher } from "@/nostr/AgentPublisher";
17
+ import { PendingDelegationsRegistry } from "@/services/ral";
18
+ import type { AISdkTool } from "@/tools/types";
19
+ import { logger } from "@/utils/logger";
20
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
21
+ import { trace } from "@opentelemetry/api";
22
+ import { extractErrorDetails, getHumanReadableContent } from "./ToolResultUtils";
23
+
24
+ /**
25
+ * Tools that publish addressable events and need delayed tool use event publishing.
26
+ * These tools return results containing addressable event references that should be
27
+ * tagged with 'a' tags on the tool use event.
28
+ */
29
+ const ADDRESSABLE_EVENT_TOOLS = ["report_write"];
30
+
31
+ /**
32
+ * Check if a tool publishes addressable events that need delayed publishing.
33
+ * This includes both direct tool names and MCP-wrapped versions.
34
+ */
35
+ function isAddressableEventTool(toolName: string): boolean {
36
+ const baseToolName = unwrapMcpToolName(toolName);
37
+ return ADDRESSABLE_EVENT_TOOLS.includes(baseToolName);
38
+ }
39
+
40
+ function needsDelayedPublishing(toolName: string): boolean {
41
+ return isDelegateToolName(toolName) || isAddressableEventTool(toolName);
42
+ }
43
+
44
+ /**
45
+ * Represents a tracked tool execution
46
+ */
47
+ interface TrackedExecution {
48
+ /** Unique identifier for this tool call */
49
+ toolCallId: string;
50
+ /** Name of the tool being executed */
51
+ toolName: string;
52
+ /** Nostr event ID published when tool started (empty string for delegation tools with delayed publishing) */
53
+ toolEventId: string;
54
+ /** Input arguments passed to the tool */
55
+ input: unknown;
56
+ /** Output from the tool (available after completion) */
57
+ output?: unknown;
58
+ /** Whether the tool execution resulted in an error */
59
+ error?: boolean;
60
+ /** Whether the tool has completed execution */
61
+ completed: boolean;
62
+ /** Human-readable content for the tool event (stored for delayed publishing) */
63
+ humanContent?: string;
64
+ /** Event context for publishing (stored for delayed publishing) */
65
+ eventContext?: EventContext;
66
+ /** Agent publisher instance (stored for delayed publishing) */
67
+ agentPublisher?: AgentPublisher;
68
+ }
69
+
70
+ /**
71
+ * Options for tracking a new tool execution
72
+ */
73
+ export interface TrackExecutionOptions {
74
+ /** Unique identifier for this tool call */
75
+ toolCallId: string;
76
+ /** Name of the tool being executed */
77
+ toolName: string;
78
+ /** Arguments passed to the tool */
79
+ args: unknown;
80
+ /** Available tools for human-readable content generation */
81
+ toolsObject: Record<string, AISdkTool>;
82
+ /** Publisher for Nostr events */
83
+ agentPublisher: AgentPublisher;
84
+ /** Context for event publishing */
85
+ eventContext: EventContext;
86
+ /** Cumulative usage from previous steps (if available) */
87
+ usage?: import("@/llm/types").LanguageModelUsageWithCostUsd;
88
+ }
89
+
90
+ /**
91
+ * Options for completing a tool execution
92
+ */
93
+ export interface CompleteExecutionOptions {
94
+ /** Unique identifier for the tool call to complete */
95
+ toolCallId: string;
96
+ /** Result from the tool execution */
97
+ result: unknown;
98
+ /** Whether the execution resulted in an error */
99
+ error: boolean;
100
+ /** Public key of the agent that executed the tool */
101
+ agentPubkey: string;
102
+ }
103
+
104
+ /**
105
+ * Manages the lifecycle and state of tool executions during LLM streaming
106
+ */
107
+ export class ToolExecutionTracker {
108
+ /**
109
+ * Internal storage for tracked executions
110
+ * Key: toolCallId, Value: execution state and metadata
111
+ */
112
+ private executions = new Map<string, TrackedExecution>();
113
+
114
+ /**
115
+ * Track a new tool execution when it starts
116
+ *
117
+ * This method is called when the LLM decides to execute a tool. It:
118
+ * 1. Generates human-readable content for the tool execution
119
+ * 2. Publishes a Nostr event announcing the tool execution (unless delegation tool)
120
+ * 3. Stores the execution state for later correlation with results
121
+ *
122
+ * For delegation tools (delegate, delegate_followup, ask, delegate_crossproject),
123
+ * publishing is delayed until completeExecution so the delegation event IDs can be included.
124
+ *
125
+ * @param options - Configuration for tracking the execution
126
+ * @returns Promise that resolves with the published Nostr event, or null for delegation tools
127
+ *
128
+ * @throws Will throw if Nostr event publishing fails
129
+ */
130
+ async trackExecution(options: TrackExecutionOptions): Promise<NDKEvent | null> {
131
+ const { toolCallId, toolName, args, toolsObject, agentPublisher, eventContext, usage } = options;
132
+
133
+ logger.debug("[ToolExecutionTracker] Tracking new tool execution", {
134
+ toolName,
135
+ toolCallId,
136
+ currentTrackedCount: this.executions.size,
137
+ });
138
+
139
+ const activeSpan = trace.getActiveSpan();
140
+ if (activeSpan) {
141
+ // Truncate args for telemetry to prevent huge span attributes
142
+ const argsPreview =
143
+ typeof args === "object" && args !== null
144
+ ? JSON.stringify(args).substring(0, 200)
145
+ : String(args).substring(0, 200);
146
+
147
+ activeSpan.addEvent("tool.execution_start", {
148
+ "tool.name": toolName,
149
+ "tool.call_id": toolCallId,
150
+ "tool.args_preview": argsPreview,
151
+ });
152
+ }
153
+
154
+ // Generate human-readable content for the tool execution
155
+ const humanContent = getHumanReadableContent(toolName, args, toolsObject);
156
+
157
+ // Store the execution state BEFORE async operations to prevent race conditions
158
+ const execution: TrackedExecution = {
159
+ toolCallId,
160
+ toolName,
161
+ toolEventId: "", // Will be updated after publish (empty for delayed delegation tools)
162
+ input: args,
163
+ completed: false,
164
+ };
165
+
166
+ this.executions.set(toolCallId, execution);
167
+
168
+ // For tools that need delayed publishing (delegation tools, addressable event tools),
169
+ // delay publishing until completion so we have the event IDs/references
170
+ if (needsDelayedPublishing(toolName)) {
171
+ // Store context for delayed publishing in completeExecution
172
+ execution.humanContent = humanContent;
173
+ execution.eventContext = eventContext;
174
+ execution.agentPublisher = agentPublisher;
175
+
176
+ const toolType = isDelegateToolName(toolName) ? "delegation" : "addressable event";
177
+ logger.debug(`[ToolExecutionTracker] ${toolType} tool tracked (delayed publishing)`, {
178
+ toolCallId,
179
+ toolName,
180
+ totalTracked: this.executions.size,
181
+ });
182
+
183
+ return null;
184
+ }
185
+
186
+ // Publish the tool execution event to Nostr (async operation)
187
+ const toolEvent = await agentPublisher.toolUse(
188
+ {
189
+ toolName,
190
+ content: humanContent,
191
+ args,
192
+ usage,
193
+ },
194
+ eventContext
195
+ );
196
+
197
+ // Update the execution with the actual event ID
198
+ execution.toolEventId = toolEvent.id;
199
+
200
+ logger.debug("[ToolExecutionTracker] Tool execution tracked", {
201
+ toolCallId,
202
+ toolName,
203
+ toolEventId: toolEvent.id,
204
+ totalTracked: this.executions.size,
205
+ });
206
+
207
+ return toolEvent;
208
+ }
209
+
210
+ /**
211
+ * Complete a tracked tool execution with its result
212
+ *
213
+ * This method is called when a tool finishes executing. It:
214
+ * 1. Retrieves the original execution metadata
215
+ * 2. Updates the execution state with results
216
+ * 3. Persists the complete tool message to filesystem
217
+ *
218
+ * @param options - Configuration for completing the execution
219
+ * @returns Promise that resolves with the tool event ID (for linking to ConversationStore messages)
220
+ *
221
+ * @remarks
222
+ * If the toolCallId is not found (e.g., due to a race condition or error),
223
+ * this method logs a warning but does not throw an error
224
+ */
225
+ async completeExecution(options: CompleteExecutionOptions): Promise<string | undefined> {
226
+ const { toolCallId, result, error, agentPubkey } = options;
227
+
228
+ logger.debug("[ToolExecutionTracker] Completing tool execution", {
229
+ toolCallId,
230
+ error,
231
+ hasResult: result !== undefined,
232
+ });
233
+
234
+ // Retrieve the tracked execution
235
+ const execution = this.executions.get(toolCallId);
236
+
237
+ if (!execution) {
238
+ logger.warn("[ToolExecutionTracker] Attempted to complete unknown tool execution", {
239
+ toolCallId,
240
+ availableExecutions: Array.from(this.executions.keys()),
241
+ });
242
+
243
+ const activeSpan = trace.getActiveSpan();
244
+ if (activeSpan) {
245
+ activeSpan.addEvent("tool.execution_unknown", {
246
+ "tool.call_id": toolCallId,
247
+ });
248
+ }
249
+
250
+ return undefined;
251
+ }
252
+
253
+ // Log errors explicitly for visibility
254
+ if (error) {
255
+ // Extract error details for better logging
256
+ const errorDetails = extractErrorDetails(result);
257
+
258
+ logger.error("[ToolExecutionTracker] Tool execution failed", {
259
+ toolName: execution.toolName,
260
+ toolCallId,
261
+ toolEventId: execution.toolEventId,
262
+ errorType: errorDetails?.type || "unknown",
263
+ errorMessage: errorDetails?.message || "No details available",
264
+ result,
265
+ });
266
+
267
+ // IMPORTANT: Log error event in telemetry for trace analysis
268
+ const activeSpan = trace.getActiveSpan();
269
+ activeSpan?.addEvent("tool.execution_error", {
270
+ "tool.name": execution.toolName,
271
+ "tool.call_id": toolCallId,
272
+ "tool.error": true,
273
+ "tool.error_type": errorDetails?.type || "unknown",
274
+ "tool.error_message": (errorDetails?.message || "").substring(0, 200),
275
+ });
276
+ }
277
+
278
+ // Update execution state
279
+ execution.output = result;
280
+ execution.error = error;
281
+ execution.completed = true;
282
+
283
+ // For tools with delayed publishing, publish the tool use event now with references
284
+ if (execution.toolEventId === "" && execution.agentPublisher && execution.eventContext) {
285
+ let referencedEventIds: string[] = [];
286
+ let referencedAddressableEvents: string[] = [];
287
+
288
+ const conversationId = execution.eventContext?.conversationId;
289
+ if (conversationId) {
290
+ if (isDelegateToolName(execution.toolName)) {
291
+ // Consume delegation event IDs from registry (registered in AgentPublisher.ask/delegate)
292
+ referencedEventIds = PendingDelegationsRegistry.consume(agentPubkey, conversationId);
293
+ } else if (isAddressableEventTool(execution.toolName)) {
294
+ // Consume addressable event references from registry (registered in report_write tool)
295
+ referencedAddressableEvents = PendingDelegationsRegistry.consumeAddressable(agentPubkey, conversationId);
296
+ }
297
+ }
298
+
299
+ // Publish the delayed tool use event with references
300
+ const toolEvent = await execution.agentPublisher.toolUse(
301
+ {
302
+ toolName: execution.toolName,
303
+ content: execution.humanContent || `Executed ${execution.toolName}`,
304
+ args: execution.input,
305
+ referencedEventIds,
306
+ referencedAddressableEvents,
307
+ },
308
+ execution.eventContext
309
+ );
310
+
311
+ execution.toolEventId = toolEvent.id;
312
+
313
+ const logDetails: Record<string, unknown> = {
314
+ toolCallId,
315
+ toolName: execution.toolName,
316
+ toolEventId: toolEvent.id,
317
+ };
318
+ if (referencedEventIds.length > 0) {
319
+ logDetails.referencedEventIds = referencedEventIds;
320
+ }
321
+ if (referencedAddressableEvents.length > 0) {
322
+ logDetails.referencedAddressableEvents = referencedAddressableEvents;
323
+ }
324
+
325
+ logger.debug("[ToolExecutionTracker] Tool event published with references", logDetails);
326
+ }
327
+
328
+ // Add telemetry for tool completion
329
+ const activeSpan = trace.getActiveSpan();
330
+ if (activeSpan) {
331
+ // Truncate result for telemetry
332
+ const resultPreview =
333
+ typeof result === "object" && result !== null
334
+ ? JSON.stringify(result).substring(0, 200)
335
+ : String(result).substring(0, 200);
336
+
337
+ activeSpan.addEvent("tool.execution_complete", {
338
+ "tool.name": execution.toolName,
339
+ "tool.call_id": toolCallId,
340
+ "tool.error": error,
341
+ "tool.result_preview": resultPreview,
342
+ });
343
+ }
344
+
345
+ // Persist the complete tool message to filesystem
346
+ // This enables conversation reconstruction and audit trails
347
+ await toolMessageStorage.store(
348
+ execution.toolEventId,
349
+ {
350
+ toolCallId,
351
+ toolName: execution.toolName,
352
+ input: execution.input,
353
+ },
354
+ {
355
+ toolCallId,
356
+ toolName: execution.toolName,
357
+ output: result,
358
+ error,
359
+ },
360
+ agentPubkey
361
+ );
362
+
363
+ logger.debug("[ToolExecutionTracker] Tool execution completed and persisted", {
364
+ toolCallId,
365
+ toolName: execution.toolName,
366
+ toolEventId: execution.toolEventId,
367
+ error,
368
+ });
369
+
370
+ // Return the tool event ID so callers can link it to ConversationStore messages
371
+ return execution.toolEventId;
372
+ }
373
+
374
+ /**
375
+ * Get the current state of a tracked execution
376
+ *
377
+ * @param toolCallId - Unique identifier of the tool call
378
+ * @returns The tracked execution or undefined if not found
379
+ */
380
+ getExecution(toolCallId: string): TrackedExecution | undefined {
381
+ return this.executions.get(toolCallId);
382
+ }
383
+
384
+ /**
385
+ * Get all tracked executions
386
+ *
387
+ * @returns Map of all tracked executions
388
+ */
389
+ getAllExecutions(): Map<string, TrackedExecution> {
390
+ return new Map(this.executions);
391
+ }
392
+
393
+ /**
394
+ * Check if a tool execution is being tracked
395
+ *
396
+ * @param toolCallId - Unique identifier of the tool call
397
+ * @returns True if the execution is being tracked
398
+ */
399
+ isTracking(toolCallId: string): boolean {
400
+ return this.executions.has(toolCallId);
401
+ }
402
+
403
+ /**
404
+ * Get statistics about tracked executions
405
+ *
406
+ * @returns Object containing execution statistics
407
+ */
408
+ getStats(): {
409
+ total: number;
410
+ pending: number;
411
+ completed: number;
412
+ failed: number;
413
+ } {
414
+ let pending = 0;
415
+ let completed = 0;
416
+ let failed = 0;
417
+
418
+ for (const execution of this.executions.values()) {
419
+ if (!execution.completed) {
420
+ pending++;
421
+ } else if (execution.error) {
422
+ failed++;
423
+ } else {
424
+ completed++;
425
+ }
426
+ }
427
+
428
+ return {
429
+ total: this.executions.size,
430
+ pending,
431
+ completed,
432
+ failed,
433
+ };
434
+ }
435
+
436
+ /**
437
+ * Clear all tracked executions
438
+ *
439
+ * @remarks
440
+ * This should typically only be called between independent agent executions
441
+ * to prevent memory leaks from accumulating execution records
442
+ */
443
+ clear(): void {
444
+ const previousSize = this.executions.size;
445
+ this.executions.clear();
446
+
447
+ logger.debug("[ToolExecutionTracker] Cleared all tracked executions", {
448
+ previousSize,
449
+ });
450
+ }
451
+
452
+ /**
453
+ * Get a summary of pending executions for debugging
454
+ *
455
+ * @returns Array of pending execution summaries
456
+ */
457
+ getPendingExecutions(): Array<{
458
+ toolCallId: string;
459
+ toolName: string;
460
+ startedAt: string;
461
+ }> {
462
+ const pending: Array<{
463
+ toolCallId: string;
464
+ toolName: string;
465
+ startedAt: string;
466
+ }> = [];
467
+
468
+ for (const [toolCallId, execution] of this.executions) {
469
+ if (!execution.completed) {
470
+ pending.push({
471
+ toolCallId,
472
+ toolName: execution.toolName,
473
+ startedAt: execution.toolEventId.substring(0, 8), // First 8 chars of event ID
474
+ });
475
+ }
476
+ }
477
+
478
+ return pending;
479
+ }
480
+
481
+ /**
482
+ * Get the names of recently executed tools.
483
+ * Returns the most recent tool names (up to 10) for diagnostics/context.
484
+ *
485
+ * @returns Array of tool names that have been executed
486
+ */
487
+ getRecentToolNames(): string[] {
488
+ const toolNames: string[] = [];
489
+
490
+ // Get all tool names from tracked executions
491
+ for (const execution of this.executions.values()) {
492
+ toolNames.push(execution.toolName);
493
+ }
494
+
495
+ // Return the most recent 10 (map preserves insertion order)
496
+ return toolNames.slice(-10);
497
+ }
498
+ }
@@ -0,0 +1,97 @@
1
+ import { formatMcpToolName } from "@/agents/tool-names";
2
+ import type { AISdkTool } from "@/tools/types";
3
+
4
+ /**
5
+ * Error details extracted from tool results
6
+ */
7
+ export interface ExtractedErrorDetails {
8
+ message: string;
9
+ type: string;
10
+ }
11
+
12
+ /**
13
+ * Extract error details from a tool result for better logging and telemetry.
14
+ * Handles various error result formats from AI SDK and shell tool.
15
+ *
16
+ * @param result - The tool result that may contain error information
17
+ * @returns Error details or null if not an error result
18
+ */
19
+ export function extractErrorDetails(result: unknown): ExtractedErrorDetails | null {
20
+ if (typeof result !== "object" || result === null) {
21
+ return null;
22
+ }
23
+
24
+ const res = result as Record<string, unknown>;
25
+
26
+ // AI SDK error-text format
27
+ if (res.type === "error-text" && typeof res.text === "string") {
28
+ return { message: res.text, type: "error-text" };
29
+ }
30
+
31
+ // AI SDK error-json format
32
+ if (res.type === "error-json" && typeof res.json === "object") {
33
+ const errorJson = res.json as Record<string, unknown>;
34
+ const message = errorJson.message || errorJson.error || JSON.stringify(errorJson);
35
+ return { message: String(message), type: "error-json" };
36
+ }
37
+
38
+ // Shell tool structured error format
39
+ if (res.type === "shell-error") {
40
+ const shellError = res as {
41
+ error?: string;
42
+ exitCode?: number | null;
43
+ stderr?: string;
44
+ };
45
+ const message = shellError.error ||
46
+ shellError.stderr ||
47
+ `Exit code: ${shellError.exitCode}`;
48
+ return { message, type: "shell-error" };
49
+ }
50
+
51
+ // Generic error object with message property
52
+ if (typeof res.error === "string") {
53
+ return { message: res.error, type: "generic" };
54
+ }
55
+
56
+ if (typeof res.message === "string") {
57
+ return { message: res.message, type: "generic" };
58
+ }
59
+
60
+ return null;
61
+ }
62
+
63
+ /**
64
+ * Generate human-readable content for a tool execution
65
+ *
66
+ * This method attempts to generate a user-friendly description of what the tool
67
+ * is doing by:
68
+ * 1. Checking if the tool has a custom getHumanReadableContent method
69
+ * 2. For MCP tools, formatting the tool name in a readable way
70
+ * 3. Falling back to a generic "Executing <toolname>" message
71
+ *
72
+ * @param toolName - Name of the tool being executed
73
+ * @param args - Arguments passed to the tool
74
+ * @param toolsObject - Available tools that may have custom formatters
75
+ * @returns Human-readable description of the tool execution
76
+ */
77
+ export function getHumanReadableContent(
78
+ toolName: string,
79
+ args: unknown,
80
+ toolsObject: Record<string, AISdkTool>
81
+ ): string {
82
+ // Check if the tool has a custom human-readable content generator
83
+ const tool = toolsObject[toolName];
84
+ const customContent = tool?.getHumanReadableContent?.(args);
85
+
86
+ if (customContent) {
87
+ return customContent;
88
+ }
89
+
90
+ // Special formatting for MCP tools
91
+ if (toolName.startsWith("mcp__")) {
92
+ return `Executing ${formatMcpToolName(toolName)}`;
93
+ }
94
+
95
+ // Default format
96
+ return `Executing ${toolName}`;
97
+ }