@agentprojectcontext/apx 1.24.0 → 1.27.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 (718) hide show
  1. package/package.json +42 -12
  2. package/skills/apx/SKILL.md +50 -119
  3. package/skills/apx-agency-agents/SKILL.md +141 -0
  4. package/skills/apx-agent/SKILL.md +100 -0
  5. package/skills/apx-mcp/SKILL.md +114 -0
  6. package/skills/apx-mcp-builder/SKILL.md +186 -0
  7. package/skills/apx-project/SKILL.md +100 -0
  8. package/skills/apx-routine/SKILL.md +138 -0
  9. package/skills/apx-runtime/SKILL.md +115 -0
  10. package/skills/apx-sessions/SKILL.md +281 -0
  11. package/skills/apx-skill-builder/SKILL.md +149 -0
  12. package/skills/apx-task/SKILL.md +95 -0
  13. package/skills/apx-telegram/SKILL.md +115 -0
  14. package/skills/apx-voice/SKILL.md +135 -0
  15. package/src/core/agent/constants.js +3 -0
  16. package/src/core/agent/ghost-guard.js +24 -0
  17. package/src/core/agent/index.js +35 -0
  18. package/src/core/agent/model-router.js +257 -0
  19. package/src/core/agent/prompt-builder.js +313 -0
  20. package/src/core/agent/prompts/channels/api.md +7 -0
  21. package/src/core/agent/prompts/channels/cli.md +6 -0
  22. package/src/core/agent/prompts/channels/code.md +20 -0
  23. package/src/core/agent/prompts/channels/deck.md +6 -0
  24. package/src/core/agent/prompts/channels/desktop.md +24 -0
  25. package/src/core/agent/prompts/channels/routine.md +9 -0
  26. package/src/core/agent/prompts/channels/telegram.md +9 -0
  27. package/src/core/agent/prompts/channels/terminal.md +16 -0
  28. package/src/core/agent/prompts/channels/web.md +7 -0
  29. package/src/core/agent/prompts/channels/web_sidebar.md +7 -0
  30. package/src/core/agent/prompts/modes/voice.md +4 -0
  31. package/src/core/agent/prompts/super-agent-base.md +42 -0
  32. package/src/core/agent/pseudo-tools.js +40 -0
  33. package/src/core/agent/retry.js +85 -0
  34. package/src/core/agent/run-agent.js +423 -0
  35. package/src/core/agent/self-memory.js +155 -0
  36. package/src/{daemon → core/agent}/tool-call-parser.js +83 -10
  37. package/src/core/agent/tools-overlap.js +66 -0
  38. package/src/core/apc-skill-sync.js +97 -0
  39. package/src/core/code-sessions-store.js +150 -0
  40. package/src/core/config.js +473 -11
  41. package/src/core/desktop/autostart.js +162 -0
  42. package/src/core/engines/_health.js +63 -0
  43. package/src/{daemon → core}/engines/anthropic.js +16 -0
  44. package/src/core/engines/gemini.js +168 -0
  45. package/src/core/engines/groq.js +8 -0
  46. package/src/{daemon → core}/engines/index.js +3 -1
  47. package/src/{daemon → core}/engines/mock.js +22 -0
  48. package/src/{daemon → core}/engines/ollama.js +35 -0
  49. package/src/core/engines/openai-compatible.js +145 -0
  50. package/src/core/engines/openai.js +8 -0
  51. package/src/core/engines/openrouter.js +8 -0
  52. package/src/core/git-baseline.js +147 -0
  53. package/src/core/identity.js +21 -0
  54. package/src/core/logging.js +1 -1
  55. package/src/core/mcp/index.js +14 -0
  56. package/src/{daemon/mcp-runner.js → core/mcp/runner.js} +18 -6
  57. package/src/core/mcp/sources.js +246 -0
  58. package/src/core/memory/active-threads.js +124 -0
  59. package/src/core/memory/broker.js +144 -0
  60. package/src/core/memory/compactor.js +186 -0
  61. package/src/core/memory/embed-engines/gemini.js +62 -0
  62. package/src/core/memory/embed-engines/index.js +148 -0
  63. package/src/core/memory/embed-engines/ollama.js +55 -0
  64. package/src/core/memory/embed-engines/openai.js +64 -0
  65. package/src/core/memory/embed-engines/tf.js +20 -0
  66. package/src/core/memory/embeddings.js +132 -0
  67. package/src/core/memory/index.js +161 -0
  68. package/src/core/memory/indexer.js +257 -0
  69. package/src/core/memory/store.js +231 -0
  70. package/src/core/messages-store.js +143 -25
  71. package/src/core/parser.js +78 -16
  72. package/src/core/scaffold.js +175 -79
  73. package/src/core/tasks-store.js +264 -0
  74. package/src/core/telegram-identity.js +126 -0
  75. package/src/core/tools/index.js +6 -0
  76. package/src/core/voice/engines/elevenlabs.js +96 -0
  77. package/src/core/voice/engines/gemini.js +148 -0
  78. package/src/core/voice/engines/index.js +144 -0
  79. package/src/core/voice/engines/mock.js +59 -0
  80. package/src/core/voice/engines/openai.js +82 -0
  81. package/src/core/voice/engines/piper.js +93 -0
  82. package/src/core/voice/index.js +3 -0
  83. package/src/core/voice/tts.js +89 -0
  84. package/src/{daemon → host/daemon}/apc-runtime-context.js +1 -1
  85. package/src/host/daemon/api/admin-config.js +159 -0
  86. package/src/host/daemon/api/admin.js +72 -0
  87. package/src/host/daemon/api/agents.js +284 -0
  88. package/src/host/daemon/api/artifacts.js +52 -0
  89. package/src/host/daemon/api/code.js +351 -0
  90. package/src/host/daemon/api/config.js +104 -0
  91. package/src/host/daemon/api/connections.js +42 -0
  92. package/src/host/daemon/api/conversations.js +161 -0
  93. package/src/host/daemon/api/deck.js +511 -0
  94. package/src/host/daemon/api/desktop.js +71 -0
  95. package/src/host/daemon/api/embeddings.js +65 -0
  96. package/src/host/daemon/api/engines.js +80 -0
  97. package/src/host/daemon/api/exec.js +193 -0
  98. package/src/host/daemon/api/health.js +10 -0
  99. package/src/host/daemon/api/identity.js +36 -0
  100. package/src/host/daemon/api/mcps.js +205 -0
  101. package/src/host/daemon/api/messages.js +83 -0
  102. package/src/host/daemon/api/pairing.js +194 -0
  103. package/src/host/daemon/api/plugins.js +19 -0
  104. package/src/host/daemon/api/projects.js +35 -0
  105. package/src/host/daemon/api/routines.js +84 -0
  106. package/src/host/daemon/api/run.js +55 -0
  107. package/src/host/daemon/api/runtimes.js +219 -0
  108. package/src/host/daemon/api/sessions-search.js +177 -0
  109. package/src/host/daemon/api/sessions.js +115 -0
  110. package/src/host/daemon/api/shared.js +217 -0
  111. package/src/host/daemon/api/super-agent.js +208 -0
  112. package/src/host/daemon/api/tasks.js +118 -0
  113. package/src/host/daemon/api/telegram.js +325 -0
  114. package/src/host/daemon/api/tools.js +21 -0
  115. package/src/host/daemon/api/top-level.js +131 -0
  116. package/src/host/daemon/api/transcribe.js +35 -0
  117. package/src/host/daemon/api/tts.js +44 -0
  118. package/src/host/daemon/api/voice.js +519 -0
  119. package/src/host/daemon/api/web.js +123 -0
  120. package/src/host/daemon/api.js +152 -0
  121. package/src/{daemon → host/daemon}/compact.js +1 -1
  122. package/src/{daemon → host/daemon}/db.js +19 -5
  123. package/src/{daemon/overlay-ws.js → host/daemon/desktop-ws.js} +7 -7
  124. package/src/host/daemon/engine-sessions.js +245 -0
  125. package/src/{daemon → host/daemon}/index.js +27 -10
  126. package/src/{daemon/plugins/overlay.js → host/daemon/plugins/desktop.js} +36 -28
  127. package/src/{daemon → host/daemon}/plugins/index.js +2 -2
  128. package/src/{daemon → host/daemon}/plugins/telegram.js +165 -33
  129. package/src/{daemon → host/daemon}/project-config.js +31 -7
  130. package/src/{daemon → host/daemon}/routines.js +27 -8
  131. package/src/{daemon → host/daemon}/skills-loader.js +4 -2
  132. package/src/{daemon → host/daemon}/smoke.js +9 -5
  133. package/src/{daemon → host/daemon}/super-agent-tools/helpers.js +1 -1
  134. package/src/host/daemon/super-agent-tools/index.js +157 -0
  135. package/src/{daemon → host/daemon}/super-agent-tools/registry-bridge.js +1 -1
  136. package/src/{daemon → host/daemon}/super-agent-tools/tools/add-project.js +2 -2
  137. package/src/{daemon → host/daemon}/super-agent-tools/tools/ask-questions.js +4 -0
  138. package/src/{daemon → host/daemon}/super-agent-tools/tools/call-agent.js +5 -2
  139. package/src/{daemon → host/daemon}/super-agent-tools/tools/call-runtime.js +117 -8
  140. package/src/host/daemon/super-agent-tools/tools/create-task.js +52 -0
  141. package/src/{daemon → host/daemon}/super-agent-tools/tools/import-agent.js +2 -3
  142. package/src/{daemon → host/daemon}/super-agent-tools/tools/list-agents.js +1 -1
  143. package/src/host/daemon/super-agent-tools/tools/list-tasks.js +52 -0
  144. package/src/{daemon → host/daemon}/super-agent-tools/tools/list-vault-agents.js +1 -1
  145. package/src/host/daemon/super-agent-tools/tools/read-self-memory.js +21 -0
  146. package/src/host/daemon/super-agent-tools/tools/remember.js +40 -0
  147. package/src/{daemon → host/daemon}/super-agent-tools/tools/search-messages.js +1 -1
  148. package/src/host/daemon/super-agent-tools/tools/search-sessions.js +134 -0
  149. package/src/{daemon → host/daemon}/super-agent-tools/tools/send-telegram.js +2 -2
  150. package/src/{daemon → host/daemon}/super-agent-tools/tools/set-identity.js +1 -1
  151. package/src/{daemon → host/daemon}/super-agent-tools/tools/set-permission-mode.js +1 -1
  152. package/src/{daemon → host/daemon}/super-agent-tools/tools/tail-messages.js +1 -1
  153. package/src/host/daemon/super-agent.js +129 -0
  154. package/src/host/daemon/token-store.js +118 -0
  155. package/src/host/daemon/tool-call-parser.js +2 -0
  156. package/src/{daemon → host/daemon}/transcription.js +1 -1
  157. package/src/{daemon → host/daemon}/wakeup.js +2 -2
  158. package/src/interfaces/cli/claude-permissions.js +33 -0
  159. package/src/{cli → interfaces/cli}/commands/agent.js +43 -8
  160. package/src/{cli → interfaces/cli}/commands/command.js +1 -1
  161. package/src/{cli → interfaces/cli}/commands/config.js +1 -1
  162. package/src/{cli → interfaces/cli}/commands/daemon.js +67 -0
  163. package/src/interfaces/cli/commands/desktop.js +335 -0
  164. package/src/interfaces/cli/commands/exec.js +92 -0
  165. package/src/{cli → interfaces/cli}/commands/identity.js +6 -63
  166. package/src/{cli → interfaces/cli}/commands/init.js +1 -1
  167. package/src/{cli → interfaces/cli}/commands/mcp.js +69 -10
  168. package/src/{cli → interfaces/cli}/commands/memory.js +2 -2
  169. package/src/interfaces/cli/commands/model.js +136 -0
  170. package/src/interfaces/cli/commands/pair.js +170 -0
  171. package/src/interfaces/cli/commands/project-config.js +131 -0
  172. package/src/{cli → interfaces/cli}/commands/project.js +1 -1
  173. package/src/{cli → interfaces/cli}/commands/search.js +1 -1
  174. package/src/interfaces/cli/commands/session.js +892 -0
  175. package/src/interfaces/cli/commands/sessions.js +997 -0
  176. package/src/{cli → interfaces/cli}/commands/setup.js +98 -4
  177. package/src/{cli → interfaces/cli}/commands/skills.js +117 -9
  178. package/src/{cli → interfaces/cli}/commands/status.js +9 -1
  179. package/src/{cli → interfaces/cli}/commands/sys.js +96 -17
  180. package/src/interfaces/cli/commands/task.js +179 -0
  181. package/src/interfaces/cli/commands/telegram.js +366 -0
  182. package/src/{cli → interfaces/cli}/commands/update.js +1 -1
  183. package/src/interfaces/cli/commands/voice.js +258 -0
  184. package/src/{cli → interfaces/cli}/http.js +6 -2
  185. package/src/{cli → interfaces/cli}/index.js +955 -63
  186. package/src/interfaces/cli/postinstall.js +34 -0
  187. package/src/interfaces/desktop/assets/app-icon-180.png +0 -0
  188. package/src/interfaces/desktop/assets/app-icon-32.png +0 -0
  189. package/src/interfaces/desktop/assets/app-icon.png +0 -0
  190. package/src/interfaces/desktop/assets/apx-logo.png +0 -0
  191. package/src/interfaces/desktop/assets/superagent.png +0 -0
  192. package/src/interfaces/desktop/assets/tray-icon.png +0 -0
  193. package/src/interfaces/desktop/index.html +18 -0
  194. package/src/interfaces/desktop/main.js +652 -0
  195. package/src/interfaces/desktop/preload.js +48 -0
  196. package/src/interfaces/desktop/renderer.js +1006 -0
  197. package/src/interfaces/desktop/style.css +400 -0
  198. package/src/{mcp → interfaces/mcp-server}/index.js +2 -2
  199. package/src/interfaces/tui/_shims/util-which.ts +53 -0
  200. package/src/{tui → interfaces/tui}/app.tsx +2 -2
  201. package/src/{tui → interfaces/tui}/component/prompt/index.tsx +4 -1
  202. package/src/{tui → interfaces/tui}/context/sdk-apx.tsx +84 -16
  203. package/src/interfaces/tui/context/sync-apx.tsx +398 -0
  204. package/src/interfaces/tui/routes/session/index.tsx +368 -0
  205. package/src/interfaces/tui/routes/session/message-actions.tsx +58 -0
  206. package/src/interfaces/tui/routes/session/sidebar-apx.tsx +114 -0
  207. package/src/{tui → interfaces/tui}/tsconfig.json +1 -0
  208. package/src/{tui → interfaces/tui}/util/clipboard.ts +1 -1
  209. package/src/interfaces/web/README.md +102 -0
  210. package/src/interfaces/web/coming-soon.html +65 -0
  211. package/src/interfaces/web/components.json +25 -0
  212. package/src/interfaces/web/dist/assets/index-BDUsA6L6.css +1 -0
  213. package/src/interfaces/web/dist/assets/index-CfWyjPBa.js +548 -0
  214. package/src/interfaces/web/dist/assets/index-CfWyjPBa.js.map +1 -0
  215. package/src/interfaces/web/dist/favicon/dark/android-chrome-192x192.png +0 -0
  216. package/src/interfaces/web/dist/favicon/dark/android-chrome-512x512.png +0 -0
  217. package/src/interfaces/web/dist/favicon/dark/apple-touch-icon.png +0 -0
  218. package/src/interfaces/web/dist/favicon/dark/favicon-16x16.png +0 -0
  219. package/src/interfaces/web/dist/favicon/dark/favicon-32x32.png +0 -0
  220. package/src/interfaces/web/dist/favicon/dark/favicon-48x48.png +0 -0
  221. package/src/interfaces/web/dist/favicon/dark/favicon.ico +0 -0
  222. package/src/interfaces/web/dist/favicon/dark/favicon.webp +0 -0
  223. package/src/interfaces/web/dist/favicon/dark/site.webmanifest +18 -0
  224. package/src/interfaces/web/dist/favicon/white/android-chrome-192x192.png +0 -0
  225. package/src/interfaces/web/dist/favicon/white/android-chrome-512x512.png +0 -0
  226. package/src/interfaces/web/dist/favicon/white/apple-touch-icon.png +0 -0
  227. package/src/interfaces/web/dist/favicon/white/favicon-16x16.png +0 -0
  228. package/src/interfaces/web/dist/favicon/white/favicon-32x32.png +0 -0
  229. package/src/interfaces/web/dist/favicon/white/favicon-48x48.png +0 -0
  230. package/src/interfaces/web/dist/favicon/white/favicon.ico +0 -0
  231. package/src/interfaces/web/dist/favicon/white/favicon.webp +0 -0
  232. package/src/interfaces/web/dist/favicon/white/site.webmanifest +18 -0
  233. package/src/interfaces/web/dist/index.html +27 -0
  234. package/src/interfaces/web/dist/logo/logo_dark.webp +0 -0
  235. package/src/interfaces/web/dist/logo/logo_only_dark.webp +0 -0
  236. package/src/interfaces/web/dist/logo/logo_only_white.webp +0 -0
  237. package/src/interfaces/web/dist/logo/logo_vertical_dark.webp +0 -0
  238. package/src/interfaces/web/dist/logo/logo_vertical_white.webp +0 -0
  239. package/src/interfaces/web/dist/logo/logo_white.webp +0 -0
  240. package/src/interfaces/web/dist/modules/superagent.png +0 -0
  241. package/src/interfaces/web/index.html +26 -0
  242. package/src/interfaces/web/package-lock.json +4253 -0
  243. package/src/interfaces/web/package.json +55 -0
  244. package/src/interfaces/web/playwright.config.ts +45 -0
  245. package/src/interfaces/web/pnpm-lock.yaml +2946 -0
  246. package/src/interfaces/web/public/favicon/dark/android-chrome-192x192.png +0 -0
  247. package/src/interfaces/web/public/favicon/dark/android-chrome-512x512.png +0 -0
  248. package/src/interfaces/web/public/favicon/dark/apple-touch-icon.png +0 -0
  249. package/src/interfaces/web/public/favicon/dark/favicon-16x16.png +0 -0
  250. package/src/interfaces/web/public/favicon/dark/favicon-32x32.png +0 -0
  251. package/src/interfaces/web/public/favicon/dark/favicon-48x48.png +0 -0
  252. package/src/interfaces/web/public/favicon/dark/favicon.ico +0 -0
  253. package/src/interfaces/web/public/favicon/dark/favicon.webp +0 -0
  254. package/src/interfaces/web/public/favicon/dark/site.webmanifest +18 -0
  255. package/src/interfaces/web/public/favicon/white/android-chrome-192x192.png +0 -0
  256. package/src/interfaces/web/public/favicon/white/android-chrome-512x512.png +0 -0
  257. package/src/interfaces/web/public/favicon/white/apple-touch-icon.png +0 -0
  258. package/src/interfaces/web/public/favicon/white/favicon-16x16.png +0 -0
  259. package/src/interfaces/web/public/favicon/white/favicon-32x32.png +0 -0
  260. package/src/interfaces/web/public/favicon/white/favicon-48x48.png +0 -0
  261. package/src/interfaces/web/public/favicon/white/favicon.ico +0 -0
  262. package/src/interfaces/web/public/favicon/white/favicon.webp +0 -0
  263. package/src/interfaces/web/public/favicon/white/site.webmanifest +18 -0
  264. package/src/interfaces/web/public/logo/logo_dark.webp +0 -0
  265. package/src/interfaces/web/public/logo/logo_only_dark.webp +0 -0
  266. package/src/interfaces/web/public/logo/logo_only_white.webp +0 -0
  267. package/src/interfaces/web/public/logo/logo_vertical_dark.webp +0 -0
  268. package/src/interfaces/web/public/logo/logo_vertical_white.webp +0 -0
  269. package/src/interfaces/web/public/logo/logo_white.webp +0 -0
  270. package/src/interfaces/web/public/modules/superagent.png +0 -0
  271. package/src/interfaces/web/src/App.tsx +199 -0
  272. package/src/interfaces/web/src/components/AddProjectDialog.tsx +121 -0
  273. package/src/interfaces/web/src/components/ModelCombobox.tsx +96 -0
  274. package/src/interfaces/web/src/components/RobyBubble.tsx +213 -0
  275. package/src/interfaces/web/src/components/Section.tsx +44 -0
  276. package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +97 -0
  277. package/src/interfaces/web/src/components/TelegramSendDialog.tsx +48 -0
  278. package/src/interfaces/web/src/components/Toast.tsx +84 -0
  279. package/src/interfaces/web/src/components/UiSelect.tsx +74 -0
  280. package/src/interfaces/web/src/components/chat/Composer.tsx +43 -0
  281. package/src/interfaces/web/src/components/chat/ContextBar.tsx +111 -0
  282. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +95 -0
  283. package/src/interfaces/web/src/components/chat/MessageList.tsx +35 -0
  284. package/src/interfaces/web/src/components/chat/ModelPicker.tsx +145 -0
  285. package/src/interfaces/web/src/components/chat/ToolCall.tsx +141 -0
  286. package/src/interfaces/web/src/components/code/CodeChangesTab.tsx +87 -0
  287. package/src/interfaces/web/src/components/code/CodeComposer.tsx +87 -0
  288. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +83 -0
  289. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +39 -0
  290. package/src/interfaces/web/src/components/code/CodeSessionList.tsx +97 -0
  291. package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +44 -0
  292. package/src/interfaces/web/src/components/code/CodeToolTrail.tsx +29 -0
  293. package/src/interfaces/web/src/components/code/DiffView.tsx +67 -0
  294. package/src/interfaces/web/src/components/common/Qr.tsx +27 -0
  295. package/src/interfaces/web/src/components/common/TabLayout.tsx +46 -0
  296. package/src/interfaces/web/src/components/common/TabNav.tsx +113 -0
  297. package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +202 -0
  298. package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +42 -0
  299. package/src/interfaces/web/src/components/config/global-config-sections.ts +60 -0
  300. package/src/interfaces/web/src/components/config/project-config-sections.ts +58 -0
  301. package/src/interfaces/web/src/components/deck/DaemonCard.tsx +58 -0
  302. package/src/interfaces/web/src/components/deck/DesktopGroup.tsx +33 -0
  303. package/src/interfaces/web/src/components/deck/WidgetRow.tsx +100 -0
  304. package/src/interfaces/web/src/components/layout/Logo.tsx +59 -0
  305. package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +116 -0
  306. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +151 -0
  307. package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +45 -0
  308. package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +72 -0
  309. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +232 -0
  310. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +60 -0
  311. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +127 -0
  312. package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +69 -0
  313. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +226 -0
  314. package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +175 -0
  315. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +93 -0
  316. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +90 -0
  317. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +101 -0
  318. package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +100 -0
  319. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +108 -0
  320. package/src/interfaces/web/src/components/settings/TelegramSettingsTabs.tsx +55 -0
  321. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +95 -0
  322. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +405 -0
  323. package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +155 -0
  324. package/src/interfaces/web/src/components/settings/providers/types.ts +26 -0
  325. package/src/interfaces/web/src/components/ui/accordion.tsx +72 -0
  326. package/src/interfaces/web/src/components/ui/alert-dialog.tsx +187 -0
  327. package/src/interfaces/web/src/components/ui/alert.tsx +76 -0
  328. package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +22 -0
  329. package/src/interfaces/web/src/components/ui/avatar.tsx +107 -0
  330. package/src/interfaces/web/src/components/ui/badge.tsx +52 -0
  331. package/src/interfaces/web/src/components/ui/breadcrumb.tsx +125 -0
  332. package/src/interfaces/web/src/components/ui/button-group.tsx +87 -0
  333. package/src/interfaces/web/src/components/ui/button.tsx +58 -0
  334. package/src/interfaces/web/src/components/ui/calendar.tsx +221 -0
  335. package/src/interfaces/web/src/components/ui/card.tsx +103 -0
  336. package/src/interfaces/web/src/components/ui/carousel.tsx +242 -0
  337. package/src/interfaces/web/src/components/ui/chart.tsx +371 -0
  338. package/src/interfaces/web/src/components/ui/chat-input.tsx +122 -0
  339. package/src/interfaces/web/src/components/ui/checkbox.tsx +29 -0
  340. package/src/interfaces/web/src/components/ui/collapsible.tsx +19 -0
  341. package/src/interfaces/web/src/components/ui/combobox.tsx +295 -0
  342. package/src/interfaces/web/src/components/ui/command.tsx +196 -0
  343. package/src/interfaces/web/src/components/ui/context-menu.tsx +271 -0
  344. package/src/interfaces/web/src/components/ui/dialog.tsx +158 -0
  345. package/src/interfaces/web/src/components/ui/direction.tsx +4 -0
  346. package/src/interfaces/web/src/components/ui/drawer.tsx +134 -0
  347. package/src/interfaces/web/src/components/ui/dropdown-menu.tsx +266 -0
  348. package/src/interfaces/web/src/components/ui/empty.tsx +104 -0
  349. package/src/interfaces/web/src/components/ui/field.tsx +236 -0
  350. package/src/interfaces/web/src/components/ui/hover-card.tsx +51 -0
  351. package/src/interfaces/web/src/components/ui/input-group.tsx +158 -0
  352. package/src/interfaces/web/src/components/ui/input-otp.tsx +85 -0
  353. package/src/interfaces/web/src/components/ui/input.tsx +20 -0
  354. package/src/interfaces/web/src/components/ui/item.tsx +201 -0
  355. package/src/interfaces/web/src/components/ui/kbd.tsx +26 -0
  356. package/src/interfaces/web/src/components/ui/label.tsx +20 -0
  357. package/src/interfaces/web/src/components/ui/menubar.tsx +280 -0
  358. package/src/interfaces/web/src/components/ui/native-select.tsx +61 -0
  359. package/src/interfaces/web/src/components/ui/navigation-menu.tsx +168 -0
  360. package/src/interfaces/web/src/components/ui/pagination.tsx +130 -0
  361. package/src/interfaces/web/src/components/ui/popover.tsx +88 -0
  362. package/src/interfaces/web/src/components/ui/progress.tsx +83 -0
  363. package/src/interfaces/web/src/components/ui/radio-group.tsx +36 -0
  364. package/src/interfaces/web/src/components/ui/resizable.tsx +50 -0
  365. package/src/interfaces/web/src/components/ui/scroll-area.tsx +53 -0
  366. package/src/interfaces/web/src/components/ui/select.tsx +201 -0
  367. package/src/interfaces/web/src/components/ui/separator.tsx +23 -0
  368. package/src/interfaces/web/src/components/ui/sheet.tsx +138 -0
  369. package/src/interfaces/web/src/components/ui/sidebar.tsx +723 -0
  370. package/src/interfaces/web/src/components/ui/skeleton.tsx +13 -0
  371. package/src/interfaces/web/src/components/ui/slider.tsx +52 -0
  372. package/src/interfaces/web/src/components/ui/sonner.tsx +49 -0
  373. package/src/interfaces/web/src/components/ui/spinner.tsx +10 -0
  374. package/src/interfaces/web/src/components/ui/switch.tsx +30 -0
  375. package/src/interfaces/web/src/components/ui/table.tsx +116 -0
  376. package/src/interfaces/web/src/components/ui/tabs.tsx +72 -0
  377. package/src/interfaces/web/src/components/ui/textarea.tsx +18 -0
  378. package/src/interfaces/web/src/components/ui/tip.tsx +21 -0
  379. package/src/interfaces/web/src/components/ui/toggle-group.tsx +87 -0
  380. package/src/interfaces/web/src/components/ui/toggle.tsx +45 -0
  381. package/src/interfaces/web/src/components/ui/tooltip.tsx +64 -0
  382. package/src/interfaces/web/src/components/ui.tsx +211 -0
  383. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +197 -0
  384. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +213 -0
  385. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +72 -0
  386. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +112 -0
  387. package/src/interfaces/web/src/components/voice/useTtsPlayer.ts +59 -0
  388. package/src/interfaces/web/src/constants/index.ts +91 -0
  389. package/src/interfaces/web/src/hooks/use-mobile.ts +19 -0
  390. package/src/interfaces/web/src/hooks/useChat.ts +276 -0
  391. package/src/interfaces/web/src/hooks/useDaemonStatus.ts +12 -0
  392. package/src/interfaces/web/src/hooks/useDevices.ts +12 -0
  393. package/src/interfaces/web/src/hooks/useEngines.ts +10 -0
  394. package/src/interfaces/web/src/hooks/useGlobalConfig.ts +24 -0
  395. package/src/interfaces/web/src/hooks/useIdentity.ts +16 -0
  396. package/src/interfaces/web/src/hooks/useProjects.ts +27 -0
  397. package/src/interfaces/web/src/hooks/useTelegram.ts +35 -0
  398. package/src/interfaces/web/src/hooks/useTheme.tsx +57 -0
  399. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +122 -0
  400. package/src/interfaces/web/src/i18n/en.ts +767 -0
  401. package/src/interfaces/web/src/i18n/es.ts +770 -0
  402. package/src/interfaces/web/src/i18n/index.ts +86 -0
  403. package/src/interfaces/web/src/lib/api/admin.ts +30 -0
  404. package/src/interfaces/web/src/lib/api/agents.ts +46 -0
  405. package/src/interfaces/web/src/lib/api/code.ts +122 -0
  406. package/src/interfaces/web/src/lib/api/conversations.ts +16 -0
  407. package/src/interfaces/web/src/lib/api/deck.ts +106 -0
  408. package/src/interfaces/web/src/lib/api/desktop.ts +54 -0
  409. package/src/interfaces/web/src/lib/api/embeddings.ts +44 -0
  410. package/src/interfaces/web/src/lib/api/engines.ts +17 -0
  411. package/src/interfaces/web/src/lib/api/filesystem.ts +12 -0
  412. package/src/interfaces/web/src/lib/api/health.ts +6 -0
  413. package/src/interfaces/web/src/lib/api/identity.ts +7 -0
  414. package/src/interfaces/web/src/lib/api/mcps.ts +29 -0
  415. package/src/interfaces/web/src/lib/api/messages.ts +24 -0
  416. package/src/interfaces/web/src/lib/api/projects.ts +29 -0
  417. package/src/interfaces/web/src/lib/api/routines.ts +14 -0
  418. package/src/interfaces/web/src/lib/api/sessions.ts +16 -0
  419. package/src/interfaces/web/src/lib/api/super_agent.ts +29 -0
  420. package/src/interfaces/web/src/lib/api/tasks.ts +19 -0
  421. package/src/interfaces/web/src/lib/api/telegram.ts +57 -0
  422. package/src/interfaces/web/src/lib/api/tools.ts +13 -0
  423. package/src/interfaces/web/src/lib/api/voice.ts +169 -0
  424. package/src/interfaces/web/src/lib/api.ts +48 -0
  425. package/src/interfaces/web/src/lib/cn.ts +6 -0
  426. package/src/interfaces/web/src/lib/code-context.ts +83 -0
  427. package/src/interfaces/web/src/lib/config-values.ts +29 -0
  428. package/src/interfaces/web/src/lib/device.ts +10 -0
  429. package/src/interfaces/web/src/lib/http.ts +104 -0
  430. package/src/interfaces/web/src/lib/secrets.ts +15 -0
  431. package/src/interfaces/web/src/lib/utils.ts +6 -0
  432. package/src/interfaces/web/src/main.tsx +16 -0
  433. package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +174 -0
  434. package/src/interfaces/web/src/screens/PairingScreen.tsx +105 -0
  435. package/src/interfaces/web/src/screens/ProjectScreen.tsx +178 -0
  436. package/src/interfaces/web/src/screens/SettingsScreen.tsx +111 -0
  437. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +274 -0
  438. package/src/interfaces/web/src/screens/base/ComingSoon.tsx +16 -0
  439. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +53 -0
  440. package/src/interfaces/web/src/screens/base/LogsTab.tsx +188 -0
  441. package/src/interfaces/web/src/screens/base/ModelsTab.tsx +13 -0
  442. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +58 -0
  443. package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +49 -0
  444. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +295 -0
  445. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +173 -0
  446. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +304 -0
  447. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +174 -0
  448. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +152 -0
  449. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +455 -0
  450. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +364 -0
  451. package/src/interfaces/web/src/screens/project/ChatTab.tsx +198 -0
  452. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +94 -0
  453. package/src/interfaces/web/src/screens/project/McpsTab.tsx +149 -0
  454. package/src/interfaces/web/src/screens/project/MemoriesTab.tsx +134 -0
  455. package/src/interfaces/web/src/screens/project/Overview.tsx +37 -0
  456. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +386 -0
  457. package/src/interfaces/web/src/screens/project/TasksTab.tsx +116 -0
  458. package/src/interfaces/web/src/screens/project/TelegramTab.tsx +126 -0
  459. package/src/interfaces/web/src/screens/project/ThreadsTab.tsx +100 -0
  460. package/src/interfaces/web/src/styles.css +128 -0
  461. package/src/interfaces/web/src/types/daemon.ts +289 -0
  462. package/src/interfaces/web/tailwind.config.js +53 -0
  463. package/src/interfaces/web/tsconfig.json +24 -0
  464. package/src/interfaces/web/vite.config.ts +50 -0
  465. package/src/cli/commands/exec.js +0 -56
  466. package/src/cli/commands/overlay.js +0 -253
  467. package/src/cli/commands/session.js +0 -395
  468. package/src/cli/commands/sessions.js +0 -517
  469. package/src/cli/commands/telegram.js +0 -77
  470. package/src/cli/postinstall.js +0 -75
  471. package/src/cli-ts/commands/agent.ts +0 -173
  472. package/src/cli-ts/commands/chat.ts +0 -119
  473. package/src/cli-ts/commands/daemon.ts +0 -112
  474. package/src/cli-ts/commands/exec.ts +0 -109
  475. package/src/cli-ts/commands/mcp.ts +0 -235
  476. package/src/cli-ts/commands/session.ts +0 -224
  477. package/src/cli-ts/commands/status.ts +0 -61
  478. package/src/cli-ts/http.ts +0 -36
  479. package/src/cli-ts/index.ts +0 -73
  480. package/src/cli-ts/ui.ts +0 -107
  481. package/src/daemon/api.js +0 -1558
  482. package/src/daemon/engines/gemini.js +0 -56
  483. package/src/daemon/engines/openai.js +0 -79
  484. package/src/daemon/mcp-sources.js +0 -114
  485. package/src/daemon/super-agent-tools/index.js +0 -84
  486. package/src/daemon/super-agent-tools.js +0 -1
  487. package/src/daemon/super-agent.js +0 -541
  488. package/src/overlay/index.html +0 -44
  489. package/src/overlay/main.js +0 -480
  490. package/src/overlay/preload.js +0 -34
  491. package/src/overlay/renderer.js +0 -371
  492. package/src/overlay/style.css +0 -250
  493. package/src/tui/context/sync-apx.tsx +0 -284
  494. package/src/tui/routes/session/index.tsx +0 -274
  495. package/src/tui/routes/session/sidebar-apx.tsx +0 -90
  496. /package/src/{daemon → core}/tools/browser.js +0 -0
  497. /package/src/{daemon → core}/tools/fetch.js +0 -0
  498. /package/src/{daemon → core}/tools/glob.js +0 -0
  499. /package/src/{daemon → core}/tools/grep.js +0 -0
  500. /package/src/{daemon → core}/tools/registry.js +0 -0
  501. /package/src/{daemon → core}/tools/search.js +0 -0
  502. /package/src/{daemon → host/daemon}/conversations.js +0 -0
  503. /package/src/{daemon → host/daemon}/env-detect.js +0 -0
  504. /package/src/{daemon → host/daemon}/runtimes/_spawn.js +0 -0
  505. /package/src/{daemon → host/daemon}/runtimes/aider.js +0 -0
  506. /package/src/{daemon → host/daemon}/runtimes/claude-code.js +0 -0
  507. /package/src/{daemon → host/daemon}/runtimes/codex.js +0 -0
  508. /package/src/{daemon → host/daemon}/runtimes/cursor-agent.js +0 -0
  509. /package/src/{daemon → host/daemon}/runtimes/gemini-cli.js +0 -0
  510. /package/src/{daemon → host/daemon}/runtimes/index.js +0 -0
  511. /package/src/{daemon → host/daemon}/runtimes/opencode.js +0 -0
  512. /package/src/{daemon → host/daemon}/runtimes/qwen-code.js +0 -0
  513. /package/src/{daemon → host/daemon}/super-agent-tools/tools/call-mcp.js +0 -0
  514. /package/src/{daemon → host/daemon}/super-agent-tools/tools/edit-file.js +0 -0
  515. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-files.js +0 -0
  516. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-mcps.js +0 -0
  517. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-projects.js +0 -0
  518. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-skills.js +0 -0
  519. /package/src/{daemon → host/daemon}/super-agent-tools/tools/load-skill.js +0 -0
  520. /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-agent-memory.js +0 -0
  521. /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-file.js +0 -0
  522. /package/src/{daemon → host/daemon}/super-agent-tools/tools/run-shell.js +0 -0
  523. /package/src/{daemon → host/daemon}/super-agent-tools/tools/search-files.js +0 -0
  524. /package/src/{daemon → host/daemon}/super-agent-tools/tools/transcribe-audio.js +0 -0
  525. /package/src/{daemon → host/daemon}/super-agent-tools/tools/write-file.js +0 -0
  526. /package/src/{daemon → host/daemon}/thinking.js +0 -0
  527. /package/src/{daemon → host/daemon}/whisper-server.py +0 -0
  528. /package/src/{daemon → host/daemon}/whisper-transcribe.py +0 -0
  529. /package/src/{cli → interfaces/cli}/commands/a2a.js +0 -0
  530. /package/src/{cli → interfaces/cli}/commands/artifact.js +0 -0
  531. /package/src/{cli → interfaces/cli}/commands/chat.js +0 -0
  532. /package/src/{cli → interfaces/cli}/commands/log.js +0 -0
  533. /package/src/{cli → interfaces/cli}/commands/messages.js +0 -0
  534. /package/src/{cli → interfaces/cli}/commands/plugins.js +0 -0
  535. /package/src/{cli → interfaces/cli}/commands/routine.js +0 -0
  536. /package/src/{cli → interfaces/cli}/commands/runtime.js +0 -0
  537. /package/src/{cli → interfaces/cli}/terminal-chat/renderer.js +0 -0
  538. /package/src/{overlay → interfaces/desktop}/package.json +0 -0
  539. /package/src/{tui → interfaces/tui}/_shims/cli-error.ts +0 -0
  540. /package/src/{tui → interfaces/tui}/_shims/cli-logo.ts +0 -0
  541. /package/src/{tui → interfaces/tui}/_shims/cli-ui.ts +0 -0
  542. /package/src/{tui → interfaces/tui}/_shims/config-console-state.ts +0 -0
  543. /package/src/{tui → interfaces/tui}/_shims/core-any.ts +0 -0
  544. /package/src/{tui → interfaces/tui}/_shims/core-binary.ts +0 -0
  545. /package/src/{tui → interfaces/tui}/_shims/core-flag.ts +0 -0
  546. /package/src/{tui → interfaces/tui}/_shims/core-log.ts +0 -0
  547. /package/src/{tui → interfaces/tui}/_shims/lsp-language.ts +0 -0
  548. /package/src/{tui → interfaces/tui}/_shims/opencode-any.ts +0 -0
  549. /package/src/{tui → interfaces/tui}/_shims/opencode-sdk-v2.ts +0 -0
  550. /package/src/{tui → interfaces/tui}/_shims/plugin-tui.ts +0 -0
  551. /package/src/{tui → interfaces/tui}/_shims/prompt-display.ts +0 -0
  552. /package/src/{tui → interfaces/tui}/_shims/provider-provider.ts +0 -0
  553. /package/src/{tui → interfaces/tui}/_shims/session-retry.ts +0 -0
  554. /package/src/{tui → interfaces/tui}/_shims/session-schema.ts +0 -0
  555. /package/src/{tui → interfaces/tui}/_shims/session-session.ts +0 -0
  556. /package/src/{tui → interfaces/tui}/_shims/snapshot.ts +0 -0
  557. /package/src/{tui → interfaces/tui}/_shims/tool-any.ts +0 -0
  558. /package/src/{tui → interfaces/tui}/_shims/util-error.ts +0 -0
  559. /package/src/{tui → interfaces/tui}/_shims/util-filesystem.ts +0 -0
  560. /package/src/{tui → interfaces/tui}/_shims/util-format.ts +0 -0
  561. /package/src/{tui → interfaces/tui}/_shims/util-iife.ts +0 -0
  562. /package/src/{tui → interfaces/tui}/_shims/util-locale.ts +0 -0
  563. /package/src/{tui → interfaces/tui}/_shims/util-process.ts +0 -0
  564. /package/src/{tui → interfaces/tui}/asset/charge.wav +0 -0
  565. /package/src/{tui → interfaces/tui}/asset/pulse-a.wav +0 -0
  566. /package/src/{tui → interfaces/tui}/asset/pulse-b.wav +0 -0
  567. /package/src/{tui → interfaces/tui}/asset/pulse-c.wav +0 -0
  568. /package/src/{tui → interfaces/tui}/attach.ts +0 -0
  569. /package/src/{tui → interfaces/tui}/component/bg-pulse-render.ts +0 -0
  570. /package/src/{tui → interfaces/tui}/component/bg-pulse.tsx +0 -0
  571. /package/src/{tui → interfaces/tui}/component/border.tsx +0 -0
  572. /package/src/{tui → interfaces/tui}/component/dialog-agent.tsx +0 -0
  573. /package/src/{tui → interfaces/tui}/component/dialog-console-org.tsx +0 -0
  574. /package/src/{tui → interfaces/tui}/component/dialog-mcp.tsx +0 -0
  575. /package/src/{tui → interfaces/tui}/component/dialog-model.tsx +0 -0
  576. /package/src/{tui → interfaces/tui}/component/dialog-provider.tsx +0 -0
  577. /package/src/{tui → interfaces/tui}/component/dialog-retry-action.tsx +0 -0
  578. /package/src/{tui → interfaces/tui}/component/dialog-session-delete-failed.tsx +0 -0
  579. /package/src/{tui → interfaces/tui}/component/dialog-session-list.tsx +0 -0
  580. /package/src/{tui → interfaces/tui}/component/dialog-session-rename.tsx +0 -0
  581. /package/src/{tui → interfaces/tui}/component/dialog-skill.tsx +0 -0
  582. /package/src/{tui → interfaces/tui}/component/dialog-stash.tsx +0 -0
  583. /package/src/{tui → interfaces/tui}/component/dialog-status.tsx +0 -0
  584. /package/src/{tui → interfaces/tui}/component/dialog-tag.tsx +0 -0
  585. /package/src/{tui → interfaces/tui}/component/dialog-theme-list.tsx +0 -0
  586. /package/src/{tui → interfaces/tui}/component/dialog-variant.tsx +0 -0
  587. /package/src/{tui → interfaces/tui}/component/dialog-workspace-create.tsx +0 -0
  588. /package/src/{tui → interfaces/tui}/component/dialog-workspace-file-changes.tsx +0 -0
  589. /package/src/{tui → interfaces/tui}/component/dialog-workspace-unavailable.tsx +0 -0
  590. /package/src/{tui → interfaces/tui}/component/error-component.tsx +0 -0
  591. /package/src/{tui → interfaces/tui}/component/logo.tsx +0 -0
  592. /package/src/{tui → interfaces/tui}/component/plugin-route-missing.tsx +0 -0
  593. /package/src/{tui → interfaces/tui}/component/prompt/autocomplete.tsx +0 -0
  594. /package/src/{tui → interfaces/tui}/component/prompt/cwd.ts +0 -0
  595. /package/src/{tui → interfaces/tui}/component/prompt/frecency.tsx +0 -0
  596. /package/src/{tui → interfaces/tui}/component/prompt/history.tsx +0 -0
  597. /package/src/{tui → interfaces/tui}/component/prompt/part.ts +0 -0
  598. /package/src/{tui → interfaces/tui}/component/prompt/stash.tsx +0 -0
  599. /package/src/{tui → interfaces/tui}/component/prompt/traits.ts +0 -0
  600. /package/src/{tui → interfaces/tui}/component/spinner.tsx +0 -0
  601. /package/src/{tui → interfaces/tui}/component/startup-loading.tsx +0 -0
  602. /package/src/{tui → interfaces/tui}/component/todo-item.tsx +0 -0
  603. /package/src/{tui → interfaces/tui}/component/use-connected.tsx +0 -0
  604. /package/src/{tui → interfaces/tui}/component/workspace-label.tsx +0 -0
  605. /package/src/{tui → interfaces/tui}/config/cwd.ts +0 -0
  606. /package/src/{tui → interfaces/tui}/config/keybind.ts +0 -0
  607. /package/src/{tui → interfaces/tui}/config/tui-migrate.ts +0 -0
  608. /package/src/{tui → interfaces/tui}/config/tui-schema.ts +0 -0
  609. /package/src/{tui → interfaces/tui}/config/tui.ts +0 -0
  610. /package/src/{tui → interfaces/tui}/context/aggregate-failures.ts +0 -0
  611. /package/src/{tui → interfaces/tui}/context/args.tsx +0 -0
  612. /package/src/{tui → interfaces/tui}/context/command-palette.tsx +0 -0
  613. /package/src/{tui → interfaces/tui}/context/directory.ts +0 -0
  614. /package/src/{tui → interfaces/tui}/context/editor-zed.ts +0 -0
  615. /package/src/{tui → interfaces/tui}/context/editor.ts +0 -0
  616. /package/src/{tui → interfaces/tui}/context/event-apx.ts +0 -0
  617. /package/src/{tui → interfaces/tui}/context/event.ts +0 -0
  618. /package/src/{tui → interfaces/tui}/context/exit.tsx +0 -0
  619. /package/src/{tui → interfaces/tui}/context/helper.tsx +0 -0
  620. /package/src/{tui → interfaces/tui}/context/kv.tsx +0 -0
  621. /package/src/{tui → interfaces/tui}/context/local.tsx +0 -0
  622. /package/src/{tui → interfaces/tui}/context/path-format.tsx +0 -0
  623. /package/src/{tui → interfaces/tui}/context/project-apx.tsx +0 -0
  624. /package/src/{tui → interfaces/tui}/context/project.tsx +0 -0
  625. /package/src/{tui → interfaces/tui}/context/prompt.tsx +0 -0
  626. /package/src/{tui → interfaces/tui}/context/route.tsx +0 -0
  627. /package/src/{tui → interfaces/tui}/context/sdk.tsx +0 -0
  628. /package/src/{tui → interfaces/tui}/context/sync-v2.tsx +0 -0
  629. /package/src/{tui → interfaces/tui}/context/sync.tsx +0 -0
  630. /package/src/{tui → interfaces/tui}/context/theme/aura.json +0 -0
  631. /package/src/{tui → interfaces/tui}/context/theme/ayu.json +0 -0
  632. /package/src/{tui → interfaces/tui}/context/theme/carbonfox.json +0 -0
  633. /package/src/{tui → interfaces/tui}/context/theme/catppuccin-frappe.json +0 -0
  634. /package/src/{tui → interfaces/tui}/context/theme/catppuccin-macchiato.json +0 -0
  635. /package/src/{tui → interfaces/tui}/context/theme/catppuccin.json +0 -0
  636. /package/src/{tui → interfaces/tui}/context/theme/cobalt2.json +0 -0
  637. /package/src/{tui → interfaces/tui}/context/theme/cursor.json +0 -0
  638. /package/src/{tui → interfaces/tui}/context/theme/dracula.json +0 -0
  639. /package/src/{tui → interfaces/tui}/context/theme/everforest.json +0 -0
  640. /package/src/{tui → interfaces/tui}/context/theme/flexoki.json +0 -0
  641. /package/src/{tui → interfaces/tui}/context/theme/github.json +0 -0
  642. /package/src/{tui → interfaces/tui}/context/theme/gruvbox.json +0 -0
  643. /package/src/{tui → interfaces/tui}/context/theme/kanagawa.json +0 -0
  644. /package/src/{tui → interfaces/tui}/context/theme/lucent-orng.json +0 -0
  645. /package/src/{tui → interfaces/tui}/context/theme/material.json +0 -0
  646. /package/src/{tui → interfaces/tui}/context/theme/matrix.json +0 -0
  647. /package/src/{tui → interfaces/tui}/context/theme/mercury.json +0 -0
  648. /package/src/{tui → interfaces/tui}/context/theme/monokai.json +0 -0
  649. /package/src/{tui → interfaces/tui}/context/theme/nightowl.json +0 -0
  650. /package/src/{tui → interfaces/tui}/context/theme/nord.json +0 -0
  651. /package/src/{tui → interfaces/tui}/context/theme/one-dark.json +0 -0
  652. /package/src/{tui → interfaces/tui}/context/theme/opencode.json +0 -0
  653. /package/src/{tui → interfaces/tui}/context/theme/orng.json +0 -0
  654. /package/src/{tui → interfaces/tui}/context/theme/osaka-jade.json +0 -0
  655. /package/src/{tui → interfaces/tui}/context/theme/palenight.json +0 -0
  656. /package/src/{tui → interfaces/tui}/context/theme/rosepine.json +0 -0
  657. /package/src/{tui → interfaces/tui}/context/theme/solarized.json +0 -0
  658. /package/src/{tui → interfaces/tui}/context/theme/synthwave84.json +0 -0
  659. /package/src/{tui → interfaces/tui}/context/theme/tokyonight.json +0 -0
  660. /package/src/{tui → interfaces/tui}/context/theme/vercel.json +0 -0
  661. /package/src/{tui → interfaces/tui}/context/theme/vesper.json +0 -0
  662. /package/src/{tui → interfaces/tui}/context/theme/zenburn.json +0 -0
  663. /package/src/{tui → interfaces/tui}/context/theme.tsx +0 -0
  664. /package/src/{tui → interfaces/tui}/context/tui-config.tsx +0 -0
  665. /package/src/{tui → interfaces/tui}/event.ts +0 -0
  666. /package/src/{tui → interfaces/tui}/feature-plugins/home/footer.tsx +0 -0
  667. /package/src/{tui → interfaces/tui}/feature-plugins/home/tips-view.tsx +0 -0
  668. /package/src/{tui → interfaces/tui}/feature-plugins/home/tips.tsx +0 -0
  669. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/context.tsx +0 -0
  670. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/files.tsx +0 -0
  671. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/footer.tsx +0 -0
  672. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/lsp.tsx +0 -0
  673. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/mcp.tsx +0 -0
  674. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/todo.tsx +0 -0
  675. /package/src/{tui → interfaces/tui}/feature-plugins/system/plugins.tsx +0 -0
  676. /package/src/{tui → interfaces/tui}/feature-plugins/system/session-v2.tsx +0 -0
  677. /package/src/{tui → interfaces/tui}/feature-plugins/system/which-key.tsx +0 -0
  678. /package/src/{tui → interfaces/tui}/keymap.tsx +0 -0
  679. /package/src/{tui → interfaces/tui}/layer.ts +0 -0
  680. /package/src/{tui → interfaces/tui}/plugin/api.tsx +0 -0
  681. /package/src/{tui → interfaces/tui}/plugin/command-shim.ts +0 -0
  682. /package/src/{tui → interfaces/tui}/plugin/internal.ts +0 -0
  683. /package/src/{tui → interfaces/tui}/plugin/runtime.ts +0 -0
  684. /package/src/{tui → interfaces/tui}/plugin/slots.tsx +0 -0
  685. /package/src/{tui → interfaces/tui}/routes/home.tsx +0 -0
  686. /package/src/{tui → interfaces/tui}/routes/session/dialog-fork-from-timeline.tsx +0 -0
  687. /package/src/{tui → interfaces/tui}/routes/session/dialog-message.tsx +0 -0
  688. /package/src/{tui → interfaces/tui}/routes/session/dialog-subagent.tsx +0 -0
  689. /package/src/{tui → interfaces/tui}/routes/session/dialog-timeline.tsx +0 -0
  690. /package/src/{tui → interfaces/tui}/routes/session/footer.tsx +0 -0
  691. /package/src/{tui → interfaces/tui}/routes/session/permission.tsx +0 -0
  692. /package/src/{tui → interfaces/tui}/routes/session/question.tsx +0 -0
  693. /package/src/{tui → interfaces/tui}/routes/session/sidebar.tsx +0 -0
  694. /package/src/{tui → interfaces/tui}/routes/session/subagent-footer.tsx +0 -0
  695. /package/src/{tui → interfaces/tui}/run.ts +0 -0
  696. /package/src/{tui → interfaces/tui}/thread.ts +0 -0
  697. /package/src/{tui → interfaces/tui}/ui/dialog-alert.tsx +0 -0
  698. /package/src/{tui → interfaces/tui}/ui/dialog-confirm.tsx +0 -0
  699. /package/src/{tui → interfaces/tui}/ui/dialog-export-options.tsx +0 -0
  700. /package/src/{tui → interfaces/tui}/ui/dialog-help.tsx +0 -0
  701. /package/src/{tui → interfaces/tui}/ui/dialog-prompt.tsx +0 -0
  702. /package/src/{tui → interfaces/tui}/ui/dialog-select.tsx +0 -0
  703. /package/src/{tui → interfaces/tui}/ui/dialog.tsx +0 -0
  704. /package/src/{tui → interfaces/tui}/ui/link.tsx +0 -0
  705. /package/src/{tui → interfaces/tui}/ui/spinner.ts +0 -0
  706. /package/src/{tui → interfaces/tui}/ui/toast.tsx +0 -0
  707. /package/src/{tui → interfaces/tui}/util/editor.ts +0 -0
  708. /package/src/{tui → interfaces/tui}/util/model.ts +0 -0
  709. /package/src/{tui → interfaces/tui}/util/provider-origin.ts +0 -0
  710. /package/src/{tui → interfaces/tui}/util/revert-diff.ts +0 -0
  711. /package/src/{tui → interfaces/tui}/util/scroll.ts +0 -0
  712. /package/src/{tui → interfaces/tui}/util/selection.ts +0 -0
  713. /package/src/{tui → interfaces/tui}/util/signal.ts +0 -0
  714. /package/src/{tui → interfaces/tui}/util/sound.ts +0 -0
  715. /package/src/{tui → interfaces/tui}/util/transcript.ts +0 -0
  716. /package/src/{tui → interfaces/tui}/validate-session.ts +0 -0
  717. /package/src/{tui → interfaces/tui}/win32.ts +0 -0
  718. /package/src/{tui → interfaces/tui}/worker.ts +0 -0
