@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,294 @@
1
+ import * as os from "node:os";
2
+ import * as path from "node:path";
3
+ import { ensureDirectory } from "@/lib/fs";
4
+ import { config } from "@/services/ConfigService";
5
+ import { logger } from "@/utils/logger";
6
+ import NDK, { NDKPrivateKeySigner } from "@nostr-dev-kit/ndk";
7
+ import { Command } from "commander";
8
+ import inquirer from "inquirer";
9
+
10
+ export const onboardingCommand = new Command("init")
11
+ .description("Initial setup wizard for TENEX")
12
+ .action(async () => {
13
+ try {
14
+ console.log("\nWelcome to TENEX! Let's get you set up.\n");
15
+
16
+ // Load existing configuration
17
+ const globalPath = config.getGlobalPath();
18
+ await ensureDirectory(globalPath);
19
+ const existingConfig = await config.loadTenexConfig(globalPath);
20
+
21
+ // Step 1: Manage whitelisted pubkeys
22
+ let whitelistedPubkeys = [...(existingConfig.whitelistedPubkeys || [])];
23
+
24
+ // Create temporary NDK instance for fetching users
25
+ const tempNdk = new NDK({
26
+ explicitRelayUrls: [
27
+ "wss://relay.damus.io",
28
+ "wss://nos.lol",
29
+ "wss://relay.nostr.band",
30
+ ],
31
+ });
32
+ await tempNdk.connect();
33
+
34
+ let managingPubkeys = true;
35
+ while (managingPubkeys) {
36
+ // If no pubkeys, go directly to adding one
37
+ if (whitelistedPubkeys.length === 0) {
38
+ const { userIdentifier } = await inquirer.prompt([
39
+ {
40
+ type: "input",
41
+ name: "userIdentifier",
42
+ message: "Enter npub, nprofile, or NIP-05 identifier to whitelist:",
43
+ validate: (input: string) => {
44
+ if (!input || input.trim().length === 0) {
45
+ return "Please enter a valid identifier";
46
+ }
47
+ return true;
48
+ },
49
+ },
50
+ ]);
51
+
52
+ try {
53
+ const user = await tempNdk.getUser({ npub: userIdentifier.trim() });
54
+ if (!user?.pubkey) {
55
+ console.log("❌ Failed to fetch user. Please try again.\n");
56
+ } else {
57
+ whitelistedPubkeys.push(user.pubkey);
58
+ console.log(`✓ Added pubkey: ${user.pubkey}\n`);
59
+ }
60
+ } catch {
61
+ console.log(
62
+ "❌ Failed to fetch user. Please verify the identifier is correct.\n"
63
+ );
64
+ }
65
+ } else {
66
+ // Show existing pubkeys with option to add new or continue
67
+ const choices = [
68
+ ...whitelistedPubkeys.map((pk, idx) => ({
69
+ name: `${idx + 1}. ${pk}`,
70
+ value: `remove:${pk}`,
71
+ })),
72
+ { name: "➕ Add new pubkey", value: "add" },
73
+ { name: "✓ Continue", value: "done" },
74
+ ];
75
+
76
+ const { action } = await inquirer.prompt([
77
+ {
78
+ type: "select",
79
+ name: "action",
80
+ message: "Whitelisted pubkeys (select to remove, or add new):",
81
+ choices,
82
+ },
83
+ ]);
84
+
85
+ if (action === "done") {
86
+ managingPubkeys = false;
87
+ } else if (action === "add") {
88
+ const { userIdentifier } = await inquirer.prompt([
89
+ {
90
+ type: "input",
91
+ name: "userIdentifier",
92
+ message: "Enter npub, nprofile, or NIP-05 identifier:",
93
+ validate: (input: string) => {
94
+ if (!input || input.trim().length === 0) {
95
+ return "Please enter a valid identifier";
96
+ }
97
+ return true;
98
+ },
99
+ },
100
+ ]);
101
+
102
+ try {
103
+ const user = await tempNdk.getUser({ npub: userIdentifier.trim() });
104
+ if (!user?.pubkey) {
105
+ console.log("❌ Failed to fetch user. Please try again.\n");
106
+ } else if (whitelistedPubkeys.includes(user.pubkey)) {
107
+ console.log("⚠️ Pubkey already in whitelist\n");
108
+ } else {
109
+ whitelistedPubkeys.push(user.pubkey);
110
+ console.log(`✓ Added pubkey: ${user.pubkey}\n`);
111
+ }
112
+ } catch {
113
+ console.log(
114
+ "❌ Failed to fetch user. Please verify the identifier is correct.\n"
115
+ );
116
+ }
117
+ } else if (action.startsWith("remove:")) {
118
+ const pubkeyToRemove = action.replace("remove:", "");
119
+ whitelistedPubkeys = whitelistedPubkeys.filter(
120
+ (pk) => pk !== pubkeyToRemove
121
+ );
122
+ console.log("✓ Removed pubkey\n");
123
+ }
124
+ }
125
+ }
126
+
127
+ // Disconnect temporary NDK
128
+ if (tempNdk.pool?.relays) {
129
+ for (const relay of tempNdk.pool.relays.values()) {
130
+ relay.disconnect();
131
+ }
132
+ }
133
+
134
+ if (whitelistedPubkeys.length === 0) {
135
+ logger.error("At least one whitelisted pubkey is required.");
136
+ process.exit(1);
137
+ }
138
+
139
+ // Step 2: Generate or use existing private key for TENEX
140
+ let tenexPrivateKey = existingConfig.tenexPrivateKey;
141
+ if (!tenexPrivateKey) {
142
+ const signer = NDKPrivateKeySigner.generate();
143
+ tenexPrivateKey = signer.privateKey;
144
+ if (!tenexPrivateKey) {
145
+ logger.error("Failed to generate private key");
146
+ process.exit(1);
147
+ }
148
+ }
149
+
150
+ // Step 3: Ask for projects base directory
151
+ const defaultProjectsBase =
152
+ existingConfig.projectsBase || path.join(os.homedir(), "tenex");
153
+ const { projectsBase } = await inquirer.prompt([
154
+ {
155
+ type: "input",
156
+ name: "projectsBase",
157
+ message: "Where should TENEX store your projects?",
158
+ default: defaultProjectsBase,
159
+ },
160
+ ]);
161
+
162
+ // Step 4: Manage relays
163
+ let relays =
164
+ existingConfig.relays && existingConfig.relays.length > 0
165
+ ? [...existingConfig.relays]
166
+ : ["wss://tenex.chat"];
167
+
168
+ let managingRelays = true;
169
+ while (managingRelays) {
170
+ // If no relays, go directly to adding one
171
+ if (relays.length === 0) {
172
+ const { relayUrl } = await inquirer.prompt([
173
+ {
174
+ type: "input",
175
+ name: "relayUrl",
176
+ message: "Enter relay URL (ws:// or wss://):",
177
+ validate: (input: string) => {
178
+ if (!input || input.trim().length === 0) {
179
+ return "Please enter a valid relay URL";
180
+ }
181
+ try {
182
+ const url = new URL(input.trim());
183
+ if (url.protocol !== "ws:" && url.protocol !== "wss:") {
184
+ return "URL must use ws:// or wss:// protocol";
185
+ }
186
+ return true;
187
+ } catch {
188
+ return "Invalid URL format";
189
+ }
190
+ },
191
+ },
192
+ ]);
193
+
194
+ relays.push(relayUrl.trim());
195
+ console.log(`✓ Added relay: ${relayUrl.trim()}\n`);
196
+ } else {
197
+ // Show existing relays with option to add new or continue
198
+ const choices = [
199
+ ...relays.map((relay, idx) => ({
200
+ name: `${idx + 1}. ${relay}`,
201
+ value: `remove:${relay}`,
202
+ })),
203
+ { name: "➕ Add new relay", value: "add" },
204
+ { name: "✓ Continue", value: "done" },
205
+ ];
206
+
207
+ const { action } = await inquirer.prompt([
208
+ {
209
+ type: "select",
210
+ name: "action",
211
+ message: "Relay URLs (select to remove, or add new):",
212
+ choices,
213
+ },
214
+ ]);
215
+
216
+ if (action === "done") {
217
+ managingRelays = false;
218
+ } else if (action === "add") {
219
+ const { relayUrl } = await inquirer.prompt([
220
+ {
221
+ type: "input",
222
+ name: "relayUrl",
223
+ message: "Enter relay URL (ws:// or wss://):",
224
+ validate: (input: string) => {
225
+ if (!input || input.trim().length === 0) {
226
+ return "Please enter a valid relay URL";
227
+ }
228
+ try {
229
+ const url = new URL(input.trim());
230
+ if (url.protocol !== "ws:" && url.protocol !== "wss:") {
231
+ return "URL must use ws:// or wss:// protocol";
232
+ }
233
+ return true;
234
+ } catch {
235
+ return "Invalid URL format";
236
+ }
237
+ },
238
+ },
239
+ ]);
240
+
241
+ const trimmedUrl = relayUrl.trim();
242
+ if (relays.includes(trimmedUrl)) {
243
+ console.log("⚠️ Relay already in list\n");
244
+ } else {
245
+ relays.push(trimmedUrl);
246
+ console.log(`✓ Added relay: ${trimmedUrl}\n`);
247
+ }
248
+ } else if (action.startsWith("remove:")) {
249
+ const relayToRemove = action.replace("remove:", "");
250
+ relays = relays.filter((r) => r !== relayToRemove);
251
+ console.log("✓ Removed relay\n");
252
+ }
253
+ }
254
+ }
255
+
256
+ if (relays.length === 0) {
257
+ logger.warn("No relays configured, adding default relay: wss://tenex.chat");
258
+ relays = ["wss://tenex.chat"];
259
+ }
260
+
261
+ // Save configuration
262
+ const newConfig = {
263
+ ...existingConfig,
264
+ whitelistedPubkeys,
265
+ tenexPrivateKey,
266
+ projectsBase: path.resolve(projectsBase),
267
+ relays,
268
+ };
269
+
270
+ await config.saveGlobalConfig(newConfig);
271
+
272
+ // Create projects directory
273
+ await ensureDirectory(path.resolve(projectsBase));
274
+
275
+ console.log("\n✓ TENEX setup complete!\n");
276
+ console.log("Configuration saved:");
277
+ console.log(
278
+ ` • Whitelisted pubkeys (${whitelistedPubkeys.length}): ${whitelistedPubkeys.join(", ")}`
279
+ );
280
+ console.log(` • Projects directory: ${path.resolve(projectsBase)}`);
281
+ console.log(` • Relays: ${relays.join(", ")}`);
282
+ console.log("\nYou can now start using TENEX!\n");
283
+
284
+ process.exit(0);
285
+ } catch (error: unknown) {
286
+ // Handle SIGINT (Ctrl+C) gracefully
287
+ const errorMessage = error instanceof Error ? error.message : String(error);
288
+ if (errorMessage?.includes("SIGINT") || errorMessage?.includes("force closed")) {
289
+ process.exit(0);
290
+ }
291
+ logger.error(`Setup failed: ${error}`);
292
+ process.exit(1);
293
+ }
294
+ });
@@ -0,0 +1,27 @@
1
+ import * as fileSystem from "@/lib/fs";
2
+ import { runProviderSetup } from "@/llm/utils/provider-setup";
3
+ import { config } from "@/services/ConfigService";
4
+ import { logger } from "@/utils/logger";
5
+ import { Command } from "commander";
6
+
7
+ export const providersCommand = new Command("providers")
8
+ .description("Configure global provider credentials")
9
+ .action(async () => {
10
+ try {
11
+ const globalPath = config.getGlobalPath();
12
+ await fileSystem.ensureDirectory(globalPath);
13
+
14
+ const existingProviders = await config.loadTenexProviders(globalPath);
15
+ const updatedProviders = await runProviderSetup(existingProviders);
16
+
17
+ await config.saveGlobalProviders(updatedProviders);
18
+ logger.info(`✅ Provider credentials saved to ${globalPath}/providers.json`);
19
+ } catch (error: unknown) {
20
+ const errorMessage = error instanceof Error ? error.message : String(error);
21
+ if (errorMessage?.includes("SIGINT") || errorMessage?.includes("force closed")) {
22
+ return;
23
+ }
24
+ logger.error(`Failed to configure providers: ${error}`);
25
+ process.exitCode = 1;
26
+ }
27
+ });
@@ -0,0 +1,34 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+
4
+ /**
5
+ * Global constants used throughout the TENEX codebase
6
+ */
7
+
8
+ /**
9
+ * Directory names
10
+ */
11
+ export const TENEX_DIR = ".tenex" as const;
12
+
13
+ /**
14
+ * Get the base TENEX directory path.
15
+ * Respects TENEX_BASE_DIR environment variable for running multiple isolated instances.
16
+ *
17
+ * Default: ~/.tenex
18
+ * Override: Set TENEX_BASE_DIR=/path/to/custom/dir
19
+ *
20
+ * @returns The absolute path to the TENEX base directory
21
+ */
22
+ export function getTenexBasePath(): string {
23
+ return process.env.TENEX_BASE_DIR || join(homedir(), TENEX_DIR);
24
+ }
25
+
26
+ /**
27
+ * File names
28
+ */
29
+ export const CONFIG_FILE = "config.json" as const;
30
+ export const MCP_CONFIG_FILE = "mcp.json" as const;
31
+ export const LLMS_FILE = "llms.json" as const;
32
+ export const PROVIDERS_FILE = "providers.json" as const;
33
+
34
+
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Utilities for reading conversation data from disk without full store loading.
3
+ */
4
+
5
+ import { existsSync, readdirSync, readFileSync, statSync } from "fs";
6
+ import { join } from "path";
7
+ import { logger } from "@/utils/logger";
8
+ import type { ConversationEntry } from "./types";
9
+
10
+ /**
11
+ * Read lightweight metadata without loading full conversation store.
12
+ */
13
+ export function readLightweightMetadata(
14
+ basePath: string,
15
+ projectId: string,
16
+ conversationId: string
17
+ ): {
18
+ id: string;
19
+ lastActivity: number;
20
+ title?: string;
21
+ summary?: string;
22
+ lastUserMessage?: string;
23
+ } | null {
24
+ const filePath = join(basePath, projectId, "conversations", `${conversationId}.json`);
25
+
26
+ try {
27
+ if (!existsSync(filePath)) return null;
28
+ const content = readFileSync(filePath, "utf-8");
29
+ const parsed = JSON.parse(content);
30
+
31
+ const messages = parsed.messages ?? [];
32
+ const lastMessage = messages[messages.length - 1];
33
+ const lastActivity = lastMessage?.timestamp || 0;
34
+
35
+ return {
36
+ id: conversationId,
37
+ lastActivity,
38
+ title: parsed.metadata?.title,
39
+ summary: parsed.metadata?.summary,
40
+ lastUserMessage: parsed.metadata?.last_user_message,
41
+ };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Read messages from disk without caching.
49
+ */
50
+ export function readMessagesFromDisk(
51
+ basePath: string,
52
+ projectId: string,
53
+ conversationId: string
54
+ ): ConversationEntry[] | null {
55
+ const filePath = join(basePath, projectId, "conversations", `${conversationId}.json`);
56
+
57
+ try {
58
+ if (!existsSync(filePath)) return null;
59
+ const content = readFileSync(filePath, "utf-8");
60
+ const parsed = JSON.parse(content);
61
+ return parsed.messages ?? [];
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Read conversation preview for a specific project.
69
+ */
70
+ export function readConversationPreviewForProject(
71
+ basePath: string,
72
+ conversationId: string,
73
+ agentPubkey: string,
74
+ projectId: string
75
+ ): {
76
+ id: string;
77
+ lastActivity: number;
78
+ title?: string;
79
+ summary?: string;
80
+ agentParticipated: boolean;
81
+ } | null {
82
+ if (!projectId || projectId.includes("/") || projectId.includes("\\") || projectId.includes("..")) {
83
+ logger.warn(`[ConversationDiskReader] Invalid projectId rejected: "${projectId}"`);
84
+ return null;
85
+ }
86
+
87
+ const filePath = join(basePath, projectId, "conversations", `${conversationId}.json`);
88
+
89
+ try {
90
+ if (!existsSync(filePath)) return null;
91
+ const content = readFileSync(filePath, "utf-8");
92
+ const parsed = JSON.parse(content);
93
+
94
+ const messages: ConversationEntry[] = parsed.messages ?? [];
95
+ const lastMessage = messages[messages.length - 1];
96
+ const lastActivity = lastMessage?.timestamp || 0;
97
+ const agentParticipated = messages.some(msg => msg.pubkey === agentPubkey);
98
+
99
+ return {
100
+ id: conversationId,
101
+ lastActivity,
102
+ title: parsed.metadata?.title,
103
+ summary: parsed.metadata?.summary,
104
+ agentParticipated,
105
+ };
106
+ } catch {
107
+ return null;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * List project IDs from disk.
113
+ */
114
+ export function listProjectIdsFromDisk(basePath: string): string[] {
115
+ try {
116
+ if (!existsSync(basePath)) return [];
117
+ const entries = readdirSync(basePath);
118
+ return entries.filter(entry => {
119
+ const entryPath = join(basePath, entry);
120
+ try {
121
+ return statSync(entryPath).isDirectory();
122
+ } catch {
123
+ return false;
124
+ }
125
+ });
126
+ } catch {
127
+ return [];
128
+ }
129
+ }
130
+
131
+ /**
132
+ * List conversation IDs for a specific project from disk.
133
+ */
134
+ export function listConversationIdsFromDiskForProject(
135
+ basePath: string,
136
+ projectId: string
137
+ ): string[] {
138
+ const conversationsDir = join(basePath, projectId, "conversations");
139
+ try {
140
+ if (!existsSync(conversationsDir)) return [];
141
+ const files = readdirSync(conversationsDir);
142
+ return files
143
+ .filter(file => file.endsWith(".json"))
144
+ .map(file => file.replace(".json", ""));
145
+ } catch {
146
+ return [];
147
+ }
148
+ }