@agentprojectcontext/apx 1.25.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
@@ -1,36 +1,37 @@
1
- // Overlay plugin — voice/floating-window channel for the APX daemon.
1
+ // Desktop plugin — voice/floating-window channel for the APX daemon.
2
2
  //
3
3
  // This plugin:
4
- // 1. Registers as a super-agent channel (type "overlay")
5
- // 2. Routes inbound messages (POST /overlay/message) to the super-agent
6
- // 3. Streams tokens + tool events back to overlay clients via WebSocket
4
+ // 1. Registers as a super-agent channel (type "desktop")
5
+ // 2. Routes inbound messages (POST /desktop/message) to the super-agent
6
+ // 3. Streams tokens + tool events back to desktop clients via WebSocket
7
7
  //
8
- // Overlay history is kept in-memory per session (not persisted to disk).
9
- // Each new overlay window starts a fresh session.
8
+ // Desktop history is kept in-memory per session (not persisted to disk).
9
+ // Each new desktop window starts a fresh session.
10
10
  //
11
11
  // Config (in ~/.apx/config.json):
12
- // "overlay": {
12
+ // "desktop": {
13
13
  // "enabled": true,
14
14
  // "route_to_agent": "", // leave empty = use super-agent
15
15
  // "model": "", // override model; leave empty = super-agent.model
16
16
  // "max_history": 20 // turns to keep in context
17
17
  // }
18
+ // (legacy "overlay" block is still read as a fallback)
18
19
 
19
20
  import {
20
- broadcastOverlay,
21
+ broadcastDesktop,
21
22
  sendToClient,
22
- setOverlayMessageHandler,
23
- } from "../overlay-ws.js";
23
+ setDesktopMessageHandler,
24
+ } from "../desktop-ws.js";
24
25
  import { runSuperAgent, isSuperAgentEnabled } from "../super-agent.js";
25
- import { appendGlobalMessage } from "../../core/messages-store.js";
26
+ import { appendGlobalMessage } from "../../../core/messages-store.js";
26
27
 
27
- const CHANNEL = "overlay";
28
+ const CHANNEL = "desktop";
28
29
 
