@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,377 @@
1
+ import type { ToolExecutionContext } from "@/tools/types";
2
+ import { ConversationStore } from "@/conversations/ConversationStore";
3
+ import type { AISdkTool } from "@/tools/types";
4
+ import { logger } from "@/utils/logger";
5
+ import { tool } from "ai";
6
+ import { z } from "zod";
7
+ import { PREFIX_LENGTH } from "@/utils/nostr-entity-parser";
8
+ import { getPubkeyService } from "@/services/PubkeyService";
9
+ import { resolveAgentSlug } from "@/services/agents/AgentResolution";
10
+ import { parseNostrUser } from "@/utils/nostr-entity-parser";
11
+
12
+ const conversationListSchema = z.object({
13
+ projectId: z
14
+ .string()
15
+ .optional()
16
+ .describe(
17
+ "Project ID to list conversations from. Pass 'ALL' to list from all projects. " +
18
+ "If not specified, lists conversations from the current project only."
19
+ ),
20
+ limit: z
21
+ .number()
22
+ .optional()
23
+ .describe("Maximum number of conversations to return. Defaults to 50."),
24
+ fromTime: z
25
+ .number()
26
+ .optional()
27
+ .describe("Only include conversations with activity on or after this Unix timestamp (seconds)."),
28
+ toTime: z
29
+ .number()
30
+ .optional()
31
+ .describe("Only include conversations with activity on or before this Unix timestamp (seconds)."),
32
+ with: z
33
+ .string()
34
+ .optional()
35
+ .describe(
36
+ "Filter to conversations where this actor was active. " +
37
+ "Accepts an agent slug (e.g., 'claude-code') or a pubkey (hex or npub format)."
38
+ ),
39
+ });
40
+
41
+ type ConversationListInput = z.infer<typeof conversationListSchema>;
42
+
43
+ interface ConversationSummary {
44
+ /** Shortened event ID (12 characters) */
45
+ id: string;
46
+ projectId?: string;
47
+ title?: string;
48
+ /** Full summary (not truncated) */
49
+ summary?: string;
50
+ messageCount: number;
51
+ createdAt?: number;
52
+ lastActivity?: number;
53
+ /** Names of participants in this conversation (resolved via PubkeyService) */
54
+ participants: string[];
55
+ /** Shortened event IDs of delegations that occurred in this conversation */
56
+ delegations: string[];
57
+ }
58
+
59
+ interface ConversationListOutput {
60
+ success: boolean;
61
+ conversations: ConversationSummary[];
62
+ total: number;
63
+ }
64
+
65
+ /**
66
+ * Shorten a full 64-char event ID to the standard prefix length
67
+ */
68
+ function shortenEventId(fullId: string): string {
69
+ return fullId.substring(0, PREFIX_LENGTH);
70
+ }
71
+
72
+ /**
73
+ * Extract unique participant pubkeys from conversation messages (direct participants only)
74
+ */
75
+ function extractParticipantPubkeys(conversation: ConversationStore): string[] {
76
+ const messages = conversation.getAllMessages();
77
+ const pubkeys = new Set<string>();
78
+
79
+ for (const message of messages) {
80
+ // Add the message author
81
+ pubkeys.add(message.pubkey);
82
+ }
83
+
84
+ return Array.from(pubkeys);
85
+ }
86
+
87
+ /**
88
+ * Extract delegation conversation IDs from delegation markers
89
+ */
90
+ function extractDelegationIds(conversation: ConversationStore): string[] {
91
+ const messages = conversation.getAllMessages();
92
+ const delegationIds: string[] = [];
93
+
94
+ for (const message of messages) {
95
+ if (message.messageType === "delegation-marker" && message.delegationMarker) {
96
+ delegationIds.push(message.delegationMarker.delegationConversationId);
97
+ }
98
+ }
99
+
100
+ return delegationIds;
101
+ }
102
+
103
+ /**
104
+ * Resolve pubkeys to display names using PubkeyService (sync version for performance)
105
+ */
106
+ function resolveParticipantNames(pubkeys: string[]): string[] {
107
+ const pubkeyService = getPubkeyService();
108
+ return pubkeys.map(pk => pubkeyService.getNameSync(pk));
109
+ }
110
+
111
+ function summarizeConversation(conversation: ConversationStore, projectId?: string): ConversationSummary {
112
+ const messages = conversation.getAllMessages();
113
+ const firstMessage = messages[0];
114
+ const lastMessage = messages[messages.length - 1];
115
+ const metadata = conversation.metadata;
116
+
117
+ // Extract participants and delegations
118
+ const participantPubkeys = extractParticipantPubkeys(conversation);
119
+ const participantNames = resolveParticipantNames(participantPubkeys);
120
+ const delegationIds = extractDelegationIds(conversation);
121
+
122
+ return {
123
+ id: shortenEventId(conversation.id),
124
+ projectId,
125
+ title: metadata.title ?? conversation.title,
126
+ summary: metadata.summary,
127
+ messageCount: messages.length,
128
+ createdAt: firstMessage?.timestamp,
129
+ lastActivity: lastMessage?.timestamp,
130
+ participants: participantNames,
131
+ delegations: delegationIds.map(shortenEventId),
132
+ };
133
+ }
134
+
135
+ interface LoadedConversation {
136
+ store: ConversationStore;
137
+ projectId: string;
138
+ }
139
+
140
+ function loadConversationsForProject(
141
+ projectId: string,
142
+ isCurrentProject: boolean
143
+ ): LoadedConversation[] {
144
+ const conversations: LoadedConversation[] = [];
145
+ const conversationIds = isCurrentProject
146
+ ? ConversationStore.listConversationIdsFromDisk()
147
+ : ConversationStore.listConversationIdsFromDiskForProject(projectId);
148
+
149
+ for (const id of conversationIds) {
150
+ try {
151
+ let store: ConversationStore;
152
+ if (isCurrentProject) {
153
+ // Use cached version for current project
154
+ store = ConversationStore.getOrLoad(id);
155
+ } else {
156
+ // Load fresh for external projects
157
+ store = new ConversationStore(ConversationStore.getBasePath());
158
+ store.load(projectId, id);
159
+ }
160
+ conversations.push({ store, projectId });
161
+ } catch (err) {
162
+ logger.debug("Failed to load conversation", { id, projectId, error: err });
163
+ }
164
+ }
165
+ return conversations;
166
+ }
167
+
168
+ /**
169
+ * Check if a value looks like a pubkey (hex or npub format) rather than a slug.
170
+ * This is used to determine if slug resolution should be attempted.
171
+ */
172
+ function looksLikePubkey(value: string): boolean {
173
+ const trimmed = value.trim();
174
+ // 64-char hex pubkey
175
+ if (/^[0-9a-fA-F]{64}$/.test(trimmed)) {
176
+ return true;
177
+ }
178
+ // npub or nprofile format
179
+ if (trimmed.startsWith("npub1") || trimmed.startsWith("nprofile1")) {
180
+ return true;
181
+ }
182
+ return false;
183
+ }
184
+
185
+ /**
186
+ * Resolve the 'with' parameter to a pubkey.
187
+ * Accepts agent slugs (single project only) or pubkeys (hex or npub format).
188
+ *
189
+ * @param withValue - The value to resolve
190
+ * @param isAllProjects - Whether projectId="all" was specified
191
+ * @throws Error if the value cannot be resolved to a pubkey
192
+ */
193
+ function resolveWithParameter(withValue: string, isAllProjects: boolean): string {
194
+ const trimmed = withValue.trim();
195
+
196
+ // If it looks like a pubkey, try to parse it directly
197
+ if (looksLikePubkey(trimmed)) {
198
+ const parsedPubkey = parseNostrUser(trimmed);
199
+ if (parsedPubkey) {
200
+ return parsedPubkey;
201
+ }
202
+ throw new Error(
203
+ `Failed to resolve 'with' parameter: "${withValue}". ` +
204
+ `The value looks like a pubkey but could not be parsed. ` +
205
+ `Please provide a valid 64-character hex pubkey or npub format.`
206
+ );
207
+ }
208
+
209
+ // It looks like a slug - check if we're in all-projects mode
210
+ if (isAllProjects) {
211
+ throw new Error(
212
+ `Agent slugs are not supported when projectId='all'. ` +
213
+ `The slug "${withValue}" can only be resolved within the current project. ` +
214
+ `Please provide a pubkey (hex or npub format) instead.`
215
+ );
216
+ }
217
+
218
+ // Try to resolve as agent slug (single project only)
219
+ const agentResult = resolveAgentSlug(trimmed);
220
+ if (agentResult.pubkey) {
221
+ return agentResult.pubkey;
222
+ }
223
+
224
+ // Slug resolution failed - provide helpful error with available slugs
225
+ const availableSlugsMsg = agentResult.availableSlugs.length > 0
226
+ ? ` Available agent slugs in this project: ${agentResult.availableSlugs.join(", ")}.`
227
+ : "";
228
+
229
+ throw new Error(
230
+ `Failed to resolve 'with' parameter: "${withValue}". ` +
231
+ `Could not find an agent with this slug or parse it as a pubkey.${availableSlugsMsg}`
232
+ );
233
+ }
234
+
235
+ /**
236
+ * Check if a conversation has a specific pubkey as a participant
237
+ */
238
+ function conversationHasParticipant(conversation: ConversationStore, pubkey: string): boolean {
239
+ const messages = conversation.getAllMessages();
240
+ for (const message of messages) {
241
+ if (message.pubkey === pubkey) {
242
+ return true;
243
+ }
244
+ }
245
+ return false;
246
+ }
247
+
248
+ async function executeConversationList(
249
+ input: ConversationListInput,
250
+ context: ToolExecutionContext
251
+ ): Promise<ConversationListOutput> {
252
+ const limit = input.limit ?? 50;
253
+ const { fromTime, toTime, projectId: requestedProjectId } = input;
254
+ const withParam = input.with;
255
+
256
+ const currentProjectId = ConversationStore.getProjectId();
257
+
258
+ // Normalize projectId: case-insensitive "all" check
259
+ const normalizedRequestedProjectId = requestedProjectId?.toLowerCase() === "all" ? "all" : requestedProjectId;
260
+
261
+ // Default to current project if not specified (NOT all projects)
262
+ const effectiveProjectId = normalizedRequestedProjectId ?? currentProjectId;
263
+
264
+ // Determine if we're querying all projects
265
+ const isAllProjects = effectiveProjectId === "all";
266
+
267
+ // Resolve the 'with' parameter to a pubkey if provided
268
+ // This will throw an error if resolution fails, preventing silent fallback to unfiltered results
269
+ let withPubkey: string | null = null;
270
+ if (withParam) {
271
+ withPubkey = resolveWithParameter(withParam, isAllProjects);
272
+ }
273
+
274
+ logger.info("📋 Listing conversations", {
275
+ limit,
276
+ fromTime,
277
+ toTime,
278
+ projectId: effectiveProjectId,
279
+ with: withParam,
280
+ withPubkey: withPubkey ? shortenEventId(withPubkey) : undefined,
281
+ agent: context.agent.name,
282
+ });
283
+
284
+ // Load conversations based on projectId parameter
285
+ let allConversations: LoadedConversation[] = [];
286
+
287
+ if (effectiveProjectId === "all") {
288
+ // Only load from all projects when explicitly requested with "ALL"
289
+ const projectIds = ConversationStore.listProjectIdsFromDisk();
290
+ for (const pid of projectIds) {
291
+ const isCurrentProject = pid === currentProjectId;
292
+ const projectConversations = loadConversationsForProject(pid, isCurrentProject);
293
+ allConversations.push(...projectConversations);
294
+ }
295
+ } else if (effectiveProjectId) {
296
+ // Load from specific project (current project by default)
297
+ const isCurrentProject = effectiveProjectId === currentProjectId;
298
+ allConversations = loadConversationsForProject(effectiveProjectId, isCurrentProject);
299
+ }
300
+
301
+ // Filter by date range if specified
302
+ let filtered = allConversations;
303
+ if (fromTime !== undefined || toTime !== undefined) {
304
+ filtered = allConversations.filter(({ store }) => {
305
+ const lastActivity = store.getLastActivityTime();
306
+ if (fromTime !== undefined && lastActivity < fromTime) return false;
307
+ if (toTime !== undefined && lastActivity > toTime) return false;
308
+ return true;
309
+ });
310
+ }
311
+
312
+ // Filter by 'with' parameter if specified and resolved
313
+ if (withPubkey) {
314
+ filtered = filtered.filter(({ store }) => conversationHasParticipant(store, withPubkey));
315
+ }
316
+
317
+ // Sort by last activity (most recent first)
318
+ const sorted = [...filtered].sort((a, b) => {
319
+ return b.store.getLastActivityTime() - a.store.getLastActivityTime();
320
+ });
321
+
322
+ const limited = sorted.slice(0, limit);
323
+ const summaries = limited.map(({ store, projectId }) => summarizeConversation(store, projectId));
324
+
325
+ logger.info("✅ Conversations listed", {
326
+ total: allConversations.length,
327
+ filtered: filtered.length,
328
+ returned: summaries.length,
329
+ projectId: effectiveProjectId,
330
+ with: withParam,
331
+ agent: context.agent.name,
332
+ });
333
+
334
+ return {
335
+ success: true,
336
+ conversations: summaries,
337
+ total: filtered.length,
338
+ };
339
+ }
340
+
341
+ export function createConversationListTool(context: ToolExecutionContext): AISdkTool {
342
+ const aiTool = tool({
343
+ description:
344
+ "List conversations for this project with summary information including ID, title, summary, participants, delegations, message count, and timestamps. Results are sorted by most recent activity. Supports optional date range filtering with fromTime/toTime (Unix timestamps in seconds). Use the 'with' parameter to filter to conversations where a specific actor was active. Use this to discover available conversations before retrieving specific ones with conversation_get.",
345
+
346
+ inputSchema: conversationListSchema,
347
+
348
+ execute: async (input: ConversationListInput) => {
349
+ return await executeConversationList(input, context);
350
+ },
351
+ });
352
+
353
+ Object.defineProperty(aiTool, "getHumanReadableContent", {
354
+ value: (input: ConversationListInput) => {
355
+ const { projectId, limit, fromTime, toTime } = input;
356
+ const withParam = input.with;
357
+ const parts: string[] = [];
358
+ if (projectId?.toLowerCase() === "all") {
359
+ parts.push("all projects");
360
+ } else if (projectId) {
361
+ parts.push(`project=${projectId}`);
362
+ }
363
+ if (withParam) parts.push(`with=${withParam}`);
364
+ if (limit) parts.push(`limit=${limit}`);
365
+ if (fromTime) parts.push(`from=${new Date(fromTime * 1000).toISOString()}`);
366
+ if (toTime) parts.push(`to=${new Date(toTime * 1000).toISOString()}`);
367
+
368
+ return parts.length > 0
369
+ ? `Listing conversations (${parts.join(", ")})`
370
+ : "Listing conversations";
371
+ },
372
+ enumerable: false,
373
+ configurable: true,
374
+ });
375
+
376
+ return aiTool as AISdkTool;
377
+ }