@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,153 @@
1
+ /**
2
+ * Web Fetch Tool
3
+ *
4
+ * Fetches content from a URL and returns it for processing.
5
+ * HTML is converted to markdown, other content types returned as-is.
6
+ */
7
+
8
+ import type { AISdkTool, ToolExecutionContext } from "@/tools/types";
9
+ import { formatAnyError } from "@/lib/error-formatter";
10
+ import {
11
+ createExpectedError,
12
+ isExpectedHttpError,
13
+ } from "@/tools/utils";
14
+ import { logger } from "@/utils/logger";
15
+ import { NodeHtmlMarkdown } from "node-html-markdown";
16
+ import { tool } from "ai";
17
+ import { z } from "zod";
18
+
19
+ const htmlToMarkdown = new NodeHtmlMarkdown();
20
+
21
+ /**
22
+ * Validate URL - allows both HTTP and HTTPS
23
+ */
24
+ function validateUrl(urlString: string): URL {
25
+ let url: URL;
26
+
27
+ try {
28
+ url = new URL(urlString);
29
+ } catch {
30
+ throw new Error(`Invalid URL: ${urlString}`);
31
+ }
32
+
33
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
34
+ throw new Error(`Unsupported protocol: ${url.protocol}. Only HTTP/HTTPS URLs are supported.`);
35
+ }
36
+
37
+ return url;
38
+ }
39
+
40
+ interface FetchResult {
41
+ content: string;
42
+ finalUrl: string;
43
+ contentType: string;
44
+ }
45
+
46
+ /**
47
+ * Fetch content from URL
48
+ */
49
+ async function fetchUrl(urlString: string): Promise<FetchResult> {
50
+ const url = validateUrl(urlString);
51
+
52
+ logger.debug(`Fetching URL: ${url.toString()}`);
53
+
54
+ const response = await fetch(url.toString(), {
55
+ method: "GET",
56
+ headers: {
57
+ "User-Agent": "TENEX-WebFetch/1.0 (https://github.com/tenex)",
58
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,application/json;q=0.8,text/plain;q=0.7,*/*;q=0.6",
59
+ "Accept-Language": "en-US,en;q=0.5",
60
+ },
61
+ redirect: "follow",
62
+ });
63
+
64
+ if (!response.ok) {
65
+ // Expected HTTP errors (4xx) - will be handled in executeWebFetch
66
+ const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
67
+ (error as Error & { status?: number }).status = response.status;
68
+ throw error;
69
+ }
70
+
71
+ const finalUrl = response.url;
72
+ const contentType = response.headers.get("content-type") || "text/plain";
73
+ const rawContent = await response.text();
74
+
75
+ // Convert HTML to markdown, leave other content types as-is
76
+ let content: string;
77
+ if (contentType.includes("text/html") || contentType.includes("application/xhtml+xml")) {
78
+ content = htmlToMarkdown.translate(rawContent);
79
+ } else {
80
+ content = rawContent;
81
+ }
82
+
83
+ return {
84
+ content,
85
+ finalUrl,
86
+ contentType,
87
+ };
88
+ }
89
+
90
+ const webFetchSchema = z.object({
91
+ url: z.string().describe("The URL to fetch content from"),
92
+ });
93
+
94
+ type WebFetchInput = z.infer<typeof webFetchSchema>;
95
+
96
+ async function executeWebFetch(input: WebFetchInput): Promise<string | { type: "error-text"; text: string }> {
97
+ const { url } = input;
98
+
99
+ try {
100
+ const result = await fetchUrl(url);
101
+
102
+ return (
103
+ `Content-Type: ${result.contentType}\n` +
104
+ `URL: ${result.finalUrl}\n\n` +
105
+ result.content
106
+ );
107
+ } catch (error) {
108
+ // Check for expected HTTP errors (4xx client errors like 404)
109
+ const status = (error as Error & { status?: number }).status;
110
+ if (status !== undefined && isExpectedHttpError(status)) {
111
+ return createExpectedError(`HTTP ${status} error fetching "${url}": ${formatAnyError(error)}`);
112
+ }
113
+
114
+ // Invalid URL errors are expected errors (user provided bad input)
115
+ if (error instanceof Error && (
116
+ error.message.includes("Invalid URL") ||
117
+ error.message.includes("Unsupported protocol")
118
+ )) {
119
+ return createExpectedError(error.message);
120
+ }
121
+
122
+ // Unexpected errors still throw (they'll be caught by the SDK)
123
+ throw new Error(`Failed to fetch URL "${url}": ${formatAnyError(error)}`, { cause: error });
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Create the web_fetch AI SDK tool
129
+ */
130
+ export function createWebFetchTool(_context: ToolExecutionContext): AISdkTool {
131
+ const toolInstance = tool({
132
+ description:
133
+ "Fetches content from a URL. HTML is converted to markdown, " +
134
+ "JSON and other content types are returned as-is. " +
135
+ "Supports both HTTP and HTTPS URLs including localhost.",
136
+
137
+ inputSchema: webFetchSchema,
138
+
139
+ execute: async (input: WebFetchInput) => {
140
+ return await executeWebFetch(input);
141
+ },
142
+ });
143
+
144
+ Object.defineProperty(toolInstance, "getHumanReadableContent", {
145
+ value: ({ url }: WebFetchInput) => {
146
+ return `Fetching ${url}`;
147
+ },
148
+ enumerable: false,
149
+ configurable: true,
150
+ });
151
+
152
+ return toolInstance as AISdkTool;
153
+ }
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Web Search Tool
3
+ *
4
+ * Searches the web using either:
5
+ * 1. A configured LLM model (via TenexLLMs.search) - preferred when available
6
+ * 2. DuckDuckGo as a fallback
7
+ *
8
+ * When using an LLM, the model performs the search using its internal knowledge
9
+ * and web access capabilities.
10
+ */
11
+
12
+ import type { AISdkTool, ToolExecutionContext } from "@/tools/types";
13
+ import { formatAnyError } from "@/lib/error-formatter";
14
+ import { logger } from "@/utils/logger";
15
+ import { search, SafeSearchType, SearchTimeType } from "duck-duck-scrape";
16
+ import { config as configService } from "@/services/ConfigService";
17
+ import { tool } from "ai";
18
+ import { z } from "zod";
19
+
20
+ const webSearchSchema = z.object({
21
+ query: z.string().min(1).max(500).describe("The search query"),
22
+ max_results: z
23
+ .number()
24
+ .min(1)
25
+ .max(25)
26
+ .default(10)
27
+ .describe("Maximum number of results to return (1-25)"),
28
+ safe_search: z
29
+ .enum(["off", "moderate", "strict"])
30
+ .default("moderate")
31
+ .describe("Safe search level: off, moderate, or strict"),
32
+ time: z
33
+ .enum(["d", "w", "m", "y"])
34
+ .optional()
35
+ .describe("Time filter: d (day), w (week), m (month), y (year)"),
36
+ });
37
+
38
+ type WebSearchInput = z.infer<typeof webSearchSchema>;
39
+
40
+ interface SearchResultItem {
41
+ title: string;
42
+ url: string;
43
+ description: string;
44
+ }
45
+
46
+ interface WebSearchOutput {
47
+ query: string;
48
+ resultsCount: number;
49
+ results: SearchResultItem[];
50
+ /** The search backend used: "llm" if using configured search model, "duckduckgo" for fallback */
51
+ source: "llm" | "duckduckgo";
52
+ }
53
+
54
+ /**
55
+ * Schema for LLM search response
56
+ */
57
+ const llmSearchResponseSchema = z.object({
58
+ query: z.string().describe("The search query that was processed"),
59
+ results: z.array(z.object({
60
+ title: z.string().describe("Title of the search result"),
61
+ url: z.string().describe("URL of the search result"),
62
+ snippet: z.string().describe("Brief description or snippet of the result"),
63
+ })).describe("Array of search results"),
64
+ });
65
+
66
+ function mapSafeSearch(level: "off" | "moderate" | "strict"): SafeSearchType {
67
+ switch (level) {
68
+ case "off":
69
+ return SafeSearchType.OFF;
70
+ case "strict":
71
+ return SafeSearchType.STRICT;
72
+ default:
73
+ return SafeSearchType.MODERATE;
74
+ }
75
+ }
76
+
77
+ function mapTimeFilter(time?: "d" | "w" | "m" | "y"): SearchTimeType | undefined {
78
+ if (!time) return undefined;
79
+ switch (time) {
80
+ case "d":
81
+ return SearchTimeType.DAY;
82
+ case "w":
83
+ return SearchTimeType.WEEK;
84
+ case "m":
85
+ return SearchTimeType.MONTH;
86
+ case "y":
87
+ return SearchTimeType.YEAR;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Execute search using a configured LLM model.
93
+ *
94
+ * NOTE: When using LLM search, the `safe_search` and `time` parameters are not applied.
95
+ * These filters are only supported by the DuckDuckGo backend. LLM search relies on the
96
+ * model's training data and capabilities, which may not respect time-based filtering.
97
+ * This is a known limitation that may be addressed in future versions.
98
+ */
99
+ async function executeLLMSearch(input: WebSearchInput, searchConfigName: string): Promise<WebSearchOutput> {
100
+ const { query, max_results } = input;
101
+
102
+ logger.debug(`LLM search: "${query}" (max: ${max_results}) using config: ${searchConfigName}`);
103
+
104
+ const llmService = configService.createLLMService(searchConfigName);
105
+
106
+ const systemPrompt = `You are a web search tool. You MUST respond ONLY with valid JSON matching the required schema.
107
+ Return search results for the given query. Provide accurate, relevant results with real URLs when possible.
108
+ If you cannot find real URLs, provide plausible examples with clearly marked placeholder URLs.`;
109
+
110
+ const userPrompt = `Search for: "${query}"
111
+ Return up to ${max_results} results.
112
+ Each result must have a title, url, and snippet (brief description).`;
113
+
114
+ const result = await llmService.generateObject(
115
+ [
116
+ { role: "system", content: systemPrompt },
117
+ { role: "user", content: userPrompt },
118
+ ],
119
+ llmSearchResponseSchema
120
+ );
121
+
122
+ const searchResults = result.object;
123
+
124
+ // Map LLM response to our output format
125
+ const results: SearchResultItem[] = searchResults.results
126
+ .slice(0, max_results)
127
+ .map((r) => ({
128
+ title: r.title,
129
+ url: r.url,
130
+ description: r.snippet,
131
+ }));
132
+
133
+ return {
134
+ query,
135
+ resultsCount: results.length,
136
+ results,
137
+ source: "llm",
138
+ };
139
+ }
140
+
141
+ /**
142
+ * Execute search using DuckDuckGo (fallback)
143
+ */
144
+ async function executeDuckDuckGoSearch(input: WebSearchInput): Promise<WebSearchOutput> {
145
+ const { query, max_results, safe_search, time } = input;
146
+
147
+ logger.debug(`DuckDuckGo search: "${query}" (max: ${max_results}, safe: ${safe_search})`);
148
+
149
+ const searchResults = await search(query, {
150
+ safeSearch: mapSafeSearch(safe_search),
151
+ time: mapTimeFilter(time),
152
+ });
153
+
154
+ if (searchResults.noResults) {
155
+ return {
156
+ query,
157
+ resultsCount: 0,
158
+ results: [],
159
+ source: "duckduckgo",
160
+ };
161
+ }
162
+
163
+ const results: SearchResultItem[] = searchResults.results
164
+ .slice(0, max_results)
165
+ .map((r) => ({
166
+ title: r.title,
167
+ url: r.url,
168
+ description: r.description || "",
169
+ }));
170
+
171
+ return {
172
+ query,
173
+ resultsCount: results.length,
174
+ results,
175
+ source: "duckduckgo",
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Get the configured search model name if available.
181
+ * Uses the typed accessor from ConfigService.
182
+ */
183
+ function getSearchModelConfig(): string | undefined {
184
+ try {
185
+ return configService.getSearchModelName();
186
+ } catch {
187
+ return undefined;
188
+ }
189
+ }
190
+
191
+ async function executeWebSearch(input: WebSearchInput): Promise<WebSearchOutput> {
192
+ // Check if we have a configured search model
193
+ const searchConfigName = getSearchModelConfig();
194
+
195
+ if (searchConfigName) {
196
+ try {
197
+ logger.info(`Using LLM search with config: ${searchConfigName}`);
198
+ return await executeLLMSearch(input, searchConfigName);
199
+ } catch (error) {
200
+ // Log the error and fall back to DuckDuckGo
201
+ logger.warn("LLM search failed, falling back to DuckDuckGo", {
202
+ error: formatAnyError(error),
203
+ query: input.query,
204
+ });
205
+ }
206
+ }
207
+
208
+ // Fall back to DuckDuckGo
209
+ return await executeDuckDuckGoSearch(input);
210
+ }
211
+
212
+ export function createWebSearchTool(_context: ToolExecutionContext): AISdkTool {
213
+ const toolInstance = tool({
214
+ description:
215
+ "Search the web for information. Returns search results with titles, URLs, and descriptions. " +
216
+ "Use for finding current information, documentation, articles, or any web content. " +
217
+ "For site-specific searches, include 'site:example.com' in your query.",
218
+
219
+ inputSchema: webSearchSchema,
220
+
221
+ execute: async (input: WebSearchInput) => {
222
+ try {
223
+ return await executeWebSearch(input);
224
+ } catch (error) {
225
+ const errorMsg = formatAnyError(error);
226
+ logger.error("Web search failed", { error, query: input.query });
227
+
228
+ // Provide a clearer message for rate limiting
229
+ if (errorMsg.includes("anomaly") || errorMsg.includes("too quickly")) {
230
+ throw new Error(
231
+ "Search rate limited. Wait a moment and try again, or try a different query.",
232
+ { cause: error }
233
+ );
234
+ }
235
+
236
+ throw new Error(`Web search failed: ${errorMsg}`, { cause: error });
237
+ }
238
+ },
239
+ });
240
+
241
+ Object.defineProperty(toolInstance, "getHumanReadableContent", {
242
+ value: ({ query, max_results }: WebSearchInput) => {
243
+ return `Searching web for "${query}" (max ${max_results || 10} results)`;
244
+ },
245
+ enumerable: false,
246
+ configurable: true,
247
+ });
248
+
249
+ return toolInstance as AISdkTool;
250
+ }