29
30
  export default {
30
- id: "overlay",
31
+ id: "desktop",
31
32
 
32
33
  init({ projects, config, log, plugins }) {
33
- const cfg = config.overlay || {};
34
+ const cfg = config.desktop || config.overlay || {};
34
35
  const enabled = cfg.enabled !== false; // enabled by default
35
36
 
36
37
  // In-memory conversation history per connected client.
@@ -42,13 +43,13 @@ export default {
42
43
  return histories.get(ws);
43
44
  }
44
45
 
45
- // Handle messages sent from the overlay renderer via WebSocket
46
- setOverlayMessageHandler(async (ws, data) => {
46
+ // Handle messages sent from the desktop renderer via WebSocket
47
+ setDesktopMessageHandler(async (ws, data) => {
47
48
  if (data.type === "message") {
48
49
  await _handleMessage({ ws, text: data.text, previousMessages: getHistory(ws) }, { projects, config, log, plugins, cfg, histories });
49
50
  } else if (data.type === "cancel") {
50
51
  // Signal to abort current generation (handled via AbortController below)
51
- ws._overlayAbort?.abort();
52
+ ws._desktopAbort?.abort();
52
53
  } else if (data.type === "ping") {
53
54
  sendToClient(ws, { type: "pong" });
54
55
  }
@@ -56,15 +57,15 @@ export default {
56
57
 
57
58
  const instance = {
58
59
  start() {
59
- if (enabled) log("overlay: plugin started");
60
+ if (enabled) log("desktop: plugin started");
60
61
  },
61
62
  stop() {},
62
63
  status() { return { enabled }; },
63
64
 
64
- // Called by the /overlay/message REST endpoint
65
+ // Called by the /desktop/message REST endpoint
65
66
  async handleMessage({ text, previousMessages = [] }) {
66
- if (!enabled) throw new Error("overlay plugin not enabled");
67
- broadcastOverlay({ type: "user_message", text });
67
+ if (!enabled) throw new Error("desktop plugin not enabled");
68
+ broadcastDesktop({ type: "user_message", text });
68
69
  await _handleMessage({ ws: null, text, previousMessages }, { projects, config, log, plugins, cfg, histories });
69
70
  },
70
71
  };
@@ -89,14 +90,14 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
89
90
 
90
91
  // AbortController for cancel support
91
92
  const controller = new AbortController();
92
- if (ws) ws._overlayAbort = controller;
93
+ if (ws) ws._desktopAbort = controller;
93
94
 
94
95
  // Emit "thinking" indicator
95
96
  _send(ws, { type: "thinking" });
96
97
 
97
- // Persist to overlay message log
98
+ // Persist to desktop message log
98
99
  try {
99
- await appendGlobalMessage(CHANNEL, { role: "user", content: text, ts: new Date().toISOString() });
100
+ await appendGlobalMessage({ channel: CHANNEL, direction: "in", type: "user", author: "user", body: text });
100
101
  } catch {}
101
102
 
102
103
  let fullResponse = "";
@@ -107,12 +108,15 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
107
108
  throw new Error("super-agent not enabled — set super_agent.enabled + super_agent.model in ~/.apx/config.json");
108
109
  }
109
110
 
111
+ log(`desktop: super-agent turn start — model=${cfg.model || config?.super_agent?.model || "(default)"} text="${text.slice(0, 60)}"`);
112
+ const t0 = Date.now();
110
113
  const result = await runSuperAgent({
111
114
  globalConfig: config,
112
115
  projects,
113
116
  plugins,
114
117
  prompt: text,
115
- contextNote: "# Channel context\nChannel: overlay (floating voice window). Reply concisely.",
118
+ channel: "desktop",
119
+ channelMeta: { voice: true }, // desktop module is voice-first → spoken mode
116
120
  previousMessages: history.slice(0, -1),
117
121
  overrideModel: cfg.model || null,
118
122
  signal: controller.signal,
@@ -134,6 +138,7 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
134
138
  },
135
139
  });
136
140
  const finalText = fullResponse || result.text || "";
141
+ log(`desktop: super-agent turn done in ${Date.now() - t0}ms text_len=${finalText.length}`);
137
142
 
138
143
  // Emit done with full text
139
144
  _send(ws, { type: "done", text: finalText });
@@ -150,14 +155,17 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
150
155
 
151
156
  // Persist assistant response
152
157
  try {
153
- await appendGlobalMessage(CHANNEL, { role: "assistant", content: finalText, ts: new Date().toISOString() });
158
+ await appendGlobalMessage({ channel: CHANNEL, direction: "out", type: "agent", body: finalText });
154
159
  } catch {}
155
160
 
156
161
  } catch (e) {
157
162
  if (e.name === "AbortError") {
158
163
  _send(ws, { type: "cancelled" });
159
164
  } else {
160
- log(`overlay: error${e.message}`);
165
+ // Verbose stack the previous one-liner hid root causes when the
166
+ // model adapter threw inside runSuperAgent's promise chain.
167
+ log(`desktop: error — ${e.message}`);
168
+ console.error("desktop plugin: super-agent threw:", e.stack || e);
161
169
  _send(ws, { type: "error", message: e.message });
162
170
  }
163
171
  }
@@ -167,7 +175,7 @@ function _send(ws, msg) {
167
175
  if (ws) {
168
176
  sendToClient(ws, msg);
169
177
  } else {
170
- broadcastOverlay(msg);
178
+ broadcastDesktop(msg);
171
179
  }
172
180
  }
173
181
 
@@ -13,9 +13,9 @@
13
13
  // Plugins are discovered by static import here. Adding a new plugin = importing
14
14
  // it and pushing into PLUGINS.
15
15
  import telegramPlugin from "./telegram.js";
16
- import overlayPlugin from "./overlay.js";
16
+ import desktopPlugin from "./desktop.js";
17
17
 
18
- export const PLUGINS = [telegramPlugin, overlayPlugin];
18
+ export const PLUGINS = [telegramPlugin, desktopPlugin];
19
19
 
20
20
  export class PluginManager {
21
21
  constructor({ projects, config, log, registries }) {
@@ -29,18 +29,59 @@
29
29
 
30
30
  import fs from "node:fs";
31
31
  import path from "node:path";
32
- import { TELEGRAM_STATE_PATH, APX_HOME } from "../../core/config.js";
33
- import { callEngine } from "../engines/index.js";
32
+ import { TELEGRAM_STATE_PATH, APX_HOME } from "../../../core/config.js";
33
+ import { callEngine } from "../../../core/engines/index.js";
34
34
  import { runSuperAgent, isSuperAgentEnabled } from "../super-agent.js";
35
35
  import { stripThinking } from "../thinking.js";
36
- import { getRecentTelegramTurnsFromFs, appendGlobalMessage } from "../../core/messages-store.js";
37
- import { readAgents } from "../../core/parser.js";
38
- import { buildAgentSystem } from "../../core/agent-system.js";
36
+ import { getRecentTelegramTurnsFromFs, appendGlobalMessage } from "../../../core/messages-store.js";
37
+ import { compactChannelIfNeeded } from "../../../core/memory/index.js";
38
+ import { readAgents } from "../../../core/parser.js";
39
+ import { buildAgentSystem } from "../../../core/agent-system.js";
39
40
  import { transcribe as transcribeAudioFile } from "../transcription.js";
41
+ import { resolveAgentName, SUPERAGENT_ACTOR_ID } from "../../../core/identity.js";
42
+ import { registerSender, resolveAllowedTools } from "../../../core/telegram-identity.js";
43
+ import { buildRelationshipBlock } from "../../../core/agent/index.js";
40
44
 
41
45
  const API_BASE = "https://api.telegram.org";
42
46
  const nowIso = () => new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
43
47
 
48
+ // Build the channelMeta passed to the super-agent loop. The prompt template at
49
+ // src/core/agent/prompts/channels/telegram.md interpolates {{projectBlock}}
50
+ // and {{routeBlock}} verbatim, so we pre-render them as plain text here
51
+ // (the template engine doesn't do conditionals).
52
+ function buildTelegramMeta({ channelName, author, chatId, target, routeToAgent }) {
53
+ const projectBlock = target
54
+ ? `\nProject pin: **${target.name || "(unnamed)"}** (\`${target.path || "?"}\`).\n` +
55
+ "This Telegram channel belongs to that project. Default any " +
56
+ "project-scoped tool call (list_agents, list_tasks, list_mcps, " +
57
+ "list_skills, create_task, list_routines, …) to " +
58
+ `\`${target.name || target.path}\` without asking the user "which ` +
59
+ 'project?". Only ask when they explicitly reference another project ' +
60
+ "by name."
61
+ : "";
62
+ const routeBlock = routeToAgent
63
+ ? `\nMaster agent for this channel: **${routeToAgent}**. Prefer ` +
64
+ `delegating substantive work to that agent via call_agent({ project: ` +
65
+ `"${target?.name || target?.path || ""}", agent: "${routeToAgent}", ` +
66
+ "prompt: <user message> }) rather than answering yourself, unless " +
67
+ "the message is small-talk or a quick factual reply."
68
+ : "";
69
+ return {
70
+ channelName,
71
+ author,
72
+ chatId,
73
+ projectBlock,
74
+ routeBlock,
75
+ // Also expose raw fields for any future surface / log that wants them.
76
+ ...(target ? {
77
+ projectId: String(target.id),
78
+ projectName: target.name || "",
79
+ projectPath: target.path || "",
80
+ } : {}),
81
+ ...(routeToAgent ? { routeToAgent } : {}),
82
+ };
83
+ }
84
+
44
85
  // ---------- media sending helpers -------------------------------------------
45
86
 
46
87
  /**
@@ -394,6 +435,22 @@ class ChannelPoller {
394
435
  : `${msg.from?.first_name || ""} ${msg.from?.last_name || ""}`.trim() || "unknown";
395
436
  const chat_id = msg.chat?.id;
396
437
 
438
+ // Resolve WHO is writing (owner / known contact / guest), keyed by the
439
+ // stable Telegram user_id. Records unknown senders and, on a fresh private
440
+ // channel with no owner yet, claims this sender as the owner. Mutates the
441
+ // in-memory globalConfig in place so later messages in this daemon session
442
+ // see the update. The resulting block is injected into whichever agent
443
+ // answers (super-agent OR a routed project agent).
444
+ const { sender } = registerSender({
445
+ cfg: this.globalConfig,
446
+ channelName: this.channel.name,
447
+ from: msg.from,
448
+ chatType: msg.chat?.type,
449
+ });
450
+ const relationshipBlock = buildRelationshipBlock(sender);
451
+ // Role-based tool gating for the super-agent path (guests → no tools).
452
+ const allowedTools = resolveAllowedTools(this.globalConfig, sender);
453
+
397
454
  // Default Interrupt: abort any running request for this chat_id
398
455
  if (chat_id) {
399
456
  const prev = this.activeRequests.get(chat_id);
@@ -519,9 +576,19 @@ class ChannelPoller {
519
576
  if (chat_id && !isReset) {
520
577
  previousMessages = getRecentTelegramTurnsFromFs({
521
578
  chat_id,
522
- limit: 20,
579
+ keepRecent: 40,
523
580
  max_age_hours: 24,
524
581
  });
582
+ // Progressive compaction (Pieza 3) runs OUT of the reply path: if this
583
+ // chat is over threshold, summarize the oldest turns in the background so
584
+ // the next turn reads a [RESUMEN COMPACTADO] instead of raw history. Never
585
+ // awaited — adds zero latency to this reply, degrades gracefully.
586
+ compactChannelIfNeeded({
587
+ channel: "telegram",
588
+ chat_id,
589
+ config: this.globalConfig,
590
+ log: this.log,
591
+ }).catch(() => {});
525
592
  // Honour a /reset marker: drop everything up to and including it.
526
593
  const lastResetIdx = (() => {
527
594
  for (let i = previousMessages.length - 1; i >= 0; i--) {
@@ -576,8 +643,10 @@ class ChannelPoller {
576
643
  channel: "telegram",
577
644
  direction: "out",
578
645
  type: "agent",
579
- actor_id: "apx",
580
- author: "apx",
646
+ actor_id: SUPERAGENT_ACTOR_ID,
647
+ actor_kind: "superagent",
648
+ agent_slug: SUPERAGENT_ACTOR_ID,
649
+ author: resolveAgentName(this.globalConfig),
581
650
  body: ack,
582
651
  meta: { chat_id, tg_channel: this.channel.name, in_reply_to: u.update_id, reset: true },
583
652
  });
@@ -592,7 +661,11 @@ class ChannelPoller {
592
661
 
593
662
  let replyText;
594
663
  let replyAuthor;
664
+ let replyActorId; // stable id: super_agent | agent slug
665
+ let replyKind; // actor_kind: superagent | agent
595
666
  const projectCfg = target.config || this.globalConfig;
667
+ // Display name for the super-agent persona on this channel (Roby / APX).
668
+ const agentDisplay = resolveAgentName(this.globalConfig);
596
669
 
597
670
  // Try the project's chosen agent first (skipped if the legacy
598
671
  // respond_with_engine === false hint asked to bypass routed agents).
@@ -605,6 +678,7 @@ class ChannelPoller {
605
678
  invocation: "telegram",
606
679
  channel: this.channel.name,
607
680
  caller: author,
681
+ extraParts: [relationshipBlock],
608
682
  });
609
683
  const result = await callEngine({
610
684
  modelId: agent.fields.Model,
@@ -614,10 +688,14 @@ class ChannelPoller {
614
688
  });
615
689
  replyText = result.text;
616
690
  replyAuthor = agent.slug;
691
+ replyActorId = agent.slug;
692
+ replyKind = "agent";
617
693
  } catch (e) {
618
694
  this.log(`telegram[${this.channel.name}] agent reply failed: ${e.message}`);
619
695
  replyText = `[apx error] ${e.message.slice(0, 200)}`;
620
- replyAuthor = "apx";
696
+ replyAuthor = agentDisplay;
697
+ replyActorId = SUPERAGENT_ACTOR_ID;
698
+ replyKind = "superagent";
621
699
  }
622
700
  } else {
623
701
  this.log(
@@ -637,9 +715,41 @@ class ChannelPoller {
637
715
  let saUsage = null;
638
716
  let streamedCount = 0;
639
717
  let lastStreamedText = "";
718
+ // Telegram shows the user ONLY prose — never the tool calls. On an action
719
+ // request the model often jumps straight to a tool with no preamble text,
720
+ // so the user would stare at a silent chat until the final reply. Send one
721
+ // short localized heads-up the moment real work starts (first tool_start),
722
+ // but only if the agent didn't already write its own "on it" line.
723
+ let sentHeadsUp = false;
724
+ const headsUpPhrase = () => {
725
+ const lang = (this.globalConfig?.user?.language || "es").slice(0, 2);
726
+ const byLang = {
727
+ es: "Dale, estoy con eso… 🛠️",
728
+ en: "On it — working on that… 🛠️",
729
+ pt: "Já estou nisso… 🛠️",
730
+ };
731
+ return byLang[lang] || byLang.es;
732
+ };
640
733
  if (!replyText && isSuperAgentEnabled(this.globalConfig)) {
641
734
  const onEvent = async (ev) => {
642
735
  try {
736
+ if (ev.type === "tool_start" && !sentHeadsUp && streamedCount === 0) {
737
+ sentHeadsUp = true;
738
+ const heads = headsUpPhrase();
739
+ await this._send({ chat_id, text: heads });
740
+ appendGlobalMessage({
741
+ channel: "telegram",
742
+ direction: "out",
743
+ type: "agent",
744
+ actor_id: SUPERAGENT_ACTOR_ID,
745
+ actor_kind: "superagent",
746
+ agent_slug: SUPERAGENT_ACTOR_ID,
747
+ author: agentDisplay,
748
+ body: heads,
749
+ meta: { chat_id, tg_channel: this.channel.name, in_reply_to: u.update_id, heads_up: true },
750
+ });
751
+ return;
752
+ }
643
753
  if (ev.type === "assistant_text" && ev.text) {
644
754
  const piece = stripThinking(ev.text).trim();
645
755
  if (!piece) return;
@@ -650,9 +760,10 @@ class ChannelPoller {
650
760
  channel: "telegram",
651
761
  direction: "out",
652
762
  type: "agent",
653
- actor_id: "apx",
654
- agent_slug: "apx",
655
- author: "apx",
763
+ actor_id: SUPERAGENT_ACTOR_ID,
764
+ actor_kind: "superagent",
765
+ agent_slug: SUPERAGENT_ACTOR_ID,
766
+ author: agentDisplay,
656
767
  body: piece,
657
768
  meta: {
658
769
  chat_id,
@@ -670,7 +781,8 @@ class ChannelPoller {
670
781
  direction: "out",
671
782
  type: "tool",
672
783
  actor_id: t.tool,
673
- author: "apx",
784
+ actor_kind: "tool",
785
+ author: agentDisplay,
674
786
  body: `${t.tool}(${JSON.stringify(t.args || {}).slice(0, 200)})`,
675
787
  meta: {
676
788
  chat_id,
@@ -697,12 +809,23 @@ class ChannelPoller {
697
809
  registries: this.registries,
698
810
  prompt: text,
699
811
  previousMessages,
700
- contextNote: `You are replying inside Telegram right now. Telegram channel="${this.channel.name}", author=${author}, chat_id=${chat_id}. Keep the reply plain-text and concise. Previous turns of this chat are included only for local conversational context; re-call tools for facts.`,
812
+ channel: "telegram",
813
+ relationshipBlock,
814
+ allowedTools,
815
+ channelMeta: buildTelegramMeta({
816
+ channelName: this.channel.name,
817
+ author,
818
+ chatId: chat_id,
819
+ target,
820
+ routeToAgent: this.channel.route_to_agent,
821
+ }),
701
822
  signal: abortCtrl.signal,
702
823
  onEvent,
703
824
  });
704
825
  replyText = sa.text;
705
- replyAuthor = sa.name;
826
+ replyAuthor = sa.name || agentDisplay;
827
+ replyActorId = SUPERAGENT_ACTOR_ID;
828
+ replyKind = "superagent";
706
829
  saUsage = sa.usage;
707
830
  } catch (e) {
708
831
  if (abortCtrl.signal.aborted) {
@@ -719,7 +842,9 @@ class ChannelPoller {
719
842
  // turn — otherwise from the chat side it looks like the bot ignored
720
843
  // the message. Keep the message short and non-leaking.
721
844
  replyText = `⚠️ Could not generate a reply right now (${e.message || "internal error"}).`;
722
- replyAuthor = "apx";
845
+ replyAuthor = agentDisplay;
846
+ replyActorId = SUPERAGENT_ACTOR_ID;
847
+ replyKind = "superagent";
723
848
  }
724
849
  }
725
850
 
@@ -752,9 +877,10 @@ class ChannelPoller {
752
877
  channel: "telegram",
753
878
  direction: "out",
754
879
  type: "agent",
755
- actor_id: replyAuthor || "apx",
756
- agent_slug: replyAuthor || "apx",
757
- author: replyAuthor || "apx",
880
+ actor_id: replyActorId || SUPERAGENT_ACTOR_ID,
881
+ actor_kind: replyKind || "superagent",
882
+ agent_slug: replyActorId || SUPERAGENT_ACTOR_ID,
883
+ author: replyAuthor || agentDisplay,
758
884
  body: toSend,
759
885
  meta,
760
886
  });
@@ -764,9 +890,10 @@ class ChannelPoller {
764
890
  channel: "telegram",
765
891
  direction: "out",
766
892
  type: "agent",
767
- actor_id: replyAuthor || "apx",
768
- agent_slug: replyAuthor || "apx",
769
- author: replyAuthor || "apx",
893
+ actor_id: replyActorId || SUPERAGENT_ACTOR_ID,
894
+ actor_kind: replyKind || "superagent",
895
+ agent_slug: replyActorId || SUPERAGENT_ACTOR_ID,
896
+ author: replyAuthor || agentDisplay,
770
897
  body: `[send_failed] ${toSend}`,
771
898
  meta: {
772
899
  chat_id,
@@ -905,7 +1032,7 @@ export default {
905
1032
  // that bot; otherwise first available bot-tokened channel. Always logs
906
1033
  // the outbound on `messages` of the channel's target project so audit
907
1034
  // trails are complete.
908
- async send({ channel: channelName, chat_id, text, author = "apx", project }) {
1035
+ async send({ channel: channelName, chat_id, text, author = resolveAgentName(config), project }) {
909
1036
  const p =
910
1037
  (channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
911
1038
  pollers.find((pp) => resolveBotToken(pp.channel)) ||
@@ -916,8 +1043,9 @@ export default {
916
1043
  channel: "telegram",
917
1044
  direction: "out",
918
1045
  type: "agent",
919
- actor_id: author,
920
- agent_slug: author,
1046
+ actor_id: SUPERAGENT_ACTOR_ID,
1047
+ actor_kind: "superagent",
1048
+ agent_slug: SUPERAGENT_ACTOR_ID,
921
1049
  author,
922
1050
  body: text,
923
1051
  meta: {
@@ -934,7 +1062,7 @@ export default {
934
1062
  * photo: local file path, Buffer, or public URL
935
1063
  * opts: { caption, parse_mode, channel, author }
936
1064
  */
937
- async sendPhoto({ channel: channelName, chat_id, photo, caption, parse_mode, author = "apx" }) {
1065
+ async sendPhoto({ channel: channelName, chat_id, photo, caption, parse_mode, author = resolveAgentName(config) }) {
938
1066
  const p =
939
1067
  (channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
940
1068
  pollers.find((pp) => resolveBotToken(pp.channel)) ||
@@ -945,7 +1073,8 @@ export default {
945
1073
  channel: "telegram",
946
1074
  direction: "out",
947
1075
  type: "photo",
948
- actor_id: author,
1076
+ actor_id: SUPERAGENT_ACTOR_ID,
1077
+ actor_kind: "superagent",
949
1078
  author,
950
1079
  body: caption || "[photo]",
951
1080
  meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
@@ -957,7 +1086,7 @@ export default {
957
1086
  * Send a voice message (OGG/Opus preferred).
958
1087
  * audio: local file path or Buffer
959
1088
  */
960
- async sendVoice({ channel: channelName, chat_id, audio, caption, duration, author = "apx" }) {
1089
+ async sendVoice({ channel: channelName, chat_id, audio, caption, duration, author = resolveAgentName(config) }) {
961
1090
  const p =
962
1091
  (channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
963
1092
  pollers.find((pp) => resolveBotToken(pp.channel)) ||
@@ -968,7 +1097,8 @@ export default {
968
1097
  channel: "telegram",
969
1098
  direction: "out",
970
1099
  type: "voice",
971
- actor_id: author,
1100
+ actor_id: SUPERAGENT_ACTOR_ID,
1101
+ actor_kind: "superagent",
972
1102
  author,
973
1103
  body: caption || "[voice]",
974
1104
  meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
@@ -980,7 +1110,7 @@ export default {
980
1110
  * Send a document (PDF, zip, txt, generated reports, etc).
981
1111
  * document: local file path, Buffer, or public https URL.
982
1112
  */
983
- async sendDocument({ channel: channelName, chat_id, document, caption, filename, mime_type, author = "apx" }) {
1113
+ async sendDocument({ channel: channelName, chat_id, document, caption, filename, mime_type, author = resolveAgentName(config) }) {
984
1114
  const p =
985
1115
  (channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
986
1116
  pollers.find((pp) => resolveBotToken(pp.channel)) ||
@@ -991,7 +1121,8 @@ export default {
991
1121
  channel: "telegram",
992
1122
  direction: "out",
993
1123
  type: "document",
994
- actor_id: author,
1124
+ actor_id: SUPERAGENT_ACTOR_ID,
1125
+ actor_kind: "superagent",
995
1126
  author,
996
1127
  body: caption || `[document${filename ? " " + filename : ""}]`,
997
1128
  meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name, filename, mime_type },
@@ -1003,7 +1134,7 @@ export default {
1003
1134
  * Send an audio file (MP3/M4A — shown in music player).
1004
1135
  * audio: local file path or Buffer
1005
1136
  */
1006
- async sendAudio({ channel: channelName, chat_id, audio, caption, title, performer, author = "apx" }) {
1137
+ async sendAudio({ channel: channelName, chat_id, audio, caption, title, performer, author = resolveAgentName(config) }) {
1007
1138
  const p =
1008
1139
  (channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
1009
1140
  pollers.find((pp) => resolveBotToken(pp.channel)) ||
@@ -1014,7 +1145,8 @@ export default {
1014
1145
  channel: "telegram",
1015
1146
  direction: "out",
1016
1147
  type: "audio",
1017
- actor_id: author,
1148
+ actor_id: SUPERAGENT_ACTOR_ID,
1149
+ actor_kind: "superagent",
1018
1150
  author,
1019
1151
  body: caption || title || "[audio]",
1020
1152
  meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
@@ -74,12 +74,28 @@ export function setDottedKey(obj, dottedKey, value) {
74
74
  let cur = obj;
75
75
  for (let i = 0; i < parts.length - 1; i++) {
76
76
  const k = parts[i];
77
- if (typeof cur[k] !== "object" || cur[k] === null || Array.isArray(cur[k])) {
78
- cur[k] = {};
77
+ const nextKey = parts[i + 1];
78
+ if (Array.isArray(cur)) {
79
+ const idx = Number(k);
80
+ if (!Number.isInteger(idx) || idx < 0) return obj;
81
+ if (typeof cur[idx] !== "object" || cur[idx] === null) {
82
+ cur[idx] = /^\d+$/.test(nextKey) ? [] : {};
83
+ }
84
+ cur = cur[idx];
85
+ continue;
86
+ }
87
+ if (typeof cur[k] !== "object" || cur[k] === null) {
88
+ cur[k] = /^\d+$/.test(nextKey) ? [] : {};
79
89
  }
80
90
  cur = cur[k];
81
91
  }
82
- cur[parts[parts.length - 1]] = value;
92
+ const last = parts[parts.length - 1];
93
+ if (Array.isArray(cur)) {
94
+ const idx = Number(last);
95
+ if (Number.isInteger(idx) && idx >= 0) cur[idx] = value;
96
+ } else {
97
+ cur[last] = value;
98
+ }
83
99
  return obj;
84
100
  }
85
101
 
@@ -87,11 +103,19 @@ export function unsetDottedKey(obj, dottedKey) {
87
103
  const parts = dottedKey.split(".");
88
104
  let cur = obj;
89
105
  for (let i = 0; i < parts.length - 1; i++) {
90
- if (typeof cur[parts[i]] !== "object") return false;
91
- cur = cur[parts[i]];
106
+ const key = parts[i];
107
+ if (Array.isArray(cur)) {
108
+ const idx = Number(key);
109
+ if (!Number.isInteger(idx) || typeof cur[idx] !== "object") return false;
110
+ cur = cur[idx];
111
+ continue;
112
+ }
113
+ if (typeof cur[key] !== "object") return false;
114
+ cur = cur[key];
92
115
  }
93
- if (parts[parts.length - 1] in cur) {
94
- delete cur[parts[parts.length - 1]];
116
+ const last = parts[parts.length - 1];
117
+ if (last in cur) {
118
+ delete cur[last];
95
119
  return true;
96
120
  }
97
121
  return false;