@agentprojectcontext/apx 1.24.0 → 1.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/package.json +42 -12
  2. package/skills/apx/SKILL.md +50 -119
  3. package/skills/apx-agency-agents/SKILL.md +141 -0
  4. package/skills/apx-agent/SKILL.md +100 -0
  5. package/skills/apx-mcp/SKILL.md +114 -0
  6. package/skills/apx-mcp-builder/SKILL.md +186 -0
  7. package/skills/apx-project/SKILL.md +100 -0
  8. package/skills/apx-routine/SKILL.md +138 -0
  9. package/skills/apx-runtime/SKILL.md +115 -0
  10. package/skills/apx-sessions/SKILL.md +281 -0
  11. package/skills/apx-skill-builder/SKILL.md +149 -0
  12. package/skills/apx-task/SKILL.md +95 -0
  13. package/skills/apx-telegram/SKILL.md +115 -0
  14. package/skills/apx-voice/SKILL.md +135 -0
  15. package/src/core/agent/constants.js +3 -0
  16. package/src/core/agent/ghost-guard.js +24 -0
  17. package/src/core/agent/index.js +35 -0
  18. package/src/core/agent/model-router.js +257 -0
  19. package/src/core/agent/prompt-builder.js +313 -0
  20. package/src/core/agent/prompts/channels/api.md +7 -0
  21. package/src/core/agent/prompts/channels/cli.md +6 -0
  22. package/src/core/agent/prompts/channels/code.md +20 -0
  23. package/src/core/agent/prompts/channels/deck.md +6 -0
  24. package/src/core/agent/prompts/channels/desktop.md +24 -0
  25. package/src/core/agent/prompts/channels/routine.md +9 -0
  26. package/src/core/agent/prompts/channels/telegram.md +9 -0
  27. package/src/core/agent/prompts/channels/terminal.md +16 -0
  28. package/src/core/agent/prompts/channels/web.md +7 -0
  29. package/src/core/agent/prompts/channels/web_sidebar.md +7 -0
  30. package/src/core/agent/prompts/modes/voice.md +4 -0
  31. package/src/core/agent/prompts/super-agent-base.md +42 -0
  32. package/src/core/agent/pseudo-tools.js +40 -0
  33. package/src/core/agent/retry.js +85 -0
  34. package/src/core/agent/run-agent.js +423 -0
  35. package/src/core/agent/self-memory.js +155 -0
  36. package/src/{daemon → core/agent}/tool-call-parser.js +83 -10
  37. package/src/core/agent/tools-overlap.js +66 -0
  38. package/src/core/apc-skill-sync.js +97 -0
  39. package/src/core/code-sessions-store.js +150 -0
  40. package/src/core/config.js +473 -11
  41. package/src/core/desktop/autostart.js +162 -0
  42. package/src/core/engines/_health.js +63 -0
  43. package/src/{daemon → core}/engines/anthropic.js +16 -0
  44. package/src/core/engines/gemini.js +168 -0
  45. package/src/core/engines/groq.js +8 -0
  46. package/src/{daemon → core}/engines/index.js +3 -1
  47. package/src/{daemon → core}/engines/mock.js +22 -0
  48. package/src/{daemon → core}/engines/ollama.js +35 -0
  49. package/src/core/engines/openai-compatible.js +145 -0
  50. package/src/core/engines/openai.js +8 -0
  51. package/src/core/engines/openrouter.js +8 -0
  52. package/src/core/git-baseline.js +147 -0
  53. package/src/core/identity.js +21 -0
  54. package/src/core/logging.js +1 -1
  55. package/src/core/mcp/index.js +14 -0
  56. package/src/{daemon/mcp-runner.js → core/mcp/runner.js} +18 -6
  57. package/src/core/mcp/sources.js +246 -0
  58. package/src/core/memory/active-threads.js +124 -0
  59. package/src/core/memory/broker.js +144 -0
  60. package/src/core/memory/compactor.js +186 -0
  61. package/src/core/memory/embed-engines/gemini.js +62 -0
  62. package/src/core/memory/embed-engines/index.js +148 -0
  63. package/src/core/memory/embed-engines/ollama.js +55 -0
  64. package/src/core/memory/embed-engines/openai.js +64 -0
  65. package/src/core/memory/embed-engines/tf.js +20 -0
  66. package/src/core/memory/embeddings.js +132 -0
  67. package/src/core/memory/index.js +161 -0
  68. package/src/core/memory/indexer.js +257 -0
  69. package/src/core/memory/store.js +231 -0
  70. package/src/core/messages-store.js +143 -25
  71. package/src/core/parser.js +78 -16
  72. package/src/core/scaffold.js +175 -79
  73. package/src/core/tasks-store.js +264 -0
  74. package/src/core/telegram-identity.js +126 -0
  75. package/src/core/tools/index.js +6 -0
  76. package/src/core/voice/engines/elevenlabs.js +96 -0
  77. package/src/core/voice/engines/gemini.js +148 -0
  78. package/src/core/voice/engines/index.js +144 -0
  79. package/src/core/voice/engines/mock.js +59 -0
  80. package/src/core/voice/engines/openai.js +82 -0
  81. package/src/core/voice/engines/piper.js +93 -0
  82. package/src/core/voice/index.js +3 -0
  83. package/src/core/voice/tts.js +89 -0
  84. package/src/{daemon → host/daemon}/apc-runtime-context.js +1 -1
  85. package/src/host/daemon/api/admin-config.js +159 -0
  86. package/src/host/daemon/api/admin.js +72 -0
  87. package/src/host/daemon/api/agents.js +284 -0
  88. package/src/host/daemon/api/artifacts.js +52 -0
  89. package/src/host/daemon/api/code.js +351 -0
  90. package/src/host/daemon/api/config.js +104 -0
  91. package/src/host/daemon/api/connections.js +42 -0
  92. package/src/host/daemon/api/conversations.js +161 -0
  93. package/src/host/daemon/api/deck.js +511 -0
  94. package/src/host/daemon/api/desktop.js +71 -0
  95. package/src/host/daemon/api/embeddings.js +65 -0
  96. package/src/host/daemon/api/engines.js +80 -0
  97. package/src/host/daemon/api/exec.js +193 -0
  98. package/src/host/daemon/api/health.js +10 -0
  99. package/src/host/daemon/api/identity.js +36 -0
  100. package/src/host/daemon/api/mcps.js +205 -0
  101. package/src/host/daemon/api/messages.js +83 -0
  102. package/src/host/daemon/api/pairing.js +194 -0
  103. package/src/host/daemon/api/plugins.js +19 -0
  104. package/src/host/daemon/api/projects.js +35 -0
  105. package/src/host/daemon/api/routines.js +84 -0
  106. package/src/host/daemon/api/run.js +55 -0
  107. package/src/host/daemon/api/runtimes.js +219 -0
  108. package/src/host/daemon/api/sessions-search.js +177 -0
  109. package/src/host/daemon/api/sessions.js +115 -0
  110. package/src/host/daemon/api/shared.js +217 -0
  111. package/src/host/daemon/api/super-agent.js +208 -0
  112. package/src/host/daemon/api/tasks.js +118 -0
  113. package/src/host/daemon/api/telegram.js +325 -0
  114. package/src/host/daemon/api/tools.js +21 -0
  115. package/src/host/daemon/api/top-level.js +131 -0
  116. package/src/host/daemon/api/transcribe.js +35 -0
  117. package/src/host/daemon/api/tts.js +44 -0
  118. package/src/host/daemon/api/voice.js +519 -0
  119. package/src/host/daemon/api/web.js +123 -0
  120. package/src/host/daemon/api.js +152 -0
  121. package/src/{daemon → host/daemon}/compact.js +1 -1
  122. package/src/{daemon → host/daemon}/db.js +19 -5
  123. package/src/{daemon/overlay-ws.js → host/daemon/desktop-ws.js} +7 -7
  124. package/src/host/daemon/engine-sessions.js +245 -0
  125. package/src/{daemon → host/daemon}/index.js +27 -10
  126. package/src/{daemon/plugins/overlay.js → host/daemon/plugins/desktop.js} +36 -28
  127. package/src/{daemon → host/daemon}/plugins/index.js +2 -2
  128. package/src/{daemon → host/daemon}/plugins/telegram.js +165 -33
  129. package/src/{daemon → host/daemon}/project-config.js +31 -7
  130. package/src/{daemon → host/daemon}/routines.js +27 -8
  131. package/src/{daemon → host/daemon}/skills-loader.js +4 -2
  132. package/src/{daemon → host/daemon}/smoke.js +9 -5
  133. package/src/{daemon → host/daemon}/super-agent-tools/helpers.js +1 -1
  134. package/src/host/daemon/super-agent-tools/index.js +157 -0
  135. package/src/{daemon → host/daemon}/super-agent-tools/registry-bridge.js +1 -1
  136. package/src/{daemon → host/daemon}/super-agent-tools/tools/add-project.js +2 -2
  137. package/src/{daemon → host/daemon}/super-agent-tools/tools/ask-questions.js +4 -0
  138. package/src/{daemon → host/daemon}/super-agent-tools/tools/call-agent.js +5 -2
  139. package/src/{daemon → host/daemon}/super-agent-tools/tools/call-runtime.js +117 -8
  140. package/src/host/daemon/super-agent-tools/tools/create-task.js +52 -0
  141. package/src/{daemon → host/daemon}/super-agent-tools/tools/import-agent.js +2 -3
  142. package/src/{daemon → host/daemon}/super-agent-tools/tools/list-agents.js +1 -1
  143. package/src/host/daemon/super-agent-tools/tools/list-tasks.js +52 -0
  144. package/src/{daemon → host/daemon}/super-agent-tools/tools/list-vault-agents.js +1 -1
  145. package/src/host/daemon/super-agent-tools/tools/read-self-memory.js +21 -0
  146. package/src/host/daemon/super-agent-tools/tools/remember.js +40 -0
  147. package/src/{daemon → host/daemon}/super-agent-tools/tools/search-messages.js +1 -1
  148. package/src/host/daemon/super-agent-tools/tools/search-sessions.js +134 -0
  149. package/src/{daemon → host/daemon}/super-agent-tools/tools/send-telegram.js +2 -2
  150. package/src/{daemon → host/daemon}/super-agent-tools/tools/set-identity.js +1 -1
  151. package/src/{daemon → host/daemon}/super-agent-tools/tools/set-permission-mode.js +1 -1
  152. package/src/{daemon → host/daemon}/super-agent-tools/tools/tail-messages.js +1 -1
  153. package/src/host/daemon/super-agent.js +129 -0
  154. package/src/host/daemon/token-store.js +118 -0
  155. package/src/host/daemon/tool-call-parser.js +2 -0
  156. package/src/{daemon → host/daemon}/transcription.js +1 -1
  157. package/src/{daemon → host/daemon}/wakeup.js +2 -2
  158. package/src/interfaces/cli/claude-permissions.js +33 -0
  159. package/src/{cli → interfaces/cli}/commands/agent.js +43 -8
  160. package/src/{cli → interfaces/cli}/commands/command.js +1 -1
  161. package/src/{cli → interfaces/cli}/commands/config.js +1 -1
  162. package/src/{cli → interfaces/cli}/commands/daemon.js +67 -0
  163. package/src/interfaces/cli/commands/desktop.js +335 -0
  164. package/src/interfaces/cli/commands/exec.js +92 -0
  165. package/src/{cli → interfaces/cli}/commands/identity.js +6 -63
  166. package/src/{cli → interfaces/cli}/commands/init.js +1 -1
  167. package/src/{cli → interfaces/cli}/commands/mcp.js +69 -10
  168. package/src/{cli → interfaces/cli}/commands/memory.js +2 -2
  169. package/src/interfaces/cli/commands/model.js +136 -0
  170. package/src/interfaces/cli/commands/pair.js +170 -0
  171. package/src/interfaces/cli/commands/project-config.js +131 -0
  172. package/src/{cli → interfaces/cli}/commands/project.js +1 -1
  173. package/src/{cli → interfaces/cli}/commands/search.js +1 -1
  174. package/src/interfaces/cli/commands/session.js +892 -0
  175. package/src/interfaces/cli/commands/sessions.js +997 -0
  176. package/src/{cli → interfaces/cli}/commands/setup.js +98 -4
  177. package/src/{cli → interfaces/cli}/commands/skills.js +117 -9
  178. package/src/{cli → interfaces/cli}/commands/status.js +9 -1
  179. package/src/{cli → interfaces/cli}/commands/sys.js +96 -17
  180. package/src/interfaces/cli/commands/task.js +179 -0
  181. package/src/interfaces/cli/commands/telegram.js +366 -0
  182. package/src/{cli → interfaces/cli}/commands/update.js +1 -1
  183. package/src/interfaces/cli/commands/voice.js +258 -0
  184. package/src/{cli → interfaces/cli}/http.js +6 -2
  185. package/src/{cli → interfaces/cli}/index.js +955 -63
  186. package/src/interfaces/cli/postinstall.js +34 -0
  187. package/src/interfaces/desktop/assets/app-icon-180.png +0 -0
  188. package/src/interfaces/desktop/assets/app-icon-32.png +0 -0
  189. package/src/interfaces/desktop/assets/app-icon.png +0 -0
  190. package/src/interfaces/desktop/assets/apx-logo.png +0 -0
  191. package/src/interfaces/desktop/assets/superagent.png +0 -0
  192. package/src/interfaces/desktop/assets/tray-icon.png +0 -0
  193. package/src/interfaces/desktop/index.html +18 -0
  194. package/src/interfaces/desktop/main.js +652 -0
  195. package/src/interfaces/desktop/preload.js +48 -0
  196. package/src/interfaces/desktop/renderer.js +1006 -0
  197. package/src/interfaces/desktop/style.css +400 -0
  198. package/src/{mcp → interfaces/mcp-server}/index.js +2 -2
  199. package/src/interfaces/tui/_shims/util-which.ts +53 -0
  200. package/src/{tui → interfaces/tui}/app.tsx +2 -2
  201. package/src/{tui → interfaces/tui}/component/prompt/index.tsx +4 -1
  202. package/src/{tui → interfaces/tui}/context/sdk-apx.tsx +84 -16
  203. package/src/interfaces/tui/context/sync-apx.tsx +398 -0
  204. package/src/interfaces/tui/routes/session/index.tsx +368 -0
  205. package/src/interfaces/tui/routes/session/message-actions.tsx +58 -0
  206. package/src/interfaces/tui/routes/session/sidebar-apx.tsx +114 -0
  207. package/src/{tui → interfaces/tui}/tsconfig.json +1 -0
  208. package/src/{tui → interfaces/tui}/util/clipboard.ts +1 -1
  209. package/src/interfaces/web/README.md +102 -0
  210. package/src/interfaces/web/coming-soon.html +65 -0
  211. package/src/interfaces/web/components.json +25 -0
  212. package/src/interfaces/web/dist/assets/index-BDUsA6L6.css +1 -0
  213. package/src/interfaces/web/dist/assets/index-CfWyjPBa.js +548 -0
  214. package/src/interfaces/web/dist/assets/index-CfWyjPBa.js.map +1 -0
  215. package/src/interfaces/web/dist/favicon/dark/android-chrome-192x192.png +0 -0
  216. package/src/interfaces/web/dist/favicon/dark/android-chrome-512x512.png +0 -0
  217. package/src/interfaces/web/dist/favicon/dark/apple-touch-icon.png +0 -0
  218. package/src/interfaces/web/dist/favicon/dark/favicon-16x16.png +0 -0
  219. package/src/interfaces/web/dist/favicon/dark/favicon-32x32.png +0 -0
  220. package/src/interfaces/web/dist/favicon/dark/favicon-48x48.png +0 -0
  221. package/src/interfaces/web/dist/favicon/dark/favicon.ico +0 -0
  222. package/src/interfaces/web/dist/favicon/dark/favicon.webp +0 -0
  223. package/src/interfaces/web/dist/favicon/dark/site.webmanifest +18 -0
  224. package/src/interfaces/web/dist/favicon/white/android-chrome-192x192.png +0 -0
  225. package/src/interfaces/web/dist/favicon/white/android-chrome-512x512.png +0 -0
  226. package/src/interfaces/web/dist/favicon/white/apple-touch-icon.png +0 -0
  227. package/src/interfaces/web/dist/favicon/white/favicon-16x16.png +0 -0
  228. package/src/interfaces/web/dist/favicon/white/favicon-32x32.png +0 -0
  229. package/src/interfaces/web/dist/favicon/white/favicon-48x48.png +0 -0
  230. package/src/interfaces/web/dist/favicon/white/favicon.ico +0 -0
  231. package/src/interfaces/web/dist/favicon/white/favicon.webp +0 -0
  232. package/src/interfaces/web/dist/favicon/white/site.webmanifest +18 -0
  233. package/src/interfaces/web/dist/index.html +27 -0
  234. package/src/interfaces/web/dist/logo/logo_dark.webp +0 -0
  235. package/src/interfaces/web/dist/logo/logo_only_dark.webp +0 -0
  236. package/src/interfaces/web/dist/logo/logo_only_white.webp +0 -0
  237. package/src/interfaces/web/dist/logo/logo_vertical_dark.webp +0 -0
  238. package/src/interfaces/web/dist/logo/logo_vertical_white.webp +0 -0
  239. package/src/interfaces/web/dist/logo/logo_white.webp +0 -0
  240. package/src/interfaces/web/dist/modules/superagent.png +0 -0
  241. package/src/interfaces/web/index.html +26 -0
  242. package/src/interfaces/web/package-lock.json +4253 -0
  243. package/src/interfaces/web/package.json +55 -0
  244. package/src/interfaces/web/playwright.config.ts +45 -0
  245. package/src/interfaces/web/pnpm-lock.yaml +2946 -0
  246. package/src/interfaces/web/public/favicon/dark/android-chrome-192x192.png +0 -0
  247. package/src/interfaces/web/public/favicon/dark/android-chrome-512x512.png +0 -0
  248. package/src/interfaces/web/public/favicon/dark/apple-touch-icon.png +0 -0
  249. package/src/interfaces/web/public/favicon/dark/favicon-16x16.png +0 -0
  250. package/src/interfaces/web/public/favicon/dark/favicon-32x32.png +0 -0
  251. package/src/interfaces/web/public/favicon/dark/favicon-48x48.png +0 -0
  252. package/src/interfaces/web/public/favicon/dark/favicon.ico +0 -0
  253. package/src/interfaces/web/public/favicon/dark/favicon.webp +0 -0
  254. package/src/interfaces/web/public/favicon/dark/site.webmanifest +18 -0
  255. package/src/interfaces/web/public/favicon/white/android-chrome-192x192.png +0 -0
  256. package/src/interfaces/web/public/favicon/white/android-chrome-512x512.png +0 -0
  257. package/src/interfaces/web/public/favicon/white/apple-touch-icon.png +0 -0
  258. package/src/interfaces/web/public/favicon/white/favicon-16x16.png +0 -0
  259. package/src/interfaces/web/public/favicon/white/favicon-32x32.png +0 -0
  260. package/src/interfaces/web/public/favicon/white/favicon-48x48.png +0 -0
  261. package/src/interfaces/web/public/favicon/white/favicon.ico +0 -0
  262. package/src/interfaces/web/public/favicon/white/favicon.webp +0 -0
  263. package/src/interfaces/web/public/favicon/white/site.webmanifest +18 -0
  264. package/src/interfaces/web/public/logo/logo_dark.webp +0 -0
  265. package/src/interfaces/web/public/logo/logo_only_dark.webp +0 -0
  266. package/src/interfaces/web/public/logo/logo_only_white.webp +0 -0
  267. package/src/interfaces/web/public/logo/logo_vertical_dark.webp +0 -0
  268. package/src/interfaces/web/public/logo/logo_vertical_white.webp +0 -0
  269. package/src/interfaces/web/public/logo/logo_white.webp +0 -0
  270. package/src/interfaces/web/public/modules/superagent.png +0 -0
  271. package/src/interfaces/web/src/App.tsx +199 -0
  272. package/src/interfaces/web/src/components/AddProjectDialog.tsx +121 -0
  273. package/src/interfaces/web/src/components/ModelCombobox.tsx +96 -0
  274. package/src/interfaces/web/src/components/RobyBubble.tsx +213 -0
  275. package/src/interfaces/web/src/components/Section.tsx +44 -0
  276. package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +97 -0
  277. package/src/interfaces/web/src/components/TelegramSendDialog.tsx +48 -0
  278. package/src/interfaces/web/src/components/Toast.tsx +84 -0
  279. package/src/interfaces/web/src/components/UiSelect.tsx +74 -0
  280. package/src/interfaces/web/src/components/chat/Composer.tsx +43 -0
  281. package/src/interfaces/web/src/components/chat/ContextBar.tsx +111 -0
  282. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +95 -0
  283. package/src/interfaces/web/src/components/chat/MessageList.tsx +35 -0
  284. package/src/interfaces/web/src/components/chat/ModelPicker.tsx +145 -0
  285. package/src/interfaces/web/src/components/chat/ToolCall.tsx +141 -0
  286. package/src/interfaces/web/src/components/code/CodeChangesTab.tsx +87 -0
  287. package/src/interfaces/web/src/components/code/CodeComposer.tsx +87 -0
  288. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +83 -0
  289. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +39 -0
  290. package/src/interfaces/web/src/components/code/CodeSessionList.tsx +97 -0
  291. package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +44 -0
  292. package/src/interfaces/web/src/components/code/CodeToolTrail.tsx +29 -0
  293. package/src/interfaces/web/src/components/code/DiffView.tsx +67 -0
  294. package/src/interfaces/web/src/components/common/Qr.tsx +27 -0
  295. package/src/interfaces/web/src/components/common/TabLayout.tsx +46 -0
  296. package/src/interfaces/web/src/components/common/TabNav.tsx +113 -0
  297. package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +202 -0
  298. package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +42 -0
  299. package/src/interfaces/web/src/components/config/global-config-sections.ts +60 -0
  300. package/src/interfaces/web/src/components/config/project-config-sections.ts +58 -0
  301. package/src/interfaces/web/src/components/deck/DaemonCard.tsx +58 -0
  302. package/src/interfaces/web/src/components/deck/DesktopGroup.tsx +33 -0
  303. package/src/interfaces/web/src/components/deck/WidgetRow.tsx +100 -0
  304. package/src/interfaces/web/src/components/layout/Logo.tsx +59 -0
  305. package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +116 -0
  306. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +151 -0
  307. package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +45 -0
  308. package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +72 -0
  309. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +232 -0
  310. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +60 -0
  311. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +127 -0
  312. package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +69 -0
  313. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +226 -0
  314. package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +175 -0
  315. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +93 -0
  316. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +90 -0
  317. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +101 -0
  318. package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +100 -0
  319. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +108 -0
  320. package/src/interfaces/web/src/components/settings/TelegramSettingsTabs.tsx +55 -0
  321. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +95 -0
  322. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +405 -0
  323. package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +155 -0
  324. package/src/interfaces/web/src/components/settings/providers/types.ts +26 -0
  325. package/src/interfaces/web/src/components/ui/accordion.tsx +72 -0
  326. package/src/interfaces/web/src/components/ui/alert-dialog.tsx +187 -0
  327. package/src/interfaces/web/src/components/ui/alert.tsx +76 -0
  328. package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +22 -0
  329. package/src/interfaces/web/src/components/ui/avatar.tsx +107 -0
  330. package/src/interfaces/web/src/components/ui/badge.tsx +52 -0
  331. package/src/interfaces/web/src/components/ui/breadcrumb.tsx +125 -0
  332. package/src/interfaces/web/src/components/ui/button-group.tsx +87 -0
  333. package/src/interfaces/web/src/components/ui/button.tsx +58 -0
  334. package/src/interfaces/web/src/components/ui/calendar.tsx +221 -0
  335. package/src/interfaces/web/src/components/ui/card.tsx +103 -0
  336. package/src/interfaces/web/src/components/ui/carousel.tsx +242 -0
  337. package/src/interfaces/web/src/components/ui/chart.tsx +371 -0
  338. package/src/interfaces/web/src/components/ui/chat-input.tsx +122 -0
  339. package/src/interfaces/web/src/components/ui/checkbox.tsx +29 -0
  340. package/src/interfaces/web/src/components/ui/collapsible.tsx +19 -0
  341. package/src/interfaces/web/src/components/ui/combobox.tsx +295 -0
  342. package/src/interfaces/web/src/components/ui/command.tsx +196 -0
  343. package/src/interfaces/web/src/components/ui/context-menu.tsx +271 -0
  344. package/src/interfaces/web/src/components/ui/dialog.tsx +158 -0
  345. package/src/interfaces/web/src/components/ui/direction.tsx +4 -0
  346. package/src/interfaces/web/src/components/ui/drawer.tsx +134 -0
  347. package/src/interfaces/web/src/components/ui/dropdown-menu.tsx +266 -0
  348. package/src/interfaces/web/src/components/ui/empty.tsx +104 -0
  349. package/src/interfaces/web/src/components/ui/field.tsx +236 -0
  350. package/src/interfaces/web/src/components/ui/hover-card.tsx +51 -0
  351. package/src/interfaces/web/src/components/ui/input-group.tsx +158 -0
  352. package/src/interfaces/web/src/components/ui/input-otp.tsx +85 -0
  353. package/src/interfaces/web/src/components/ui/input.tsx +20 -0
  354. package/src/interfaces/web/src/components/ui/item.tsx +201 -0
  355. package/src/interfaces/web/src/components/ui/kbd.tsx +26 -0
  356. package/src/interfaces/web/src/components/ui/label.tsx +20 -0
  357. package/src/interfaces/web/src/components/ui/menubar.tsx +280 -0
  358. package/src/interfaces/web/src/components/ui/native-select.tsx +61 -0
  359. package/src/interfaces/web/src/components/ui/navigation-menu.tsx +168 -0
  360. package/src/interfaces/web/src/components/ui/pagination.tsx +130 -0
  361. package/src/interfaces/web/src/components/ui/popover.tsx +88 -0
  362. package/src/interfaces/web/src/components/ui/progress.tsx +83 -0
  363. package/src/interfaces/web/src/components/ui/radio-group.tsx +36 -0
  364. package/src/interfaces/web/src/components/ui/resizable.tsx +50 -0
  365. package/src/interfaces/web/src/components/ui/scroll-area.tsx +53 -0
  366. package/src/interfaces/web/src/components/ui/select.tsx +201 -0
  367. package/src/interfaces/web/src/components/ui/separator.tsx +23 -0
  368. package/src/interfaces/web/src/components/ui/sheet.tsx +138 -0
  369. package/src/interfaces/web/src/components/ui/sidebar.tsx +723 -0
  370. package/src/interfaces/web/src/components/ui/skeleton.tsx +13 -0
  371. package/src/interfaces/web/src/components/ui/slider.tsx +52 -0
  372. package/src/interfaces/web/src/components/ui/sonner.tsx +49 -0
  373. package/src/interfaces/web/src/components/ui/spinner.tsx +10 -0
  374. package/src/interfaces/web/src/components/ui/switch.tsx +30 -0
  375. package/src/interfaces/web/src/components/ui/table.tsx +116 -0
  376. package/src/interfaces/web/src/components/ui/tabs.tsx +72 -0
  377. package/src/interfaces/web/src/components/ui/textarea.tsx +18 -0
  378. package/src/interfaces/web/src/components/ui/tip.tsx +21 -0
  379. package/src/interfaces/web/src/components/ui/toggle-group.tsx +87 -0
  380. package/src/interfaces/web/src/components/ui/toggle.tsx +45 -0
  381. package/src/interfaces/web/src/components/ui/tooltip.tsx +64 -0
  382. package/src/interfaces/web/src/components/ui.tsx +211 -0
  383. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +197 -0
  384. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +213 -0
  385. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +72 -0
  386. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +112 -0
  387. package/src/interfaces/web/src/components/voice/useTtsPlayer.ts +59 -0
  388. package/src/interfaces/web/src/constants/index.ts +91 -0
  389. package/src/interfaces/web/src/hooks/use-mobile.ts +19 -0
  390. package/src/interfaces/web/src/hooks/useChat.ts +276 -0
  391. package/src/interfaces/web/src/hooks/useDaemonStatus.ts +12 -0
  392. package/src/interfaces/web/src/hooks/useDevices.ts +12 -0
  393. package/src/interfaces/web/src/hooks/useEngines.ts +10 -0
  394. package/src/interfaces/web/src/hooks/useGlobalConfig.ts +24 -0
  395. package/src/interfaces/web/src/hooks/useIdentity.ts +16 -0
  396. package/src/interfaces/web/src/hooks/useProjects.ts +27 -0
  397. package/src/interfaces/web/src/hooks/useTelegram.ts +35 -0
  398. package/src/interfaces/web/src/hooks/useTheme.tsx +57 -0
  399. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +122 -0
  400. package/src/interfaces/web/src/i18n/en.ts +767 -0
  401. package/src/interfaces/web/src/i18n/es.ts +770 -0
  402. package/src/interfaces/web/src/i18n/index.ts +86 -0
  403. package/src/interfaces/web/src/lib/api/admin.ts +30 -0
  404. package/src/interfaces/web/src/lib/api/agents.ts +46 -0
  405. package/src/interfaces/web/src/lib/api/code.ts +122 -0
  406. package/src/interfaces/web/src/lib/api/conversations.ts +16 -0
  407. package/src/interfaces/web/src/lib/api/deck.ts +106 -0
  408. package/src/interfaces/web/src/lib/api/desktop.ts +54 -0
  409. package/src/interfaces/web/src/lib/api/embeddings.ts +44 -0
  410. package/src/interfaces/web/src/lib/api/engines.ts +17 -0
  411. package/src/interfaces/web/src/lib/api/filesystem.ts +12 -0
  412. package/src/interfaces/web/src/lib/api/health.ts +6 -0
  413. package/src/interfaces/web/src/lib/api/identity.ts +7 -0
  414. package/src/interfaces/web/src/lib/api/mcps.ts +29 -0
  415. package/src/interfaces/web/src/lib/api/messages.ts +24 -0
  416. package/src/interfaces/web/src/lib/api/projects.ts +29 -0
  417. package/src/interfaces/web/src/lib/api/routines.ts +14 -0
  418. package/src/interfaces/web/src/lib/api/sessions.ts +16 -0
  419. package/src/interfaces/web/src/lib/api/super_agent.ts +29 -0
  420. package/src/interfaces/web/src/lib/api/tasks.ts +19 -0
  421. package/src/interfaces/web/src/lib/api/telegram.ts +57 -0
  422. package/src/interfaces/web/src/lib/api/tools.ts +13 -0
  423. package/src/interfaces/web/src/lib/api/voice.ts +169 -0
  424. package/src/interfaces/web/src/lib/api.ts +48 -0
  425. package/src/interfaces/web/src/lib/cn.ts +6 -0
  426. package/src/interfaces/web/src/lib/code-context.ts +83 -0
  427. package/src/interfaces/web/src/lib/config-values.ts +29 -0
  428. package/src/interfaces/web/src/lib/device.ts +10 -0
  429. package/src/interfaces/web/src/lib/http.ts +104 -0
  430. package/src/interfaces/web/src/lib/secrets.ts +15 -0
  431. package/src/interfaces/web/src/lib/utils.ts +6 -0
  432. package/src/interfaces/web/src/main.tsx +16 -0
  433. package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +174 -0
  434. package/src/interfaces/web/src/screens/PairingScreen.tsx +105 -0
  435. package/src/interfaces/web/src/screens/ProjectScreen.tsx +178 -0
  436. package/src/interfaces/web/src/screens/SettingsScreen.tsx +111 -0
  437. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +274 -0
  438. package/src/interfaces/web/src/screens/base/ComingSoon.tsx +16 -0
  439. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +53 -0
  440. package/src/interfaces/web/src/screens/base/LogsTab.tsx +188 -0
  441. package/src/interfaces/web/src/screens/base/ModelsTab.tsx +13 -0
  442. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +58 -0
  443. package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +49 -0
  444. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +295 -0
  445. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +173 -0
  446. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +304 -0
  447. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +174 -0
  448. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +152 -0
  449. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +455 -0
  450. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +364 -0
  451. package/src/interfaces/web/src/screens/project/ChatTab.tsx +198 -0
  452. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +94 -0
  453. package/src/interfaces/web/src/screens/project/McpsTab.tsx +149 -0
  454. package/src/interfaces/web/src/screens/project/MemoriesTab.tsx +134 -0
  455. package/src/interfaces/web/src/screens/project/Overview.tsx +37 -0
  456. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +386 -0
  457. package/src/interfaces/web/src/screens/project/TasksTab.tsx +116 -0
  458. package/src/interfaces/web/src/screens/project/TelegramTab.tsx +126 -0
  459. package/src/interfaces/web/src/screens/project/ThreadsTab.tsx +100 -0
  460. package/src/interfaces/web/src/styles.css +128 -0
  461. package/src/interfaces/web/src/types/daemon.ts +289 -0
  462. package/src/interfaces/web/tailwind.config.js +53 -0
  463. package/src/interfaces/web/tsconfig.json +24 -0
  464. package/src/interfaces/web/vite.config.ts +50 -0
  465. package/src/cli/commands/exec.js +0 -56
  466. package/src/cli/commands/overlay.js +0 -253
  467. package/src/cli/commands/session.js +0 -395
  468. package/src/cli/commands/sessions.js +0 -517
  469. package/src/cli/commands/telegram.js +0 -77
  470. package/src/cli/postinstall.js +0 -75
  471. package/src/cli-ts/commands/agent.ts +0 -173
  472. package/src/cli-ts/commands/chat.ts +0 -119
  473. package/src/cli-ts/commands/daemon.ts +0 -112
  474. package/src/cli-ts/commands/exec.ts +0 -109
  475. package/src/cli-ts/commands/mcp.ts +0 -235
  476. package/src/cli-ts/commands/session.ts +0 -224
  477. package/src/cli-ts/commands/status.ts +0 -61
  478. package/src/cli-ts/http.ts +0 -36
  479. package/src/cli-ts/index.ts +0 -73
  480. package/src/cli-ts/ui.ts +0 -107
  481. package/src/daemon/api.js +0 -1558
  482. package/src/daemon/engines/gemini.js +0 -56
  483. package/src/daemon/engines/openai.js +0 -79
  484. package/src/daemon/mcp-sources.js +0 -114
  485. package/src/daemon/super-agent-tools/index.js +0 -84
  486. package/src/daemon/super-agent-tools.js +0 -1
  487. package/src/daemon/super-agent.js +0 -541
  488. package/src/overlay/index.html +0 -44
  489. package/src/overlay/main.js +0 -480
  490. package/src/overlay/preload.js +0 -34
  491. package/src/overlay/renderer.js +0 -371
  492. package/src/overlay/style.css +0 -250
  493. package/src/tui/context/sync-apx.tsx +0 -284
  494. package/src/tui/routes/session/index.tsx +0 -274
  495. package/src/tui/routes/session/sidebar-apx.tsx +0 -90
  496. /package/src/{daemon → core}/tools/browser.js +0 -0
  497. /package/src/{daemon → core}/tools/fetch.js +0 -0
  498. /package/src/{daemon → core}/tools/glob.js +0 -0
  499. /package/src/{daemon → core}/tools/grep.js +0 -0
  500. /package/src/{daemon → core}/tools/registry.js +0 -0
  501. /package/src/{daemon → core}/tools/search.js +0 -0
  502. /package/src/{daemon → host/daemon}/conversations.js +0 -0
  503. /package/src/{daemon → host/daemon}/env-detect.js +0 -0
  504. /package/src/{daemon → host/daemon}/runtimes/_spawn.js +0 -0
  505. /package/src/{daemon → host/daemon}/runtimes/aider.js +0 -0
  506. /package/src/{daemon → host/daemon}/runtimes/claude-code.js +0 -0
  507. /package/src/{daemon → host/daemon}/runtimes/codex.js +0 -0
  508. /package/src/{daemon → host/daemon}/runtimes/cursor-agent.js +0 -0
  509. /package/src/{daemon → host/daemon}/runtimes/gemini-cli.js +0 -0
  510. /package/src/{daemon → host/daemon}/runtimes/index.js +0 -0
  511. /package/src/{daemon → host/daemon}/runtimes/opencode.js +0 -0
  512. /package/src/{daemon → host/daemon}/runtimes/qwen-code.js +0 -0
  513. /package/src/{daemon → host/daemon}/super-agent-tools/tools/call-mcp.js +0 -0
  514. /package/src/{daemon → host/daemon}/super-agent-tools/tools/edit-file.js +0 -0
  515. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-files.js +0 -0
  516. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-mcps.js +0 -0
  517. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-projects.js +0 -0
  518. /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-skills.js +0 -0
  519. /package/src/{daemon → host/daemon}/super-agent-tools/tools/load-skill.js +0 -0
  520. /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-agent-memory.js +0 -0
  521. /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-file.js +0 -0
  522. /package/src/{daemon → host/daemon}/super-agent-tools/tools/run-shell.js +0 -0
  523. /package/src/{daemon → host/daemon}/super-agent-tools/tools/search-files.js +0 -0
  524. /package/src/{daemon → host/daemon}/super-agent-tools/tools/transcribe-audio.js +0 -0
  525. /package/src/{daemon → host/daemon}/super-agent-tools/tools/write-file.js +0 -0
  526. /package/src/{daemon → host/daemon}/thinking.js +0 -0
  527. /package/src/{daemon → host/daemon}/whisper-server.py +0 -0
  528. /package/src/{daemon → host/daemon}/whisper-transcribe.py +0 -0
  529. /package/src/{cli → interfaces/cli}/commands/a2a.js +0 -0
  530. /package/src/{cli → interfaces/cli}/commands/artifact.js +0 -0
  531. /package/src/{cli → interfaces/cli}/commands/chat.js +0 -0
  532. /package/src/{cli → interfaces/cli}/commands/log.js +0 -0
  533. /package/src/{cli → interfaces/cli}/commands/messages.js +0 -0
  534. /package/src/{cli → interfaces/cli}/commands/plugins.js +0 -0
  535. /package/src/{cli → interfaces/cli}/commands/routine.js +0 -0
  536. /package/src/{cli → interfaces/cli}/commands/runtime.js +0 -0
  537. /package/src/{cli → interfaces/cli}/terminal-chat/renderer.js +0 -0
  538. /package/src/{overlay → interfaces/desktop}/package.json +0 -0
  539. /package/src/{tui → interfaces/tui}/_shims/cli-error.ts +0 -0
  540. /package/src/{tui → interfaces/tui}/_shims/cli-logo.ts +0 -0
  541. /package/src/{tui → interfaces/tui}/_shims/cli-ui.ts +0 -0
  542. /package/src/{tui → interfaces/tui}/_shims/config-console-state.ts +0 -0
  543. /package/src/{tui → interfaces/tui}/_shims/core-any.ts +0 -0
  544. /package/src/{tui → interfaces/tui}/_shims/core-binary.ts +0 -0
  545. /package/src/{tui → interfaces/tui}/_shims/core-flag.ts +0 -0
  546. /package/src/{tui → interfaces/tui}/_shims/core-log.ts +0 -0
  547. /package/src/{tui → interfaces/tui}/_shims/lsp-language.ts +0 -0
  548. /package/src/{tui → interfaces/tui}/_shims/opencode-any.ts +0 -0
  549. /package/src/{tui → interfaces/tui}/_shims/opencode-sdk-v2.ts +0 -0
  550. /package/src/{tui → interfaces/tui}/_shims/plugin-tui.ts +0 -0
  551. /package/src/{tui → interfaces/tui}/_shims/prompt-display.ts +0 -0
  552. /package/src/{tui → interfaces/tui}/_shims/provider-provider.ts +0 -0
  553. /package/src/{tui → interfaces/tui}/_shims/session-retry.ts +0 -0
  554. /package/src/{tui → interfaces/tui}/_shims/session-schema.ts +0 -0
  555. /package/src/{tui → interfaces/tui}/_shims/session-session.ts +0 -0
  556. /package/src/{tui → interfaces/tui}/_shims/snapshot.ts +0 -0
  557. /package/src/{tui → interfaces/tui}/_shims/tool-any.ts +0 -0
  558. /package/src/{tui → interfaces/tui}/_shims/util-error.ts +0 -0
  559. /package/src/{tui → interfaces/tui}/_shims/util-filesystem.ts +0 -0
  560. /package/src/{tui → interfaces/tui}/_shims/util-format.ts +0 -0
  561. /package/src/{tui → interfaces/tui}/_shims/util-iife.ts +0 -0
  562. /package/src/{tui → interfaces/tui}/_shims/util-locale.ts +0 -0
  563. /package/src/{tui → interfaces/tui}/_shims/util-process.ts +0 -0
  564. /package/src/{tui → interfaces/tui}/asset/charge.wav +0 -0
  565. /package/src/{tui → interfaces/tui}/asset/pulse-a.wav +0 -0
  566. /package/src/{tui → interfaces/tui}/asset/pulse-b.wav +0 -0
  567. /package/src/{tui → interfaces/tui}/asset/pulse-c.wav +0 -0
  568. /package/src/{tui → interfaces/tui}/attach.ts +0 -0
  569. /package/src/{tui → interfaces/tui}/component/bg-pulse-render.ts +0 -0
  570. /package/src/{tui → interfaces/tui}/component/bg-pulse.tsx +0 -0
  571. /package/src/{tui → interfaces/tui}/component/border.tsx +0 -0
  572. /package/src/{tui → interfaces/tui}/component/dialog-agent.tsx +0 -0
  573. /package/src/{tui → interfaces/tui}/component/dialog-console-org.tsx +0 -0
  574. /package/src/{tui → interfaces/tui}/component/dialog-mcp.tsx +0 -0
  575. /package/src/{tui → interfaces/tui}/component/dialog-model.tsx +0 -0
  576. /package/src/{tui → interfaces/tui}/component/dialog-provider.tsx +0 -0
  577. /package/src/{tui → interfaces/tui}/component/dialog-retry-action.tsx +0 -0
  578. /package/src/{tui → interfaces/tui}/component/dialog-session-delete-failed.tsx +0 -0
  579. /package/src/{tui → interfaces/tui}/component/dialog-session-list.tsx +0 -0
  580. /package/src/{tui → interfaces/tui}/component/dialog-session-rename.tsx +0 -0
  581. /package/src/{tui → interfaces/tui}/component/dialog-skill.tsx +0 -0
  582. /package/src/{tui → interfaces/tui}/component/dialog-stash.tsx +0 -0
  583. /package/src/{tui → interfaces/tui}/component/dialog-status.tsx +0 -0
  584. /package/src/{tui → interfaces/tui}/component/dialog-tag.tsx +0 -0
  585. /package/src/{tui → interfaces/tui}/component/dialog-theme-list.tsx +0 -0
  586. /package/src/{tui → interfaces/tui}/component/dialog-variant.tsx +0 -0
  587. /package/src/{tui → interfaces/tui}/component/dialog-workspace-create.tsx +0 -0
  588. /package/src/{tui → interfaces/tui}/component/dialog-workspace-file-changes.tsx +0 -0
  589. /package/src/{tui → interfaces/tui}/component/dialog-workspace-unavailable.tsx +0 -0
  590. /package/src/{tui → interfaces/tui}/component/error-component.tsx +0 -0
  591. /package/src/{tui → interfaces/tui}/component/logo.tsx +0 -0
  592. /package/src/{tui → interfaces/tui}/component/plugin-route-missing.tsx +0 -0
  593. /package/src/{tui → interfaces/tui}/component/prompt/autocomplete.tsx +0 -0
  594. /package/src/{tui → interfaces/tui}/component/prompt/cwd.ts +0 -0
  595. /package/src/{tui → interfaces/tui}/component/prompt/frecency.tsx +0 -0
  596. /package/src/{tui → interfaces/tui}/component/prompt/history.tsx +0 -0
  597. /package/src/{tui → interfaces/tui}/component/prompt/part.ts +0 -0
  598. /package/src/{tui → interfaces/tui}/component/prompt/stash.tsx +0 -0
  599. /package/src/{tui → interfaces/tui}/component/prompt/traits.ts +0 -0
  600. /package/src/{tui → interfaces/tui}/component/spinner.tsx +0 -0
  601. /package/src/{tui → interfaces/tui}/component/startup-loading.tsx +0 -0
  602. /package/src/{tui → interfaces/tui}/component/todo-item.tsx +0 -0
  603. /package/src/{tui → interfaces/tui}/component/use-connected.tsx +0 -0
  604. /package/src/{tui → interfaces/tui}/component/workspace-label.tsx +0 -0
  605. /package/src/{tui → interfaces/tui}/config/cwd.ts +0 -0
  606. /package/src/{tui → interfaces/tui}/config/keybind.ts +0 -0
  607. /package/src/{tui → interfaces/tui}/config/tui-migrate.ts +0 -0
  608. /package/src/{tui → interfaces/tui}/config/tui-schema.ts +0 -0
  609. /package/src/{tui → interfaces/tui}/config/tui.ts +0 -0
  610. /package/src/{tui → interfaces/tui}/context/aggregate-failures.ts +0 -0
  611. /package/src/{tui → interfaces/tui}/context/args.tsx +0 -0
  612. /package/src/{tui → interfaces/tui}/context/command-palette.tsx +0 -0
  613. /package/src/{tui → interfaces/tui}/context/directory.ts +0 -0
  614. /package/src/{tui → interfaces/tui}/context/editor-zed.ts +0 -0
  615. /package/src/{tui → interfaces/tui}/context/editor.ts +0 -0
  616. /package/src/{tui → interfaces/tui}/context/event-apx.ts +0 -0
  617. /package/src/{tui → interfaces/tui}/context/event.ts +0 -0
  618. /package/src/{tui → interfaces/tui}/context/exit.tsx +0 -0
  619. /package/src/{tui → interfaces/tui}/context/helper.tsx +0 -0
  620. /package/src/{tui → interfaces/tui}/context/kv.tsx +0 -0
  621. /package/src/{tui → interfaces/tui}/context/local.tsx +0 -0
  622. /package/src/{tui → interfaces/tui}/context/path-format.tsx +0 -0
  623. /package/src/{tui → interfaces/tui}/context/project-apx.tsx +0 -0
  624. /package/src/{tui → interfaces/tui}/context/project.tsx +0 -0
  625. /package/src/{tui → interfaces/tui}/context/prompt.tsx +0 -0
  626. /package/src/{tui → interfaces/tui}/context/route.tsx +0 -0
  627. /package/src/{tui → interfaces/tui}/context/sdk.tsx +0 -0
  628. /package/src/{tui → interfaces/tui}/context/sync-v2.tsx +0 -0
  629. /package/src/{tui → interfaces/tui}/context/sync.tsx +0 -0
  630. /package/src/{tui → interfaces/tui}/context/theme/aura.json +0 -0
  631. /package/src/{tui → interfaces/tui}/context/theme/ayu.json +0 -0
  632. /package/src/{tui → interfaces/tui}/context/theme/carbonfox.json +0 -0
  633. /package/src/{tui → interfaces/tui}/context/theme/catppuccin-frappe.json +0 -0
  634. /package/src/{tui → interfaces/tui}/context/theme/catppuccin-macchiato.json +0 -0
  635. /package/src/{tui → interfaces/tui}/context/theme/catppuccin.json +0 -0
  636. /package/src/{tui → interfaces/tui}/context/theme/cobalt2.json +0 -0
  637. /package/src/{tui → interfaces/tui}/context/theme/cursor.json +0 -0
  638. /package/src/{tui → interfaces/tui}/context/theme/dracula.json +0 -0
  639. /package/src/{tui → interfaces/tui}/context/theme/everforest.json +0 -0
  640. /package/src/{tui → interfaces/tui}/context/theme/flexoki.json +0 -0
  641. /package/src/{tui → interfaces/tui}/context/theme/github.json +0 -0
  642. /package/src/{tui → interfaces/tui}/context/theme/gruvbox.json +0 -0
  643. /package/src/{tui → interfaces/tui}/context/theme/kanagawa.json +0 -0
  644. /package/src/{tui → interfaces/tui}/context/theme/lucent-orng.json +0 -0
  645. /package/src/{tui → interfaces/tui}/context/theme/material.json +0 -0
  646. /package/src/{tui → interfaces/tui}/context/theme/matrix.json +0 -0
  647. /package/src/{tui → interfaces/tui}/context/theme/mercury.json +0 -0
  648. /package/src/{tui → interfaces/tui}/context/theme/monokai.json +0 -0
  649. /package/src/{tui → interfaces/tui}/context/theme/nightowl.json +0 -0
  650. /package/src/{tui → interfaces/tui}/context/theme/nord.json +0 -0
  651. /package/src/{tui → interfaces/tui}/context/theme/one-dark.json +0 -0
  652. /package/src/{tui → interfaces/tui}/context/theme/opencode.json +0 -0
  653. /package/src/{tui → interfaces/tui}/context/theme/orng.json +0 -0
  654. /package/src/{tui → interfaces/tui}/context/theme/osaka-jade.json +0 -0
  655. /package/src/{tui → interfaces/tui}/context/theme/palenight.json +0 -0
  656. /package/src/{tui → interfaces/tui}/context/theme/rosepine.json +0 -0
  657. /package/src/{tui → interfaces/tui}/context/theme/solarized.json +0 -0
  658. /package/src/{tui → interfaces/tui}/context/theme/synthwave84.json +0 -0
  659. /package/src/{tui → interfaces/tui}/context/theme/tokyonight.json +0 -0
  660. /package/src/{tui → interfaces/tui}/context/theme/vercel.json +0 -0
  661. /package/src/{tui → interfaces/tui}/context/theme/vesper.json +0 -0
  662. /package/src/{tui → interfaces/tui}/context/theme/zenburn.json +0 -0
  663. /package/src/{tui → interfaces/tui}/context/theme.tsx +0 -0
  664. /package/src/{tui → interfaces/tui}/context/tui-config.tsx +0 -0
  665. /package/src/{tui → interfaces/tui}/event.ts +0 -0
  666. /package/src/{tui → interfaces/tui}/feature-plugins/home/footer.tsx +0 -0
  667. /package/src/{tui → interfaces/tui}/feature-plugins/home/tips-view.tsx +0 -0
  668. /package/src/{tui → interfaces/tui}/feature-plugins/home/tips.tsx +0 -0
  669. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/context.tsx +0 -0
  670. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/files.tsx +0 -0
  671. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/footer.tsx +0 -0
  672. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/lsp.tsx +0 -0
  673. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/mcp.tsx +0 -0
  674. /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/todo.tsx +0 -0
  675. /package/src/{tui → interfaces/tui}/feature-plugins/system/plugins.tsx +0 -0
  676. /package/src/{tui → interfaces/tui}/feature-plugins/system/session-v2.tsx +0 -0
  677. /package/src/{tui → interfaces/tui}/feature-plugins/system/which-key.tsx +0 -0
  678. /package/src/{tui → interfaces/tui}/keymap.tsx +0 -0
  679. /package/src/{tui → interfaces/tui}/layer.ts +0 -0
  680. /package/src/{tui → interfaces/tui}/plugin/api.tsx +0 -0
  681. /package/src/{tui → interfaces/tui}/plugin/command-shim.ts +0 -0
  682. /package/src/{tui → interfaces/tui}/plugin/internal.ts +0 -0
  683. /package/src/{tui → interfaces/tui}/plugin/runtime.ts +0 -0
  684. /package/src/{tui → interfaces/tui}/plugin/slots.tsx +0 -0
  685. /package/src/{tui → interfaces/tui}/routes/home.tsx +0 -0
  686. /package/src/{tui → interfaces/tui}/routes/session/dialog-fork-from-timeline.tsx +0 -0
  687. /package/src/{tui → interfaces/tui}/routes/session/dialog-message.tsx +0 -0
  688. /package/src/{tui → interfaces/tui}/routes/session/dialog-subagent.tsx +0 -0
  689. /package/src/{tui → interfaces/tui}/routes/session/dialog-timeline.tsx +0 -0
  690. /package/src/{tui → interfaces/tui}/routes/session/footer.tsx +0 -0
  691. /package/src/{tui → interfaces/tui}/routes/session/permission.tsx +0 -0
  692. /package/src/{tui → interfaces/tui}/routes/session/question.tsx +0 -0
  693. /package/src/{tui → interfaces/tui}/routes/session/sidebar.tsx +0 -0
  694. /package/src/{tui → interfaces/tui}/routes/session/subagent-footer.tsx +0 -0
  695. /package/src/{tui → interfaces/tui}/run.ts +0 -0
  696. /package/src/{tui → interfaces/tui}/thread.ts +0 -0
  697. /package/src/{tui → interfaces/tui}/ui/dialog-alert.tsx +0 -0
  698. /package/src/{tui → interfaces/tui}/ui/dialog-confirm.tsx +0 -0
  699. /package/src/{tui → interfaces/tui}/ui/dialog-export-options.tsx +0 -0
  700. /package/src/{tui → interfaces/tui}/ui/dialog-help.tsx +0 -0
  701. /package/src/{tui → interfaces/tui}/ui/dialog-prompt.tsx +0 -0
  702. /package/src/{tui → interfaces/tui}/ui/dialog-select.tsx +0 -0
  703. /package/src/{tui → interfaces/tui}/ui/dialog.tsx +0 -0
  704. /package/src/{tui → interfaces/tui}/ui/link.tsx +0 -0
  705. /package/src/{tui → interfaces/tui}/ui/spinner.ts +0 -0
  706. /package/src/{tui → interfaces/tui}/ui/toast.tsx +0 -0
  707. /package/src/{tui → interfaces/tui}/util/editor.ts +0 -0
  708. /package/src/{tui → interfaces/tui}/util/model.ts +0 -0
  709. /package/src/{tui → interfaces/tui}/util/provider-origin.ts +0 -0
  710. /package/src/{tui → interfaces/tui}/util/revert-diff.ts +0 -0
  711. /package/src/{tui → interfaces/tui}/util/scroll.ts +0 -0
  712. /package/src/{tui → interfaces/tui}/util/selection.ts +0 -0
  713. /package/src/{tui → interfaces/tui}/util/signal.ts +0 -0
  714. /package/src/{tui → interfaces/tui}/util/sound.ts +0 -0
  715. /package/src/{tui → interfaces/tui}/util/transcript.ts +0 -0
  716. /package/src/{tui → interfaces/tui}/validate-session.ts +0 -0
  717. /package/src/{tui → interfaces/tui}/win32.ts +0 -0
  718. /package/src/{tui → interfaces/tui}/worker.ts +0 -0
