@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,152 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ import { logger } from "@/utils/logger";
5
+
6
+ /**
7
+ * State persisted during graceful restart
8
+ */
9
+ export interface RestartStateData {
10
+ /** Timestamp when restart was requested */
11
+ requestedAt: number;
12
+ /** List of project IDs that were booted at the time of restart */
13
+ bootedProjects: string[];
14
+ /** PID of the process that requested the restart */
15
+ pid: number;
16
+ /** Hostname for debugging */
17
+ hostname: string;
18
+ }
19
+
20
+ /**
21
+ * Manages restart state persistence for graceful restarts.
22
+ *
23
+ * When the daemon receives SIGHUP in supervised mode, it:
24
+ * 1. Persists the list of currently booted projects
25
+ * 2. Waits for all active RALs to complete
26
+ * 3. Exits cleanly (exit code 0)
27
+ *
28
+ * On startup, the daemon:
29
+ * 1. Checks for restart state file
30
+ * 2. If found, auto-boots the projects listed
31
+ * 3. Clears the restart state file
32
+ */
33
+ export class RestartState {
34
+ private static readonly RESTART_STATE_FILE = "restart-state.json";
35
+ private daemonDir: string;
36
+
37
+ constructor(daemonDir: string) {
38
+ this.daemonDir = daemonDir;
39
+ }
40
+
41
+ /**
42
+ * Get the path to the restart state file
43
+ */
44
+ private getStatePath(): string {
45
+ return path.join(this.daemonDir, RestartState.RESTART_STATE_FILE);
46
+ }
47
+
48
+ /**
49
+ * Save restart state before graceful shutdown.
50
+ * Uses atomic write (write to temp file, then rename) to prevent corruption.
51
+ */
52
+ async save(bootedProjects: string[]): Promise<void> {
53
+ const statePath = this.getStatePath();
54
+ const tempPath = `${statePath}.tmp.${process.pid}`;
55
+
56
+ const state: RestartStateData = {
57
+ requestedAt: Date.now(),
58
+ bootedProjects,
59
+ pid: process.pid,
60
+ hostname: os.hostname(),
61
+ };
62
+
63
+ try {
64
+ // Write to temp file first
65
+ await fs.writeFile(tempPath, JSON.stringify(state, null, 2), "utf-8");
66
+
67
+ // Atomic rename
68
+ await fs.rename(tempPath, statePath);
69
+
70
+ logger.info("[RestartState] Saved restart state", {
71
+ bootedProjectCount: bootedProjects.length,
72
+ statePath,
73
+ });
74
+ } catch (error) {
75
+ // Clean up temp file on failure
76
+ try {
77
+ await fs.unlink(tempPath);
78
+ } catch {
79
+ // Ignore cleanup errors
80
+ }
81
+
82
+ logger.error("[RestartState] Failed to save restart state", {
83
+ error: error instanceof Error ? error.message : String(error),
84
+ });
85
+ throw error;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Load restart state if it exists.
91
+ * Returns null if no restart state file is present.
92
+ */
93
+ async load(): Promise<RestartStateData | null> {
94
+ const statePath = this.getStatePath();
95
+
96
+ try {
97
+ const content = await fs.readFile(statePath, "utf-8");
98
+ const state: RestartStateData = JSON.parse(content);
99
+
100
+ logger.info("[RestartState] Loaded restart state", {
101
+ requestedAt: new Date(state.requestedAt).toISOString(),
102
+ bootedProjectCount: state.bootedProjects.length,
103
+ originalPid: state.pid,
104
+ });
105
+
106
+ return state;
107
+ } catch (error) {
108
+ const err = error as NodeJS.ErrnoException;
109
+ if (err.code === "ENOENT") {
110
+ // No restart state file - normal startup
111
+ return null;
112
+ }
113
+
114
+ logger.error("[RestartState] Failed to load restart state", {
115
+ error: error instanceof Error ? error.message : String(error),
116
+ });
117
+ return null;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Clear restart state after successful processing.
123
+ */
124
+ async clear(): Promise<void> {
125
+ const statePath = this.getStatePath();
126
+
127
+ try {
128
+ await fs.unlink(statePath);
129
+ logger.debug("[RestartState] Cleared restart state file");
130
+ } catch (error) {
131
+ const err = error as NodeJS.ErrnoException;
132
+ if (err.code !== "ENOENT") {
133
+ logger.warn("[RestartState] Failed to clear restart state", {
134
+ error: error instanceof Error ? error.message : String(error),
135
+ });
136
+ }
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Check if a restart state file exists
142
+ */
143
+ async exists(): Promise<boolean> {
144
+ const statePath = this.getStatePath();
145
+ try {
146
+ await fs.stat(statePath);
147
+ return true;
148
+ } catch {
149
+ return false;
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,268 @@
1
+ import { logger } from "@/utils/logger";
2
+ import type { NDKProject } from "@nostr-dev-kit/ndk";
3
+ import { trace } from "@opentelemetry/api";
4
+ import { ProjectAlreadyRunningError } from "@/services/scheduling/errors";
5
+ import { ProjectRuntime } from "./ProjectRuntime";
6
+
7
+ /**
8
+ * Manages the lifecycle of project runtimes.
9
+ * Handles starting, stopping, restarting, and crash recovery for ProjectRuntime instances.
10
+ *
11
+ * This class extracts runtime management logic from the Daemon class,
12
+ * eliminating duplicate code and providing a focused responsibility.
13
+ */
14
+ export class RuntimeLifecycle {
15
+ private activeRuntimes = new Map<string, ProjectRuntime>();
16
+ private startingRuntimes = new Map<string, Promise<ProjectRuntime>>();
17
+
18
+ constructor(private projectsBase: string) {}
19
+
20
+ /**
21
+ * Get all active runtimes
22
+ */
23
+ getActiveRuntimes(): Map<string, ProjectRuntime> {
24
+ return new Map(this.activeRuntimes);
25
+ }
26
+
27
+ /**
28
+ * Get a specific runtime by project ID
29
+ */
30
+ getRuntime(projectId: string): ProjectRuntime | undefined {
31
+ return this.activeRuntimes.get(projectId);
32
+ }
33
+
34
+ /**
35
+ * Check if a runtime is active
36
+ */
37
+ isRuntimeActive(projectId: string): boolean {
38
+ return this.activeRuntimes.has(projectId);
39
+ }
40
+
41
+ /**
42
+ * Start a new runtime for a project.
43
+ * This is the single source of truth for runtime startup logic.
44
+ *
45
+ * @param projectId - The project ID
46
+ * @param project - The NDKProject instance
47
+ * @returns Promise resolving to the started ProjectRuntime
48
+ * @throws Error if startup fails
49
+ */
50
+ async startRuntime(projectId: string, project: NDKProject): Promise<ProjectRuntime> {
51
+ // Check if already running
52
+ const existingRuntime = this.activeRuntimes.get(projectId);
53
+ if (existingRuntime) {
54
+ const status = existingRuntime.getStatus();
55
+ if (status.isRunning) {
56
+ throw new ProjectAlreadyRunningError(projectId);
57
+ }
58
+ // Runtime exists but is not running - remove it and allow restart
59
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.removing_stale", {
60
+ "project.id": projectId,
61
+ });
62
+ this.activeRuntimes.delete(projectId);
63
+ }
64
+
65
+ // Check if already starting
66
+ const existingPromise = this.startingRuntimes.get(projectId);
67
+ if (existingPromise) {
68
+ return existingPromise;
69
+ }
70
+
71
+ const projectTitle = project.tagValue("title") || "Untitled";
72
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.starting", {
73
+ "project.id": projectId,
74
+ "project.title": projectTitle,
75
+ });
76
+
77
+ // Create startup promise to prevent concurrent startups
78
+ const startupPromise = this.performStartup(project);
79
+ this.startingRuntimes.set(projectId, startupPromise);
80
+
81
+ try {
82
+ const runtime = await startupPromise;
83
+ this.activeRuntimes.set(projectId, runtime);
84
+
85
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.started", {
86
+ "project.id": projectId,
87
+ "project.title": projectTitle,
88
+ });
89
+
90
+ return runtime;
91
+ } catch (error) {
92
+ logger.error(`Failed to start project runtime: ${projectId}`, {
93
+ error: error instanceof Error ? error.message : String(error),
94
+ });
95
+ throw error;
96
+ } finally {
97
+ // Always clean up the starting promise
98
+ this.startingRuntimes.delete(projectId);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Perform the actual runtime startup
104
+ * @param project - The NDKProject instance
105
+ * @returns Promise resolving to the started ProjectRuntime
106
+ */
107
+ private async performStartup(project: NDKProject): Promise<ProjectRuntime> {
108
+ const newRuntime = new ProjectRuntime(project, this.projectsBase);
109
+ await newRuntime.start();
110
+ return newRuntime;
111
+ }
112
+
113
+ /**
114
+ * Stop a runtime gracefully
115
+ * @param projectId - The project ID to stop
116
+ * @throws Error if the runtime is not found
117
+ */
118
+ async stopRuntime(projectId: string): Promise<void> {
119
+ const runtime = this.activeRuntimes.get(projectId);
120
+ if (!runtime) {
121
+ throw new Error(`Runtime not found: ${projectId}`);
122
+ }
123
+
124
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopping", {
125
+ "project.id": projectId,
126
+ });
127
+
128
+ try {
129
+ await runtime.stop();
130
+ this.activeRuntimes.delete(projectId);
131
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopped", {
132
+ "project.id": projectId,
133
+ });
134
+ } catch (error) {
135
+ logger.error(`Error stopping project runtime: ${projectId}`, {
136
+ error: error instanceof Error ? error.message : String(error),
137
+ });
138
+ // Still remove from active runtimes even if stop fails
139
+ this.activeRuntimes.delete(projectId);
140
+ throw error;
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Restart a runtime (stop and start again)
146
+ * @param projectId - The project ID to restart
147
+ * @param project - The NDKProject instance (needed for restart)
148
+ * @throws Error if the runtime is not found or restart fails
149
+ */
150
+ async restartRuntime(projectId: string, project: NDKProject): Promise<ProjectRuntime> {
151
+ const runtime = this.activeRuntimes.get(projectId);
152
+ if (!runtime) {
153
+ throw new Error(`Runtime not found: ${projectId}`);
154
+ }
155
+
156
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.restarting", {
157
+ "project.id": projectId,
158
+ });
159
+
160
+ try {
161
+ // Stop the runtime
162
+ await runtime.stop();
163
+ this.activeRuntimes.delete(projectId);
164
+
165
+ // Start it again
166
+ return await this.startRuntime(projectId, project);
167
+ } catch (error) {
168
+ logger.error(`Failed to restart project runtime: ${projectId}`, {
169
+ error: error instanceof Error ? error.message : String(error),
170
+ });
171
+ throw error;
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Handle a crashed runtime by cleaning it up
177
+ * @param projectId - The project ID that crashed
178
+ * @param runtime - The crashed runtime instance
179
+ */
180
+ async handleRuntimeCrash(projectId: string, runtime: ProjectRuntime): Promise<void> {
181
+ logger.error(`Handling crashed runtime: ${projectId}`);
182
+
183
+ // Remove from active runtimes
184
+ this.activeRuntimes.delete(projectId);
185
+
186
+ // Best effort cleanup
187
+ try {
188
+ await runtime.stop();
189
+ } catch (cleanupError) {
190
+ logger.warn(`Failed to clean up crashed runtime: ${projectId}`, {
191
+ error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
192
+ });
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Stop all active runtimes (for shutdown)
198
+ */
199
+ async stopAllRuntimes(): Promise<void> {
200
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.stopping_all", {
201
+ "runtimes.active_count": this.activeRuntimes.size,
202
+ });
203
+
204
+ const stopPromises = Array.from(this.activeRuntimes.entries()).map(
205
+ async ([projectId, runtime]) => {
206
+ try {
207
+ await runtime.stop();
208
+ } catch (error) {
209
+ logger.error(`Error stopping runtime during shutdown: ${projectId}`, {
210
+ error: error instanceof Error ? error.message : String(error),
211
+ });
212
+ }
213
+ }
214
+ );
215
+
216
+ await Promise.all(stopPromises);
217
+ this.activeRuntimes.clear();
218
+
219
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.all_stopped");
220
+ }
221
+
222
+ /**
223
+ * Get statistics about managed runtimes
224
+ */
225
+ getStats(): {
226
+ activeCount: number;
227
+ startingCount: number;
228
+ projectIds: string[];
229
+ } {
230
+ return {
231
+ activeCount: this.activeRuntimes.size,
232
+ startingCount: this.startingRuntimes.size,
233
+ projectIds: Array.from(this.activeRuntimes.keys()),
234
+ };
235
+ }
236
+
237
+ /**
238
+ * Check if any runtimes are currently starting
239
+ */
240
+ hasStartingRuntimes(): boolean {
241
+ return this.startingRuntimes.size > 0;
242
+ }
243
+
244
+ /**
245
+ * Wait for all starting runtimes to complete
246
+ * Useful for graceful shutdown
247
+ */
248
+ async waitForStartingRuntimes(): Promise<void> {
249
+ if (this.startingRuntimes.size === 0) {
250
+ return;
251
+ }
252
+
253
+ trace.getActiveSpan()?.addEvent("runtime_lifecycle.waiting_for_starting", {
254
+ "runtimes.starting_count": this.startingRuntimes.size,
255
+ });
256
+
257
+ const promises = Array.from(this.startingRuntimes.values());
258
+ await Promise.allSettled(promises);
259
+ }
260
+
261
+ /**
262
+ * Get list of currently active project IDs.
263
+ * Used by graceful restart to persist which projects to auto-boot after restart.
264
+ */
265
+ getActiveProjectIds(): string[] {
266
+ return Array.from(this.activeRuntimes.keys());
267
+ }
268
+ }