@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,171 @@
1
+ import type { ModelMessage, ToolSet } from "ai";
2
+ import type { TodoStatus } from "../../services/ral/types";
3
+
4
+ /**
5
+ * When heuristic checks run relative to agent execution
6
+ */
7
+ export type HeuristicTiming = "pre-tool-execution" | "post-completion";
8
+
9
+ /**
10
+ * Result of a heuristic detection check
11
+ */
12
+ export interface HeuristicDetection {
13
+ /** Whether the heuristic condition was triggered */
14
+ triggered: boolean;
15
+ /** Human-readable reason for the detection */
16
+ reason?: string;
17
+ /** Additional evidence that led to the detection */
18
+ evidence?: unknown;
19
+ }
20
+
21
+ /**
22
+ * Result of LLM verification of a heuristic detection
23
+ */
24
+ export interface VerificationResult {
25
+ /** Whether the detection was confirmed as a real violation */
26
+ verdict: "ok" | "violation";
27
+ /** Explanation of the verdict */
28
+ explanation: string;
29
+ /** Optional message to inject for correction */
30
+ correctionMessage?: string;
31
+ }
32
+
33
+ /**
34
+ * Action to take when a violation is confirmed
35
+ */
36
+ export interface CorrectionAction {
37
+ /** Type of correction to apply */
38
+ type: "inject-message" | "block-tool" | "suppress-publish";
39
+ /** Correction message to provide to the agent. Used for inject-message type and
40
+ * for suppress-publish type when reEngage is true (to guide the agent on what to fix). */
41
+ message?: string;
42
+ /** Whether to re-engage the agent after correction */
43
+ reEngage: boolean;
44
+ }
45
+
46
+ /**
47
+ * Context provided to the supervisor LLM for verification
48
+ */
49
+ export interface SupervisionContext {
50
+ /** Agent identifier slug */
51
+ agentSlug: string;
52
+ /** Agent's Nostr public key */
53
+ agentPubkey: string;
54
+ /** The agent's system prompt */
55
+ systemPrompt: string;
56
+ /** Full conversation history */
57
+ conversationHistory: ModelMessage[];
58
+ /** Tools available to the agent */
59
+ availableTools: ToolSet;
60
+ /** ID of the heuristic that triggered */
61
+ triggeringHeuristic: string;
62
+ /** Detection result from the heuristic */
63
+ detection: HeuristicDetection;
64
+ }
65
+
66
+ /**
67
+ * State tracking for supervision of an execution
68
+ */
69
+ export interface SupervisionState {
70
+ /** Number of retry attempts made */
71
+ retryCount: number;
72
+ /** Maximum allowed retries */
73
+ maxRetries: number;
74
+ /** ID of the last triggered heuristic */
75
+ lastHeuristicTriggered?: string;
76
+ /** Set of heuristic IDs that have been enforced in this execution (in-memory only) */
77
+ enforcedHeuristics: Set<string>;
78
+ }
79
+
80
+ /**
81
+ * Context for post-completion heuristic checks
82
+ */
83
+ export interface PostCompletionContext {
84
+ /** Agent identifier slug */
85
+ agentSlug: string;
86
+ /** Agent's Nostr public key */
87
+ agentPubkey: string;
88
+ /** The final message content from the agent */
89
+ messageContent: string;
90
+ /** Names of tools that were called during execution */
91
+ toolCallsMade: string[];
92
+ /** The agent's system prompt */
93
+ systemPrompt: string;
94
+ /** Full conversation history */
95
+ conversationHistory: ModelMessage[];
96
+ /** Tools available to the agent */
97
+ availableTools: ToolSet;
98
+ /** Whether the agent has already been nudged about todo usage in this conversation */
99
+ hasBeenNudgedAboutTodos: boolean;
100
+ /** The agent's todo items (for detailed inspection by heuristics) */
101
+ todos: Array<{ id: string; title: string; status: TodoStatus; description?: string }>;
102
+ /** Number of pending delegations the agent is waiting for (0 if none) */
103
+ pendingDelegationCount: number;
104
+ }
105
+
106
+ /**
107
+ * Context for pre-tool execution heuristic checks
108
+ */
109
+ export interface PreToolContext {
110
+ /** Agent identifier slug */
111
+ agentSlug: string;
112
+ /** Agent's Nostr public key */
113
+ agentPubkey: string;
114
+ /** Name of the tool about to be executed */
115
+ toolName: string;
116
+ /** Arguments passed to the tool */
117
+ toolArgs: unknown;
118
+ /** The agent's system prompt */
119
+ systemPrompt: string;
120
+ /** Full conversation history */
121
+ conversationHistory: ModelMessage[];
122
+ /** Tools available to the agent */
123
+ availableTools: ToolSet;
124
+ }
125
+
126
+ /**
127
+ * Base interface for all heuristics
128
+ */
129
+ export interface Heuristic<TContext> {
130
+ /** Unique identifier for the heuristic */
131
+ id: string;
132
+ /** Human-readable name */
133
+ name: string;
134
+ /** When this heuristic runs */
135
+ timing: HeuristicTiming;
136
+ /** Optional filter to only run for specific tools (pre-tool-execution only) */
137
+ toolFilter?: string[];
138
+ /** Skip LLM verification and apply correction directly on detection (for low-stakes nudges) */
139
+ skipVerification?: boolean;
140
+ /**
141
+ * Detect if the heuristic condition is met
142
+ * @param context - The context to check
143
+ * @returns Detection result indicating if triggered
144
+ */
145
+ detect(context: TContext): Promise<HeuristicDetection>;
146
+ /**
147
+ * Build the prompt for the supervisor LLM to verify the detection
148
+ * @param context - The context that triggered detection
149
+ * @param detection - The detection result
150
+ * @returns Prompt string for the LLM
151
+ */
152
+ buildVerificationPrompt(context: TContext, detection: HeuristicDetection): string;
153
+ /**
154
+ * Build the correction message to inject back to the agent
155
+ * @param context - The original context
156
+ * @param verification - The LLM verification result
157
+ * @returns Message to inject
158
+ */
159
+ buildCorrectionMessage(context: TContext, verification: VerificationResult): string;
160
+ /**
161
+ * Get the correction action to take
162
+ * @param verification - The LLM verification result
163
+ * @returns The correction action
164
+ */
165
+ getCorrectionAction(verification: VerificationResult): CorrectionAction;
166
+ }
167
+
168
+ /**
169
+ * Maximum number of supervision retries before giving up
170
+ */
171
+ export const MAX_SUPERVISION_RETRIES = 3;
@@ -0,0 +1,46 @@
1
+ import type { ToolName } from "@/tools/types";
2
+ import { DELEGATE_TOOLS } from "./constants";
3
+
4
+ export type McpToolNameParts = {
5
+ serverName: string;
6
+ toolName: string;
7
+ };
8
+
9
+ export function parseMcpToolName(toolName: string): McpToolNameParts | null {
10
+ if (!toolName.startsWith("mcp__")) {
11
+ return null;
12
+ }
13
+
14
+ const parts = toolName.split("__");
15
+ if (parts.length < 3) {
16
+ return null;
17
+ }
18
+
19
+ const serverName = parts[1];
20
+ const parsedToolName = parts.slice(2).join("__");
21
+
22
+ if (!serverName || !parsedToolName) {
23
+ return null;
24
+ }
25
+
26
+ return { serverName, toolName: parsedToolName };
27
+ }
28
+
29
+ export function unwrapMcpToolName(toolName: string): string {
30
+ const parsed = parseMcpToolName(toolName);
31
+ return parsed ? parsed.toolName : toolName;
32
+ }
33
+
34
+ export function formatMcpToolName(toolName: string): string {
35
+ const parsed = parseMcpToolName(toolName);
36
+ if (!parsed) {
37
+ return toolName;
38
+ }
39
+
40
+ return `${parsed.serverName}'s ${parsed.toolName.replace(/_/g, " ")}`;
41
+ }
42
+
43
+ export function isDelegateToolName(toolName: string): boolean {
44
+ const baseName = unwrapMcpToolName(toolName);
45
+ return DELEGATE_TOOLS.includes(baseName as ToolName);
46
+ }
@@ -0,0 +1,184 @@
1
+ import type { MCPManager } from "@/services/mcp/MCPManager";
2
+ import { isValidToolName } from "@/tools/registry";
3
+ import type { ToolName } from "@/tools/types";
4
+ import { logger } from "@/utils/logger";
5
+ import { CORE_AGENT_TOOLS, DELEGATE_TOOLS, getDelegateToolsForAgent } from "./constants";
6
+
7
+ /**
8
+ * tool-normalization - Pure functions for processing agent tool lists
9
+ *
10
+ * ## Responsibility
11
+ * Centralizes all tool assignment logic that was previously scattered across:
12
+ * - AgentRegistry
13
+ * - agent-loader
14
+ * - Agent creation tools
15
+ *
16
+ * ## What it does
17
+ * Takes a raw tool list + agent context → returns final validated tool list:
18
+ * 1. Filter out delegate tools (managed separately)
19
+ * 2. Add appropriate delegate tools
20
+ * 3. Add core tools (all agents get these)
21
+ * 4. Validate tool names
22
+ * 5. Resolve MCP tools (check availability)
23
+ * 6. Return final deduplicated list
24
+ *
25
+ * ## Pure Functions
26
+ * All functions here are stateless and side-effect free:
27
+ * - Same input = same output
28
+ * - No external state
29
+ * - No mutations
30
+ * - Easy to test
31
+ *
32
+ * ## Usage
33
+ * Called during AgentInstance creation in agent-loader.ts:
34
+ * ```typescript
35
+ * const finalTools = processAgentTools(storedAgent.tools, storedAgent.slug);
36
+ * ```
37
+ *
38
+ * @see agent-loader for usage in instance creation
39
+ */
40
+
41
+ /**
42
+ * Normalize agent tools by applying business rules:
43
+ * 1. Filter out delegate tools (they're managed separately)
44
+ * 2. Add appropriate delegate tools
45
+ * 3. Ensure all core tools are included
46
+ */
47
+ export function normalizeAgentTools(requestedTools: string[]): string[] {
48
+ // Filter out delegation tools
49
+ const toolNames = requestedTools.filter((tool) => {
50
+ const typedTool = tool as ToolName;
51
+ return !DELEGATE_TOOLS.includes(typedTool);
52
+ });
53
+
54
+ // Add delegation tools
55
+ const delegateTools = getDelegateToolsForAgent();
56
+ toolNames.push(...delegateTools);
57
+
58
+ // Ensure core tools are included
59
+ for (const coreTool of CORE_AGENT_TOOLS) {
60
+ if (!toolNames.includes(coreTool)) {
61
+ toolNames.push(coreTool);
62
+ }
63
+ }
64
+
65
+ return toolNames;
66
+ }
67
+
68
+ /**
69
+ * Validate and filter tools, separating valid tools from MCP tool requests.
70
+ *
71
+ * ## Warning: Unrecognized tools are logged
72
+ * Tools that are neither valid static tools nor MCP tools are logged as warnings.
73
+ */
74
+ export function validateAndSeparateTools(toolNames: string[]): {
75
+ validTools: string[];
76
+ mcpToolRequests: string[];
77
+ } {
78
+ const validTools: string[] = [];
79
+ const mcpToolRequests: string[] = [];
80
+ const droppedTools: string[] = [];
81
+
82
+ for (const toolName of toolNames) {
83
+ if (isValidToolName(toolName)) {
84
+ validTools.push(toolName);
85
+ } else if (toolName.startsWith("mcp__")) {
86
+ mcpToolRequests.push(toolName);
87
+ } else {
88
+ // Track dropped tools to warn about them
89
+ droppedTools.push(toolName);
90
+ }
91
+ }
92
+
93
+ // Warn about dropped tools
94
+ if (droppedTools.length > 0) {
95
+ logger.warn(
96
+ `[tool-normalization] Dropping ${droppedTools.length} unrecognized tool(s): ${droppedTools.join(", ")}`
97
+ );
98
+ }
99
+
100
+ return { validTools, mcpToolRequests };
101
+ }
102
+
103
+ /**
104
+ * Resolve MCP tools - check if requested MCP tools are available
105
+ * Returns array of available MCP tool names
106
+ *
107
+ * If mcpManager is not provided, returns all requested MCP tools without validation.
108
+ * This allows agent loading to proceed before MCP is initialized - actual tool
109
+ * availability is checked at execution time in getToolsObject.
110
+ */
111
+ export function resolveMCPTools(mcpToolRequests: string[], agentSlug: string, mcpManager?: MCPManager): string[] {
112
+ if (mcpToolRequests.length === 0) {
113
+ return [];
114
+ }
115
+
116
+ // If no MCPManager available, keep all MCP tool requests - they'll be validated at execution time
117
+ if (!mcpManager) {
118
+ return mcpToolRequests;
119
+ }
120
+
121
+ const availableMcpTools: string[] = [];
122
+
123
+ try {
124
+ const allMcpTools = mcpManager.getCachedTools();
125
+ for (const toolName of mcpToolRequests) {
126
+ if (allMcpTools[toolName]) {
127
+ availableMcpTools.push(toolName);
128
+ }
129
+ }
130
+ } catch (error) {
131
+ logger.debug(`Could not load MCP tools for agent "${agentSlug}":`, error);
132
+ // Return all requested tools on error - validation will happen at execution time
133
+ return mcpToolRequests;
134
+ }
135
+
136
+ return availableMcpTools;
137
+ }
138
+
139
+ /**
140
+ * Expand filesystem capability groups:
141
+ * - fs_read implies fs_glob + fs_grep (reading without searching is impractical)
142
+ * - fs_write implies fs_edit (writing without editing is impractical)
143
+ *
144
+ * This is a pure expansion — it never removes tools, only adds implied ones.
145
+ * Does not mutate the input array.
146
+ */
147
+ export function expandFsCapabilities(tools: string[]): string[] {
148
+ const expanded = [...tools];
149
+
150
+ if (expanded.includes("fs_read")) {
151
+ if (!expanded.includes("fs_glob")) expanded.push("fs_glob");
152
+ if (!expanded.includes("fs_grep")) expanded.push("fs_grep");
153
+ }
154
+
155
+ if (expanded.includes("fs_write")) {
156
+ if (!expanded.includes("fs_edit")) expanded.push("fs_edit");
157
+ }
158
+
159
+ return expanded;
160
+ }
161
+
162
+ /**
163
+ * Complete tool processing pipeline:
164
+ * 1. Normalize (add core, delegate, filter)
165
+ * 2. Validate
166
+ * 3. Resolve MCP tools
167
+ * Returns final list of valid, available tool names
168
+ *
169
+ * @param mcpManager - Optional MCPManager for validating MCP tools. If not provided,
170
+ * MCP tool names are kept without validation (validated at execution time).
171
+ */
172
+ export function processAgentTools(requestedTools: string[], agentSlug: string, mcpManager?: MCPManager): string[] {
173
+ // Step 1: Normalize
174
+ const normalized = normalizeAgentTools(requestedTools);
175
+
176
+ // Step 2: Validate and separate
177
+ const { validTools, mcpToolRequests } = validateAndSeparateTools(normalized);
178
+
179
+ // Step 3: Resolve MCP tools
180
+ const mcpTools = resolveMCPTools(mcpToolRequests, agentSlug, mcpManager);
181
+
182
+ // Combine and return
183
+ return [...validTools, ...mcpTools];
184
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./runtime";
2
+ export * from "./storage";
@@ -0,0 +1,74 @@
1
+ import type { AgentMetadataStore } from "@/services/agents";
2
+ import type { LLMService } from "@/llm/service";
3
+ import type { MCPConfig, MCPServerConfig } from "@/llm/providers/types";
4
+ import type { OnStreamStartCallback } from "@/llm/types";
5
+ import type { NDKEvent, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
6
+ import type { Tool as CoreTool } from "ai";
7
+ import type { AgentProjectConfig } from "./storage";
8
+
9
+ /**
10
+ * Simplified agent representation for UI display and selection.
11
+ */
12
+ export interface AgentSummary {
13
+ name: string;
14
+ role: string;
15
+ pubkey: string;
16
+ }
17
+
18
+ /**
19
+ * Complete agent configuration and identity used during execution.
20
+ */
21
+ export interface AgentInstance {
22
+ name: string;
23
+ pubkey: string;
24
+ signer: NDKPrivateKeySigner;
25
+ role: string;
26
+ description?: string;
27
+ instructions?: string;
28
+ customInstructions?: string; // Custom system prompt instructions
29
+ useCriteria?: string;
30
+ llmConfig: string;
31
+ tools: string[];
32
+ eventId?: string;
33
+ slug: string;
34
+ useAISDKAgent?: boolean; // Feature flag: use AI SDK Agent class instead of traditional AgentExecutor
35
+ maxAgentSteps?: number; // Maximum steps for AI SDK Agent agentic loop (default: 10)
36
+ /** Agent-specific MCP server configurations */
37
+ mcpServers?: Record<string, MCPServerConfig>;
38
+ /**
39
+ * Project-scoped PM override flags.
40
+ * Key is project dTag, value is true if this agent is PM for that project.
41
+ */
42
+ pmOverrides?: Record<string, boolean>;
43
+ /**
44
+ * Global PM designation flag.
45
+ * When true, this agent is designated as PM for ALL projects where it exists.
46
+ * Set via kind 24020 TenexAgentConfigUpdate event with ["pm"] tag (without a-tag).
47
+ * Takes precedence over pmOverrides and project tag designations.
48
+ */
49
+ isPM?: boolean;
50
+ /**
51
+ * Per-project configuration overrides.
52
+ * Key is project dTag, value contains project-specific settings including isPM.
53
+ * Set via kind 24020 TenexAgentConfigUpdate events WITH an a-tag specifying the project.
54
+ */
55
+ projectOverrides?: Record<string, AgentProjectConfig>;
56
+ createMetadataStore(conversationId: string): AgentMetadataStore;
57
+ createLLMService(options?: {
58
+ tools?: Record<string, CoreTool>;
59
+ sessionId?: string;
60
+ workingDirectory?: string;
61
+ /** MCP configuration to pass to the provider */
62
+ mcpConfig?: MCPConfig;
63
+ /** Conversation ID for OpenRouter correlation */
64
+ conversationId?: string;
65
+ /**
66
+ * Override the config name to use (for meta model resolution).
67
+ * If provided, uses this config instead of the agent's llmConfig.
68
+ */
69
+ resolvedConfigName?: string;
70
+ /** Callback invoked when Claude Code stream starts, providing the message injector */
71
+ onStreamStart?: OnStreamStartCallback;
72
+ }): LLMService;
73
+ sign(event: NDKEvent): Promise<void>;
74
+ }
@@ -0,0 +1,145 @@
1
+ import type { MCPServerConfig } from "@/llm/providers/types";
2
+
3
+ /**
4
+ * Default agent configuration block.
5
+ * Stored under the `default` key in agent JSON files.
6
+ * A 24020 event with no a-tag writes to this block.
7
+ */
8
+ export interface AgentDefaultConfig {
9
+ /** Default LLM model configuration string (e.g., "anthropic:claude-sonnet-4") */
10
+ model?: string;
11
+ /** Default tools list for this agent */
12
+ tools?: string[];
13
+ }
14
+
15
+ /**
16
+ * Per-project configuration override block.
17
+ * Stored under `projectOverrides[projectDTag]` in agent JSON files.
18
+ * A 24020 event with an a-tag writes to this block.
19
+ *
20
+ * Tools can use delta syntax:
21
+ * - "+tool" adds a tool on top of defaults
22
+ * - "-tool" removes a tool from defaults
23
+ * - Plain "tool" (no prefix) = full replacement list
24
+ */
25
+ export interface AgentProjectConfig {
26
+ /** Project-specific model override (when set, overrides default.model) */
27
+ model?: string;
28
+ /**
29
+ * Project-specific tools.
30
+ * Can be a full replacement list or a delta (using +/- prefix).
31
+ * If any entry has +/- prefix, treated as delta applied to default tools.
32
+ * Empty array or undefined means: use defaults.
33
+ */
34
+ tools?: string[];
35
+ /**
36
+ * Project-scoped PM designation.
37
+ * When true, this agent is designated as PM for this specific project.
38
+ * Set via kind 24020 event with ["pm"] tag and an a-tag.
39
+ */
40
+ isPM?: boolean;
41
+ }
42
+
43
+ /**
44
+ * Project-scoped configuration for an agent (legacy schema).
45
+ * Used by agents written before the new `default`/`projectOverrides` schema.
46
+ *
47
+ * @deprecated Prefer `AgentProjectConfig` with `projectOverrides` field.
48
+ */
49
+ export interface ProjectScopedConfig {
50
+ /** Project-scoped LLM configuration string. */
51
+ llmConfig?: string;
52
+ /** Project-scoped tools list. */
53
+ tools?: string[];
54
+ /** Project-scoped PM designation. */
55
+ isPM?: boolean;
56
+ }
57
+
58
+ /**
59
+ * Agent data stored in JSON files (.tenex/agents/*.json).
60
+ */
61
+ export interface StoredAgentData {
62
+ name: string;
63
+ role: string;
64
+ description?: string;
65
+ instructions?: string;
66
+ useCriteria?: string;
67
+ /** Agent-specific MCP server configurations */
68
+ mcpServers?: Record<string, MCPServerConfig>;
69
+
70
+ /**
71
+ * The d-tag of the source agent definition event (kind:4199).
72
+ * Used by AgentDefinitionMonitor to detect when a newer version
73
+ * of the same definition is published.
74
+ * Backward-compatible: agents without this field are silently ignored.
75
+ */
76
+ definitionDTag?: string;
77
+
78
+ /**
79
+ * The pubkey of the author of the source agent definition event.
80
+ * Used by AgentDefinitionMonitor to verify that incoming definition
81
+ * updates come from the original (or whitelisted) author.
82
+ */
83
+ definitionAuthor?: string;
84
+
85
+ /**
86
+ * The `created_at` timestamp of the source agent definition event.
87
+ * Used by AgentDefinitionMonitor to ensure only strictly newer
88
+ * definition events trigger upgrades, preventing rollbacks from
89
+ * older events arriving out of order.
90
+ */
91
+ definitionCreatedAt?: number;
92
+
93
+ /**
94
+ * Legacy top-level LLM config field.
95
+ * @deprecated Use `default.model` instead.
96
+ */
97
+ llmConfig?: string;
98
+
99
+ /**
100
+ * Legacy top-level tools field.
101
+ * @deprecated Use `default.tools` instead.
102
+ */
103
+ tools?: string[];
104
+
105
+ /**
106
+ * Default configuration block.
107
+ * Written by kind 24020 events WITHOUT an a-tag.
108
+ * Fields here are the global fallback when no project-specific override exists.
109
+ */
110
+ default?: AgentDefaultConfig;
111
+
112
+ /**
113
+ * Per-project configuration overrides.
114
+ * Key is project dTag, value is the project-specific delta override.
115
+ * Written by kind 24020 events WITH an a-tag.
116
+ *
117
+ * Tools stored here use delta syntax ("+tool" / "-tool") or full replacement.
118
+ * See ConfigResolver for resolution logic.
119
+ */
120
+ projectOverrides?: Record<string, AgentProjectConfig>;
121
+
122
+ /**
123
+ * Legacy project-scoped configurations (old schema).
124
+ * @deprecated Use `projectOverrides` instead.
125
+ */
126
+ projectConfigs?: Record<string, ProjectScopedConfig>;
127
+ }
128
+
129
+ /**
130
+ * Agent configuration including sensitive data from the registry.
131
+ */
132
+ export interface AgentConfig extends StoredAgentData {
133
+ nsec: string;
134
+ eventId?: string;
135
+ pubkey?: string;
136
+ }
137
+
138
+ /**
139
+ * Agent configuration used during creation flows where nsec may be provided later.
140
+ */
141
+ export interface AgentConfigOptionalNsec extends StoredAgentData {
142
+ nsec?: string;
143
+ eventId?: string;
144
+ pubkey?: string;
145
+ }
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { openclawImportCommand } from "./openclaw";
3
+
4
+ export const importCommand = new Command("import")
5
+ .description("Import agents from external sources")
6
+ .addCommand(openclawImportCommand);
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { llmServiceFactory } from "@/llm/LLMServiceFactory";
3
+ import type { LLMConfiguration } from "@/services/config/types";
4
+ import type { OpenClawWorkspaceFiles } from "./openclaw-reader";
5
+
6
+ const DistilledIdentitySchema = z.object({
7
+ name: z.string(),
8
+ description: z.string(),
9
+ role: z.string(),
10
+ useCriteria: z.string(),
11
+ instructions: z.string(),
12
+ });
13
+ export type DistilledAgentIdentity = z.infer<typeof DistilledIdentitySchema>;
14
+
15
+ export function buildDistillationPrompt(files: OpenClawWorkspaceFiles): string {
16
+ const sections: string[] = [];
17
+
18
+ if (files.soul) {
19
+ sections.push(`<SOUL.md>\n${files.soul}\n</SOUL.md>`);
20
+ }
21
+ if (files.identity) {
22
+ sections.push(`<IDENTITY.md>\n${files.identity}\n</IDENTITY.md>`);
23
+ }
24
+ if (files.agents) {
25
+ sections.push(`<AGENTS.md>\n${files.agents}\n</AGENTS.md>`);
26
+ }
27
+
28
+ return `You are extracting a portable agent identity from an OpenClaw installation.
29
+ Given these workspace files, return a JSON object with exactly these fields:
30
+
31
+ - name: the agent's display name (string)
32
+ - description: one-sentence description of who this agent is (string)
33
+ - role: short phrase describing expertise/personality, e.g. "personal AI assistant" (string)
34
+ - useCriteria: when this agent should be selected over others (string)
35
+ - instructions: a clean, platform-agnostic system prompt capturing the agent's
36
+ personality, behavioral guidelines, and identity. Discard anything specific
37
+ to OpenClaw: heartbeat polling, HEARTBEAT_OK responses, workspace file reading
38
+ rituals, emoji reaction guidance, silence tokens, tool-specific commands,
39
+ and memory file management instructions. (string)
40
+
41
+ ${sections.join("\n\n")}`;
42
+ }
43
+
44
+ export async function distillAgentIdentity(
45
+ files: OpenClawWorkspaceFiles,
46
+ llmConfig: LLMConfiguration
47
+ ): Promise<DistilledAgentIdentity> {
48
+ const service = llmServiceFactory.createService(llmConfig);
49
+ const prompt = buildDistillationPrompt(files);
50
+
51
+ const { object } = await service.generateObject(
52
+ [{ role: "user", content: prompt }],
53
+ DistilledIdentitySchema
54
+ );
55
+
56
+ return object;
57
+ }