@@ -0,0 +1,231 @@
1
+ // Vector store for the cross-channel memory RAG (Pieza 2).
2
+ //
3
+ // Dual backend, chosen at open() time:
4
+ // 1. SqliteVecStore — better-sqlite3 + the sqlite-vec extension, persisted to
5
+ // ~/.apx/memory.db. Uses vec_distance_cosine() for scoring. Preferred.
6
+ // 2. JsonStore — a dependency-free JSONL file with brute-force cosine in JS.
7
+ // Used when better-sqlite3 / sqlite-vec can't load (no native binary).
8
+ //
9
+ // Both expose the same interface:
10
+ // upsert(rows) rows: {id, source, channel, ts, tag, text, embedder, dim, vector}
11
+ // search(vector, {embedder, k, channel}) -> [{...row, score}]
12
+ // hasId(id) / count()
13
+ // close()
14
+ //
15
+ // Cosine is only meaningful within one embedder space, so search() filters to
16
+ // rows whose `embedder` matches the query's embedder. Everything here is
17
+ // best-effort: open() never throws — on any failure it returns a JsonStore.
18
+
19
+ import fs from "node:fs";
20
+ import path from "node:path";
21
+ import { cosineSim } from "./embeddings.js";
22
+
23
+ function vecToBlob(vec) {
24
+ const f = new Float32Array(vec);
25
+ return Buffer.from(f.buffer, f.byteOffset, f.byteLength);
26
+ }
27
+
28
+ // ---------------------------------------------------------------------------
29
+ // JSON fallback store
30
+ // ---------------------------------------------------------------------------
31
+ export class JsonStore {
32
+ constructor(jsonPath) {
33
+ this.jsonPath = jsonPath;
34
+ this.rows = new Map(); // id -> row {id, source, channel, ts, tag, text, embedder, dim, vector}
35
+ this.backend = "json";
36
+ this._load();
37
+ }
38
+
39
+ _load() {
40
+ try {
41
+ const text = fs.readFileSync(this.jsonPath, "utf8");
42
+ for (const line of text.split("\n")) {
43
+ const t = line.trim();
44
+ if (!t) continue;
45
+ try {
46
+ const row = JSON.parse(t);
47
+ if (row && row.id) this.rows.set(row.id, row);
48
+ } catch {
49
+ /* skip bad line */
50
+ }
51
+ }
52
+ } catch {
53
+ /* no file yet */
54
+ }
55
+ }
56
+
57
+ _flush() {
58
+ fs.mkdirSync(path.dirname(this.jsonPath), { recursive: true });
59
+ const lines = [];
60
+ for (const row of this.rows.values()) lines.push(JSON.stringify(row));
61
+ const tmp = `${this.jsonPath}.tmp`;
62
+ fs.writeFileSync(tmp, lines.join("\n") + (lines.length ? "\n" : ""));
63
+ fs.renameSync(tmp, this.jsonPath);
64
+ }
65
+
66
+ upsert(rows) {
67
+ let n = 0;
68
+ for (const r of rows) {
69
+ if (!r || !r.id) continue;
70
+ this.rows.set(r.id, r);
71
+ n++;
72
+ }
73
+ if (n) this._flush();
74
+ return n;
75
+ }
76
+
77
+ hasId(id) {
78
+ return this.rows.has(id);
79
+ }
80
+
81
+ count() {
82
+ return this.rows.size;
83
+ }
84
+
85
+ clear() {
86
+ this.rows.clear();
87
+ this._flush();
88
+ }
89
+
90
+ search(vector, { embedder, k = 5, channel } = {}) {
91
+ const scored = [];
92
+ for (const row of this.rows.values()) {
93
+ if (embedder && row.embedder !== embedder) continue;
94
+ if (channel && row.channel !== channel) continue;
95
+ if (!Array.isArray(row.vector) || row.vector.length !== vector.length) continue;
96
+ scored.push({ ...row, score: cosineSim(vector, row.vector) });
97
+ }
98
+ scored.sort((a, b) => b.score - a.score);
99
+ return scored.slice(0, k);
100
+ }
101
+
102
+ close() {
103
+ /* nothing to release */
104
+ }
105
+ }
106
+
107
+ // ---------------------------------------------------------------------------
108
+ // sqlite-vec store
109
+ // ---------------------------------------------------------------------------
110
+ class SqliteVecStore {
111
+ constructor(db) {
112
+ this.db = db;
113
+ this.backend = "sqlite-vec";
114
+ db.exec(`
115
+ CREATE TABLE IF NOT EXISTS chunks (
116
+ id TEXT PRIMARY KEY,
117
+ source TEXT,
118
+ channel TEXT,
119
+ ts TEXT,
120
+ tag TEXT,
121
+ text TEXT,
122
+ embedder TEXT,
123
+ dim INTEGER,
124
+ vec BLOB
125
+ );
126
+ CREATE INDEX IF NOT EXISTS idx_chunks_embedder ON chunks(embedder);
127
+ `);
128
+ this._insert = db.prepare(
129
+ `INSERT INTO chunks (id, source, channel, ts, tag, text, embedder, dim, vec)
130
+ VALUES (@id, @source, @channel, @ts, @tag, @text, @embedder, @dim, @vec)
131
+ ON CONFLICT(id) DO UPDATE SET
132
+ source=@source, channel=@channel, ts=@ts, tag=@tag, text=@text,
133
+ embedder=@embedder, dim=@dim, vec=@vec`
134
+ );
135
+ this._has = db.prepare("SELECT 1 FROM chunks WHERE id = ?");
136
+ this._count = db.prepare("SELECT COUNT(*) AS n FROM chunks");
137
+ }
138
+
139
+ upsert(rows) {
140
+ const tx = this.db.transaction((items) => {
141
+ let n = 0;
142
+ for (const r of items) {
143
+ if (!r || !r.id) continue;
144
+ this._insert.run({
145
+ id: r.id,
146
+ source: r.source || null,
147
+ channel: r.channel || null,
148
+ ts: r.ts || null,
149
+ tag: r.tag || null,
150
+ text: r.text || "",
151
+ embedder: r.embedder || null,
152
+ dim: r.dim || (r.vector ? r.vector.length : 0),
153
+ vec: vecToBlob(r.vector),
154
+ });
155
+ n++;
156
+ }
157
+ return n;
158
+ });
159
+ return tx(rows);
160
+ }
161
+
162
+ hasId(id) {
163
+ return !!this._has.get(id);
164
+ }
165
+
166
+ count() {
167
+ return this._count.get().n;
168
+ }
169
+
170
+ clear() {
171
+ this.db.prepare("DELETE FROM chunks").run();
172
+ }
173
+
174
+ search(vector, { embedder, k = 5, channel } = {}) {
175
+ const blob = vecToBlob(vector);
176
+ const where = ["embedder = ?", "dim = ?"];
177
+ const params = [embedder, vector.length];
178
+ if (channel) {
179
+ where.push("channel = ?");
180
+ params.push(channel);
181
+ }
182
+ const rows = this.db
183
+ .prepare(
184
+ `SELECT id, source, channel, ts, tag, text, embedder, dim,
185
+ vec_distance_cosine(vec, ?) AS dist
186
+ FROM chunks
187
+ WHERE ${where.join(" AND ")}
188
+ ORDER BY dist ASC
189
+ LIMIT ?`
190
+ )
191
+ .all(blob, ...params, k);
192
+ // cosine distance → similarity score in [0,1] (sqlite-vec returns 1 - cos).
193
+ return rows.map((r) => ({ ...r, score: 1 - r.dist }));
194
+ }
195
+
196
+ close() {
197
+ try {
198
+ this.db.close();
199
+ } catch {
200
+ /* ignore */
201
+ }
202
+ }
203
+ }
204
+
205
+ // Open the vector store. Async because the native modules are dynamically
206
+ // imported. Tries the sqlite-vec backend first; on ANY failure (module missing,
207
+ // extension load error, broken build) it returns a JsonStore. Never throws.
208
+ export async function openMemoryStore({ dbPath, jsonPath, log } = {}) {
209
+ const note = typeof log === "function" ? log : () => {};
210
+ if (!process.env.APX_MEMORY_FORCE_JSON) {
211
+ try {
212
+ const [{ default: Database }, sqliteVec] = await Promise.all([
213
+ import("better-sqlite3"),
214
+ import("sqlite-vec"),
215
+ ]);
216
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true });
217
+ const db = new Database(dbPath);
218
+ sqliteVec.load(db);
219
+ // Smoke-test the extension so a broken build falls back cleanly.
220
+ db.prepare("SELECT vec_distance_cosine(?, ?) AS d").get(
221
+ vecToBlob([1, 0]),
222
+ vecToBlob([1, 0])
223
+ );
224
+ note("memory: sqlite-vec backend active (" + dbPath + ")");
225
+ return new SqliteVecStore(db);
226
+ } catch (e) {
227
+ note("memory: sqlite-vec unavailable (" + (e?.message || e) + ") — JSON fallback");
228
+ }
229
+ }
230
+ return new JsonStore(jsonPath);
231
+ }
@@ -32,12 +32,41 @@ function dayPathMd(projectRoot, ts) {
32
32
  return path.join(projectRoot, "messages", `${day}.md`);
33
33
  }
