@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,241 @@
1
+ import type { AgentRegistry } from "@/agents/AgentRegistry";
2
+ import { agentStorage, type StoredAgent } from "@/agents/AgentStorage";
3
+ import { installAgentFromNostr } from "@/agents/agent-installer";
4
+ import { AgentSlugConflictError } from "@/agents/errors";
5
+ import { processAgentTools } from "@/agents/tool-normalization";
6
+ import type { AgentInstance } from "@/agents/types";
7
+ import { AgentMetadataStore } from "@/services/agents";
8
+ import { DEFAULT_AGENT_LLM_CONFIG } from "@/llm/constants";
9
+ import type { MCPConfig } from "@/llm/providers/types";
10
+ import { AgentProfilePublisher } from "@/nostr/AgentProfilePublisher";
11
+ import { config } from "@/services/ConfigService";
12
+ import { logger } from "@/utils/logger";
13
+ import { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
14
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
15
+
16
+ /**
17
+ * Agent loading orchestration.
18
+ * Single entry point for loading agents into registry.
19
+ * Handles the complete flow: registry → storage → Nostr
20
+ */
21
+
22
+ /**
23
+ * Create an AgentInstance from stored agent data.
24
+ * This is the hydration step from persistent data to runtime object.
25
+ * Exported for use in agent creation tools (e.g., agents_write).
26
+ *
27
+ * @param storedAgent - The stored agent data
28
+ * @param registry - The agent registry (used for metadata and LLM service creation)
29
+ * @param projectDTag - Optional project dTag for resolving project-scoped config
30
+ */
31
+ export function createAgentInstance(
32
+ storedAgent: StoredAgent,
33
+ registry: AgentRegistry,
34
+ projectDTag?: string
35
+ ): AgentInstance {
36
+ const signer = new NDKPrivateKeySigner(storedAgent.nsec);
37
+ const pubkey = signer.pubkey;
38
+
39
+ // Resolve effective configuration: projectOverrides[dTag] ?? default
40
+ const resolvedConfig = agentStorage.getEffectiveConfig(storedAgent, projectDTag);
41
+ const effectiveLLMConfig = resolvedConfig.model;
42
+ const effectiveTools = resolvedConfig.tools;
43
+
44
+ // Process tools using pure functions
45
+ const validToolNames = processAgentTools(effectiveTools || [], storedAgent.slug);
46
+
47
+ // Build agent-specific MCP config from stored mcpServers
48
+ const agentMcpConfig: MCPConfig | undefined = storedAgent.mcpServers
49
+ ? {
50
+ enabled: true,
51
+ servers: storedAgent.mcpServers,
52
+ }
53
+ : undefined;
54
+
55
+ const agent: AgentInstance = {
56
+ name: storedAgent.name,
57
+ pubkey,
58
+ signer,
59
+ role: storedAgent.role,
60
+ description: storedAgent.description,
61
+ instructions: storedAgent.instructions,
62
+ useCriteria: storedAgent.useCriteria,
63
+ llmConfig: effectiveLLMConfig || DEFAULT_AGENT_LLM_CONFIG,
64
+ tools: validToolNames,
65
+ eventId: storedAgent.eventId,
66
+ slug: storedAgent.slug,
67
+ mcpServers: storedAgent.mcpServers,
68
+ pmOverrides: storedAgent.pmOverrides,
69
+ isPM: storedAgent.isPM,
70
+ projectOverrides: storedAgent.projectOverrides,
71
+ createMetadataStore: (conversationId: string) => {
72
+ const metadataPath = registry.getMetadataPath();
73
+ return new AgentMetadataStore(conversationId, storedAgent.slug, metadataPath);
74
+ },
75
+ createLLMService: (options) => {
76
+ // Merge passed mcpConfig with agent's own mcpConfig
77
+ // Agent-specific servers override project-level servers on name collision
78
+ // Project-level enabled flag takes precedence (default to true if not specified)
79
+ let mergedMcpConfig: MCPConfig | undefined;
80
+ if (options?.mcpConfig && agentMcpConfig) {
81
+ mergedMcpConfig = {
82
+ enabled: options.mcpConfig.enabled !== false,
83
+ servers: {
84
+ ...options.mcpConfig.servers, // project-level first
85
+ ...agentMcpConfig.servers, // agent-specific overrides
86
+ },
87
+ };
88
+ } else {
89
+ mergedMcpConfig = options?.mcpConfig || agentMcpConfig;
90
+ }
91
+
92
+ // Use resolved config name if provided (for meta model resolution),
93
+ // otherwise use the agent's llmConfig
94
+ const configName = options?.resolvedConfigName || agent.llmConfig || DEFAULT_AGENT_LLM_CONFIG;
95
+
96
+ return config.createLLMService(
97
+ configName,
98
+ {
99
+ tools: options?.tools ?? {},
100
+ agentName: storedAgent.name,
101
+ sessionId: options?.sessionId,
102
+ workingDirectory: options?.workingDirectory ?? registry.getBasePath(),
103
+ mcpConfig: mergedMcpConfig,
104
+ conversationId: options?.conversationId,
105
+ onStreamStart: options?.onStreamStart,
106
+ }
107
+ );
108
+ },
109
+ sign: async (event: NDKEvent) => {
110
+ await event.sign(signer, { pTags: false });
111
+ },
112
+ };
113
+
114
+ return agent;
115
+ }
116
+
117
+ /**
118
+ * Load an agent by eventId into the registry.
119
+ * This is the ONLY function needed for loading agents.
120
+ *
121
+ * Flow (no redundant checks):
122
+ * 1. Check if already in registry → return
123
+ * 2. Check storage → load and return
124
+ * 3. Not in storage → fetch from Nostr → save → load → return
125
+ *
126
+ * @param eventId - The Nostr event ID of the agent definition
127
+ * @param registry - The AgentRegistry to load the agent into
128
+ * @param customSlug - Optional custom slug for the agent
129
+ * @returns The loaded AgentInstance
130
+ * @throws Error if agent cannot be loaded
131
+ */
132
+ export async function loadAgentIntoRegistry(
133
+ eventId: string,
134
+ registry: AgentRegistry,
135
+ customSlug?: string
136
+ ): Promise<AgentInstance> {
137
+ // Clean event ID
138
+ const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
139
+
140
+ // Step 1: Check if already in registry by eventId
141
+ const existingByEventId = registry.getAgentByEventId(cleanEventId);
142
+ if (existingByEventId) {
143
+ logger.debug(`Agent ${cleanEventId} already loaded in registry as ${existingByEventId.slug}`);
144
+ return existingByEventId;
145
+ }
146
+
147
+ // If custom slug provided, also check by slug
148
+ if (customSlug) {
149
+ const existingBySlug = registry.getAgent(customSlug);
150
+ if (existingBySlug) {
151
+ if (existingBySlug.eventId === cleanEventId) {
152
+ logger.debug(`Agent ${customSlug} already loaded with same event ID`);
153
+ return existingBySlug;
154
+ }
155
+ throw new AgentSlugConflictError(customSlug, existingBySlug.eventId, cleanEventId);
156
+ }
157
+ }
158
+
159
+ // Step 2: Check storage by eventId
160
+ let storedAgent = await agentStorage.getAgentByEventId(cleanEventId);
161
+
162
+ if (!storedAgent) {
163
+ // Step 3: Not in storage - fetch from Nostr and save
164
+ logger.debug(`Agent ${cleanEventId} not in storage, fetching from Nostr`);
165
+ storedAgent = await installAgentFromNostr(cleanEventId, customSlug);
166
+ } else {
167
+ logger.debug(`Agent ${cleanEventId} found in storage as ${storedAgent.slug}`);
168
+ }
169
+
170
+ // If custom slug provided and different from stored slug, update it
171
+ if (customSlug && storedAgent.slug !== customSlug) {
172
+ // Check if the custom slug is already taken by a different agent
173
+ const existingWithCustomSlug = await agentStorage.getAgentBySlug(customSlug);
174
+ if (existingWithCustomSlug) {
175
+ throw new AgentSlugConflictError(
176
+ customSlug,
177
+ existingWithCustomSlug.eventId,
178
+ cleanEventId
179
+ );
180
+ }
181
+
182
+ // Update slug
183
+ storedAgent.slug = customSlug;
184
+ await agentStorage.saveAgent(storedAgent);
185
+ logger.info(`Updated agent slug to ${customSlug}`);
186
+ }
187
+
188
+ // Ensure agent is associated with this project using storage method
189
+ const projectDTag = registry.getProjectDTag();
190
+ const signer = new NDKPrivateKeySigner(storedAgent.nsec);
191
+ const pubkey = signer.pubkey;
192
+
193
+ if (projectDTag) {
194
+ await agentStorage.addAgentToProject(pubkey, projectDTag);
195
+ }
196
+
197
+ // Reload agent after project association to ensure fresh state
198
+ const freshAgent = await agentStorage.loadAgent(pubkey);
199
+ if (!freshAgent) {
200
+ throw new Error(`Agent ${storedAgent.slug} disappeared after project association`);
201
+ }
202
+
203
+ // Create instance and add to registry
204
+ // Pass projectDTag so project-scoped config can be resolved
205
+ const instance = createAgentInstance(freshAgent, registry, projectDTag);
206
+ registry.addAgent(instance);
207
+
208
+ // Publish kind:0 profile for this agent now that it's associated with the project
209
+ const ndkProject = registry.getNDKProject();
210
+ if (ndkProject) {
211
+ try {
212
+ const projectTitle = ndkProject.tagValue("title") || "Untitled Project";
213
+ const whitelistedPubkeys = config.getWhitelistedPubkeys(undefined, config.getConfig());
214
+
215
+ AgentProfilePublisher.publishAgentProfile(
216
+ signer,
217
+ freshAgent.name,
218
+ freshAgent.role,
219
+ projectTitle,
220
+ ndkProject,
221
+ freshAgent.eventId,
222
+ {
223
+ description: freshAgent.description,
224
+ instructions: freshAgent.instructions,
225
+ useCriteria: freshAgent.useCriteria,
226
+ },
227
+ whitelistedPubkeys
228
+ );
229
+
230
+ logger.debug(`Published kind:0 profile for agent ${freshAgent.name} on project ${projectDTag}`);
231
+ } catch (error) {
232
+ logger.warn(`Failed to publish kind:0 profile for agent ${freshAgent.name}`, { error });
233
+ }
234
+ }
235
+
236
+ logger.info(
237
+ `Loaded agent "${instance.name}" (${instance.slug}) into registry for project ${projectDTag}`
238
+ );
239
+
240
+ return instance;
241
+ }
@@ -0,0 +1,82 @@
1
+ import type { ToolName } from "@/tools/types";
2
+
3
+ /**
4
+ * Core tools that ALL agents must have access to regardless of configuration.
5
+ * These are fundamental capabilities that every agent needs.
6
+ * NOT announced in 24010 events - auto-injected to all agents.
7
+ */
8
+ export const CORE_AGENT_TOOLS: ToolName[] = [
9
+ "lesson_get", // All agents should access lessons
10
+ "lessons_list", // All agents should be able to list lessons
11
+ "lesson_learn", // All agents should be able to learn
12
+ "lesson_delete", // All agents should be able to delete their lessons
13
+ "reports_list", // All agents should see available reports
14
+ "report_read", // All agents should read reports
15
+ "report_write", // All agents should be able to write reports
16
+ "report_delete", // All agents should be able to delete reports
17
+ // Todo tool for task tracking
18
+ "todo_write", // All agents should be able to write/update todos
19
+ // Conversation tools for project introspection
20
+ "conversation_get", // All agents should access conversation details
21
+ "conversation_list", // All agents should list conversations
22
+ // Unified search across all project knowledge
23
+ "search", // All agents should be able to search across reports, conversations, and lessons
24
+ // Process control
25
+ "kill", // All agents should be able to terminate processes
26
+ // MCP resource reading and subscriptions (self-gating: only works if agent has MCP tools from that server)
27
+ "mcp_resource_read", // All agents can read MCP resources from servers they have tools for
28
+ "mcp_subscribe", // All agents can subscribe to MCP resource notifications
29
+ ] as const;
30
+
31
+ /**
32
+ * Delegate tools that should be excluded from configuration and TenexProjectStatus events
33
+ */
34
+ export const DELEGATE_TOOLS: ToolName[] = [
35
+ "ask",
36
+ "delegate",
37
+ "delegate_crossproject",
38
+ "delegate_followup",
39
+ ] as const;
40
+
41
+
42
+ /**
43
+ * Tools auto-injected at runtime based on capability (not announced in 24010).
44
+ * fs_read implies fs_glob + fs_grep; fs_write implies fs_edit.
45
+ */
46
+ export const AUTO_INJECTED_TOOLS: ToolName[] = ["fs_edit", "fs_glob", "fs_grep"];
47
+
48
+ /**
49
+ * Context-sensitive tools that are auto-injected based on runtime conditions.
50
+ * These should NOT appear in TenexProjectStatus (24010) events since they're
51
+ * not configurable per-agent - they're injected based on execution context.
52
+ */
53
+ export const CONTEXT_INJECTED_TOOLS: ToolName[] = [
54
+ // Meta model tool (injected when agent uses a meta model configuration)
55
+ "change_model",
56
+ // Home-scoped filesystem tools (injected when agent lacks fs_* tools)
57
+ "home_fs_read",
58
+ "home_fs_write",
59
+ "home_fs_grep",
60
+ // MCP subscription stop (injected when agent has active MCP subscriptions)
61
+ "mcp_subscription_stop",
62
+ ];
63
+
64
+ /**
65
+ * Get the delegate tools for an agent
66
+ * This is the SINGLE source of truth for delegate tool assignment
67
+ */
68
+ export function getDelegateToolsForAgent(): ToolName[] {
69
+ const tools: ToolName[] = [];
70
+
71
+ // All agents get ask tool
72
+ tools.push("ask");
73
+
74
+ // All agents get the unified delegate tool
75
+ tools.push("delegate");
76
+
77
+ // All agents get delegate_crossproject and delegate_followup
78
+ tools.push("delegate_crossproject");
79
+ tools.push("delegate_followup");
80
+
81
+ return tools;
82
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Agent-specific error types for better error handling
3
+ */
4
+
5
+ export class AgentError extends Error {
6
+ constructor(message: string) {
7
+ super(message);
8
+ this.name = "AgentError";
9
+ }
10
+ }
11
+
12
+ export class AgentNotFoundError extends AgentError {
13
+ constructor(
14
+ public readonly eventId: string,
15
+ message?: string
16
+ ) {
17
+ super(
18
+ message ||
19
+ `Agent event ${eventId} not found on Nostr relays. The event may not have been published yet or your relays may not have it.`
20
+ );
21
+ this.name = "AgentNotFoundError";
22
+ }
23
+ }
24
+
25
+ export class AgentSlugConflictError extends AgentError {
26
+ constructor(
27
+ public readonly slug: string,
28
+ public readonly existingPubkey?: string,
29
+ public readonly attemptedPubkey?: string
30
+ ) {
31
+ const message = `Agent slug conflict: slug "${slug}" already claimed by different agent`;
32
+ const details = existingPubkey && attemptedPubkey
33
+ ? `\nExisting agent: ${existingPubkey.substring(0, 12)}...` +
34
+ `\nAttempted agent: ${attemptedPubkey.substring(0, 12)}...` +
35
+ `\n\nSuggestion: Remove the existing agent from overlapping projects or use a different slug.`
36
+ : "";
37
+
38
+ super(message + details);
39
+ this.name = "AgentSlugConflictError";
40
+ }
41
+ }
42
+
43
+ export class AgentValidationError extends AgentError {
44
+ constructor(message: string) {
45
+ super(message);
46
+ this.name = "AgentValidationError";
47
+ }
48
+ }