@agentprojectcontext/apx 1.25.0 → 1.27.2

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,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import { findApfRoot, readAgents, readVaultAgents, VAULT_DIR, SLUG_RE } from "../../core/parser.js";
4
- import { writeAgentFile, writeVaultAgentFile, addImportedAgent, ensureAgentDir, regenerateAgentsMd } from "../../core/scaffold.js";
3
+ import { findApfRoot, readAgents, readVaultAgents, readVaultAgent, VAULT_DIR, SLUG_RE } from "../../../core/parser.js";
4
+ import { writeAgentFile, writeVaultAgentFile, removeVaultAgent, restoreVaultAgent, addImportedAgent, ensureAgentDir } from "../../../core/scaffold.js";
5
5
  import { http } from "../http.js";
6
6
 
7
7
  // ── ANSI ──────────────────────────────────────────────────────────────────────
@@ -49,7 +49,6 @@ export async function cmdAgentAdd(args) {
49
49
 
50
50
  writeAgentFile(root, slug, fields);
51
51
  ensureAgentDir(root, slug);
52
- regenerateAgentsMd(root);
53
52
  await nudgeDaemon(root);
54
53
 
55
54
  console.log(`Added agent ${slug}`);
@@ -100,10 +99,11 @@ export function cmdAgentGet(args) {
100
99
 
101
100
  // ── Vault commands ────────────────────────────────────────────────────────────
102
101
 
103
- export function cmdAgentVaultList() {
104
- const vault = readVaultAgents();
102
+ export function cmdAgentVaultList(args = { flags: {} }) {
103
+ const includeRemoved = !!args.flags.all || !!args.flags["include-removed"];
104
+ const vault = readVaultAgents({ includeRemoved });
105
105
  if (vault.length === 0) {
106
- console.log(dim(`(vault empty — add templates with \`apx agent vault add <slug>\`)`));
106
+ console.log(dim(`(vault empty — bundled defaults missing? add one with \`apx agent vault add <slug>\`)`));
107
107
  console.log(gray(` vault: ${VAULT_DIR}`));
108
108
  return;
109
109
  }
@@ -111,10 +111,16 @@ export function cmdAgentVaultList() {
111
111
  for (const a of vault) {
112
112
  const role = a.fields.Role ? dim(a.fields.Role) : gray("—");
113
113
  const model = a.fields.Model ? dim(a.fields.Model) : gray("—");
114
- console.log(` ${bold(a.slug)} ${role} ${cyan(model)}`);
114
+ const tag = a.source === "bundled" ? gray("[bundled]")
115
+ : a.source === "user-override" ? tag2("[override]")
116
+ : a.source === "user" ? tag2("[user]")
117
+ : "";
118
+ console.log(` ${bold(a.slug)} ${role} ${cyan(model)} ${tag}`);
115
119
  }
116
120
  console.log();
117
121
  }
122
+ // Local helper just for the list table coloring above.
123
+ function tag2(s) { return `${c.green}${s}${c.reset}`; }
118
124
 
119
125
  export async function cmdAgentVaultAdd(args) {
120
126
  const slug = args._[0];
@@ -144,6 +150,36 @@ export async function cmdAgentVaultAdd(args) {
144
150
  console.log(`\n ${bold(slug)} added to vault ${gray(VAULT_DIR + "/" + slug + ".md")}\n`);
145
151
  }
146
152
 
153
+ // Remove a vault template. If the slug exists in the bundle a tombstone is
154
+ // written so it stays hidden until `apx agent vault restore <slug>`. User-
155
+ // layer files are physically removed.
156
+ export function cmdAgentVaultRm(args) {
157
+ const slug = args._[0];
158
+ if (!slug || !SLUG_RE.test(slug)) throw new Error("apx agent vault rm: missing or invalid <slug>");
159
+ const before = readVaultAgent(slug, { includeRemoved: true });
160
+ if (!before) throw new Error(`"${slug}" not found in vault (bundled or user)`);
161
+ const out = removeVaultAgent(slug);
162
+ if (out.removed === "tomb") {
163
+ console.log(` ${tag("hidden")} ${bold(slug)} ${gray("(bundled default tombstoned — restore with `apx agent vault restore`)")}`);
164
+ } else if (out.removed === "user") {
165
+ console.log(` ${tag("removed")} ${bold(slug)} ${gray("(user template deleted; no bundled default exists)")}`);
166
+ } else if (out.removed === "user+tomb") {
167
+ console.log(` ${tag("removed")} ${bold(slug)} ${gray("(user override deleted + bundled tombstoned)")}`);
168
+ }
169
+ }
170
+
171
+ // Un-tombstone a bundled slug. No-op if it wasn't hidden.
172
+ export function cmdAgentVaultRestore(args) {
173
+ const slug = args._[0];
174
+ if (!slug || !SLUG_RE.test(slug)) throw new Error("apx agent vault restore: missing or invalid <slug>");
175
+ const out = restoreVaultAgent(slug);
176
+ if (!out.restored) {
177
+ console.log(dim(` (slug "${slug}" was not tombstoned — nothing to restore)`));
178
+ return;
179
+ }
180
+ console.log(` ${cyan("restored")} ${bold(slug)} ${gray("(bundled default visible again)")}`);
181
+ }
182
+
147
183
  export async function cmdAgentImport(args) {
148
184
  const slug = args._[0];
149
185
  if (!slug) throw new Error("apx agent import: missing <slug>");
@@ -176,6 +212,5 @@ export async function cmdAgentImport(args) {
176
212
  }
177
213
 
178
214
  ensureAgentDir(root, slug);
179
- regenerateAgentsMd(root);
180
215
  await nudgeDaemon(root);
181
216
  }
@@ -1,7 +1,7 @@
1
1
  // apx command — list and show workflow commands from .apc/commands/
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
- import { findApfRoot } from "../../core/parser.js";
4
+ import { findApfRoot } from "../../../core/parser.js";
5
5
  import { http } from "../http.js";
6
6
  import { resolveProjectId } from "./project.js";
7
7
 
@@ -1,6 +1,6 @@
1
1
  import { http } from "../http.js";
2
2
  import { resolveProjectId } from "./project.js";
3
- import { readConfig, writeConfig } from "../../core/config.js";
3
+ import { readConfig, writeConfig } from "../../../core/config.js";
4
4
 
5
5
  function parseValue(raw) {
6
6
  // best-effort: try JSON first (covers numbers, bools, objects, arrays, null,
@@ -3,6 +3,16 @@ import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { ensureDaemon, http } from "../http.js";
5
5
 
6
+ // Wait until nothing answers on the daemon port (old process fully exited and
7
+ // released it), so a fresh start can bind it. Resolves true when down.
8
+ async function waitForPortReleased({ tries = 40, intervalMs = 150 } = {}) {
9
+ for (let i = 0; i < tries; i++) {
10
+ if (!(await http.ping(200))) return true;
11
+ await new Promise((r) => setTimeout(r, intervalMs));
12
+ }
13
+ return false;
14
+ }
15
+
6
16
  const PID_PATH = path.join(os.homedir(), ".apx", "daemon.pid");
7
17
  const LOG_PATH = path.join(os.homedir(), ".apx", "daemon.log");
8
18
 
@@ -97,6 +107,63 @@ export async function cmdDaemonStatus(args = {}) {
97
107
  console.log();
98
108
  }
99
109
 
110
+ export async function cmdDaemonReload(args = {}) {
111
+ const debug = args.flags?.debug;
112
+ if (!(await http.ping())) {
113
+ console.log(`\n ${fmt.yellow("○")} ${fmt.bold("apx daemon")} ${fmt.dim("not running — start first")}\n`);
114
+ process.exit(1);
115
+ }
116
+ const res = await http.post("/admin/reload", undefined, { autoStart: false });
117
+ if (debug) debugRaw("/admin/reload", res);
118
+ console.log(`\n ${fmt.green("↻")} ${fmt.bold("config reloaded")}`);
119
+ if (res.super_agent_model) console.log(fmt.kv("model", fmt.cyan(res.super_agent_model)));
120
+ if (res.fallback_order?.length) console.log(fmt.kv("fallback", fmt.cyan(res.fallback_order.join(" → "))));
121
+ console.log();
122
+ }
123
+
124
+ export async function cmdDaemonRestart(args = {}) {
125
+ const debug = args.flags?.debug;
126
+ const wasRunning = await http.ping();
127
+
128
+ if (wasRunning) {
129
+ // Ask the daemon to shut down cleanly; fall back to a PID kill if the
130
+ // HTTP shutdown route is unreachable (same fallback as `stop`).
131
+ try {
132
+ const res = await http.post("/admin/shutdown", undefined, { autoStart: false });
133
+ if (debug) debugRaw("/admin/shutdown", res);
134
+ } catch {
135
+ if (fs.existsSync(PID_PATH)) {
136
+ try {
137
+ const pid = parseInt(fs.readFileSync(PID_PATH, "utf8"), 10);
138
+ if (pid) process.kill(pid);
139
+ } catch {}
140
+ }
141
+ }
142
+ // The old process must release port 7430 before we start a fresh one,
143
+ // otherwise ensureDaemon() sees it alive and starts nothing.
144
+ if (!(await waitForPortReleased())) {
145
+ console.log(
146
+ `\n ${fmt.red("○")} ${fmt.bold("apx daemon")} ` +
147
+ `${fmt.dim("did not shut down in time — aborting restart")}\n`
148
+ );
149
+ process.exit(1);
150
+ }
151
+ process.stderr.write("apx: restarting daemon...\n");
152
+ } else {
153
+ process.stderr.write("apx: daemon not running — starting...\n");
154
+ }
155
+
156
+ await ensureDaemon({ silent: true });
157
+ const status = await http.get("/health", { autoStart: false });
158
+ if (debug) debugRaw("/health", status);
159
+ console.log(
160
+ `\n ${fmt.green("●")} ${fmt.bold("apx daemon")} ${fmt.dim("v" + status.version)}` +
161
+ ` ${fmt.gray("·")} ${fmt.green(wasRunning ? "restarted" : "started")}` +
162
+ ` ${fmt.gray("·")} ${fmt.cyan("port")} ${status.port ?? (process.env.APX_PORT || 7430)}` +
163
+ ` ${fmt.gray("·")} ${fmt.cyan("uptime")} ${uptime(status.uptime_s)}\n`
164
+ );
165
+ }
166
+
100
167
  export async function cmdDaemonStop(args = {}) {
101
168
  const debug = args.flags?.debug;
102
169
 
@@ -0,0 +1,335 @@
1
+ // apx desktop — launch/manage the floating voice desktop window (Electron).
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { spawn, execFileSync } from "node:child_process";
6
+ import { fileURLToPath } from "node:url";
7
+ import { http } from "../http.js";
8
+ import {
9
+ autostartIsOn as _autostartIsOn,
10
+ autostartInstall,
11
+ autostartUninstall,
12
+ getApxRunner as _getApxRunner,
13
+ buildPlist as _buildPlist,
14
+ MAC_PLIST_PATH,
15
+ LINUX_DESKTOP_PATH,
16
+ WIN_RUN_KEY,
17
+ WIN_RUN_NAME,
18
+ } from "../../../core/desktop/autostart.js";
19
+
20
+ // Re-exports — kept so existing tests (tests/desktop-autostart.test.js)
21
+ // can still import these directly from the CLI module.
22
+ export const getApxRunner = _getApxRunner;
23
+ export const buildPlist = _buildPlist;
24
+ export const autostartIsOn = _autostartIsOn;
25
+
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = path.dirname(__filename);
28
+
29
+ const DESKTOP_MAIN = path.resolve(__dirname, "../../desktop/main.js");
30
+ const DESKTOP_PID = path.join(os.homedir(), ".apx", "desktop.pid");
31
+
32
+ // ── ANSI ─────────────────────────────────────────────────────────────────────
33
+ const c = { reset:"\x1b[0m", bold:"\x1b[1m", dim:"\x1b[2m", green:"\x1b[32m",
34
+ red:"\x1b[31m", yellow:"\x1b[33m", cyan:"\x1b[36m", gray:"\x1b[90m" };
35
+ const fmt = {
36
+ bold:(s)=>`${c.bold}${s}${c.reset}`, dim:(s)=>`${c.dim}${s}${c.reset}`,
37
+ green:(s)=>`${c.green}${s}${c.reset}`, red:(s)=>`${c.red}${s}${c.reset}`,
38
+ cyan:(s)=>`${c.cyan}${s}${c.reset}`, gray:(s)=>`${c.gray}${s}${c.reset}`,
39
+ };
40
+
41
+ // ── Helpers ───────────────────────────────────────────────────────────────────
42
+
43
+ function readPid() {
44
+ try { return parseInt(fs.readFileSync(DESKTOP_PID, "utf8").trim(), 10); } catch { return null; }
45
+ }
46
+ function writePid(pid) {
47
+ fs.mkdirSync(path.dirname(DESKTOP_PID), { recursive: true });
48
+ fs.writeFileSync(DESKTOP_PID, String(pid));
49
+ }
50
+ function clearPid() { try { fs.unlinkSync(DESKTOP_PID); } catch {} }
51
+ function pidAlive(pid) {
52
+ if (!pid) return false;
53
+ try { process.kill(pid, 0); return true; } catch { return false; }
54
+ }
55
+
56
+ // Validate that an electron candidate actually runs (a pnpm shim can exist as a
57
+ // file while its underlying package was never built — `--version` smokes that out).
58
+ function electronRuns(cmd, argv) {
59
+ try {
60
+ execFileSync(cmd, argv, { stdio: "ignore", timeout: 5000 });
61
+ return true;
62
+ } catch { return false; }
63
+ }
64
+
65
+ // Returns a descriptor used by buildElectronSpawn():
66
+ // absolute path to a real electron binary,
67
+ // absolute path to electron's cli.js (".js" → run via node),
68
+ // "npx" as a last-resort fallback (downloads/uses electron via npx).
69
+ // Never returns null — npx is always attempted so the user gets a real error
70
+ // from the spawn (and a one-time download) rather than a silent no-op.
71
+ export function findElectron() {
72
+ // commands/ is 4 levels under the project root: src/interfaces/cli/commands/
73
+ const root = path.resolve(__dirname, "..", "..", "..", "..");
74
+ const bin = path.join(root, "node_modules", ".bin", "electron");
75
+ // The .bin shim is a shell wrapper that `exec node …`. Under launchd's
76
+ // minimal PATH (`/usr/bin:/bin:/usr/sbin:/sbin`) `node` isn't found, so the
77
+ // shim fails. We try it first (cheap, works for terminal use) and then fall
78
+ // back to invoking electron's cli.js directly with process.execPath, which
79
+ // is launchd-safe.
80
+ if (fs.existsSync(bin) && electronRuns(bin, ["--version"])) return bin;
81
+
82
+ const cli = path.join(root, "node_modules", "electron", "cli.js");
83
+ if (fs.existsSync(cli) && electronRuns(process.execPath, [cli, "--version"])) return cli;
84
+
85
+ // Global electron on PATH (works from terminal, usually not from launchd)
86
+ try {
87
+ const which = execFileSync("which", ["electron"], { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
88
+ if (which && electronRuns(which, ["--version"])) return which;
89
+ } catch {}
90
+
91
+ // Last resort: npx (pulls electron if absent). Will ENOENT under launchd if
92
+ // npx isn't on PATH — that's why we try cli.js BEFORE this.
93
+ return "npx";
94
+ }
95
+
96
+ // Turn a findElectron() descriptor + the app entry into a { cmd, argv } pair.
97
+ export function buildElectronSpawn(descriptor, mainPath, port) {
98
+ if (descriptor === "npx") {
99
+ return { cmd: "npx", argv: ["-y", "electron", mainPath, "--port", port] };
100
+ }
101
+ if (descriptor.endsWith(".js")) {
102
+ return { cmd: process.execPath, argv: [descriptor, mainPath, "--port", port] };
103
+ }
104
+ return { cmd: descriptor, argv: [mainPath, "--port", port] };
105
+ }
106
+
107
+ // ── Commands ──────────────────────────────────────────────────────────────────
108
+
109
+ export async function cmdDesktopStart(args = {}) {
110
+ const debug = !!(args.debug || args.d);
111
+
112
+ const pid = readPid();
113
+ if (pidAlive(pid)) {
114
+ if (debug) {
115
+ console.log(`\n ${fmt.cyan("●")} Desktop already running ${fmt.dim("pid " + pid)} — stop it first with: apx desktop stop\n`);
116
+ return;
117
+ }
118
+ console.log(`\n ${fmt.cyan("●")} Desktop already running ${fmt.dim("pid " + pid)}\n`);
119
+ return;
120
+ }
121
+ clearPid();
122
+
123
+ if (!fs.existsSync(DESKTOP_MAIN)) {
124
+ console.error(`\n ${fmt.red("✗")} Desktop app not found at ${fmt.dim(DESKTOP_MAIN)}\n`);
125
+ process.exit(1);
126
+ }
127
+
128
+ const electronDescriptor = findElectron();
129
+
130
+ // Get daemon port from running daemon or env
131
+ let daemonPort = process.env.APX_PORT || "7430";
132
+ try {
133
+ const health = await http.get("/health").catch(() => null);
134
+ if (health?.port) daemonPort = String(health.port);
135
+ } catch {}
136
+
137
+ const { cmd, argv } = buildElectronSpawn(electronDescriptor, DESKTOP_MAIN, daemonPort);
138
+
139
+ const logFile = path.join(os.homedir(), ".apx", "desktop.log");
140
+
141
+ if (debug) {
142
+ // ── Debug mode: start desktop normally, then tail -f the log ─────────
143
+ // Truncate log so we only see fresh output
144
+ try { fs.writeFileSync(logFile, `--- APX Desktop debug started ${new Date().toISOString()} ---\n`); } catch {}
145
+
146
+ const logFd = fs.openSync(logFile, "a");
147
+ const child = spawn(cmd, argv, {
148
+ detached: false,
149
+ stdio: ["ignore", logFd, logFd],
150
+ env: { ...process.env, ELECTRON_ENABLE_LOGGING: "1" },
151
+ });
152
+ fs.closeSync(logFd);
153
+
154
+ if (child.pid) writePid(child.pid);
155
+
156
+ // Small pause so Electron writes its first lines before we tail
157
+ await new Promise(r => setTimeout(r, 600));
158
+
159
+ console.log(
160
+ `\n ${fmt.cyan("◉")} ${fmt.bold("APX Desktop")} ${fmt.yellow("[DEBUG]")}` +
161
+ ` pid ${child.pid} port ${daemonPort}` +
162
+ `\n ${fmt.dim("Tailing:")} ${logFile}` +
163
+ `\n ${fmt.dim("Press Ctrl+C to stop tailing (desktop keeps running).")}\n`
164
+ );
165
+
166
+ // Tail the log file live — read new bytes as they arrive
167
+ const logStream = fs.createReadStream(logFile, { encoding: "utf8", start: 0 });
168
+ logStream.pipe(process.stdout);
169
+
170
+ // After initial content, watch for new data
171
+ const watcher = fs.watch(logFile, () => {});
172
+ let pos = fs.statSync(logFile).size;
173
+ const interval = setInterval(() => {
174
+ const stat = fs.statSync(logFile);
175
+ if (stat.size > pos) {
176
+ const stream = fs.createReadStream(logFile, { start: pos, end: stat.size });
177
+ stream.on("data", (chunk) => {
178
+ const lines = chunk.toString();
179
+ // Filter Chromium noise
180
+ lines.split("\n").forEach(line => {
181
+ if (!/^\[[\d:]+\]/.test(line.trim())) process.stdout.write(line + (line ? "\n" : ""));
182
+ });
183
+ });
184
+ pos = stat.size;
185
+ }
186
+ }, 300);
187
+
188
+ child.on("exit", (code) => {
189
+ clearInterval(interval);
190
+ watcher.close();
191
+ console.log(`\n ${code === 0 ? fmt.green("✓") : fmt.red("✗")} Desktop exited (code ${code})\n`);
192
+ clearPid();
193
+ process.exit(code || 0);
194
+ });
195
+
196
+ await new Promise((resolve) => {
197
+ process.on("SIGINT", () => {
198
+ clearInterval(interval);
199
+ watcher.close();
200
+ console.log(`\n ${fmt.dim("Stopped tailing. Desktop is still running.")}\n`);
201
+ resolve();
202
+ });
203
+ process.on("SIGTERM", resolve);
204
+ });
205
+ return;
206
+ }
207
+
208
+ // ── Normal (detached) mode ────────────────────────────────────────────
209
+ // detached:true is REQUIRED for the autostart case — launchd kills the
210
+ // entire process group of a LaunchAgent when the "main" process (this
211
+ // wrapper) exits. detached:true gives the Electron child its own session
212
+ // (setsid), so it survives the wrapper's 1.5s exit. unref() below lets
213
+ // the wrapper's event loop end naturally.
214
+ const logFd = fs.openSync(logFile, "a");
215
+ const child = spawn(cmd, argv, {
216
+ detached: true,
217
+ stdio: ["ignore", logFd, logFd],
218
+ env: { ...process.env, ELECTRON_ENABLE_LOGGING: "1" },
219
+ });
220
+
221
+ // Give the process 1.5s to fail fast, then detach and let it run
222
+ await new Promise((res) => {
223
+ let exited = false;
224
+ child.on("exit", (code) => {
225
+ exited = true;
226
+ if (code !== 0) {
227
+ console.error(
228
+ `\n ${fmt.red("✗")} Desktop exited with code ${code}\n` +
229
+ ` ${fmt.dim("Check log:")} ${logFile}\n` +
230
+ ` ${fmt.dim("Or run with:")} ${fmt.cyan("apx desktop start --debug")}\n`
231
+ );
232
+ }
233
+ res();
234
+ });
235
+ setTimeout(() => {
236
+ if (!exited) {
237
+ child.unref();
238
+ res();
239
+ }
240
+ }, 1500);
241
+ });
242
+
243
+ if (!child.exitCode && child.pid) writePid(child.pid);
244
+ else return;
245
+
246
+ // Read configured shortcut (if any) for display
247
+ let shortcutHint = "⌘G (macOS) / Ctrl+G (Win/Linux)";
248
+ try {
249
+ const cfg = JSON.parse(fs.readFileSync(path.join(os.homedir(), ".apx", "config.json"), "utf8"));
250
+ const sc = cfg?.desktop?.shortcut || cfg?.overlay?.shortcut;
251
+ if (sc) shortcutHint = sc;
252
+ } catch {}
253
+
254
+ console.log(
255
+ `\n ${fmt.green("●")} ${fmt.bold("APX Desktop")} started` +
256
+ ` ${fmt.dim("pid " + child.pid)}` +
257
+ ` ${fmt.dim("port " + daemonPort)}` +
258
+ `\n ${fmt.dim("Shortcut:")} ${fmt.cyan(shortcutHint)}` +
259
+ `\n ${fmt.dim("Debug:")} ${fmt.gray("apx desktop start --debug")}` +
260
+ `\n ${fmt.dim("Log:")} ${fmt.gray(logFile)}\n`
261
+ );
262
+ }
263
+
264
+ export async function cmdDesktopStop(_args = {}) {
265
+ const pid = readPid();
266
+ if (!pidAlive(pid)) {
267
+ console.log(`\n ${fmt.dim("Desktop is not running.")}\n`);
268
+ clearPid();
269
+ return;
270
+ }
271
+ try {
272
+ process.kill(pid, "SIGTERM");
273
+ clearPid();
274
+ console.log(`\n ${fmt.green("✓")} Desktop stopped ${fmt.dim("(pid " + pid + ")")}\n`);
275
+ } catch (e) {
276
+ console.error(`\n ${fmt.red("✗")} Could not stop desktop: ${e.message}\n`);
277
+ }
278
+ }
279
+
280
+ export async function cmdDesktopStatus(_args = {}) {
281
+ const pid = readPid();
282
+ const alive = pidAlive(pid);
283
+
284
+ let daemonClients = 0;
285
+ try {
286
+ const s = await http.get("/desktop/status").catch(() => null);
287
+ daemonClients = s?.connected_clients ?? 0;
288
+ } catch {}
289
+
290
+ const icon = alive ? fmt.green("●") : fmt.dim("○");
291
+ const state = alive ? fmt.green("running") : fmt.dim("stopped");
292
+ const autoIcon = autostartIsOn() ? fmt.green("●") : fmt.dim("○");
293
+ const autoState = autostartIsOn() ? fmt.green("on") : fmt.dim("off");
294
+ console.log(
295
+ `\n ${icon} ${fmt.bold("APX Desktop")} ${state}` +
296
+ (pid ? ` ${fmt.dim("pid " + pid)}` : "") +
297
+ `\n ${fmt.dim("daemon connections:")} ${daemonClients}` +
298
+ `\n ${autoIcon} ${fmt.dim("autostart:")} ${autoState}\n`
299
+ );
300
+ }
301
+
302
+ // ── Autostart (opt-in: apx desktop install / uninstall) ───────────────────
303
+ //
304
+ // All the heavy lifting lives in core/desktop/autostart.js so the daemon's
305
+ // /desktop/autostart endpoint and these CLI commands share a single
306
+ // implementation. The functions below are just ANSI/UX wrappers around it.
307
+
308
+ export async function cmdDesktopInstall(_args = {}) {
309
+ const r = autostartInstall();
310
+ if (!r.ok) {
311
+ console.error(`\n ${fmt.red("✗")} ${r.error}\n`);
312
+ process.exit(1);
313
+ }
314
+ console.log(
315
+ `\n ${fmt.green("✓")} ${fmt.bold("Autostart activado")}` +
316
+ (r.runs ? `\n ${fmt.dim("runs:")} ${r.runs}` : "") +
317
+ (r.path ? `\n ${fmt.dim("entry:")} ${r.path}` : "") +
318
+ `\n ${fmt.dim("La ventana arrancará automáticamente en el próximo login.")}` +
319
+ `\n ${fmt.dim("Para desactivar:")} ${fmt.cyan("apx desktop uninstall")}\n`
320
+ );
321
+ }
322
+
323
+ export async function cmdDesktopUninstall(_args = {}) {
324
+ const r = autostartUninstall();
325
+ if (!r.ok) {
326
+ console.error(`\n ${fmt.red("✗")} ${r.error}\n`);
327
+ process.exit(1);
328
+ }
329
+ if (!r.removed) {
330
+ console.log(`\n ${fmt.dim("Autostart no estaba activado.")}\n`);
331
+ return;
332
+ }
333
+ console.log(`\n ${fmt.green("✓")} Autostart desactivado.\n ${fmt.dim("Se eliminó:")} ${r.path}\n`);
334
+ }
335
+
@@ -0,0 +1,92 @@
1
+ import { http } from "../http.js";
2
+ import { resolveProjectId } from "./project.js";
3
+
4
+ /**
5
+ * Resolve exec target from CLI args.
6
+ * Default (no agent): super-agent daemon route.
7
+ * Explicit: -a / --agent <slug>
8
+ * Legacy: apx exec <slug> "prompt" when 2+ positionals
9
+ */
10
+ export function resolveExecRequest(args) {
11
+ const agentFlag = args.flags?.agent ?? args.flags?.a;
12
+ let slug = null;
13
+ let promptParts;
14
+
15
+ if (agentFlag && agentFlag !== true) {
16
+ slug = String(agentFlag);
17
+ promptParts = args._;
18
+ } else if (args._.length >= 2) {
19
+ slug = args._[0];
20
+ promptParts = args._.slice(1);
21
+ } else {
22
+ promptParts = args._;
23
+ }
24
+
25
+ const useSuperAgent = !slug || slug === "super-agent";
26
+ return {
27
+ slug: useSuperAgent ? null : slug,
28
+ useSuperAgent,
29
+ promptParts,
30
+ };
31
+ }
32
+
33
+ async function readPromptFromStdin() {
34
+ const fs = await import("node:fs");
35
+ if (process.stdin.isTTY) return "";
36
+ const chunks = [];
37
+ const buf = Buffer.alloc(65536);
38
+ try {
39
+ while (true) {
40
+ const n = fs.readSync(0, buf, 0, buf.length);
41
+ if (!n) break;
42
+ chunks.push(buf.slice(0, n).toString("utf8"));
43
+ }
44
+ } catch {
45
+ /* empty */
46
+ }
47
+ return chunks.join("").trim();
48
+ }
49
+
50
+ export async function cmdExec(args) {
51
+ const { slug, useSuperAgent, promptParts } = resolveExecRequest(args);
52
+ let prompt = promptParts.join(" ").trim();
53
+
54
+ if (!prompt || prompt === "-") {
55
+ prompt = await readPromptFromStdin();
56
+ }
57
+ if (!prompt) {
58
+ throw new Error(
59
+ 'apx exec: prompt is empty. Usage: apx exec "prompt" | apx exec -a <agent> "prompt" | apx exec -- "prompt"'
60
+ );
61
+ }
62
+
63
+ const pid = await resolveProjectId(args?.flags?.project);
64
+ const body = {
65
+ prompt,
66
+ channel: "cli",
67
+ channelMeta: { cwd: process.cwd() },
68
+ };
69
+ if (args.flags.model && args.flags.model !== true) body.model = args.flags.model;
70
+ if (args.flags.temperature) body.temperature = parseFloat(args.flags.temperature);
71
+ if (args.flags["max-tokens"]) body.maxTokens = parseInt(args.flags["max-tokens"], 10);
72
+
73
+ if (useSuperAgent) {
74
+ const result = await http.post(`/projects/${pid}/super-agent/chat`, body);
75
+ process.stdout.write(result.text + "\n");
76
+ if (process.stderr.isTTY || args.flags.verbose) {
77
+ process.stderr.write(
78
+ `\n— ${result.name || "super-agent"} | model=${result.trace ? "tools" : "engine"} | in=${result.usage?.input_tokens || "?"} out=${result.usage?.output_tokens || "?"}${result.model ? ` | ${result.model}` : ""}\n`
79
+ );
80
+ }
81
+ return;
82
+ }
83
+
84
+ const result = await http.post(`/projects/${pid}/agents/${slug}/exec`, body);
85
+
86
+ process.stdout.write(result.text + "\n");
87
+ if (process.stderr.isTTY || args.flags.verbose) {
88
+ process.stderr.write(
89
+ `\n— ${result.engine} | in=${result.usage?.input_tokens || "?"} out=${result.usage?.output_tokens || "?"} | conv=${result.conversation.id}\n`
90
+ );
91
+ }
92
+ }