34
34
 
35
- const VALID_MESSAGE_TYPES = new Set(["user", "agent", "tool", "system"]);
35
+ // `compact` is a progressive-compaction summary record (Pieza 3): a dense
36
+ // recap of older turns, stored inline in the channel JSONL so the reader can
37
+ // prepend it as a [RESUMEN COMPACTADO] system turn instead of replaying the
38
+ // raw history it covers.
39
+ const VALID_MESSAGE_TYPES = new Set(["user", "agent", "tool", "system", "compact"]);
40
+
41
+ // Render class (`type`) stays a 4-value enum the UI branches on. `actor_kind`
42
+ // is a finer discriminator stored in meta: who/what actually produced the turn.
43
+ // superagent — the APX daemon-level agent (persona from identity.json)
44
+ // agent — a project agent (its own slug/persona, may run on any engine)
45
+ // engine — a raw external engine reply with no project-agent persona
46
+ // user / tool / system — mirror the render class
47
+ const VALID_ACTOR_KINDS = new Set(["superagent", "agent", "engine", "user", "tool", "system", "compact"]);
36
48
 
37
49
  function normalizeMessageType(type) {
38
50
  return typeof type === "string" && VALID_MESSAGE_TYPES.has(type) ? type : null;
39
51
  }
40
52
 
