@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,229 @@
1
+ /**
2
+ * ConfigResolver - Utility module for resolving effective agent configuration.
3
+ *
4
+ * Handles the merging of default config with project-scoped delta overrides.
5
+ *
6
+ * ## Tool Delta Syntax
7
+ * Project overrides can use delta syntax for tools:
8
+ * - "+tool" - add this tool on top of defaults
9
+ * - "-tool" - remove this tool from defaults
10
+ * - Plain "tool" (no prefix) - full replacement (entire list is the effective tools)
11
+ *
12
+ * If any tool uses delta syntax, the whole list is treated as delta.
13
+ * If no tool uses delta syntax, the whole list is a full replacement.
14
+ *
15
+ * ## Dedup Logic
16
+ * When a project override field is identical to the default, the override is cleared.
17
+ * This keeps overrides minimal and avoids redundant entries.
18
+ *
19
+ * @example
20
+ * const resolver = new ConfigResolver({
21
+ * defaultConfig: { model: 'modelA', tools: ['tool1', 'tool2'] },
22
+ * projectConfigs: {
23
+ * projectA: { model: 'modelB', tools: ['-tool1', '+tool4'] },
24
+ * projectB: { tools: ['+tool5'] }
25
+ * }
26
+ * });
27
+ *
28
+ * // projectA: model=modelB, tools=[tool2, tool4]
29
+ * resolver.resolveEffectiveConfig('projectA');
30
+ *
31
+ * // projectB: model=modelA (default), tools=[tool1, tool2, tool5]
32
+ * resolver.resolveEffectiveConfig('projectB');
33
+ */
34
+
35
+ import type { AgentDefaultConfig, AgentProjectConfig } from "@/agents/types";
36
+ export type { AgentDefaultConfig, AgentProjectConfig };
37
+
38
+ export interface ResolvedAgentConfig {
39
+ /** The effective model for this project context */
40
+ model?: string;
41
+ /** The effective tools list (fully resolved, no +/- prefixes) */
42
+ tools?: string[];
43
+ }
44
+
45
+ /**
46
+ * Apply delta tools to a base tool list.
47
+ * "+tool" adds, "-tool" removes. Order: apply removals first, then additions.
48
+ *
49
+ * @param baseTools - The default tools to apply delta to
50
+ * @param delta - Array of tools with "+"/"-" prefixes
51
+ * @returns The resolved tool list
52
+ */
53
+ export function applyToolsDelta(baseTools: string[], delta: string[]): string[] {
54
+ const removals = new Set(
55
+ delta.filter((t) => t.startsWith("-")).map((t) => t.slice(1))
56
+ );
57
+ const additions = delta.filter((t) => t.startsWith("+")).map((t) => t.slice(1));
58
+
59
+ const result = baseTools.filter((t) => !removals.has(t));
60
+
61
+ for (const tool of additions) {
62
+ if (!result.includes(tool)) {
63
+ result.push(tool);
64
+ }
65
+ }
66
+
67
+ return result;
68
+ }
69
+
70
+ /**
71
+ * Resolve the effective tools for a project given defaults and a project override.
72
+ *
73
+ * @param defaultTools - Default tools from agent's default config
74
+ * @param projectTools - Override from project config (may use delta syntax or be full replacement)
75
+ * @returns The effective tools list
76
+ */
77
+ export function resolveEffectiveTools(
78
+ defaultTools: string[] | undefined,
79
+ projectTools: string[] | undefined
80
+ ): string[] | undefined {
81
+ if (!projectTools || projectTools.length === 0) {
82
+ return defaultTools;
83
+ }
84
+
85
+ const base = defaultTools ?? [];
86
+ return applyToolsDelta(base, projectTools);
87
+ }
88
+
89
+ /**
90
+ * Resolve the effective model for a project given defaults and a project override.
91
+ *
92
+ * @param defaultModel - Default model from agent's default config
93
+ * @param projectModel - Override from project config
94
+ * @returns The effective model
95
+ */
96
+ export function resolveEffectiveModel(
97
+ defaultModel: string | undefined,
98
+ projectModel: string | undefined
99
+ ): string | undefined {
100
+ return projectModel ?? defaultModel;
101
+ }
102
+
103
+ /**
104
+ * Resolve the full effective config for an agent in a specific project context.
105
+ */
106
+ export function resolveEffectiveConfig(
107
+ defaultConfig: AgentDefaultConfig,
108
+ projectConfig: AgentProjectConfig | undefined
109
+ ): ResolvedAgentConfig {
110
+ const effectiveModel = resolveEffectiveModel(defaultConfig.model, projectConfig?.model);
111
+ const effectiveTools = resolveEffectiveTools(defaultConfig.tools, projectConfig?.tools);
112
+
113
+ return {
114
+ model: effectiveModel,
115
+ tools: effectiveTools,
116
+ };
117
+ }
118
+
119
+ /**
120
+ * Compute the minimal delta representation of a full tool list relative to a set of defaults.
121
+ *
122
+ * This is the inverse of applyToolsDelta: given a desired full list and the current defaults,
123
+ * produce the smallest delta (+tool/-tool) that when applied to defaults yields the desired list.
124
+ *
125
+ * Used when storing project-scoped tool overrides: kind 24020 events carry a full list,
126
+ * but the storage layer stores deltas for project overrides.
127
+ *
128
+ * ## Algorithm
129
+ * - Tools in desired but NOT in defaults → "+tool" additions
130
+ * - Tools in defaults but NOT in desired → "-tool" removals
131
+ * - Tools in both → no entry needed (they're already in defaults)
132
+ *
133
+ * @param defaultTools - The agent's default tools list
134
+ * @param desiredTools - The full tool list to achieve
135
+ * @returns Delta array (may contain "+tool" and "-tool" entries), or empty array if no change
136
+ */
137
+ export function computeToolsDelta(defaultTools: string[], desiredTools: string[]): string[] {
138
+ const defaultSet = new Set(defaultTools);
139
+ const desiredSet = new Set(desiredTools);
140
+
141
+ const delta: string[] = [];
142
+
143
+ // Tools to remove: in defaults but not in desired
144
+ for (const tool of defaultTools) {
145
+ if (!desiredSet.has(tool)) {
146
+ delta.push(`-${tool}`);
147
+ }
148
+ }
149
+
150
+ // Tools to add: in desired but not in defaults
151
+ for (const tool of desiredTools) {
152
+ if (!defaultSet.has(tool)) {
153
+ delta.push(`+${tool}`);
154
+ }
155
+ }
156
+
157
+ return delta;
158
+ }
159
+
160
+ /**
161
+ * Deduplicate a project config against the default config.
162
+ *
163
+ * If a project override value is identical to the effective default, remove it
164
+ * from the override (it's redundant). This keeps overrides minimal.
165
+ *
166
+ * For tools: we compare the fully-resolved tool list. If the resolved tools
167
+ * equal the default tools, clear the project override.
168
+ *
169
+ * Also handles no-op delta dedup: if a stored delta becomes a no-op against
170
+ * the current defaults (e.g., "+tool" where tool is already in defaults),
171
+ * it is cleaned up since the user is explicitly confirming the tool should be available.
172
+ *
173
+ * @param defaultConfig - Agent's default config
174
+ * @param projectConfig - Project override config to deduplicate
175
+ * @returns Cleaned project config (may be empty object if all fields were identical to default)
176
+ */
177
+ export function deduplicateProjectConfig(
178
+ defaultConfig: AgentDefaultConfig,
179
+ projectConfig: AgentProjectConfig
180
+ ): AgentProjectConfig {
181
+ const cleaned: AgentProjectConfig = { ...projectConfig };
182
+
183
+ // Dedup model: if project model == default model, clear it
184
+ if (cleaned.model !== undefined && cleaned.model === defaultConfig.model) {
185
+ delete cleaned.model;
186
+ }
187
+
188
+ // Dedup tools: resolve, normalize delta, and compare
189
+ if (cleaned.tools !== undefined) {
190
+ const defaultToolsResolved = defaultConfig.tools ?? [];
191
+ const resolvedProjectTools = resolveEffectiveTools(defaultConfig.tools, cleaned.tools);
192
+
193
+ // Compare resolved tools to default tools (order-insensitive)
194
+ if (arraysEqualUnordered(resolvedProjectTools ?? [], defaultToolsResolved)) {
195
+ delete cleaned.tools;
196
+ } else {
197
+ // Normalize: recompute the minimal delta from the fully-resolved tool list.
198
+ cleaned.tools = computeToolsDelta(defaultToolsResolved, resolvedProjectTools ?? []);
199
+ }
200
+ }
201
+
202
+ return cleaned;
203
+ }
204
+
205
+ /**
206
+ * Check if two arrays contain the same elements in the same order.
207
+ */
208
+ export function arraysEqual<T>(a: T[], b: T[]): boolean {
209
+ if (a.length !== b.length) return false;
210
+ for (let i = 0; i < a.length; i++) {
211
+ if (a[i] !== b[i]) return false;
212
+ }
213
+ return true;
214
+ }
215
+
216
+ /**
217
+ * Check if two arrays contain the same elements (order-independent).
218
+ * Used for tool list comparison where order doesn't matter for dedup.
219
+ */
220
+ export function arraysEqualUnordered<T>(a: T[], b: T[]): boolean {
221
+ if (a.length !== b.length) return false;
222
+ const setA = new Set(a);
223
+ const setB = new Set(b);
224
+ if (setA.size !== setB.size) return false;
225
+ for (const item of setA) {
226
+ if (!setB.has(item)) return false;
227
+ }
228
+ return true;
229
+ }
@@ -0,0 +1,236 @@
1
+ import { agentStorage, createStoredAgent, type StoredAgent } from "@/agents/AgentStorage";
2
+ import { AgentNotFoundError, AgentValidationError } from "@/agents/errors";
3
+ import { installAgentScripts } from "@/agents/script-installer";
4
+ import { DEFAULT_AGENT_LLM_CONFIG } from "@/llm/constants";
5
+ import { getNDK } from "@/nostr";
6
+ import { logger } from "@/utils/logger";
7
+ import { toKebabCase } from "@/lib/string";
8
+ import type NDK from "@nostr-dev-kit/ndk";
9
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
10
+ import { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
11
+ import { NDKAgentDefinition } from "@/events/NDKAgentDefinition";
12
+
13
+ /**
14
+ * agent-installer - Pure Nostr operations for fetching agent definitions
15
+ *
16
+ * ## Responsibility
17
+ * Fetches agent definition events from Nostr relays and saves them to storage.
18
+ * - Fetches events by event ID
19
+ * - Validates event structure
20
+ * - Parses event into StoredAgent format
21
+ * - Generates private keys for agents
22
+ * - Installs bundled files from kind 1063 (NIP-94) events via e-tags
23
+ * - Saves to AgentStorage
24
+ *
25
+ * ## Architecture
26
+ * - **agent-installer** (this): Pure Nostr operations only
27
+ * - **script-installer**: Handles downloading and installing bundled scripts
28
+ * - **AgentStorage**: Handles persistence (uses this)
29
+ * - **agent-loader**: Orchestrates the full loading flow (uses this)
30
+ *
31
+ * ## Separation of Concerns
32
+ * This module is ONLY about Nostr:
33
+ * - No registry logic
34
+ * - No project logic
35
+ * - No in-memory state
36
+ * - Just: fetch → validate → parse → install scripts → save
37
+ *
38
+ * ## Usage
39
+ * Typically called by agent-loader when an agent is not found in storage.
40
+ * Can also be used standalone to pre-install agents.
41
+ *
42
+ * @example
43
+ * // Install agent from Nostr
44
+ * const stored = await installAgentFromNostr('nostr:event123', 'my-agent');
45
+ * console.log('Installed:', stored.name);
46
+ *
47
+ * @see agent-loader for the complete loading orchestration
48
+ * @see AgentStorage for persistence operations
49
+ * @see script-installer for bundled script installation
50
+ */
51
+
52
+ /**
53
+ * Validate that an NDK event is a valid agent definition event
54
+ */
55
+ function validateAgentEvent(agentDef: NDKAgentDefinition): void {
56
+ // Check if event has required fields
57
+ if (!agentDef.id) {
58
+ throw new AgentValidationError("Agent event missing ID");
59
+ }
60
+
61
+ // Check if event has a title tag (agents should have titles)
62
+ if (!agentDef.title || agentDef.title.trim() === "") {
63
+ throw new AgentValidationError("Agent event missing title tag");
64
+ }
65
+
66
+ // Check if event has instructions
67
+ if (!agentDef.instructions || agentDef.instructions.trim() === "") {
68
+ logger.warn(`Agent event ${agentDef.id} has no instructions`);
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Parse an NDK agent definition event into StoredAgent data structure
74
+ */
75
+ interface ParsedAgentEvent {
76
+ eventId: string;
77
+ slug: string;
78
+ name: string;
79
+ role: string;
80
+ description: string;
81
+ instructions: string;
82
+ useCriteria: string;
83
+ defaultConfig: { model: string; tools?: string[] };
84
+ definitionDTag?: string;
85
+ definitionAuthor?: string;
86
+ definitionCreatedAt?: number;
87
+ }
88
+
89
+ function parseAgentEvent(event: NDKEvent, slug: string): ParsedAgentEvent {
90
+ // Wrap in NDKAgentDefinition to use proper accessors
91
+ const agentDef = NDKAgentDefinition.from(event);
92
+
93
+ // Validate before parsing
94
+ validateAgentEvent(agentDef);
95
+
96
+ const title = agentDef.title || "Unnamed Agent";
97
+ const description = agentDef.description || "";
98
+ const role = agentDef.role || "assistant";
99
+ const instructions = agentDef.instructions || "";
100
+ const useCriteria = agentDef.useCriteria || "";
101
+
102
+ // Extract definition tracking metadata for auto-upgrade monitoring
103
+ const definitionDTag = event.tagValue("d") || undefined;
104
+ const definitionAuthor = event.pubkey || undefined;
105
+
106
+ // Extract tool requirements from the agent definition event
107
+ const toolTags = event.tags
108
+ .filter((tag) => tag[0] === "tool" && tag[1])
109
+ .map((tag) => tag[1]);
110
+
111
+ if (toolTags.length > 0) {
112
+ logger.info(`Agent "${title}" requests access to ${toolTags.length} tool(s):`, toolTags);
113
+ }
114
+
115
+ return {
116
+ eventId: event.id,
117
+ slug,
118
+ name: title,
119
+ role,
120
+ description,
121
+ instructions,
122
+ useCriteria,
123
+ defaultConfig: {
124
+ model: DEFAULT_AGENT_LLM_CONFIG,
125
+ tools: toolTags.length > 0 ? toolTags : undefined,
126
+ },
127
+ definitionDTag,
128
+ definitionAuthor,
129
+ definitionCreatedAt: event.created_at,
130
+ };
131
+ }
132
+
133
+ /**
134
+ * Install an agent from an already-fetched NDKEvent.
135
+ *
136
+ * Core installation logic: validate → parse → generate keys → install scripts → save → return
137
+ *
138
+ * @param event - The NDKEvent containing the agent definition
139
+ * @param customSlug - Optional custom slug (defaults to kebab-case of agent name)
140
+ * @param ndk - Optional NDK instance (uses default if not provided, needed for script downloads)
141
+ * @returns The saved StoredAgent (with generated private key)
142
+ * @throws AgentValidationError if event structure is invalid
143
+ */
144
+ export async function installAgentFromNostrEvent(
145
+ event: NDKEvent,
146
+ customSlug?: string,
147
+ ndk?: NDK
148
+ ): Promise<StoredAgent> {
149
+ const ndkInstance = ndk || getNDK();
150
+
151
+ // Check if an agent with this eventId already exists
152
+ // This preserves user configuration (llmConfig, pmOverrides, etc.)
153
+ if (event.id) {
154
+ const existingAgent = await agentStorage.getAgentByEventId(event.id);
155
+ if (existingAgent) {
156
+ logger.debug(
157
+ `Agent with eventId ${event.id} already exists as "${existingAgent.slug}", ` +
158
+ `preserving existing configuration`
159
+ );
160
+ return existingAgent;
161
+ }
162
+ }
163
+
164
+ const agentDef = NDKAgentDefinition.from(event);
165
+
166
+ // Generate slug: prefer customSlug > event's d-tag > derived from title
167
+ const slug = customSlug || agentDef.slug || toKebabCase(agentDef.title || "unnamed-agent");
168
+
169
+ // Parse and validate the event into agent data
170
+ const agentData = parseAgentEvent(event, slug);
171
+
172
+ // Generate a new private key for this agent
173
+ const signer = NDKPrivateKeySigner.generate();
174
+
175
+ // Install bundled files from kind 1063 events (referenced via e-tags)
176
+ const fileETags = agentDef.getETags();
177
+ if (fileETags.length > 0) {
178
+ logger.info(`Agent "${agentData.name}" has ${fileETags.length} bundled file(s)`);
179
+ const fileResults = await installAgentScripts(fileETags, signer.pubkey, ndkInstance);
180
+
181
+ const failures = fileResults.filter((r) => !r.success);
182
+ if (failures.length > 0) {
183
+ logger.warn(`${failures.length} file(s) failed to install for agent "${agentData.name}"`, {
184
+ failures: failures.map((f) => ({ path: f.relativePath, error: f.error })),
185
+ });
186
+ }
187
+ }
188
+
189
+ const storedAgent = createStoredAgent({
190
+ nsec: signer.nsec,
191
+ slug: agentData.slug,
192
+ name: agentData.name,
193
+ role: agentData.role,
194
+ description: agentData.description,
195
+ instructions: agentData.instructions,
196
+ useCriteria: agentData.useCriteria,
197
+ defaultConfig: agentData.defaultConfig,
198
+ eventId: agentData.eventId,
199
+ definitionDTag: agentData.definitionDTag,
200
+ definitionAuthor: agentData.definitionAuthor,
201
+ definitionCreatedAt: agentData.definitionCreatedAt,
202
+ });
203
+
204
+ await agentStorage.saveAgent(storedAgent);
205
+ logger.info(`Installed agent "${agentData.name}" (${slug}) from Nostr event ${event.id}`);
206
+
207
+ return storedAgent;
208
+ }
209
+
210
+ /**
211
+ * Fetch an agent definition event from Nostr by ID and install it.
212
+ *
213
+ * @param eventId - The Nostr event ID (with or without "nostr:" prefix)
214
+ * @param customSlug - Optional custom slug (defaults to kebab-case of agent name)
215
+ * @param ndk - Optional NDK instance (uses default if not provided)
216
+ * @returns The saved StoredAgent (with generated private key)
217
+ * @throws AgentNotFoundError if event not found on relays
218
+ * @throws AgentValidationError if event structure is invalid
219
+ */
220
+ export async function installAgentFromNostr(
221
+ eventId: string,
222
+ customSlug?: string,
223
+ ndk?: NDK
224
+ ): Promise<StoredAgent> {
225
+ const ndkInstance = ndk || getNDK();
226
+ const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
227
+
228
+ logger.debug(`Fetching agent event ${cleanEventId} from Nostr relays`);
229
+ const agentEvent = await ndkInstance.fetchEvent(cleanEventId, { groupable: false });
230
+
231
+ if (!agentEvent) {
232
+ throw new AgentNotFoundError(cleanEventId);
233
+ }
234
+
235
+ return installAgentFromNostrEvent(agentEvent, customSlug, ndkInstance);
236
+ }