@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,177 @@
1
+ import type { AgentInstance } from "@/agents/types";
2
+ import type { ConversationStore } from "@/conversations/ConversationStore";
3
+ import type { AgentPublisher } from "@/nostr/AgentPublisher";
4
+ import type { MCPManager } from "@/services/mcp/MCPManager";
5
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
6
+ import type { Tool as CoreTool } from "ai";
7
+
8
+ /**
9
+ * Tool names available in the system.
10
+ * Keep this list in sync with implementations registered in the tool registry.
11
+ */
12
+ export type ToolName =
13
+ | "fs_read"
14
+ | "fs_write"
15
+ | "fs_edit"
16
+ | "fs_glob"
17
+ | "fs_grep"
18
+ | "home_fs_read"
19
+ | "home_fs_write"
20
+ | "home_fs_grep"
21
+ | "conversation_get"
22
+ | "conversation_list"
23
+ | "lesson_learn"
24
+ | "lesson_get"
25
+ | "lesson_delete"
26
+ | "lessons_list"
27
+ | "shell"
28
+ | "agents_discover"
29
+ | "agents_hire"
30
+ | "agents_list"
31
+ | "agents_read"
32
+ | "agents_write"
33
+ | "agents_publish"
34
+ | "delegate"
35
+ | "delegate_followup"
36
+ | "ask"
37
+ | "project_list"
38
+ | "delegate_crossproject"
39
+ | "report_write"
40
+ | "report_read"
41
+ | "reports_list"
42
+ | "report_delete"
43
+ | "schedule_task"
44
+ | "schedule_task_once"
45
+ | "schedule_tasks_list"
46
+ | "schedule_task_cancel"
47
+ | "upload_blob"
48
+ | "rag_create_collection"
49
+ | "rag_add_documents"
50
+ | "rag_query"
51
+ | "rag_delete_collection"
52
+ | "rag_list_collections"
53
+ | "rag_subscription_create"
54
+ | "rag_subscription_list"
55
+ | "rag_subscription_get"
56
+ | "rag_subscription_delete"
57
+ | "mcp_resource_read"
58
+ | "mcp_subscribe"
59
+ | "mcp_subscription_stop"
60
+ | "conversation_search"
61
+ | "todo_write"
62
+ | "web_fetch"
63
+ | "web_search"
64
+ | "nostr_fetch"
65
+ | "nostr_publish_as_user"
66
+ | "search"
67
+ | "change_model"
68
+ | "kill"
69
+ | "generate_image";
70
+
71
+ /**
72
+ * AI SDK tool with optional human-readable formatter and side effect declaration.
73
+ */
74
+ export type AISdkTool<TInput = unknown, TOutput = unknown> = CoreTool<TInput, TOutput> & {
75
+ getHumanReadableContent?: (args: TInput) => string;
76
+ /**
77
+ * Whether this tool has side effects (modifies state, writes files, sends messages, etc.)
78
+ * Default is true (assume side effects unless explicitly declared false).
79
+ * Read-only tools (queries, reads) should set this to false.
80
+ */
81
+ hasSideEffects?: boolean;
82
+ };
83
+
84
+ /**
85
+ * Minimal agent surface needed by tools.
86
+ */
87
+ export type ToolAgentInfo = Pick<
88
+ AgentInstance,
89
+ "name" | "pubkey" | "slug" | "signer" | "sign" | "llmConfig" | "tools"
90
+ >;
91
+
92
+ /**
93
+ * Base execution environment - available before RAL/publisher setup.
94
+ * This is the minimal context available at any lifecycle stage.
95
+ */
96
+ export interface ExecutionEnvironment {
97
+ agent: ToolAgentInfo;
98
+ conversationId: string;
99
+ /**
100
+ * Project directory (normal git repository root).
101
+ * Example: ~/tenex/{dTag}
102
+ */
103
+ projectBasePath: string;
104
+ /**
105
+ * Working directory for code execution.
106
+ * - Default branch: same as projectBasePath (~/tenex/{dTag})
107
+ * - Feature branch: ~/tenex/{dTag}/.worktrees/feature_branch/
108
+ */
109
+ workingDirectory: string;
110
+ /**
111
+ * Current git branch name.
112
+ * Example: "master", "feature/branch-name", "research/foo"
113
+ */
114
+ currentBranch: string;
115
+ triggeringEvent: NDKEvent;
116
+ /**
117
+ * Access to conversation state. May return undefined before full execution setup.
118
+ */
119
+ getConversation: () => ConversationStore | undefined;
120
+ }
121
+
122
+ /**
123
+ * Runtime tool context - available after prepareExecution().
124
+ * Tools that publish events or need RAL state use this type.
125
+ * All runtime dependencies are REQUIRED, not optional.
126
+ */
127
+ export interface ToolExecutionContext extends ExecutionEnvironment {
128
+ agentPublisher: AgentPublisher;
129
+ ralNumber: number;
130
+ }
131
+
132
+ /**
133
+ * Extended context for tools that require conversation state.
134
+ * Tools like todo_write, conversation_get (current conversation) need this.
135
+ */
136
+ export interface ConversationToolContext extends ToolExecutionContext {
137
+ getConversation: () => ConversationStore;
138
+ conversationStore: ConversationStore;
139
+ }
140
+
141
+ /**
142
+ * Full registry context for tool selection/injection logic.
143
+ * Used by getToolsObject() during actual execution.
144
+ * Extends ConversationToolContext because normal execution always has a conversation.
145
+ */
146
+ export interface ToolRegistryContext extends ConversationToolContext {
147
+ mcpManager?: MCPManager;
148
+ }
149
+
150
+ export interface ToolError {
151
+ kind: "validation" | "execution" | "system";
152
+ message: string;
153
+ field?: string;
154
+ tool?: string;
155
+ }
156
+
157
+ export interface ToolExecutionResult {
158
+ success: boolean;
159
+ duration: number;
160
+ toolName: string;
161
+ toolArgs: Record<string, unknown>;
162
+ output?: unknown;
163
+ error?: ToolError;
164
+ }
165
+
166
+ /**
167
+ * Tool factory for tools that work without conversation context (MCP-safe).
168
+ */
169
+ export type ToolFactory = (context: ToolExecutionContext) => AISdkTool<unknown, unknown>;
170
+
171
+ /**
172
+ * Tool factory for tools that require conversation context.
173
+ * These tools are filtered out when no conversation is available (e.g., MCP).
174
+ */
175
+ export type ConversationToolFactory = (
176
+ context: ConversationToolContext
177
+ ) => AISdkTool<unknown, unknown>;
@@ -0,0 +1,256 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+ import type { ToolExecutionContext } from "@/tools/types";
3
+ import { handleError } from "@/utils/error-handler";
4
+ import { logger } from "@/utils/logger";
5
+ import { trace } from "@opentelemetry/api";
6
+
7
+ /**
8
+ * Resolves and validates a file path to ensure it stays within the project boundaries.
9
+ *
10
+ * @param filePath - The file path to validate (can be absolute or relative)
11
+ * @param projectPath - The root project path
12
+ * @returns The resolved absolute path if valid
13
+ * @throws Error if the path would escape the project directory
14
+ */
15
+ export function resolveAndValidatePath(filePath: string, projectPath: string): string {
16
+ // Validate projectPath is not empty - this would resolve to process.cwd()
17
+ if (!projectPath) {
18
+ const span = trace.getActiveSpan();
19
+ span?.setAttributes({
20
+ "path.error": "projectPath_empty",
21
+ "path.file_path": filePath,
22
+ "path.project_path": projectPath || "(empty)",
23
+ });
24
+ throw new Error(
25
+ `Cannot resolve path "${filePath}": projectPath is empty. ` +
26
+ "This indicates a bug in the execution context - workingDirectory was not set."
27
+ );
28
+ }
29
+
30
+ const fullPath = isAbsolute(filePath) ? filePath : resolve(projectPath, filePath);
31
+ const relativePath = relative(projectPath, fullPath);
32
+
33
+ // Add trace attributes for debugging
34
+ const span = trace.getActiveSpan();
35
+ span?.addEvent("path.resolved", {
36
+ "path.input": filePath,
37
+ "path.project": projectPath,
38
+ "path.resolved": fullPath,
39
+ "path.relative": relativePath,
40
+ });
41
+
42
+ if (relativePath.startsWith("..")) {
43
+ throw new Error(`Path outside project directory: ${filePath}`);
44
+ }
45
+
46
+ return fullPath;
47
+ }
48
+
49
+ /**
50
+ * Standard response format for tool execution
51
+ */
52
+ export interface ToolResponse {
53
+ success: boolean;
54
+ message?: string;
55
+ error?: string;
56
+ data?: unknown;
57
+ [key: string]: unknown;
58
+ }
59
+
60
+ /**
61
+ * Base class for tool execution errors
62
+ */
63
+ export class ToolExecutionError extends Error {
64
+ constructor(
65
+ message: string,
66
+ public readonly toolName: string,
67
+ public readonly cause?: Error
68
+ ) {
69
+ super(message);
70
+ this.name = "ToolExecutionError";
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Standard wrapper for tool execution with error handling
76
+ * Provides consistent error handling and response formatting
77
+ */
78
+ export async function executeToolWithErrorHandling<TInput>(
79
+ toolName: string,
80
+ input: TInput,
81
+ context: ToolExecutionContext,
82
+ executeFn: (input: TInput, context: ToolExecutionContext) => Promise<ToolResponse>
83
+ ): Promise<string> {
84
+ logger.debug(`Executing tool: ${toolName}`, { input });
85
+
86
+ try {
87
+ const result = await executeFn(input, context);
88
+
89
+ if (!result.success) {
90
+ logger.warn(`Tool execution failed: ${toolName}`, {
91
+ error: result.error,
92
+ input,
93
+ });
94
+ }
95
+
96
+ return JSON.stringify(result, null, 2);
97
+ } catch (error) {
98
+ // Use project's error handling utilities
99
+ const errorMessage = handleError(error, `Tool execution failed: ${toolName}`, {
100
+ logLevel: "error",
101
+ });
102
+
103
+ // Return standardized error response
104
+ const errorResponse: ToolResponse = {
105
+ success: false,
106
+ error: errorMessage,
107
+ toolName,
108
+ };
109
+
110
+ return JSON.stringify(errorResponse, null, 2);
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Validate required fields in tool input
116
+ */
117
+ export function validateRequiredFields<T extends Record<string, unknown>>(
118
+ input: T,
119
+ requiredFields: (keyof T)[],
120
+ toolName: string
121
+ ): void {
122
+ const missingFields = requiredFields.filter(
123
+ (field) => input[field] === undefined || input[field] === null
124
+ );
125
+
126
+ if (missingFields.length > 0) {
127
+ throw new ToolExecutionError(
128
+ `Missing required fields: ${missingFields.join(", ")}`,
129
+ toolName
130
+ );
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Parse and validate numeric input with constraints
136
+ */
137
+ export function parseNumericInput(
138
+ value: number | undefined,
139
+ defaultValue: number,
140
+ constraints?: {
141
+ min?: number;
142
+ max?: number;
143
+ integer?: boolean;
144
+ }
145
+ ): number {
146
+ const result = value ?? defaultValue;
147
+
148
+ if (constraints) {
149
+ if (constraints.min !== undefined && result < constraints.min) {
150
+ throw new Error(`Value ${result} is less than minimum ${constraints.min}`);
151
+ }
152
+
153
+ if (constraints.max !== undefined && result > constraints.max) {
154
+ throw new Error(`Value ${result} is greater than maximum ${constraints.max}`);
155
+ }
156
+
157
+ if (constraints.integer && !Number.isInteger(result)) {
158
+ throw new Error(`Value ${result} must be an integer`);
159
+ }
160
+ }
161
+
162
+ return result;
163
+ }
164
+
165
+ // =============================================================================
166
+ // Expected Error Handling Contract
167
+ // =============================================================================
168
+ //
169
+ // PRINCIPLE:
170
+ // - Expected failures (ENOENT, EACCES, "not found", etc.) → Return error-text object
171
+ // - Unexpected failures (null pointer, invariant violation) → Throw exception
172
+ //
173
+ // RATIONALE:
174
+ // When tools throw exceptions, the AI SDK wraps them in tool-error chunks.
175
+ // However, OpenRouter/Gemini providers don't always convert these properly,
176
+ // causing silent stream failures. Returning error-text objects ensures the
177
+ // error is properly communicated back to the LLM.
178
+ // =============================================================================
179
+
180
+ /**
181
+ * Expected error result type - AI SDK format for tool errors
182
+ * This format is recognized by ChunkHandler and ToolResultUtils
183
+ */
184
+ export interface ExpectedErrorResult {
185
+ type: "error-text";
186
+ text: string;
187
+ }
188
+
189
+ /**
190
+ * Expected filesystem error codes that should return error-text instead of throwing
191
+ */
192
+ const EXPECTED_FS_ERROR_CODES = new Set(["ENOENT", "EACCES", "EISDIR", "EPERM", "ENOTDIR"]);
193
+
194
+ /**
195
+ * Check if an error is an expected filesystem error (file not found, permission denied, etc.)
196
+ * These should return error-text objects rather than throwing exceptions.
197
+ */
198
+ export function isExpectedFsError(error: unknown): boolean {
199
+ if (error instanceof Error) {
200
+ const code = (error as NodeJS.ErrnoException).code;
201
+ return code !== undefined && EXPECTED_FS_ERROR_CODES.has(code);
202
+ }
203
+ return false;
204
+ }
205
+
206
+ /**
207
+ * Check if an HTTP status code is an expected error (all 4xx client errors)
208
+ * This includes 400-499 range: bad request, unauthorized, forbidden, not found, etc.
209
+ */
210
+ export function isExpectedHttpError(status: number): boolean {
211
+ return status >= 400 && status < 500;
212
+ }
213
+
214
+ /**
215
+ * Check if an error message indicates an expected "not found" condition
216
+ */
217
+ export function isExpectedNotFoundError(error: unknown): boolean {
218
+ if (error instanceof Error) {
219
+ const message = error.message.toLowerCase();
220
+ return (
221
+ message.includes("not found") ||
222
+ message.includes("does not exist") ||
223
+ message.includes("no such") ||
224
+ message.includes("cannot find")
225
+ );
226
+ }
227
+ return false;
228
+ }
229
+
230
+ /**
231
+ * Create an expected error result object (error-text format)
232
+ * Use this when a tool encounters an expected failure condition.
233
+ */
234
+ export function createExpectedError(message: string): ExpectedErrorResult {
235
+ return { type: "error-text", text: message };
236
+ }
237
+
238
+ /**
239
+ * Get a human-readable description of a filesystem error code
240
+ */
241
+ export function getFsErrorDescription(code: string | undefined): string {
242
+ switch (code) {
243
+ case "ENOENT":
244
+ return "File or directory not found";
245
+ case "EACCES":
246
+ return "Permission denied";
247
+ case "EISDIR":
248
+ return "Expected a file but found a directory";
249
+ case "EPERM":
250
+ return "Operation not permitted";
251
+ case "ENOTDIR":
252
+ return "Expected a directory but found a file";
253
+ default:
254
+ return "Filesystem error";
255
+ }
256
+ }