53
+ function normalizeActorKind(kind) {
54
+ return typeof kind === "string" && VALID_ACTOR_KINDS.has(kind) ? kind : null;
55
+ }
56
+
57
+ // Best-effort classification of the actor when not given explicitly. Legacy
58
+ // records (and most call sites) don't set actor_kind, so this keeps history
59
+ // queryable: a `type:"agent"` turn whose actor_id is the stable super-agent id
60
+ // is a "superagent"; any other agent turn is a project "agent".
61
+ function inferActorKind({ actor_kind, type, actor_id, meta = {} } = {}) {
62
+ const explicit = normalizeActorKind(actor_kind) || normalizeActorKind(meta.actor_kind);
63
+ if (explicit) return explicit;
64
+ if (type === "compact") return "compact";
65
+ if (type === "user" || type === "tool" || type === "system") return type;
66
+ if (type === "agent") return actor_id === "super_agent" ? "superagent" : "agent";
67
+ return null;
68
+ }
69
+
41
70
  export function inferMessageType({ type, channel, direction, author, agent_slug, meta = {} } = {}) {
42
71
  const explicit = normalizeMessageType(type) || normalizeMessageType(meta.type) || normalizeMessageType(meta.actor_type);
43
72
  if (explicit) return explicit;
@@ -57,28 +86,31 @@ function inferActorId({ type, actor_id, author, agent_slug, meta = {} } = {}) {
57
86
  if (type === "agent") return agent_slug || author || "agent";
58
87
  if (type === "tool") return meta.tool || meta.tool_name || author || "tool";
59
88
  if (type === "system") return author || "system";
89
+ if (type === "compact") return "compact";
60
90
  return author || null;
61
91
  }
62
92
 
63
- function messageMeta({ type, actor_id, agent_slug, session_id, external_id, meta = {} }) {
93
+ function messageMeta({ type, actor_id, actor_kind, agent_slug, session_id, external_id, meta = {} }) {
64
94
  return {
65
95
  ...meta,
66
96
  type,
67
97
  ...(actor_id ? { actor_id } : {}),
98
+ ...(actor_kind ? { actor_kind } : {}),
68
99
  ...(agent_slug ? { agent: agent_slug } : {}),
69
100
  ...(session_id ? { session_id } : {}),
70
101
  ...(external_id ? { external_id } : {}),
71
102
  };
72
103
  }
73
104
 
74
- export function appendMessageToFs({ projectRoot, channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
105
+ export function appendMessageToFs({ projectRoot, channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
75
106
  ts = ts || nowIso();
76
107
  const file = dayPathJsonl(projectRoot, ts);
77
108
  fs.mkdirSync(path.dirname(file), { recursive: true });
78
109
 
79
110
  const msgType = inferMessageType({ type, channel, direction, author, agent_slug, meta });
80
111
  const msgActorId = inferActorId({ type: msgType, actor_id, author, agent_slug, meta });
81
- const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, agent_slug, session_id, external_id, meta });
112
+ const msgActorKind = inferActorKind({ actor_kind, type: msgType, actor_id: msgActorId, meta });
113
+ const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, actor_kind: msgActorKind, agent_slug, session_id, external_id, meta });
82
114
 
83
115
  const record = {
84
116
  ts,
@@ -104,9 +136,11 @@ export function insertMessageRow(db, m) {
104
136
  }
105
137
  const type = inferMessageType(m);
106
138
  const actor_id = inferActorId({ ...m, type });
139
+ const actor_kind = inferActorKind({ actor_kind: m.actor_kind, type, actor_id, meta: m.meta || {} });
107
140
  const meta = messageMeta({
108
141
  type,
109
142
  actor_id,
143
+ actor_kind,
110
144
  agent_slug: m.agent_slug,
111
145
  session_id: m.session_id,
112
146
  external_id: m.external_id,
@@ -131,13 +165,14 @@ export function insertMessageRow(db, m) {
131
165
  }
132
166
 
133
167
  // Single entry point used by everywhere the daemon writes a message.
134
- export function appendMessage({ projectRoot, db, channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
168
+ export function appendMessage({ projectRoot, db, channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
135
169
  const written = appendMessageToFs({
136
170
  projectRoot,
137
171
  channel,
138
172
  direction,
139
173
  type,
140
174
  actor_id,
175
+ actor_kind,
141
176
  author,
142
177
  body,
143
178
  meta,
@@ -151,6 +186,7 @@ export function appendMessage({ projectRoot, db, channel, direction, type, actor
151
186
  direction,
152
187
  type,
153
188
  actor_id,
189
+ actor_kind,
154
190
  author,
155
191
  body,
156
192
  meta,
@@ -188,6 +224,7 @@ export function parseDayJsonl(text) {
188
224
  agent_slug,
189
225
  meta,
190
226
  });
227
+ const actor_kind = inferActorKind({ actor_kind: obj.actor_kind, type, actor_id, meta });
191
228
  out.push({
192
229
  ts: obj.ts,
193
230
  channel: obj.channel,
@@ -195,6 +232,7 @@ export function parseDayJsonl(text) {
195
232
  type,
196
233
  author: obj.author,
197
234
  actor_id,
235
+ actor_kind,
198
236
  body: obj.body || "",
199
237
  meta,
200
238
  agent_slug,
@@ -228,10 +266,12 @@ export function parseDayFile(text) {
228
266
  const agent_slug = meta.agent;
229
267
  const type = inferMessageType({ channel, direction, author, agent_slug, meta });
230
268
  const actor_id = inferActorId({ type, author, agent_slug, meta });
269
+ const actor_kind = inferActorKind({ type, actor_id, meta });
231
270
  out.push({
232
271
  ts, channel, direction, author, body, meta,
233
272
  type,
234
273
  actor_id,
274
+ actor_kind,
235
275
  agent_slug,
236
276
  session_id: meta.session_id ?? (typeof meta.apc_session_id === "number" ? meta.apc_session_id : null),
237
277
  external_id: meta.external_id,
@@ -376,20 +416,59 @@ export function searchProjectMessages(projectRoot, query, limit = 50) {
376
416
  return all.slice(0, Math.min(limit, 500));
377
417
  }
378
418
 
379
- // File-based Telegram turn history: reads from ~/.apx/messages/telegram/ JSONL.
419
+ const TOOL_CONTEXT_CAP = 400; // chars of a tool result kept in model context
420
+
421
+ // Truncated, prefixed rendering of a tool result for model context (Pieza 3).
422
+ function renderToolResult(m) {
423
+ const name = m.meta?.tool_name || m.meta?.tool || m.actor_id || "tool";
424
+ const body = String(m.body || "").replace(/\s+/g, " ").trim();
425
+ return `[tool result: ${name}] ${body}`.slice(0, TOOL_CONTEXT_CAP);
426
+ }
427
+
428
+ // Collapse consecutive same-role entries into one message. Keeps the model
429
+ // context clean and side-steps engines (Anthropic) that dislike consecutive
430
+ // same-role turns once tool results land on the assistant side.
431
+ function coalesceTurns(turns) {
432
+ const out = [];
433
+ for (const t of turns) {
434
+ const prev = out[out.length - 1];
435
+ if (prev && prev.role === t.role) {
436
+ prev.content = `${prev.content}\n${t.content}`.trim();
437
+ } else {
438
+ out.push({ role: t.role, content: t.content });
439
+ }
440
+ }
441
+ return out;
442
+ }
443
+
444
+ // File-based channel turn history (Pieza 3). Reads ~/.apx/messages/<channel>/
445
+ // JSONL and shapes it for use as `previousMessages`:
446
+ // - the latest `compact` record (if any) is prepended as a role:"system"
447
+ // turn "[RESUMEN COMPACTADO turnos a-b]: …"; the raw turns it covers are
448
+ // dropped (they live in the summary now)
449
+ // - tool results are INCLUDED, truncated to 400 chars, prefixed
450
+ // "[tool result: <tool>]" (kept on the assistant side)
451
+ // - the most recent `keepRecent` conversational turns are kept verbatim
452
+ // - consecutive same-role turns are coalesced
453
+ //
380
454
  // Pass _globalMessagesDir to override the default dir (useful in tests).
381
- export function getRecentTelegramTurnsFromFs({
455
+ export function getRecentChannelTurnsFromFs({
456
+ channel = "telegram",
382
457
  chat_id,
383
- limit = 12,
458
+ // Back-compat: `limit` (if given) is treated as the verbatim-turn budget.
459
+ limit,
460
+ keepRecent = 40,
384
461
  max_age_hours = 24,
462
+ includeTools = true,
385
463
  _globalMessagesDir,
386
464
  } = {}) {
387
465
  if (!chat_id) return [];
466
+ const keep = Number.isFinite(limit) ? limit : keepRecent;
388
467
  const cutoff = new Date(Date.now() - max_age_hours * 3600_000)
389
468
  .toISOString()
390
469
  .replace(/\.\d{3}Z$/, "Z");
391
470
  const base = _globalMessagesDir || GLOBAL_MESSAGES_DIR;
392
- const dir = path.join(base, "telegram");
471
+ const dir = path.join(base, channel);
393
472
  if (!fs.existsSync(dir)) return [];
394
473
  const all = [];
395
474
  for (const f of fs.readdirSync(dir).sort()) {
@@ -401,20 +480,58 @@ export function getRecentTelegramTurnsFromFs({
401
480
  }
402
481
  }
403
482
  all.sort((a, b) => (a.ts || "").localeCompare(b.ts || ""));
404
- const filtered = all
405
- .filter((m) => String(m.meta?.chat_id ?? "") === String(chat_id))
406
- // Only conversational turns become model context. `tool` / `system`
407
- // entries are kept in the store for the audit trail (and for channels
408
- // that DO render tools), but replaying them as assistant messages would
409
- // look like bogus answers to the model.
410
- .filter((m) => m.type === "user" || m.type === "agent")
411
- .slice(-limit);
412
- return filtered.map((m) => {
413
- const role = m.direction === "in" ? "user" : "assistant";
414
- let content = m.body;
415
- if (role === "assistant") content = sanitizeAssistantForContext(content);
416
- return { role, content };
417
- });
483
+ const mine = all.filter((m) => String(m.meta?.chat_id ?? "") === String(chat_id));
484
+
485
+ // Latest compact record wins; everything it covers is replaced by its summary.
486
+ let compact = null;
487
+ for (const m of mine) if (m.type === "compact") compact = m;
488
+ const coverUntil = compact ? compact.meta?.covers_until_ts || compact.ts : "";
489
+
490
+ const eligible = mine.filter(
491
+ (m) =>
492
+ (m.type === "user" || m.type === "agent" || (includeTools && m.type === "tool")) &&
493
+ (!coverUntil || m.ts > coverUntil)
494
+ );
495
+
496
+ // Keep the last `keep` conversational (user/agent) turns plus any tool
497
+ // results interleaved among them.
498
+ const kept = [];
499
+ let realCount = 0;
500
+ for (let i = eligible.length - 1; i >= 0; i--) {
501
+ const m = eligible[i];
502
+ kept.push(m);
503
+ if (m.type === "user" || m.type === "agent") realCount++;
504
+ if (realCount >= keep) break;
505
+ }
506
+ kept.reverse();
507
+
508
+ const turns = [];
509
+ if (compact && String(compact.body || "").trim()) {
510
+ const range = compact.meta?.range;
511
+ const label = Array.isArray(range)
512
+ ? `turnos ${range[0]}-${range[1]}`
513
+ : `${compact.meta?.count || ""} turnos previos`.trim();
514
+ turns.push({
515
+ role: "system",
516
+ content: `[RESUMEN COMPACTADO ${label}]:\n${String(compact.body).trim()}`,
517
+ });
518
+ }
519
+ for (const m of kept) {
520
+ if (m.type === "tool") {
521
+ turns.push({ role: "assistant", content: renderToolResult(m) });
522
+ } else {
523
+ const role = m.type === "user" ? "user" : "assistant";
524
+ let content = m.body;
525
+ if (role === "assistant") content = sanitizeAssistantForContext(content);
526
+ turns.push({ role, content });
527
+ }
528
+ }
529
+ return coalesceTurns(turns);
530
+ }
531
+
532
+ // Telegram-specific wrapper kept for back-compat with existing call sites.
533
+ export function getRecentTelegramTurnsFromFs(opts = {}) {
534
+ return getRecentChannelTurnsFromFs({ ...opts, channel: "telegram" });
418
535
  }
419
536
 
420
537
  // ---------------------------------------------------------------------------
@@ -422,14 +539,15 @@ export function getRecentTelegramTurnsFromFs({
422
539
  // ---------------------------------------------------------------------------
423
540
 
424
541
  // Write a message to the global channel store. No SQL cache — JSONL only.
425
- export function appendGlobalMessage({ channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, external_id }) {
542
+ export function appendGlobalMessage({ channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, external_id }) {
426
543
  ts = ts || nowIso();
427
544
  const dir = path.join(GLOBAL_MESSAGES_DIR, channel);
428
545
  fs.mkdirSync(dir, { recursive: true });
429
546
  const file = path.join(dir, `${ts.slice(0, 10)}.jsonl`);
430
547
  const msgType = inferMessageType({ type, channel, direction, author, agent_slug, meta });
431
548
  const msgActorId = inferActorId({ type: msgType, actor_id, author, agent_slug, meta });
432
- const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, agent_slug, external_id, meta });
549
+ const msgActorKind = inferActorKind({ actor_kind, type: msgType, actor_id: msgActorId, meta });
550
+ const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, actor_kind: msgActorKind, agent_slug, external_id, meta });
433
551
  const record = {
434
552
  ts,
435
553
  channel,
@@ -104,41 +104,103 @@ export function readAgentsFromDir(root) {
104
104
  }
105
105
 
106
106
  // ---------------------------------------------------------------------------
107
- // Vault — ~/.apx/agents/<slug>.md (global templates, no memory)
107
+ // Vault — global, project-agnostic agent templates.
108
+ // Two-layer model:
109
+ // - BUNDLED → assets/agent-vault-defaults/<slug>.md, shipped with APX,
110
+ // always visible. Read-only on the user's machine.
111
+ // - USER → ~/.apx/agents/<slug>.md, the user's own additions and
112
+ // overrides on top of the bundle. User layer wins per-slug.
113
+ // - REMOVED → ~/.apx/agents/.removed.json, tombstones (slugs the user
114
+ // explicitly deleted). Hidden from listings until restored.
115
+ // Reading: BUNDLED ∪ USER, dedup by slug (user wins), filter tombstones.
116
+ // Writing: always to the USER layer (copy-on-write). Removing: tombstones
117
+ // if it's a bundled slug, deletes the user file otherwise.
108
118
  // ---------------------------------------------------------------------------
109
119
 
110
120
  import os from "node:os";
121
+ import { fileURLToPath } from "node:url";
122
+
123
+ const __parserDir = path.dirname(fileURLToPath(import.meta.url));
111
124
 
112
125
  export const VAULT_DIR = path.join(os.homedir(), ".apx", "agents");
126
+ export const BUNDLED_VAULT_DIR = path.resolve(__parserDir, "../../assets/agent-vault-defaults");
127
+ export const VAULT_TOMBSTONE_PATH = path.join(VAULT_DIR, ".removed.json");
113
128
 
114
- export function readVaultAgents() {
115
- if (!fs.existsSync(VAULT_DIR)) return [];
129
+ function readVaultDirRaw(dir) {
130
+ if (!fs.existsSync(dir)) return [];
116
131
  return fs
117
- .readdirSync(VAULT_DIR)
132
+ .readdirSync(dir)
118
133
  .filter((f) => f.endsWith(".md") && SLUG_RE.test(f.slice(0, -3)))
119
134
  .sort()
120
- .map((f) => {
121
- const slug = f.slice(0, -3);
122
- const agent = parseAgentFile(slug, fs.readFileSync(path.join(VAULT_DIR, f), "utf8"));
123
- return { ...agent, source: "vault" };
124
- });
135
+ .map((f) => ({ slug: f.slice(0, -3), file: path.join(dir, f) }));
136
+ }
137
+
138
+ export function readVaultTombstones() {
139
+ if (!fs.existsSync(VAULT_TOMBSTONE_PATH)) return new Set();
140
+ try {
141
+ const raw = JSON.parse(fs.readFileSync(VAULT_TOMBSTONE_PATH, "utf8"));
142
+ return new Set(Array.isArray(raw.slugs) ? raw.slugs : []);
143
+ } catch { return new Set(); }
144
+ }
145
+
146
+ export function writeVaultTombstones(slugs) {
147
+ fs.mkdirSync(VAULT_DIR, { recursive: true });
148
+ fs.writeFileSync(
149
+ VAULT_TOMBSTONE_PATH,
150
+ JSON.stringify({ slugs: [...slugs].sort() }, null, 2) + "\n",
151
+ );
125
152
  }
126
153
 
127
- // Resolve a single agent for a project: local file → vault → null
154
+ export function readVaultAgents({ includeRemoved = false } = {}) {
155
+ const tombstones = readVaultTombstones();
156
+ // Build a map slug → { agent, source }. User layer overrides bundled.
157
+ const bySlug = new Map();
158
+ for (const { slug, file } of readVaultDirRaw(BUNDLED_VAULT_DIR)) {
159
+ if (!includeRemoved && tombstones.has(slug)) continue;
160
+ const agent = parseAgentFile(slug, fs.readFileSync(file, "utf8"));
161
+ bySlug.set(slug, { ...agent, source: "bundled" });
162
+ }
163
+ for (const { slug, file } of readVaultDirRaw(VAULT_DIR)) {
164
+ if (!includeRemoved && tombstones.has(slug)) continue;
165
+ const agent = parseAgentFile(slug, fs.readFileSync(file, "utf8"));
166
+ const overrides = bySlug.has(slug);
167
+ bySlug.set(slug, { ...agent, source: overrides ? "user-override" : "user" });
168
+ }
169
+ return [...bySlug.values()].sort((a, b) => a.slug.localeCompare(b.slug));
170
+ }
171
+
172
+ // Resolve a single vault agent honoring the layered model. Returns null when
173
+ // the slug is missing or tombstoned (unless includeRemoved is true).
174
+ function readVaultAgent(slug, { includeRemoved = false } = {}) {
175
+ if (!includeRemoved && readVaultTombstones().has(slug)) return null;
176
+ const userPath = path.join(VAULT_DIR, `${slug}.md`);
177
+ if (fs.existsSync(userPath)) {
178
+ const agent = parseAgentFile(slug, fs.readFileSync(userPath, "utf8"));
179
+ const overrides = fs.existsSync(path.join(BUNDLED_VAULT_DIR, `${slug}.md`));
180
+ return { ...agent, source: overrides ? "user-override" : "user" };
181
+ }
182
+ const bundledPath = path.join(BUNDLED_VAULT_DIR, `${slug}.md`);
183
+ if (fs.existsSync(bundledPath)) {
184
+ const agent = parseAgentFile(slug, fs.readFileSync(bundledPath, "utf8"));
185
+ return { ...agent, source: "bundled" };
186
+ }
187
+ return null;
188
+ }
189
+
190
+ // Resolve a single agent for a project: local file → vault (layered) → null.
128
191
  export function resolveAgent(root, slug) {
129
192
  const localPath = path.join(root, ".apc", "agents", `${slug}.md`);
130
193
  if (fs.existsSync(localPath)) {
131
194
  const agent = parseAgentFile(slug, fs.readFileSync(localPath, "utf8"));
132
195
  return { ...agent, source: "local" };
133
196
  }
134
- const vaultPath = path.join(VAULT_DIR, `${slug}.md`);
135
- if (fs.existsSync(vaultPath)) {
136
- const agent = parseAgentFile(slug, fs.readFileSync(vaultPath, "utf8"));
137
- return { ...agent, source: "vault" };
138
- }
139
- return null;
197
+ return readVaultAgent(slug);
140
198
  }
141
199
 
200
+ // Exported for callers (CLI rm/edit, API DELETE/PATCH) that need to know
201
+ // whether a slug is user-layer, bundled, or absent before acting.
202
+ export { readVaultAgent };
203
+
142
204
  // Return slugs imported from vault in this project (from project.json)
143
205
  export function importedVaultSlugs(root) {
144
206
  const p = path.join(root, ".apc", "project.json");