@@ -0,0 +1,8 @@
1
+ import { createOpenAiCompatibleEngine } from "./openai-compatible.js";
2
+
3
+ export default createOpenAiCompatibleEngine({
4
+ id: "openrouter",
5
+ defaultBaseUrl: "https://openrouter.ai/api/v1",
6
+ apiKeyEnv: "OPENROUTER_API_KEY",
7
+ defaultFallbackModel: "openrouter:meta-llama/llama-3.3-70b-instruct",
8
+ });
@@ -0,0 +1,147 @@
1
+ // Git baseline helper for the Code module's "changes" view.
2
+ //
3
+ // A code session records a snapshot of the project's working tree when it
4
+ // starts (the "baseline"). The changes tab later diffs the CURRENT working
5
+ // tree against that baseline, so it shows ONLY what the session touched — not
6
+ // every pre-existing uncommitted change.
7
+ //
8
+ // Both snapshots are taken into a TEMPORARY git index (GIT_INDEX_FILE), so we
9
+ // never touch the user's real index or working tree. `git add -A` honours
10
+ // .gitignore, so ignored paths (node_modules, dist, …) stay out of the diff.
11
+ import { execFileSync } from "node:child_process";
12
+ import os from "node:os";
13
+ import path from "node:path";
14
+ import fs from "node:fs";
15
+ import { randomUUID } from "node:crypto";
16
+
17
+ function git(cwd, args, extraEnv = {}) {
18
+ return execFileSync("git", args, {
19
+ cwd,
20
+ encoding: "utf8",
21
+ maxBuffer: 64 * 1024 * 1024,
22
+ env: { ...process.env, ...extraEnv },
23
+ });
24
+ }
25
+
26
+ function gitSafe(cwd, args, extraEnv = {}) {
27
+ try {
28
+ return git(cwd, args, extraEnv);
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ export function isGitRepo(cwd) {
35
+ if (!cwd) return false;
36
+ const out = gitSafe(cwd, ["rev-parse", "--is-inside-work-tree"]);
37
+ return (out || "").trim() === "true";
38
+ }
39
+
40
+ // Best-effort `git init` so the Code "changes" diff has something to compare
41
+ // against. Non-destructive: it only creates an empty .git (no commit, no index
42
+ // changes). Returns true if the directory is a git repo afterwards. Callers
43
+ // must guard against initializing dirs that shouldn't be repos (e.g. the apx
44
+ // home / default project).
45
+ export function initGitRepo(cwd) {
46
+ if (!cwd) return false;
47
+ if (isGitRepo(cwd)) return true;
48
+ gitSafe(cwd, ["init"]);
49
+ return isGitRepo(cwd);
50
+ }
51
+
52
+ function headSha(cwd) {
53
+ const out = gitSafe(cwd, ["rev-parse", "HEAD"]);
54
+ return out ? out.trim() : null;
55
+ }
56
+
57
+ // Write the CURRENT working-tree state (tracked + untracked, minus .gitignore)
58
+ // to a fresh tree object using a throwaway index. Returns the tree sha.
59
+ function snapshotTree(cwd) {
60
+ const tmpIndex = path.join(os.tmpdir(), `apx-code-idx-${randomUUID()}`);
61
+ const env = { GIT_INDEX_FILE: tmpIndex };
62
+ try {
63
+ // Seed the temp index from HEAD when there is one (empty repos have none).
64
+ if (headSha(cwd)) gitSafe(cwd, ["read-tree", "HEAD"], env);
65
+ git(cwd, ["add", "-A"], env);
66
+ return git(cwd, ["write-tree"], env).trim();
67
+ } finally {
68
+ try {
69
+ fs.rmSync(tmpIndex, { force: true });
70
+ } catch {
71
+ /* ignore */
72
+ }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Capture a baseline of the project's working tree. Non-mutating.
78
+ * Returns { baselineCommit, baselineTree } or null when cwd isn't a git repo.
79
+ */
80
+ export function captureBaseline(cwd) {
81
+ if (!isGitRepo(cwd)) return null;
82
+ let baselineTree;
83
+ try {
84
+ baselineTree = snapshotTree(cwd);
85
+ } catch {
86
+ return null;
87
+ }
88
+ // The commit object is best-effort (handy for debugging); the tree alone is
89
+ // enough to diff against. Force an identity so commit-tree never fails on a
90
+ // machine without user.name/email configured.
91
+ const idEnv = {
92
+ GIT_AUTHOR_NAME: "apx",
93
+ GIT_AUTHOR_EMAIL: "apx@local",
94
+ GIT_COMMITTER_NAME: "apx",
95
+ GIT_COMMITTER_EMAIL: "apx@local",
96
+ };
97
+ const parent = headSha(cwd);
98
+ const args = ["commit-tree", baselineTree, "-m", "apx code session baseline"];
99
+ if (parent) args.push("-p", parent);
100
+ const commit = gitSafe(cwd, args, idEnv);
101
+ return { baselineCommit: commit ? commit.trim() : null, baselineTree };
102
+ }
103
+
104
+ const STATUS_MAP = { A: "added", M: "modified", D: "deleted", T: "modified" };
105
+
106
+ /**
107
+ * Diff the current working tree against a recorded baseline tree.
108
+ * Returns an array of { path, status, additions, deletions, patch }.
109
+ * Renames are split into add+delete (--no-renames) so the UI stays simple.
110
+ */
111
+ export function diffAgainstBaseline(cwd, baselineTree) {
112
+ if (!baselineTree || !isGitRepo(cwd)) return [];
113
+ let currentTree;
114
+ try {
115
+ currentTree = snapshotTree(cwd);
116
+ } catch {
117
+ return [];
118
+ }
119
+ if (currentTree === baselineTree) return [];
120
+
121
+ const base = ["diff", "--no-color", "--no-renames", baselineTree, currentTree];
122
+
123
+ // numstat: "<add>\t<del>\t<path>" (counts are "-" for binary files).
124
+ const counts = new Map();
125
+ const numstat = gitSafe(cwd, [...base, "--numstat"]) || "";
126
+ for (const line of numstat.split("\n")) {
127
+ if (!line.trim()) continue;
128
+ const [add, del, ...rest] = line.split("\t");
129
+ const p = rest.join("\t");
130
+ if (p) counts.set(p, { additions: add === "-" ? null : Number(add), deletions: del === "-" ? null : Number(del) });
131
+ }
132
+
133
+ // name-status drives the file list + status; patch is fetched per file.
134
+ const nameStatus = gitSafe(cwd, [...base, "--name-status"]) || "";
135
+ const files = [];
136
+ for (const line of nameStatus.split("\n")) {
137
+ if (!line.trim()) continue;
138
+ const [code, ...rest] = line.split("\t");
139
+ const p = rest.join("\t");
140
+ if (!p) continue;
141
+ const status = STATUS_MAP[code[0]] || "modified";
142
+ const patch = gitSafe(cwd, [...base, "--", p]) || "";
143
+ const c = counts.get(p) || { additions: null, deletions: null };
144
+ files.push({ path: p, status, additions: c.additions, deletions: c.deletions, patch });
145
+ }
146
+ return files;
147
+ }
@@ -4,6 +4,14 @@ import os from "node:os";
4
4
 
5
5
  export const IDENTITY_PATH = path.join(os.homedir(), ".apx", "identity.json");
6
6
 
7
+ // Stable machine id for the daemon-level "super-agent" mode. Never tied to the
8
+ // persona name, so renaming the persona (identity.json) doesn't break message
9
+ // attribution / history queries.
10
+ export const SUPERAGENT_ACTOR_ID = "super_agent";
11
+
12
+ // Shown when no persona is configured yet. Brand of the app, not a persona.
13
+ export const SUPERAGENT_DISPLAY_FALLBACK = "APX";
14
+
7
15
  export function readIdentity() {
8
16
  try {
9
17
  return JSON.parse(fs.readFileSync(IDENTITY_PATH, "utf8"));
@@ -12,6 +20,19 @@ export function readIdentity() {
12
20
  }
13
21
  }
14
22
 
23
+ // Resolve the super-agent's DISPLAY name (the persona shown to users). Order:
24
+ // identity.json persona → legacy super_agent.name → "APX". This is the single
25
+ // source of truth for "what is the super-agent called"; callers must not read
26
+ // super_agent.name directly. The stable id for storage is SUPERAGENT_ACTOR_ID.
27
+ export function resolveAgentName(globalConfig = {}) {
28
+ const identity = readIdentity();
29
+ return (
30
+ identity?.agent_name ||
31
+ globalConfig?.super_agent?.name ||
32
+ SUPERAGENT_DISPLAY_FALLBACK
33
+ );
34
+ }
35
+
15
36
  export function writeIdentity(fields) {
16
37
  const existing = readIdentity() || {};
17
38
  const now = new Date().toISOString();
@@ -5,7 +5,7 @@ import { APX_HOME } from "./config.js";
5
5
  export const LOG_DIR = path.join(APX_HOME, "logs");
6
6
  export const ERROR_TRACE_PATH = path.join(LOG_DIR, "errors.jsonl");
7
7
  // Unified daemon log. Every module (daemon, telegram, whisper, super-agent,
8
- // tools, overlay) writes here with one consistent format so the user can
8
+ // tools, desktop) writes here with one consistent format so the user can
9
9
  // follow the whole system from a single tail.
10
10
  export const APX_LOG_PATH = path.join(LOG_DIR, "apx.log");
11
11
 
@@ -0,0 +1,14 @@
1
+ export {
2
+ loadAll,
3
+ readApfMcps,
4
+ writeApfMcps,
5
+ readRuntimeMcps,
6
+ writeRuntimeMcps,
7
+ readGlobalMcps,
8
+ writeGlobalMcps,
9
+ runtimeMcpsPath,
10
+ globalMcpsPath,
11
+ SOURCES,
12
+ PROJECT_SOURCES,
13
+ } from "./sources.js";
14
+ export { McpRegistry } from "./runner.js";
@@ -1,7 +1,7 @@
1
1
  // MCP runner: spawn child MCP processes and proxy JSON-RPC tools/call.
2
2
  // Speaks the stdio transport: newline-delimited JSON-RPC 2.0 messages.
3
3
  import { spawn } from "node:child_process";
4
- import { loadAll } from "./mcp-sources.js";
4
+ import { loadAll } from "./sources.js";
5
5
 
6
6
  const DEFAULT_TIMEOUT_MS = 30_000;
7
7
 
@@ -158,17 +158,29 @@ function entryToMeta(e) {
158
158
  }
159
159
 
160
160
  export class McpRegistry {
161
- constructor(projectPath) {
162
- this.projectPath = projectPath;
161
+ // Accepts either the project path string (back-compat) or an object
162
+ // { projectPath, storagePath } so the runtime scope can be aggregated.
163
+ constructor(arg) {
164
+ if (typeof arg === "string" || arg == null) {
165
+ this.projectPath = arg || null;
166
+ this.storagePath = null;
167
+ } else {
168
+ this.projectPath = arg.projectPath || null;
169
+ this.storagePath = arg.storagePath || null;
170
+ }
163
171
  this.processes = new Map(); // mcp name -> McpProcess
164
172
  }
165
173
 
174
+ _load() {
175
+ return loadAll(this.projectPath, { storagePath: this.storagePath });
176
+ }
177
+
166
178
  list() {
167
- return loadAll(this.projectPath).entries.map(entryToMeta);
179
+ return this._load().entries.map(entryToMeta);
168
180
  }
169
181
 
170
182
  conflicts() {
171
- return loadAll(this.projectPath).conflicts;
183
+ return this._load().conflicts;
172
184
  }
173
185
 
174
186
  evict(name) {
@@ -180,7 +192,7 @@ export class McpRegistry {
180
192
  }
181
193
 
182
194
  getByName(name) {
183
- const e = loadAll(this.projectPath).entries.find((x) => x.name === name);
195
+ const e = this._load().entries.find((x) => x.name === name);
184
196
  return e ? entryToMeta(e) : null;
185
197
  }
186
198
 
@@ -0,0 +1,246 @@
1
+ // Multi-source MCP discovery: read MCPs from three primary APX scopes plus
2
+ // configs from coexisting AI tools (Cursor, Claude Code, VS Code, Roo, etc.).
3
+ // All discoverable files are read-only; APX-owned writes target apc / runtime /
4
+ // global only.
5
+ //
6
+ // APX scopes (writable by APX):
7
+ // 1. runtime — <storagePath>/mcps.json (a.k.a. ~/.apx/projects/<apxId>/mcps.json)
8
+ // Per-project, machine-local, NEVER committed. Holds tokens and
9
+ // user-specific endpoints. File is chmod 0600.
10
+ // 2. apc — .apc/mcps.json in the repo. Project-shared, committable.
11
+ // 3. global — ~/.apx/mcps.json (machine-wide). Shared across projects on
12
+ // this machine, not committed.
13
+ //
14
+ // Foreign-IDE scopes (read-only, never written by APX):
15
+ // claude — .mcp.json key: mcpServers
16
+ // cursor — .cursor/mcp.json key: mcpServers
17
+ // vscode — .vscode/mcp.json key: servers (different!)
18
+ // roo — .roo/mcp.json key: mcpServers
19
+ // gemini — .gemini/settings.json key: mcpServers
20
+ //
21
+ // Priority (first wins by name; conflicts are reported):
22
+ // 1. runtime (highest — per-project secrets win)
23
+ // 2. apc (project-shared)
24
+ // 3. claude
25
+ // 4. cursor
26
+ // 5. vscode
27
+ // 6. roo
28
+ // 7. gemini
29
+ // 8. global (lowest — machine-wide fallback)
30
+ //
31
+ // Each entry returns:
32
+ // { name, source, command?, args?, env?, url?, headers?, enabled, raw }
33
+ // `enabled` is APC's extension. Falls back to !disabled if the source uses that
34
+ // instead, then to true.
35
+
36
+ import fs from "node:fs";
37
+ import os from "node:os";
38
+ import path from "node:path";
39
+
40
+ const APX_HOME = path.join(os.homedir(), ".apx");
41
+ const GLOBAL_MCPS_FILE = path.join(APX_HOME, "mcps.json");
42
+ const RUNTIME_MCPS_FILENAME = "mcps.json";
43
+
44
+ // Project-relative sources (file path resolved against projectRoot).
45
+ // `id: 'apc'` is APX's primary project-shared store. The rest are read-only
46
+ // foreign IDE configs included so APC sees what the user already configured.
47
+ export const PROJECT_SOURCES = [
48
+ { id: "apc", file: ".apc/mcps.json", key: "mcpServers" },
49
+ { id: "claude", file: ".mcp.json", key: "mcpServers" },
50
+ { id: "cursor", file: ".cursor/mcp.json", key: "mcpServers" },
51
+ { id: "vscode", file: ".vscode/mcp.json", key: "servers" },
52
+ { id: "roo", file: ".roo/mcp.json", key: "mcpServers" },
53
+ { id: "gemini", file: ".gemini/settings.json", key: "mcpServers" },
54
+ ];
55
+
56
+ // SOURCES is the full ordered list (for discovery/check). Runtime path depends
57
+ // on the storagePath of the project; we expose a placeholder entry whose
58
+ // `file` is left as a hint, but the actual read path is computed in loadAll.
59
+ export const SOURCES = [
60
+ { id: "runtime", file: "~/.apx/projects/<apxId>/mcps.json", key: "mcpServers", scope: "runtime" },
61
+ ...PROJECT_SOURCES.map((s) => ({ ...s, scope: "project" })),
62
+ { id: "global", file: "~/.apx/mcps.json", key: "mcpServers", scope: "global" },
63
+ ];
64
+
65
+ function readJsonSafe(absPath) {
66
+ if (!absPath) return null;
67
+ if (!fs.existsSync(absPath)) return null;
68
+ try {
69
+ return JSON.parse(fs.readFileSync(absPath, "utf8"));
70
+ } catch {
71
+ return null;
72
+ }
73
+ }
74
+
75
+ // Resolve the runtime mcps.json path for a given project. `storagePath` is the
76
+ // project's ~/.apx/projects/<apxId>/ directory.
77
+ export function runtimeMcpsPath(storagePath) {
78
+ if (!storagePath) return null;
79
+ return path.join(storagePath, RUNTIME_MCPS_FILENAME);
80
+ }
81
+
82
+ export function globalMcpsPath() {
83
+ return GLOBAL_MCPS_FILE;
84
+ }
85
+
86
+ // Aggregate all MCP sources for a project, in priority order.
87
+ // Backwards-compatible call signature: loadAll(projectRoot) still works.
88
+ // loadAll(projectRoot) // no runtime
89
+ // loadAll(projectRoot, { storagePath }) // include runtime if file exists
90
+ export function loadAll(projectRoot, opts = {}) {
91
+ const storagePath = opts.storagePath || null;
92
+ const merged = new Map(); // name -> entry (first writer wins)
93
+ const conflicts = []; // [{name, winner, loser}]
94
+ const sourceMap = {}; // sourceId -> count
95
+
96
+ const pipeline = [];
97
+
98
+ // 1. runtime (highest)
99
+ if (storagePath) {
100
+ pipeline.push({
101
+ id: "runtime",
102
+ abs: runtimeMcpsPath(storagePath),
103
+ key: "mcpServers",
104
+ });
105
+ }
106
+
107
+ // 2..N. project-relative sources (apc + IDE configs)
108
+ if (projectRoot) {
109
+ for (const src of PROJECT_SOURCES) {
110
+ pipeline.push({
111
+ id: src.id,
112
+ abs: path.join(projectRoot, src.file),
113
+ key: src.key,
114
+ });
115
+ }
116
+ }
117
+
118
+ // last. global
119
+ pipeline.push({
120
+ id: "global",
121
+ abs: GLOBAL_MCPS_FILE,
122
+ key: "mcpServers",
123
+ });
124
+
125
+ for (const src of pipeline) {
126
+ const raw = readJsonSafe(src.abs);
127
+ if (!raw) continue;
128
+ const dict = raw[src.key] || {};
129
+ sourceMap[src.id] = 0;
130
+ for (const [name, server] of Object.entries(dict)) {
131
+ sourceMap[src.id]++;
132
+ const entry = normalize(name, server, src.id);
133
+ if (merged.has(name)) {
134
+ const winner = merged.get(name);
135
+ conflicts.push({
136
+ name,
137
+ winner: winner.source,
138
+ loser: src.id,
139
+ });
140
+ } else {
141
+ merged.set(name, entry);
142
+ }
143
+ }
144
+ }
145
+ return {
146
+ entries: Array.from(merged.values()),
147
+ conflicts,
148
+ sourceCounts: sourceMap,
149
+ };
150
+ }
151
+
152
+ function normalize(name, server, sourceId) {
153
+ const enabled =
154
+ server.enabled === false
155
+ ? false
156
+ : server.disabled === true
157
+ ? false
158
+ : true;
159
+ return {
160
+ name,
161
+ source: sourceId,
162
+ command: server.command || null,
163
+ args: server.args || [],
164
+ env: server.env || {},
165
+ url: server.url || null,
166
+ headers: server.headers || null,
167
+ transport: server.url ? "http" : "stdio",
168
+ enabled,
169
+ raw: server,
170
+ };
171
+ }
172
+
173
+ // ---------------------------------------------------------------------------
174
+ // apc scope (project-shared, .apc/mcps.json)
175
+ // ---------------------------------------------------------------------------
176
+
177
+ export function readApfMcps(projectRoot) {
178
+ const p = path.join(projectRoot, ".apc", "mcps.json");
179
+ if (!fs.existsSync(p)) return { mcpServers: {} };
180
+ try {
181
+ const json = JSON.parse(fs.readFileSync(p, "utf8"));
182
+ if (!json.mcpServers) json.mcpServers = {};
183
+ return json;
184
+ } catch {
185
+ return { mcpServers: {} };
186
+ }
187
+ }
188
+
189
+ export function writeApfMcps(projectRoot, json) {
190
+ const p = path.join(projectRoot, ".apc", "mcps.json");
191
+ fs.mkdirSync(path.dirname(p), { recursive: true });
192
+ fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
193
+ }
194
+
195
+ // ---------------------------------------------------------------------------
196
+ // runtime scope (per-project, ~/.apx/projects/<apxId>/mcps.json)
197
+ // File is chmod 0600 — may contain tokens.
198
+ // ---------------------------------------------------------------------------
199
+
200
+ export function readRuntimeMcps(storagePath) {
201
+ if (!storagePath) return { mcpServers: {} };
202
+ const p = runtimeMcpsPath(storagePath);
203
+ if (!fs.existsSync(p)) return { mcpServers: {} };
204
+ try {
205
+ const json = JSON.parse(fs.readFileSync(p, "utf8"));
206
+ if (!json.mcpServers) json.mcpServers = {};
207
+ return json;
208
+ } catch {
209
+ return { mcpServers: {} };
210
+ }
211
+ }
212
+
213
+ export function writeRuntimeMcps(storagePath, json) {
214
+ if (!storagePath) throw new Error("writeRuntimeMcps: storagePath required");
215
+ const p = runtimeMcpsPath(storagePath);
216
+ fs.mkdirSync(path.dirname(p), { recursive: true });
217
+ fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
218
+ // Tokens may live in this file — protect it.
219
+ try {
220
+ fs.chmodSync(p, 0o600);
221
+ } catch {
222
+ // chmod is a best-effort on non-POSIX FS (Windows). Ignore errors.
223
+ }
224
+ }
225
+
226
+ // ---------------------------------------------------------------------------
227
+ // global scope (machine-wide, ~/.apx/mcps.json)
228
+ // ---------------------------------------------------------------------------
229
+
230
+ export function readGlobalMcps() {
231
+ const p = GLOBAL_MCPS_FILE;
232
+ if (!fs.existsSync(p)) return { mcpServers: {} };
233
+ try {
234
+ const json = JSON.parse(fs.readFileSync(p, "utf8"));
235
+ if (!json.mcpServers) json.mcpServers = {};
236
+ return json;
237
+ } catch {
238
+ return { mcpServers: {} };
239
+ }
240
+ }
241
+
242
+ export function writeGlobalMcps(json) {
243
+ const p = GLOBAL_MCPS_FILE;
244
+ fs.mkdirSync(path.dirname(p), { recursive: true });
245
+ fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
246
+ }
@@ -0,0 +1,124 @@
1
+ // "Hilos activos en otros canales" — a tiny, recency-based awareness block.
2
+ //
3
+ // Unlike the Memory Broker (semantic RAG + remembered notes), this reads the
4
+ // raw cross-channel message log and surfaces the most recent turn from every
5
+ // channel OTHER than the one the user is on right now, within a short window.
6
+ // It fills the gap where a vague "seguimos?" on the web wouldn't semantically
7
+ // match the deploy thread you had on Telegram 12 minutes ago.
8
+ //
9
+ // Bounded + best-effort: only appears when there's recent cross-channel
10
+ // activity, capped at max_lines bullets. Never throws into the request path.
11
+
12
+ import fs from "node:fs";
13
+ import path from "node:path";
14
+ import { GLOBAL_MESSAGES_DIR } from "../config.js";
15
+ import { parseDayJsonl } from "../messages-store.js";
16
+
17
+ const BODY_CAP = 70;
18
+
19
+ function ago(ts) {
20
+ const then = Date.parse(ts);
21
+ if (!Number.isFinite(then)) return "";
22
+ const mins = Math.max(0, Math.round((Date.now() - then) / 60000));
23
+ if (mins < 60) return `hace ${mins} min`;
24
+ const hrs = Math.round(mins / 60);
25
+ return `hace ${hrs} h`;
26
+ }
27
+
28
+ // Prefer the last USER turn (most recognizable for "lo de antes"); fall back to
29
+ // the last agent turn. Skip tool/system/compact noise and tiny bodies.
30
+ function lastMeaningfulTurn(records) {
31
+ const pick = (pred) => {
32
+ for (let i = records.length - 1; i >= 0; i--) {
33
+ const r = records[i];
34
+ if (!r || r.type === "tool" || r.type === "system" || r.type === "compact") continue;
35
+ if (!pred(r)) continue;
36
+ const body = String(r.body || "").trim();
37
+ if (body.length >= 4) return r;
38
+ }
39
+ return null;
40
+ };
41
+ return (
42
+ pick((r) => r.type === "user" || r.direction === "in") ||
43
+ pick(() => true)
44
+ );
45
+ }
46
+
47
+ function readChannelRecentTurn(baseDir, channel, sinceMs) {
48
+ const dir = path.join(baseDir, channel);
49
+ let files;
50
+ try {
51
+ files = fs.readdirSync(dir).filter((f) => f.endsWith(".jsonl")).sort();
52
+ } catch {
53
+ return null;
54
+ }
55
+ if (!files.length) return null;
56
+ // Last 2 day files cover a window that crosses midnight without reading all.
57
+ let records = [];
58
+ for (const f of files.slice(-2)) {
59
+ try {
60
+ records = records.concat(parseDayJsonl(fs.readFileSync(path.join(dir, f), "utf8")));
61
+ } catch {
62
+ /* skip bad file */
63
+ }
64
+ }
65
+ const turn = lastMeaningfulTurn(records);
66
+ if (!turn) return null;
67
+ const t = Date.parse(turn.ts);
68
+ if (!Number.isFinite(t) || t < sinceMs) return null;
69
+ return turn;
70
+ }
71
+
72
+ // Build the "# Hilos activos en otros canales" block. Returns "" when there's
73
+ // nothing recent on another channel (or the feature is disabled).
74
+ export function buildActiveThreadsBlock(currentChannel, { config, messagesDir } = {}) {
75
+ try {
76
+ const cfg = config?.memory?.active_threads || {};
77
+ if (cfg.enabled === false) return "";
78
+ const windowHours = cfg.window_hours || 6;
79
+ const maxLines = cfg.max_lines || 3;
80
+ const sinceMs = Date.now() - windowHours * 3600_000;
81
+ const baseDir = messagesDir || GLOBAL_MESSAGES_DIR;
82
+
83
+ let channels;
84
+ try {
85
+ channels = fs
86
+ .readdirSync(baseDir, { withFileTypes: true })
87
+ .filter((d) => d.isDirectory())
88
+ .map((d) => d.name);
89
+ } catch {
90
+ return "";
91
+ }
92
+
93
+ const cur = String(currentChannel || "");
94
+ const rows = [];
95
+ for (const ch of channels) {
96
+ if (ch === cur) continue;
97
+ const turn = readChannelRecentTurn(baseDir, ch, sinceMs);
98
+ if (!turn) continue;
99
+ rows.push({
100
+ channel: ch,
101
+ ts: turn.ts,
102
+ body: String(turn.body || "").replace(/\s+/g, " ").trim(),
103
+ });
104
+ }
105
+ if (!rows.length) return "";
106
+ rows.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));
107
+
108
+ const lines = rows.slice(0, maxLines).map((r) => {
109
+ const body = r.body.length > BODY_CAP ? r.body.slice(0, BODY_CAP - 1).trimEnd() + "…" : r.body;
110
+ return `• ${r.channel} — ${ago(r.ts)}: "${body}"`;
111
+ });
112
+
113
+ return [
114
+ "# Hilos activos en otros canales",
115
+ 'Charlas recientes en otras superficies (NO es este chat). Si el usuario dice',
116
+ '"seguimos" / "lo de antes" / "lo de telegram", probablemente sea uno de estos —',
117
+ "retomalo naturalmente; usá search_messages para el detalle exacto.",
118
+ "",
119
+ ...lines,
120
+ ].join("\n");
121
+ } catch {
122
+ return "";
123
+ }
124
+ }