@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,320 @@
1
+ /**
2
+ * Typed Event IDs - Branded types for type-safe ID handling
3
+ *
4
+ * This module provides branded types to prevent bugs where functions receive
5
+ * wrong ID formats. The three main ID categories are:
6
+ *
7
+ * 1. FullEventId (64-char hex) - Full Nostr event IDs and conversation IDs
8
+ * 2. ShortEventId (12-char hex) - Shortened IDs for display and user input
9
+ * 3. ShellTaskId (7-char alphanumeric) - Background shell task identifiers
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * // Create typed IDs
14
+ * const fullId = createFullEventId("a1b2c3..."); // 64 chars
15
+ * const shortId = createShortEventId("a1b2c3d4e5f6"); // 12 chars
16
+ *
17
+ * // Type guards
18
+ * if (isFullEventId(input)) {
19
+ * // input is FullEventId
20
+ * }
21
+ *
22
+ * // Conversion
23
+ * const short = shortenEventId(fullId); // FullEventId -> ShortEventId
24
+ * ```
25
+ */
26
+
27
+ // =============================================================================
28
+ // Branded Types
29
+ // =============================================================================
30
+
31
+ /**
32
+ * 64-character lowercase hex string (Nostr event ID / conversation ID)
33
+ *
34
+ * This is the canonical format for:
35
+ * - Nostr event IDs
36
+ * - Conversation IDs
37
+ * - Delegation IDs
38
+ * - Agent pubkeys (technically different semantic, same format)
39
+ */
40
+ export type FullEventId = string & { readonly __brand: "FullEventId" };
41
+
42
+ /**
43
+ * 12-character lowercase hex string (shortened event ID for display)
44
+ *
45
+ * Used for:
46
+ * - User-facing display (logs, UI, tool outputs)
47
+ * - User input (when typing IDs manually)
48
+ * - Prefix lookups via PrefixKVStore
49
+ *
50
+ * Provides 48 bits of entropy (2^48 ≈ 281 trillion combinations),
51
+ * giving very low collision probability for typical conversation volumes.
52
+ */
53
+ export type ShortEventId = string & { readonly __brand: "ShortEventId" };
54
+
55
+ /**
56
+ * 7-character alphanumeric string (shell background task ID)
57
+ *
58
+ * Generated via Math.random().toString(36).substring(2, 9)
59
+ * Used only for background shell task tracking (in-memory, per-process)
60
+ */
61
+ export type ShellTaskId = string & { readonly __brand: "ShellTaskId" };
62
+
63
+ // =============================================================================
64
+ // Union Types
65
+ // =============================================================================
66
+
67
+ /**
68
+ * Any event ID format (full or short)
69
+ * Use when a function accepts either format and will resolve internally
70
+ */
71
+ export type AnyEventId = FullEventId | ShortEventId;
72
+
73
+ /**
74
+ * Any task/target ID format
75
+ * Use for kill tool and similar commands that accept multiple ID types
76
+ */
77
+ export type AnyTaskId = FullEventId | ShortEventId | ShellTaskId;
78
+
79
+ // =============================================================================
80
+ // Constants
81
+ // =============================================================================
82
+
83
+ /** Length of a full event ID (64 hex characters) */
84
+ export const FULL_EVENT_ID_LENGTH = 64;
85
+
86
+ /** Length of a short event ID prefix (12 hex characters) */
87
+ export const SHORT_EVENT_ID_LENGTH = 12;
88
+
89
+ /** Length of a shell task ID (7 alphanumeric characters) */
90
+ export const SHELL_TASK_ID_LENGTH = 7;
91
+
92
+ // =============================================================================
93
+ // Type Guards
94
+ // =============================================================================
95
+
96
+ /**
97
+ * Check if a string is a valid full event ID format (64-char lowercase hex)
98
+ */
99
+ export function isFullEventId(id: string): id is FullEventId {
100
+ return /^[0-9a-f]{64}$/.test(id);
101
+ }
102
+
103
+ /**
104
+ * Check if a string is a valid short event ID format (12-char lowercase hex)
105
+ */
106
+ export function isShortEventId(id: string): id is ShortEventId {
107
+ return /^[0-9a-f]{12}$/.test(id);
108
+ }
109
+
110
+ /**
111
+ * Check if a string is a valid shell task ID format (7-char alphanumeric)
112
+ */
113
+ export function isShellTaskId(id: string): id is ShellTaskId {
114
+ return /^[a-z0-9]{7}$/.test(id);
115
+ }
116
+
117
+ /**
118
+ * Detect the type of an ID string
119
+ *
120
+ * @returns The detected type, or null if the format is not recognized
121
+ */
122
+ export function detectIdType(id: string): "full" | "short" | "shell" | null {
123
+ const normalized = id.toLowerCase();
124
+
125
+ if (isFullEventId(normalized)) {
126
+ return "full";
127
+ }
128
+
129
+ if (isShortEventId(normalized)) {
130
+ return "short";
131
+ }
132
+
133
+ if (isShellTaskId(normalized)) {
134
+ return "shell";
135
+ }
136
+
137
+ return null;
138
+ }
139
+
140
+ // =============================================================================
141
+ // Factory Functions
142
+ // =============================================================================
143
+
144
+ /**
145
+ * Create a FullEventId from a string, with validation
146
+ *
147
+ * @throws Error if the input is not a valid 64-char hex string
148
+ */
149
+ export function createFullEventId(id: string): FullEventId {
150
+ const normalized = id.toLowerCase();
151
+
152
+ if (!isFullEventId(normalized)) {
153
+ throw new Error(
154
+ `Invalid FullEventId: expected 64-char lowercase hex string, got "${id.substring(0, 20)}..." (length: ${id.length})`
155
+ );
156
+ }
157
+
158
+ return normalized;
159
+ }
160
+
161
+ /**
162
+ * Create a ShortEventId from a string, with validation
163
+ *
164
+ * @throws Error if the input is not a valid 12-char hex string
165
+ */
166
+ export function createShortEventId(id: string): ShortEventId {
167
+ const normalized = id.toLowerCase();
168
+
169
+ if (!isShortEventId(normalized)) {
170
+ throw new Error(
171
+ `Invalid ShortEventId: expected 12-char lowercase hex string, got "${id}" (length: ${id.length})`
172
+ );
173
+ }
174
+
175
+ return normalized;
176
+ }
177
+
178
+ /**
179
+ * Create a ShellTaskId from a string, with validation
180
+ *
181
+ * @throws Error if the input is not a valid 7-char alphanumeric string
182
+ */
183
+ export function createShellTaskId(id: string): ShellTaskId {
184
+ const normalized = id.toLowerCase();
185
+
186
+ if (!isShellTaskId(normalized)) {
187
+ throw new Error(
188
+ `Invalid ShellTaskId: expected 7-char lowercase alphanumeric string, got "${id}" (length: ${id.length})`
189
+ );
190
+ }
191
+
192
+ return normalized;
193
+ }
194
+
195
+ /**
196
+ * Attempt to create a FullEventId, returning null on failure instead of throwing
197
+ */
198
+ export function tryCreateFullEventId(id: string): FullEventId | null {
199
+ const normalized = id.toLowerCase();
200
+ return isFullEventId(normalized) ? normalized : null;
201
+ }
202
+
203
+ /**
204
+ * Attempt to create a ShortEventId, returning null on failure instead of throwing
205
+ */
206
+ export function tryCreateShortEventId(id: string): ShortEventId | null {
207
+ const normalized = id.toLowerCase();
208
+ return isShortEventId(normalized) ? normalized : null;
209
+ }
210
+
211
+ /**
212
+ * Attempt to create a ShellTaskId, returning null on failure instead of throwing
213
+ */
214
+ export function tryCreateShellTaskId(id: string): ShellTaskId | null {
215
+ const normalized = id.toLowerCase();
216
+ return isShellTaskId(normalized) ? normalized : null;
217
+ }
218
+
219
+ // =============================================================================
220
+ // Conversion Functions
221
+ // =============================================================================
222
+
223
+ /**
224
+ * Shorten a full event ID to a short event ID (first 12 characters)
225
+ */
226
+ export function shortenEventId(fullId: FullEventId): ShortEventId {
227
+ return fullId.substring(0, SHORT_EVENT_ID_LENGTH) as ShortEventId;
228
+ }
229
+
230
+ /**
231
+ * Convert any typed ID back to a raw string
232
+ * Useful for interfacing with external APIs that expect plain strings
233
+ */
234
+ export function toRawString(id: AnyEventId | ShellTaskId): string {
235
+ return id as string;
236
+ }
237
+
238
+ // =============================================================================
239
+ // Assertion Functions
240
+ // =============================================================================
241
+
242
+ /**
243
+ * Assert that a string is a valid FullEventId (already lowercase)
244
+ *
245
+ * NOTE: This assertion is STRICT - it requires the string to already be
246
+ * lowercase. If you have potentially uppercase input, use createFullEventId()
247
+ * which normalizes and returns the typed ID.
248
+ *
249
+ * @throws Error if the assertion fails (not 64-char lowercase hex)
250
+ */
251
+ export function assertFullEventId(id: string): asserts id is FullEventId {
252
+ if (!isFullEventId(id)) {
253
+ throw new Error(
254
+ `Assertion failed: expected FullEventId (64-char lowercase hex), got "${id.substring(0, 20)}..." (length: ${id.length}). Use createFullEventId() to normalize uppercase input.`
255
+ );
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Assert that a string is a valid ShortEventId (already lowercase)
261
+ *
262
+ * NOTE: This assertion is STRICT - it requires the string to already be
263
+ * lowercase. If you have potentially uppercase input, use createShortEventId()
264
+ * which normalizes and returns the typed ID.
265
+ *
266
+ * @throws Error if the assertion fails (not 12-char lowercase hex)
267
+ */
268
+ export function assertShortEventId(id: string): asserts id is ShortEventId {
269
+ if (!isShortEventId(id)) {
270
+ throw new Error(
271
+ `Assertion failed: expected ShortEventId (12-char lowercase hex), got "${id}" (length: ${id.length}). Use createShortEventId() to normalize uppercase input.`
272
+ );
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Assert that a string is a valid ShellTaskId (already lowercase)
278
+ *
279
+ * NOTE: This assertion is STRICT - it requires the string to already be
280
+ * lowercase. If you have potentially uppercase input, use createShellTaskId()
281
+ * which normalizes and returns the typed ID.
282
+ *
283
+ * @throws Error if the assertion fails (not 7-char lowercase alphanumeric)
284
+ */
285
+ export function assertShellTaskId(id: string): asserts id is ShellTaskId {
286
+ if (!isShellTaskId(id)) {
287
+ throw new Error(
288
+ `Assertion failed: expected ShellTaskId (7-char lowercase alphanumeric), got "${id}" (length: ${id.length}). Use createShellTaskId() to normalize uppercase input.`
289
+ );
290
+ }
291
+ }
292
+
293
+ // =============================================================================
294
+ // Utility Functions
295
+ // =============================================================================
296
+
297
+ /**
298
+ * Parse an ID from user input, detecting its type
299
+ *
300
+ * @returns Object with typed ID and detected type, or null if unrecognized
301
+ */
302
+ export function parseEventId(
303
+ input: string
304
+ ): { id: FullEventId; type: "full" } | { id: ShortEventId; type: "short" } | { id: ShellTaskId; type: "shell" } | null {
305
+ const normalized = input.trim().toLowerCase();
306
+
307
+ if (isFullEventId(normalized)) {
308
+ return { id: normalized, type: "full" };
309
+ }
310
+
311
+ if (isShortEventId(normalized)) {
312
+ return { id: normalized, type: "short" };
313
+ }
314
+
315
+ if (isShellTaskId(normalized)) {
316
+ return { id: normalized, type: "shell" };
317
+ }
318
+
319
+ return null;
320
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Types barrel export
3
+ *
4
+ * Centralized exports for all custom types used throughout the system.
5
+ */
6
+
7
+ // Event ID types and utilities
8
+ export {
9
+ // Branded types
10
+ type FullEventId,
11
+ type ShortEventId,
12
+ type ShellTaskId,
13
+ type AnyEventId,
14
+ type AnyTaskId,
15
+
16
+ // Constants
17
+ FULL_EVENT_ID_LENGTH,
18
+ SHORT_EVENT_ID_LENGTH,
19
+ SHELL_TASK_ID_LENGTH,
20
+
21
+ // Type guards
22
+ isFullEventId,
23
+ isShortEventId,
24
+ isShellTaskId,
25
+ detectIdType,
26
+
27
+ // Factory functions
28
+ createFullEventId,
29
+ createShortEventId,
30
+ createShellTaskId,
31
+ tryCreateFullEventId,
32
+ tryCreateShortEventId,
33
+ tryCreateShellTaskId,
34
+
35
+ // Conversion functions
36
+ shortenEventId,
37
+ toRawString,
38
+
39
+ // Assertion functions
40
+ assertFullEventId,
41
+ assertShortEventId,
42
+ assertShellTaskId,
43
+
44
+ // Utility functions
45
+ parseEventId,
46
+ } from "./event-ids";
@@ -0,0 +1,107 @@
1
+ import type NDK from "@nostr-dev-kit/ndk";
2
+ import type { NDKEvent } from "@nostr-dev-kit/ndk";
3
+ import { NDKAgentDefinition, type ETagReference } from "@/events/NDKAgentDefinition";
4
+ import { logger } from "./logger";
5
+
6
+ /**
7
+ * Represents the parsed data from an agent definition event.
8
+ * Contains all fields needed to instantiate or display an agent.
9
+ */
10
+ export interface AgentDefinitionData {
11
+ /** The Nostr event ID of the agent definition */
12
+ id: string;
13
+ /** The slug identifier (d-tag) for versioning */
14
+ slug: string | undefined;
15
+ /** Display name of the agent */
16
+ title: string;
17
+ /** Short one-liner description */
18
+ description: string;
19
+ /** Extended markdown description from content field */
20
+ markdownDescription: string | undefined;
21
+ /** The agent's role/personality */
22
+ role: string;
23
+ /** Detailed operational instructions */
24
+ instructions: string;
25
+ /** Criteria for when to use this agent */
26
+ useCriteria: string;
27
+ /** Version number of the agent definition */
28
+ version: number;
29
+ /** Unix timestamp when the event was created */
30
+ created_at: number | undefined;
31
+ /** Pubkey of the agent definition author */
32
+ pubkey: string;
33
+ /** References to bundled file metadata events */
34
+ fileETags: ETagReference[];
35
+ /** Reference to the source agent if this is a fork */
36
+ forkSource: ETagReference | undefined;
37
+ }
38
+
39
+ /**
40
+ * Fetches an agent event from Nostr
41
+ * @param eventId - The ID of the event containing the agent
42
+ * @param ndk - The NDK instance to use for fetching
43
+ * @returns The agent event or null if not found
44
+ */
45
+ export async function fetchAgent(eventId: string, ndk: NDK): Promise<NDKEvent | null> {
46
+ try {
47
+ // Strip "nostr:" prefix if present
48
+ const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
49
+
50
+ const event = await ndk.fetchEvent(cleanEventId, { groupable: false });
51
+
52
+ if (!event) {
53
+ logger.debug(`Agent event not found: ${cleanEventId}`);
54
+ return null;
55
+ }
56
+
57
+ return event;
58
+ } catch (error) {
59
+ logger.error(`Failed to fetch agent event: ${eventId}`, error);
60
+ return null;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Fetches an agent definition from a Nostr event
66
+ * @param eventId - The ID of the event containing the agent definition
67
+ * @param ndk - The NDK instance to use for fetching
68
+ * @returns The agent definition data or null if not found
69
+ */
70
+ export async function fetchAgentDefinition(
71
+ eventId: string,
72
+ ndk: NDK
73
+ ): Promise<AgentDefinitionData | null> {
74
+ try {
75
+ // Strip "nostr:" prefix if present
76
+ const cleanEventId = eventId.startsWith("nostr:") ? eventId.substring(6) : eventId;
77
+
78
+ const event = await ndk.fetchEvent(cleanEventId, { groupable: false });
79
+
80
+ if (!event) {
81
+ logger.warning(`Agent event not found: ${cleanEventId}`);
82
+ return null;
83
+ }
84
+
85
+ // Use NDKAgentDefinition for proper parsing
86
+ const agentDef = NDKAgentDefinition.from(event);
87
+
88
+ return {
89
+ id: event.id,
90
+ slug: agentDef.slug,
91
+ title: agentDef.title || "Unnamed Agent",
92
+ description: agentDef.description || "",
93
+ markdownDescription: agentDef.markdownDescription,
94
+ role: agentDef.role || "assistant",
95
+ instructions: agentDef.instructions || "",
96
+ useCriteria: agentDef.useCriteria || "",
97
+ version: agentDef.version,
98
+ created_at: event.created_at,
99
+ pubkey: event.pubkey,
100
+ fileETags: agentDef.getFileETags(),
101
+ forkSource: agentDef.getForkSource(),
102
+ };
103
+ } catch (error) {
104
+ logger.error(`Failed to fetch agent event: ${eventId}`, error);
105
+ return null;
106
+ }
107
+ }
@@ -0,0 +1,29 @@
1
+ import { formatAnyError } from "@/lib/error-formatter";
2
+ import { logger } from "./logger";
3
+
4
+ /**
5
+ * Centralized CLI error handler that ensures consistent error logging and exit behavior
6
+ * @param error - The error object or message
7
+ * @param context - Optional context for better error reporting
8
+ * @param exitCode - The process exit code (default: 1)
9
+ */
10
+ export function handleCliError(error: unknown, context?: string, exitCode = 1): never {
11
+ const errorMessage = formatAnyError(error);
12
+ const errorStack = error instanceof Error ? error.stack : undefined;
13
+
14
+ // Log error with context
15
+ if (context) {
16
+ logger.error(`${context}: ${errorMessage}`);
17
+ } else {
18
+ logger.error(errorMessage);
19
+ }
20
+
21
+ // Log stack trace in debug mode
22
+ if (errorStack && process.env.DEBUG) {
23
+ logger.debug(errorStack);
24
+ }
25
+
26
+ // Exit with specified code
27
+ process.exit(exitCode);
28
+ }
29
+
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Conversation ID Utilities
3
+ *
4
+ * Centralized utilities for handling conversation IDs throughout the system.
5
+ */
6
+
7
+ import { PREFIX_LENGTH } from "@/utils/nostr-entity-parser";
8
+ import type { ShortEventId, FullEventId } from "@/types/event-ids";
9
+ import { SHORT_EVENT_ID_LENGTH } from "@/types/event-ids";
10
+
11
+ /**
12
+ * Shorten a conversation ID for Jaeger span attributes.
13
+ * Uses the standard PREFIX_LENGTH (12 characters) for consistency across all traces.
14
+ * This makes Jaeger UI more readable with reduced length and low collision risk.
15
+ *
16
+ * Note: 12 hex characters provides 48 bits of entropy (2^48 ≈ 281 trillion combinations),
17
+ * which gives very low collision probability for typical conversation volumes.
18
+ *
19
+ * @param conversationId - Full conversation ID (can be typed FullEventId or plain string)
20
+ * @returns Shortened ID (first 12 characters) as ShortEventId
21
+ */
22
+ export function shortenConversationId(conversationId: string | FullEventId): ShortEventId {
23
+ return conversationId.substring(0, SHORT_EVENT_ID_LENGTH).toLowerCase() as ShortEventId;
24
+ }
25
+
26
+ // Re-export PREFIX_LENGTH for backward compatibility
27
+ export { PREFIX_LENGTH };
@@ -0,0 +1 @@
1
+ // Conversation utility functions