@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,188 @@
1
+ import type { LanguageModelMiddleware } from "ai";
2
+ import { mkdir, writeFile } from "fs/promises";
3
+ import { join } from "path";
4
+ import { getTenexBasePath } from "@/constants";
5
+ import { recordingState } from "../RecordingState";
6
+
7
+ type WrapGenerateParams = Parameters<NonNullable<LanguageModelMiddleware["wrapGenerate"]>>[0];
8
+ type WrapStreamParams = Parameters<NonNullable<LanguageModelMiddleware["wrapStream"]>>[0];
9
+
10
+ // Recording types - using unknown for SDK types that may change between versions
11
+ interface RecordingResponse {
12
+ content: unknown;
13
+ finishReason: unknown;
14
+ usage: unknown;
15
+ }
16
+
17
+ interface RecordingError {
18
+ message: string;
19
+ }
20
+
21
+ interface ToolCallRecord {
22
+ toolCallId: string;
23
+ toolName: string;
24
+ args: unknown;
25
+ }
26
+
27
+ /**
28
+ * Flight recorder configuration
29
+ */
30
+ export interface FlightRecorderConfig {
31
+ /** Base directory for recordings (defaults to ~/.tenex/recordings) */
32
+ baseDir?: string;
33
+ }
34
+
35
+ /**
36
+ * Creates a flight recorder middleware that records LLM interactions when enabled.
37
+ * Recording is controlled by the global recordingState - toggle with Ctrl+R in daemon.
38
+ *
39
+ * Recordings are saved to: {baseDir}/YYYY-MM-DD/{timestamp}-{hash}.json
40
+ * Respects TENEX_BASE_DIR environment variable for instance isolation.
41
+ */
42
+ export function createFlightRecorderMiddleware(
43
+ config: FlightRecorderConfig = {}
44
+ ): LanguageModelMiddleware {
45
+ const baseDir = config.baseDir || join(getTenexBasePath(), "recordings");
46
+
47
+ return {
48
+ specificationVersion: "v3" as const,
49
+
50
+ async wrapGenerate({ doGenerate, params, model }: WrapGenerateParams) {
51
+ if (!recordingState.isRecording) {
52
+ return doGenerate();
53
+ }
54
+
55
+ const startTime = Date.now();
56
+ const hash = createSimpleHash(JSON.stringify(params.prompt));
57
+
58
+ const recording = {
59
+ timestamp: new Date().toISOString(),
60
+ type: "generate",
61
+ model: { provider: model.provider, modelId: model.modelId },
62
+ request: {
63
+ prompt: params.prompt,
64
+ temperature: params.temperature,
65
+ maxOutputTokens: params.maxOutputTokens,
66
+ tools: params.tools,
67
+ toolChoice: params.toolChoice,
68
+ },
69
+ response: null as RecordingResponse | null,
70
+ error: null as RecordingError | null,
71
+ duration: 0,
72
+ };
73
+
74
+ try {
75
+ const result = await doGenerate();
76
+ recording.response = {
77
+ content: result.content,
78
+ finishReason: result.finishReason,
79
+ usage: result.usage,
80
+ };
81
+ recording.duration = Date.now() - startTime;
82
+ await saveRecording(baseDir, hash, recording);
83
+ return result;
84
+ } catch (error) {
85
+ recording.error = {
86
+ message: error instanceof Error ? error.message : String(error),
87
+ };
88
+ recording.duration = Date.now() - startTime;
89
+ await saveRecording(baseDir, hash, recording);
90
+ throw error;
91
+ }
92
+ },
93
+
94
+ wrapStream({ doStream, params, model }: WrapStreamParams) {
95
+ if (!recordingState.isRecording) {
96
+ return doStream();
97
+ }
98
+
99
+ const startTime = Date.now();
100
+ const hash = createSimpleHash(JSON.stringify(params.prompt));
101
+
102
+ // Buffer to collect stream content
103
+ const textParts: string[] = [];
104
+ const toolCalls: ToolCallRecord[] = [];
105
+ let finishReason: string | undefined;
106
+ let usage: unknown;
107
+
108
+ // Wrap the stream with a TransformStream to intercept chunks
109
+ return doStream().then((result) => {
110
+ const transform = new TransformStream({
111
+ transform(chunk, controller) {
112
+ // Pass through the chunk
113
+ controller.enqueue(chunk);
114
+
115
+ // Collect data for recording
116
+ if (chunk.type === "text-delta" && chunk.textDelta) {
117
+ textParts.push(chunk.textDelta);
118
+ }
119
+ if (chunk.type === "tool-call") {
120
+ toolCalls.push({
121
+ toolCallId: chunk.toolCallId,
122
+ toolName: chunk.toolName,
123
+ args: chunk.args,
124
+ });
125
+ }
126
+ if (chunk.type === "finish") {
127
+ finishReason = chunk.finishReason;
128
+ usage = chunk.usage;
129
+ }
130
+ },
131
+ flush() {
132
+ // Stream finished - save the recording
133
+ const recording = {
134
+ timestamp: new Date().toISOString(),
135
+ type: "stream",
136
+ model: { provider: model.provider, modelId: model.modelId },
137
+ request: {
138
+ prompt: params.prompt,
139
+ temperature: params.temperature,
140
+ maxOutputTokens: params.maxOutputTokens,
141
+ tools: params.tools,
142
+ toolChoice: params.toolChoice,
143
+ },
144
+ response: {
145
+ content: [{ type: "text", text: textParts.join("") }],
146
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
147
+ finishReason,
148
+ usage,
149
+ },
150
+ duration: Date.now() - startTime,
151
+ };
152
+ saveRecording(baseDir, hash, recording).catch(() => {});
153
+ },
154
+ });
155
+
156
+ return {
157
+ ...result,
158
+ stream: result.stream.pipeThrough(transform),
159
+ };
160
+ });
161
+ },
162
+ };
163
+ }
164
+
165
+ async function saveRecording(baseDir: string, hash: string, recording: Record<string, unknown>): Promise<void> {
166
+ try {
167
+ const now = new Date();
168
+ const dateStr = now.toISOString().split("T")[0];
169
+ const dirPath = join(baseDir, dateStr);
170
+ await mkdir(dirPath, { recursive: true });
171
+
172
+ const timestamp = now.toISOString().replace(/[:.]/g, "-");
173
+ const filename = `${timestamp}-${hash}.json`;
174
+ await writeFile(join(dirPath, filename), JSON.stringify(recording, null, 2), "utf-8");
175
+ } catch (error) {
176
+ console.error("[FlightRecorder] Failed to save recording:", error);
177
+ }
178
+ }
179
+
180
+ function createSimpleHash(input: string): string {
181
+ let hash = 0;
182
+ for (let i = 0; i < input.length; i++) {
183
+ const char = input.charCodeAt(i);
184
+ hash = (hash << 5) - hash + char;
185
+ hash = hash & hash;
186
+ }
187
+ return Math.abs(hash).toString(16).substring(0, 8);
188
+ }
@@ -0,0 +1,332 @@
1
+ import type {
2
+ LanguageModelV3,
3
+ LanguageModelV3CallOptions,
4
+ LanguageModelV3Content,
5
+ LanguageModelV3FinishReason,
6
+ LanguageModelV3StreamPart,
7
+ LanguageModelV3Usage,
8
+ ProviderV3,
9
+ } from "@ai-sdk/provider";
10
+ import { MockLLMService } from "@/test-utils/mock-llm/MockLLMService";
11
+ import type { MockLLMConfig, MockMessage, MockToolCall } from "@/test-utils/mock-llm/types";
12
+ import { logger } from "@/utils/logger";
13
+ import { MockLanguageModelV3 } from "ai/test";
14
+
15
+ const buildUsage = (inputTotal: number, outputTotal: number): LanguageModelV3Usage => ({
16
+ inputTokens: {
17
+ total: inputTotal,
18
+ noCache: inputTotal,
19
+ cacheRead: 0,
20
+ cacheWrite: 0,
21
+ },
22
+ outputTokens: {
23
+ total: outputTotal,
24
+ text: outputTotal,
25
+ reasoning: 0,
26
+ },
27
+ });
28
+
29
+ const buildFinishReason = (hasToolCalls: boolean): LanguageModelV3FinishReason => ({
30
+ unified: hasToolCalls ? "tool-calls" : "stop",
31
+ raw: hasToolCalls ? "tool-calls" : "stop",
32
+ });
33
+
34
+ const formatToolInput = (toolCall: MockToolCall): string => {
35
+ if (toolCall.params) {
36
+ return JSON.stringify(toolCall.params);
37
+ }
38
+
39
+ if (typeof toolCall.args === "string") {
40
+ return toolCall.args;
41
+ }
42
+
43
+ if (toolCall.args) {
44
+ return JSON.stringify(toolCall.args);
45
+ }
46
+
47
+ return "{}";
48
+ };
49
+
50
+ const formatToolName = (toolCall: MockToolCall): string => {
51
+ return toolCall.name ?? toolCall.function ?? "unknown";
52
+ };
53
+
54
+ const formatMessageContent = (
55
+ content: LanguageModelV3CallOptions["prompt"][number]["content"]
56
+ ): string => {
57
+ if (typeof content === "string") {
58
+ return content;
59
+ }
60
+
61
+ return content
62
+ .map((part) => (part.type === "text" ? part.text : "[non-text content]"))
63
+ .join(" ");
64
+ };
65
+
66
+ const toMockMessages = (prompt: LanguageModelV3CallOptions["prompt"]): MockMessage[] => {
67
+ return prompt.map((message) => ({
68
+ role: message.role,
69
+ content: formatMessageContent(message.content),
70
+ }));
71
+ };
72
+
73
+ /**
74
+ * Creates a mock provider that integrates MockLLMService with AI SDK
75
+ * This allows us to use the mock service through the standard LLMServiceFactory
76
+ */
77
+ export function createMockProvider(config?: MockLLMConfig): ProviderV3 {
78
+ const mockService = new MockLLMService(config);
79
+
80
+ // Create a factory function that returns a language model
81
+ const createLanguageModel = (modelId: string): LanguageModelV3 => {
82
+ logger.info(`[MockProvider] Creating language model for: ${modelId}`);
83
+
84
+ const doGenerate: LanguageModelV3["doGenerate"] = async (options) => {
85
+ const messages = options.prompt;
86
+
87
+ logger.debug("[MockProvider] doGenerate called", {
88
+ messageCount: messages.length,
89
+ toolCount: options.tools?.length ?? 0,
90
+ });
91
+
92
+ if (messages.length === 0) {
93
+ logger.warn("[MockProvider] doGenerate called with no messages");
94
+ return {
95
+ content: [
96
+ { type: "text", text: "Mock response: no messages provided" },
97
+ ],
98
+ finishReason: buildFinishReason(false),
99
+ usage: buildUsage(0, 0),
100
+ warnings: [],
101
+ response: {
102
+ id: `mock-${Date.now()}`,
103
+ timestamp: new Date(),
104
+ modelId,
105
+ },
106
+ };
107
+ }
108
+
109
+ // Convert AI SDK messages to our Message format
110
+ const convertedMessages = toMockMessages(messages);
111
+
112
+ // Call MockLLMService
113
+ const response = await mockService.complete({
114
+ messages: convertedMessages,
115
+ options: {
116
+ configName: modelId,
117
+ },
118
+ });
119
+
120
+ const content: LanguageModelV3Content[] = [];
121
+
122
+ // Add text content if present
123
+ if (response.content) {
124
+ content.push({ type: "text", text: response.content });
125
+ }
126
+
127
+ // Add tool calls if present
128
+ if (response.toolCalls) {
129
+ response.toolCalls.forEach((toolCall, index) => {
130
+ content.push({
131
+ type: "tool-call",
132
+ toolCallId: `call_${index}`,
133
+ toolName: formatToolName(toolCall),
134
+ input: formatToolInput(toolCall),
135
+ });
136
+ });
137
+ }
138
+
139
+ return {
140
+ content,
141
+ finishReason: buildFinishReason(Boolean(response.toolCalls?.length)),
142
+ usage: buildUsage(
143
+ response.usage?.prompt_tokens ?? 100,
144
+ response.usage?.completion_tokens ?? 50
145
+ ),
146
+ warnings: [],
147
+ response: {
148
+ id: `mock-${Date.now()}`,
149
+ timestamp: new Date(),
150
+ modelId,
151
+ },
152
+ };
153
+ };
154
+
155
+ const doStream: LanguageModelV3["doStream"] = async (options) => {
156
+ const messages = options.prompt;
157
+
158
+ logger.debug("[MockProvider] doStream called", {
159
+ messageCount: messages.length,
160
+ toolCount: options.tools?.length ?? 0,
161
+ });
162
+
163
+ if (messages.length === 0) {
164
+ logger.warn("[MockProvider] doStream called with no messages");
165
+ const stream = new ReadableStream<LanguageModelV3StreamPart>({
166
+ start(controller) {
167
+ const textId = `text-${Date.now()}`;
168
+ controller.enqueue({ type: "stream-start", warnings: [] });
169
+ controller.enqueue({ type: "text-start", id: textId });
170
+ controller.enqueue({
171
+ type: "text-delta",
172
+ id: textId,
173
+ delta: "Mock response: no messages provided",
174
+ });
175
+ controller.enqueue({ type: "text-end", id: textId });
176
+ controller.enqueue({
177
+ type: "finish",
178
+ finishReason: buildFinishReason(false),
179
+ usage: buildUsage(0, 0),
180
+ });
181
+ controller.close();
182
+ },
183
+ });
184
+ return {
185
+ stream,
186
+ };
187
+ }
188
+
189
+ // Convert messages
190
+ const convertedMessages = toMockMessages(messages);
191
+
192
+ // Get the mock service's stream
193
+ const streamEvents = mockService.stream({
194
+ messages: convertedMessages,
195
+ options: {
196
+ configName: modelId,
197
+ },
198
+ });
199
+
200
+ // Create a ReadableStream that emits AI SDK v3 stream parts
201
+ const stream = new ReadableStream<LanguageModelV3StreamPart>({
202
+ async start(controller) {
203
+ let textId: string | null = null;
204
+ let sawToolCall = false;
205
+ let toolCallIndex = 0;
206
+
207
+ const ensureTextStart = (): void => {
208
+ if (!textId) {
209
+ textId = `text-${Date.now()}`;
210
+ controller.enqueue({ type: "text-start", id: textId });
211
+ }
212
+ };
213
+
214
+ controller.enqueue({ type: "stream-start", warnings: [] });
215
+
216
+ try {
217
+ for await (const event of streamEvents) {
218
+ switch (event.type) {
219
+ case "content":
220
+ ensureTextStart();
221
+ controller.enqueue({
222
+ type: "text-delta",
223
+ id: textId ?? "text-unknown",
224
+ delta: event.content ?? "",
225
+ });
226
+ break;
227
+
228
+ case "tool_start": {
229
+ if (!event.tool) break;
230
+ sawToolCall = true;
231
+ const toolCallId = `call_${toolCallIndex++}`;
232
+ controller.enqueue({
233
+ type: "tool-call",
234
+ toolCallId,
235
+ toolName: event.tool,
236
+ input: JSON.stringify(event.args ?? {}),
237
+ });
238
+ break;
239
+ }
240
+
241
+ case "done": {
242
+ if (textId) {
243
+ controller.enqueue({ type: "text-end", id: textId });
244
+ }
245
+ controller.enqueue({
246
+ type: "finish",
247
+ finishReason: buildFinishReason(sawToolCall),
248
+ usage: buildUsage(
249
+ event.response?.usage?.prompt_tokens ?? 100,
250
+ event.response?.usage?.completion_tokens ?? 50
251
+ ),
252
+ });
253
+ break;
254
+ }
255
+
256
+ case "error": {
257
+ controller.enqueue({
258
+ type: "error",
259
+ error: new Error(event.error ?? "Unknown error"),
260
+ });
261
+ break;
262
+ }
263
+ }
264
+ }
265
+
266
+ controller.close();
267
+ } catch (error) {
268
+ controller.error(error);
269
+ }
270
+ },
271
+ });
272
+
273
+ return {
274
+ stream,
275
+ };
276
+ };
277
+
278
+ return new MockLanguageModelV3({
279
+ provider: "mock",
280
+ modelId: modelId || "mock-model",
281
+ doGenerate,
282
+ doStream,
283
+ });
284
+ };
285
+
286
+ // Create a custom provider that can handle any model ID
287
+ const provider: ProviderV3 = {
288
+ specificationVersion: "v3",
289
+ languageModel: (modelId: string) => {
290
+ return createLanguageModel(modelId);
291
+ },
292
+ embeddingModel: () => {
293
+ throw new Error("Mock provider does not support embedding models");
294
+ },
295
+ imageModel: () => {
296
+ throw new Error("Mock provider does not support image models");
297
+ },
298
+ transcriptionModel: () => {
299
+ throw new Error("Mock provider does not support transcription models");
300
+ },
301
+ speechModel: () => {
302
+ throw new Error("Mock provider does not support speech models");
303
+ },
304
+ rerankingModel: () => {
305
+ throw new Error("Mock provider does not support reranking models");
306
+ },
307
+ };
308
+
309
+ return provider;
310
+ }
311
+
312
+ /**
313
+ * Global mock service instance for test configuration
314
+ */
315
+ let globalMockService: MockLLMService | null = null;
316
+
317
+ /**
318
+ * Get or create the global mock service
319
+ */
320
+ export function getGlobalMockService(config?: MockLLMConfig): MockLLMService {
321
+ if (!globalMockService) {
322
+ globalMockService = new MockLLMService(config);
323
+ }
324
+ return globalMockService;
325
+ }
326
+
327
+ /**
328
+ * Reset the global mock service
329
+ */
330
+ export function resetGlobalMockService(): void {
331
+ globalMockService = null;
332
+ }