@agentprojectcontext/apx 1.77.3 → 1.79.0

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 (356) hide show
  1. package/README.md +23 -9
  2. package/package.json +12 -12
  3. package/src/core/agent/build-agent-system.js +3 -2
  4. package/src/core/agent/constants.js +3 -2
  5. package/src/core/agent/loop/greeting-guard.js +55 -0
  6. package/src/core/agent/loop/side-effects.js +52 -0
  7. package/src/core/agent/prompt-builder.js +49 -8
  8. package/src/core/agent/run-agent.js +43 -53
  9. package/src/core/agent/security.js +1 -1
  10. package/src/core/agent/self-memory.js +4 -2
  11. package/src/core/agent/skills/index-store.js +2 -2
  12. package/src/core/agent/skills/loader.js +3 -22
  13. package/src/core/agent/super-agent.js +0 -2
  14. package/src/core/agent/tool-summary.js +65 -0
  15. package/src/core/agent/tools/handlers/call-runtime.js +4 -4
  16. package/src/core/agent/tools/handlers/list-commitments.js +80 -0
  17. package/src/core/agent/tools/handlers/list-tasks.js +66 -27
  18. package/src/core/agent/tools/handlers/record-commitment.js +68 -0
  19. package/src/core/agent/tools/handlers/search-sessions.js +1 -1
  20. package/src/core/agent/tools/handlers/send-telegram.js +68 -2
  21. package/src/core/agent/tools/handlers/set-permission-mode.js +11 -4
  22. package/src/core/agent/tools/names.js +64 -0
  23. package/src/core/agent/tools/registry.js +9 -0
  24. package/src/core/agent/tools/tool-call-parser.js +70 -1
  25. package/src/core/apc/context-copy.js +1 -1
  26. package/src/core/apc/frontmatter.js +85 -0
  27. package/src/core/apc/parser.js +9 -21
  28. package/src/core/apc/paths.js +8 -8
  29. package/src/core/apc/scaffold.js +5 -4
  30. package/src/core/channels/telegram/ask-callbacks.js +35 -0
  31. package/src/core/channels/telegram/config.js +201 -0
  32. package/src/core/channels/telegram/dispatch.js +3 -0
  33. package/src/core/channels/telegram/reply.js +30 -5
  34. package/src/core/config/index.js +25 -183
  35. package/src/core/config/paths.js +57 -1
  36. package/src/core/config/redact.js +22 -0
  37. package/src/core/confirmation/adapters/web.js +1 -1
  38. package/src/core/daemon/service.js +238 -0
  39. package/src/core/deck/manifest.js +12 -12
  40. package/src/core/desktop/autostart.js +3 -2
  41. package/src/core/desktop/process.js +4 -4
  42. package/src/core/engines/gemini.js +322 -60
  43. package/src/core/engines/openai-compatible.js +21 -2
  44. package/src/core/engines/presets.js +2 -2
  45. package/src/core/http-tools/browser.js +1 -1
  46. package/src/core/http-tools/catalog.js +551 -0
  47. package/src/core/http-tools/fetch.js +1 -1
  48. package/src/core/http-tools/glob.js +3 -3
  49. package/src/core/http-tools/grep.js +2 -9
  50. package/src/core/http-tools/inline-handlers.js +59 -0
  51. package/src/core/http-tools/registry.js +31 -615
  52. package/src/core/http-tools/search.js +2 -2
  53. package/src/core/identity/self.js +6 -7
  54. package/src/core/identity/telegram.js +3 -3
  55. package/src/core/logging.js +6 -5
  56. package/src/core/mcp/sources.js +12 -16
  57. package/src/core/memory/consolidate.js +225 -0
  58. package/src/core/memory/indexer.js +2 -5
  59. package/src/core/nudge/index.js +192 -0
  60. package/src/core/nudge/policy.js +143 -0
  61. package/src/core/nudge/store.js +141 -0
  62. package/src/core/profiles/bundled/secretary/PROFILE.md +8 -9
  63. package/src/core/profiles/bundled/secretary/config.schema.json +33 -3
  64. package/src/core/profiles/bundled/secretary/routines/day-close.json +7 -3
  65. package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -3
  66. package/src/core/profiles/bundled/secretary/routines/watch.json +13 -0
  67. package/src/core/profiles/lifecycle.js +0 -2
  68. package/src/core/profiles/store.js +2 -7
  69. package/src/core/routines/runner.js +103 -4
  70. package/src/core/routines/signals.js +270 -0
  71. package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
  72. package/src/core/runtime-skills/apx-profile/SKILL.md +3 -3
  73. package/src/core/runtime-skills/apx-project/SKILL.md +1 -1
  74. package/src/core/runtime-skills/apx-task/SKILL.md +8 -8
  75. package/src/core/runtime-skills/apx-telegram/SKILL.md +4 -4
  76. package/src/core/runtime-skills/apx-voice/SKILL.md +4 -4
  77. package/src/core/runtimes/detect.js +2 -2
  78. package/src/core/sessions/index.js +800 -0
  79. package/src/core/stores/code-sessions.js +3 -14
  80. package/src/core/stores/commitments.js +331 -0
  81. package/src/core/stores/engine-sessions.js +0 -4
  82. package/src/core/stores/messages.js +4 -5
  83. package/src/core/stores/organization.js +9 -11
  84. package/src/core/stores/routines.js +23 -14
  85. package/src/core/stores/runtime-callbacks.js +2 -1
  86. package/src/core/util/json-file.js +128 -0
  87. package/src/core/util/thinking.js +51 -0
  88. package/src/core/vars/sources.js +14 -21
  89. package/src/core/voice/stt-models.js +1 -1
  90. package/src/core/voice/tts.js +5 -4
  91. package/src/host/daemon/api/admin-config.js +5 -5
  92. package/src/host/daemon/api/admin.js +8 -7
  93. package/src/host/daemon/api/agents.js +16 -16
  94. package/src/host/daemon/api/artifact-preview.js +8 -8
  95. package/src/host/daemon/api/artifacts.js +7 -7
  96. package/src/host/daemon/api/code.js +8 -8
  97. package/src/host/daemon/api/commitments.js +135 -0
  98. package/src/host/daemon/api/config.js +6 -6
  99. package/src/host/daemon/api/confirm.js +2 -2
  100. package/src/host/daemon/api/connections.js +2 -2
  101. package/src/host/daemon/api/conversations.js +12 -12
  102. package/src/host/daemon/api/deck.js +6 -6
  103. package/src/host/daemon/api/desktop.js +8 -8
  104. package/src/host/daemon/api/embeddings.js +4 -4
  105. package/src/host/daemon/api/engines.js +8 -7
  106. package/src/host/daemon/api/exec.js +5 -4
  107. package/src/host/daemon/api/files-project.js +6 -6
  108. package/src/host/daemon/api/health.js +2 -2
  109. package/src/host/daemon/api/identity.js +3 -3
  110. package/src/host/daemon/api/inbox.js +2 -2
  111. package/src/host/daemon/api/integrations.js +23 -19
  112. package/src/host/daemon/api/mcps.js +16 -12
  113. package/src/host/daemon/api/messages.js +5 -5
  114. package/src/host/daemon/api/nudges.js +112 -0
  115. package/src/host/daemon/api/organization.js +8 -8
  116. package/src/host/daemon/api/pairing.js +6 -6
  117. package/src/host/daemon/api/plugins.js +3 -3
  118. package/src/host/daemon/api/prefix.js +20 -0
  119. package/src/host/daemon/api/profiles.js +9 -9
  120. package/src/host/daemon/api/projects.js +5 -5
  121. package/src/host/daemon/api/routines.js +32 -8
  122. package/src/host/daemon/api/run.js +2 -2
  123. package/src/host/daemon/api/runtimes.js +6 -6
  124. package/src/host/daemon/api/self-memory.js +50 -0
  125. package/src/host/daemon/api/sessions-search.js +18 -11
  126. package/src/host/daemon/api/sessions.js +6 -6
  127. package/src/host/daemon/api/shared.js +59 -13
  128. package/src/host/daemon/api/skills.js +12 -12
  129. package/src/host/daemon/api/super-agent.js +4 -4
  130. package/src/host/daemon/api/tasks.js +11 -11
  131. package/src/host/daemon/api/telegram.js +61 -24
  132. package/src/host/daemon/api/tools.js +7 -7
  133. package/src/host/daemon/api/top-level.js +7 -7
  134. package/src/host/daemon/api/transcribe.js +6 -6
  135. package/src/host/daemon/api/tts.js +3 -3
  136. package/src/host/daemon/api/vars.js +11 -8
  137. package/src/host/daemon/api/voice.js +9 -7
  138. package/src/host/daemon/api/web.js +28 -32
  139. package/src/host/daemon/api.js +83 -48
  140. package/src/host/daemon/callback-reconciler.js +16 -0
  141. package/src/host/daemon/db.js +1 -1
  142. package/src/host/daemon/desktop-ws.js +7 -3
  143. package/src/host/daemon/index.js +11 -5
  144. package/src/host/daemon/plugins/desktop/index.js +8 -2
  145. package/src/host/daemon/plugins/telegram/index.js +7 -2
  146. package/src/host/daemon/stt-venv.js +20 -81
  147. package/src/host/daemon/wakeup.js +18 -4
  148. package/src/interfaces/acp/index.js +3 -3
  149. package/src/interfaces/acp/session.js +2 -2
  150. package/src/interfaces/cli/commands/a2a.js +2 -2
  151. package/src/interfaces/cli/commands/agent.js +3 -3
  152. package/src/interfaces/cli/commands/artifact.js +13 -13
  153. package/src/interfaces/cli/commands/chat.js +3 -3
  154. package/src/interfaces/cli/commands/command.js +2 -2
  155. package/src/interfaces/cli/commands/commitment.js +154 -0
  156. package/src/interfaces/cli/commands/config.js +4 -4
  157. package/src/interfaces/cli/commands/daemon.js +74 -18
  158. package/src/interfaces/cli/commands/desktop.js +7 -14
  159. package/src/interfaces/cli/commands/exec.js +2 -2
  160. package/src/interfaces/cli/commands/log.js +3 -4
  161. package/src/interfaces/cli/commands/mcp.js +9 -9
  162. package/src/interfaces/cli/commands/memory.js +75 -2
  163. package/src/interfaces/cli/commands/messages.js +5 -5
  164. package/src/interfaces/cli/commands/model.js +0 -18
  165. package/src/interfaces/cli/commands/nudge.js +130 -0
  166. package/src/interfaces/cli/commands/obsidian.js +5 -5
  167. package/src/interfaces/cli/commands/org.js +5 -5
  168. package/src/interfaces/cli/commands/pair.js +6 -6
  169. package/src/interfaces/cli/commands/plugins.js +2 -2
  170. package/src/interfaces/cli/commands/profile.js +10 -10
  171. package/src/interfaces/cli/commands/project-config.js +6 -6
  172. package/src/interfaces/cli/commands/project.js +10 -10
  173. package/src/interfaces/cli/commands/routine.js +8 -9
  174. package/src/interfaces/cli/commands/runtime.js +2 -2
  175. package/src/interfaces/cli/commands/search.js +0 -1
  176. package/src/interfaces/cli/commands/session.js +12 -40
  177. package/src/interfaces/cli/commands/sessions.js +21 -798
  178. package/src/interfaces/cli/commands/setup.js +16 -6
  179. package/src/interfaces/cli/commands/skills.js +1 -2
  180. package/src/interfaces/cli/commands/status.js +3 -3
  181. package/src/interfaces/cli/commands/task.js +8 -8
  182. package/src/interfaces/cli/commands/telegram.js +21 -21
  183. package/src/interfaces/cli/commands/voice.js +6 -6
  184. package/src/interfaces/cli/help/index.js +2245 -0
  185. package/src/interfaces/cli/http.js +9 -4
  186. package/src/interfaces/cli/index.js +14 -2857
  187. package/src/interfaces/cli/routes/acp.js +13 -0
  188. package/src/interfaces/cli/routes/agent.js +27 -0
  189. package/src/interfaces/cli/routes/artifact.js +28 -0
  190. package/src/interfaces/cli/routes/chat.js +11 -0
  191. package/src/interfaces/cli/routes/code.js +11 -0
  192. package/src/interfaces/cli/routes/command.js +21 -0
  193. package/src/interfaces/cli/routes/commitment.js +19 -0
  194. package/src/interfaces/cli/routes/config.js +16 -0
  195. package/src/interfaces/cli/routes/connections.js +11 -0
  196. package/src/interfaces/cli/routes/conversations.js +21 -0
  197. package/src/interfaces/cli/routes/daemon.js +25 -0
  198. package/src/interfaces/cli/routes/desktop.js +20 -0
  199. package/src/interfaces/cli/routes/env.js +13 -0
  200. package/src/interfaces/cli/routes/exec.js +11 -0
  201. package/src/interfaces/cli/routes/identity.js +11 -0
  202. package/src/interfaces/cli/routes/index.js +75 -0
  203. package/src/interfaces/cli/routes/init.js +11 -0
  204. package/src/interfaces/cli/routes/log.js +20 -0
  205. package/src/interfaces/cli/routes/mcp.js +22 -0
  206. package/src/interfaces/cli/routes/memory.js +19 -0
  207. package/src/interfaces/cli/routes/messages.js +16 -0
  208. package/src/interfaces/cli/routes/model.js +11 -0
  209. package/src/interfaces/cli/routes/nudge.js +17 -0
  210. package/src/interfaces/cli/routes/obsidian.js +17 -0
  211. package/src/interfaces/cli/routes/org.js +34 -0
  212. package/src/interfaces/cli/routes/overlay.js +10 -0
  213. package/src/interfaces/cli/routes/pair.js +17 -0
  214. package/src/interfaces/cli/routes/panel.js +16 -0
  215. package/src/interfaces/cli/routes/permission.js +11 -0
  216. package/src/interfaces/cli/routes/plugins.js +21 -0
  217. package/src/interfaces/cli/routes/profile.js +27 -0
  218. package/src/interfaces/cli/routes/project.js +41 -0
  219. package/src/interfaces/cli/routes/restart.js +15 -0
  220. package/src/interfaces/cli/routes/routine.js +28 -0
  221. package/src/interfaces/cli/routes/run.js +11 -0
  222. package/src/interfaces/cli/routes/search.js +11 -0
  223. package/src/interfaces/cli/routes/send.js +11 -0
  224. package/src/interfaces/cli/routes/session.js +26 -0
  225. package/src/interfaces/cli/routes/sessions.js +15 -0
  226. package/src/interfaces/cli/routes/setup.js +18 -0
  227. package/src/interfaces/cli/routes/skills.js +20 -0
  228. package/src/interfaces/cli/routes/status.js +12 -0
  229. package/src/interfaces/cli/routes/task.js +26 -0
  230. package/src/interfaces/cli/routes/telegram.js +39 -0
  231. package/src/interfaces/cli/routes/update.js +24 -0
  232. package/src/interfaces/cli/routes/voice.js +17 -0
  233. package/src/interfaces/desktop/main.js +6 -7
  234. package/src/interfaces/desktop/renderer.js +0 -5
  235. package/src/interfaces/mcp-server/index.js +15 -14
  236. package/src/interfaces/tui/_shims/globals.d.ts +8 -0
  237. package/src/interfaces/tui/tsconfig.json +4 -1
  238. package/src/interfaces/web/README.md +6 -6
  239. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +849 -0
  240. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +1 -0
  241. package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +1 -0
  242. package/src/interfaces/web/dist/index.html +2 -2
  243. package/src/interfaces/web/package-lock.json +11 -10
  244. package/src/interfaces/web/src/components/AddProjectDialog.tsx +1 -1
  245. package/src/interfaces/web/src/components/Section.tsx +18 -3
  246. package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +1 -1
  247. package/src/interfaces/web/src/components/chat/ChatList.tsx +2 -2
  248. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +13 -0
  249. package/src/interfaces/web/src/components/chat/SkillPicker.tsx +1 -1
  250. package/src/interfaces/web/src/components/code/CodeFileTree.tsx +1 -1
  251. package/src/interfaces/web/src/components/code/CodeTerminal.tsx +1 -1
  252. package/src/interfaces/web/src/components/cron/CronPicker.tsx +196 -0
  253. package/src/interfaces/web/src/components/desktop/DesktopStatusCard.tsx +1 -1
  254. package/src/interfaces/web/src/components/files/FileBrowser.tsx +2 -2
  255. package/src/interfaces/web/src/components/inbox/InboxList.tsx +145 -0
  256. package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +36 -6
  257. package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +1 -1
  258. package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +16 -4
  259. package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +14 -4
  260. package/src/interfaces/web/src/components/routines/shared.ts +14 -5
  261. package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +1 -1
  262. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +1 -1
  263. package/src/interfaces/web/src/components/settings/NudgePanel.tsx +183 -0
  264. package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +36 -12
  265. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +1 -1
  266. package/src/interfaces/web/src/components/settings/SkillsManager.tsx +2 -2
  267. package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +1 -1
  268. package/src/interfaces/web/src/components/ui/filter-chips.tsx +47 -0
  269. package/src/interfaces/web/src/components/ui.tsx +1 -0
  270. package/src/interfaces/web/src/constants/index.ts +1 -0
  271. package/src/interfaces/web/src/hooks/useChat.ts +5 -1
  272. package/src/interfaces/web/src/hooks/useDaemonStatus.ts +1 -1
  273. package/src/interfaces/web/src/hooks/useDevices.ts +1 -1
  274. package/src/interfaces/web/src/hooks/useEngines.ts +1 -1
  275. package/src/interfaces/web/src/hooks/useGlobalConfig.ts +2 -2
  276. package/src/interfaces/web/src/hooks/useIdentity.ts +1 -1
  277. package/src/interfaces/web/src/hooks/useInbox.ts +1 -1
  278. package/src/interfaces/web/src/hooks/useNudges.ts +38 -0
  279. package/src/interfaces/web/src/hooks/useProfiles.ts +3 -3
  280. package/src/interfaces/web/src/hooks/useProjects.ts +1 -1
  281. package/src/interfaces/web/src/hooks/useTelegram.ts +3 -3
  282. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +3 -3
  283. package/src/interfaces/web/src/i18n/en.ts +127 -0
  284. package/src/interfaces/web/src/i18n/es.ts +127 -0
  285. package/src/interfaces/web/src/lib/api/admin.ts +11 -11
  286. package/src/interfaces/web/src/lib/api/agents.ts +14 -14
  287. package/src/interfaces/web/src/lib/api/artifacts.ts +11 -11
  288. package/src/interfaces/web/src/lib/api/code.ts +1 -1
  289. package/src/interfaces/web/src/lib/api/commitments.ts +57 -0
  290. package/src/interfaces/web/src/lib/api/conversations.ts +8 -8
  291. package/src/interfaces/web/src/lib/api/deck.ts +3 -3
  292. package/src/interfaces/web/src/lib/api/desktop.ts +8 -8
  293. package/src/interfaces/web/src/lib/api/embeddings.ts +3 -3
  294. package/src/interfaces/web/src/lib/api/engines.ts +3 -3
  295. package/src/interfaces/web/src/lib/api/filesystem.ts +2 -2
  296. package/src/interfaces/web/src/lib/api/health.ts +1 -1
  297. package/src/interfaces/web/src/lib/api/identity.ts +2 -2
  298. package/src/interfaces/web/src/lib/api/inbox.ts +1 -1
  299. package/src/interfaces/web/src/lib/api/integrations.ts +8 -8
  300. package/src/interfaces/web/src/lib/api/mcps.ts +6 -6
  301. package/src/interfaces/web/src/lib/api/messages.ts +3 -3
  302. package/src/interfaces/web/src/lib/api/notebook.ts +23 -0
  303. package/src/interfaces/web/src/lib/api/nudges.ts +53 -0
  304. package/src/interfaces/web/src/lib/api/organization.ts +7 -7
  305. package/src/interfaces/web/src/lib/api/profiles.ts +8 -8
  306. package/src/interfaces/web/src/lib/api/projectFiles.ts +5 -5
  307. package/src/interfaces/web/src/lib/api/projects.ts +12 -12
  308. package/src/interfaces/web/src/lib/api/routines.ts +7 -7
  309. package/src/interfaces/web/src/lib/api/sessions.ts +2 -2
  310. package/src/interfaces/web/src/lib/api/skills.ts +11 -11
  311. package/src/interfaces/web/src/lib/api/super_agent.ts +3 -3
  312. package/src/interfaces/web/src/lib/api/tasks.ts +12 -12
  313. package/src/interfaces/web/src/lib/api/telegram.ts +14 -14
  314. package/src/interfaces/web/src/lib/api/tools.ts +1 -1
  315. package/src/interfaces/web/src/lib/api/vars.ts +4 -4
  316. package/src/interfaces/web/src/lib/api/voice.ts +6 -6
  317. package/src/interfaces/web/src/lib/cron.ts +196 -0
  318. package/src/interfaces/web/src/lib/when.ts +32 -0
  319. package/src/interfaces/web/src/screens/InboxScreen.tsx +107 -77
  320. package/src/interfaces/web/src/screens/ProjectScreen.tsx +5 -2
  321. package/src/interfaces/web/src/screens/SettingsScreen.tsx +17 -3
  322. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +1 -1
  323. package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +239 -0
  324. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +103 -20
  325. package/src/interfaces/web/src/screens/base/LogsTab.tsx +18 -3
  326. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +1 -1
  327. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +1 -1
  328. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +1 -1
  329. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +1 -1
  330. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +1 -1
  331. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +8 -8
  332. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +2 -2
  333. package/src/interfaces/web/src/screens/project/ChatTab.tsx +24 -6
  334. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +1 -1
  335. package/src/interfaces/web/src/screens/project/McpsTab.tsx +3 -3
  336. package/src/interfaces/web/src/screens/project/Overview.tsx +6 -6
  337. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +15 -13
  338. package/src/interfaces/web/src/screens/project/StructureTab.tsx +1 -1
  339. package/src/interfaces/web/src/screens/project/TasksTab.tsx +1 -1
  340. package/src/interfaces/web/src/screens/project/VarsTab.tsx +1 -1
  341. package/src/interfaces/web/src/types/daemon.ts +10 -1
  342. package/src/interfaces/web/vite.config.ts +13 -18
  343. package/src/interfaces/web/dist/assets/index-BptlbKjU.js +0 -824
  344. package/src/interfaces/web/dist/assets/index-BptlbKjU.js.map +0 -1
  345. package/src/interfaces/web/dist/assets/index-D_EJEA1n.css +0 -1
  346. package/src/skills/apc-context/SKILL.md +0 -159
  347. /package/src/{host/daemon → core}/runtimes/_spawn.js +0 -0
  348. /package/src/{host/daemon → core}/runtimes/aider.js +0 -0
  349. /package/src/{host/daemon → core}/runtimes/antigravity.js +0 -0
  350. /package/src/{host/daemon → core}/runtimes/claude-code.js +0 -0
  351. /package/src/{host/daemon → core}/runtimes/codex.js +0 -0
  352. /package/src/{host/daemon → core}/runtimes/cursor-agent.js +0 -0
  353. /package/src/{host/daemon → core}/runtimes/gemini-cli.js +0 -0
  354. /package/src/{host/daemon → core}/runtimes/index.js +0 -0
  355. /package/src/{host/daemon → core}/runtimes/opencode.js +0 -0
  356. /package/src/{host/daemon → core}/runtimes/qwen-code.js +0 -0
@@ -2,7 +2,6 @@
2
2
  // Guides the user through provider, model, channels, and language.
3
3
  // Starts the daemon and sends a fun wake-up message when done.
4
4
 
5
- import fs from "node:fs";
6
5
  import https from "node:https";
7
6
  import http from "node:http";
8
7
  import readline from "node:readline";
@@ -11,7 +10,9 @@ import { readConfig, writeConfig } from "#core/config/index.js";
11
10
  import { ENGINE_PRESETS } from "#core/engines/presets.js";
12
11
  import { mascot } from "#core/mascot.js";
13
12
  import { setupClaudePermissions } from "../claude-permissions.js";
14
- import { PERMISSION_MODES, DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
13
+ import { DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
14
+ import { DEFAULT_PROJECT_ID } from "#core/config/paths.js";
15
+ import { http as daemonHttp } from "../http.js";
15
16
 
16
17
  // ── ANSI helpers ──────────────────────────────────────────────────────────────
17
18
  const c = {
@@ -390,7 +391,7 @@ export async function cmdSetup() {
390
391
 
391
392
  // Send a fun wake-up message via Telegram using super-agent.
392
393
  // The prompt is in English so the model knows to reply in the user's language.
393
- async function sendTelegramWakeup({ botToken, chatId, language, model }) {
394
+ async function sendTelegramWakeup({ botToken, chatId, language }) {
394
395
  const prompt =
395
396
  `You are APX, an AI agent assistant that just came online for the first time. ` +
396
397
  `Write a short, enthusiastic wake-up message in the language with ISO 639-1 code "${language}". ` +
@@ -400,12 +401,21 @@ async function sendTelegramWakeup({ botToken, chatId, language, model }) {
400
401
  `3) Ask the user for their own name or what you should call them. ` +
401
402
  `Be warm and playful. Do NOT mention configuration or setup.`;
402
403
 
403
- // Ask the daemon's super-agent
404
+ // Ask the daemon's super-agent to write it.
405
+ //
406
+ // This used to GET a `/super-agent/ask` route that does not exist — and a GET
407
+ // cannot carry a body, so the prompt above was built and thrown away. The
408
+ // wake-up always silently fell through to the canned languageFallback()
409
+ // string. Post the prompt to the real blocking chat route instead, so the
410
+ // first thing the user hears is model-authored, not a template.
404
411
  let text;
405
412
  try {
406
- const res = await fetchJson("http://127.0.0.1:7430/super-agent/ask", 8000);
413
+ const res = await daemonHttp.post(
414
+ `/api/projects/${DEFAULT_PROJECT_ID}/super-agent/chat`,
415
+ { prompt }
416
+ );
407
417
  text = res?.text;
408
- } catch {}
418
+ } catch { /* daemon unreachable — the fallback below covers it */ }
409
419
 
410
420
  // Fallback: generate a simple message without daemon
411
421
  if (!text) {
@@ -10,7 +10,6 @@ import {
10
10
  IDE_TARGETS,
11
11
  installIdeSkills,
12
12
  installGlobalSkills,
13
- listBundledSkillSlugs,
14
13
  listBundledSkills,
15
14
  listEngineSkills,
16
15
  listLegacyPruneSlugs,
@@ -210,7 +209,7 @@ export async function cmdSkillsList(args = {}) {
210
209
  if (args?.flags?.all) {
211
210
  const root = findApfRoot();
212
211
  const params = root ? `?project_path=${encodeURIComponent(root)}` : "";
213
- const out = await http.get(`/skills${params}`);
212
+ const out = await http.get(`/api/skills${params}`);
214
213
  if (!out.count) {
215
214
  console.log("(no skills available)");
216
215
  return;
@@ -28,7 +28,7 @@ export async function cmdStatus() {
28
28
  let daemonOk = false;
29
29
  let daemonInfo = {};
30
30
  try {
31
- daemonInfo = await http.get("/health");
31
+ daemonInfo = await http.get("/api/health");
32
32
  daemonOk = true;
33
33
  } catch {}
34
34
 
@@ -94,7 +94,7 @@ export async function cmdStatus() {
94
94
  const tg = cfg.telegram || {};
95
95
  let tgLive = null;
96
96
  if (daemonOk) {
97
- try { tgLive = await http.get("/telegram/status"); } catch {}
97
+ try { tgLive = await http.get("/api/telegram/status"); } catch {}
98
98
  }
99
99
 
100
100
  if (tgLive) {
@@ -130,7 +130,7 @@ export async function cmdStatus() {
130
130
  console.log(sec("Projects"));
131
131
  let projects = [];
132
132
  if (daemonOk) {
133
- try { projects = await http.get("/projects"); } catch {}
133
+ try { projects = await http.get("/api/projects"); } catch {}
134
134
  } else {
135
135
  projects = (cfg.projects || []).map((p, i) => ({ id: i + 1, path: p.path, name: p.path?.split("/").pop() || "?", agents: "?" }));
136
136
  }
@@ -108,7 +108,7 @@ export async function cmdTaskAdd(args) {
108
108
  source: args.flags?.source || "cli",
109
109
  tags: asArray(args.flags?.tag).filter(Boolean),
110
110
  };
111
- const task = await http.post(`/projects/${pid}/tasks`, body);
111
+ const task = await http.post(`/api/projects/${pid}/tasks`, body);
112
112
  console.log(`added task ${task.id}: ${task.title}`);
113
113
  }
114
114
 
@@ -137,8 +137,8 @@ export async function cmdTaskList(args) {
137
137
  // project it came from. Without it, behaviour is exactly as before.
138
138
  const all = !!args.flags?.all;
139
139
  const path = all
140
- ? `/tasks${qs ? "?" + qs : ""}`
141
- : `/projects/${await resolveProjectId(args?.flags?.project)}/tasks${qs ? "?" + qs : ""}`;
140
+ ? `/api/tasks${qs ? "?" + qs : ""}`
141
+ : `/api/projects/${await resolveProjectId(args?.flags?.project)}/tasks${qs ? "?" + qs : ""}`;
142
142
 
143
143
  const { rows, meta } = unwrap(await http.get(path));
144
144
  renderTable(rows, { showProject: all });
@@ -154,7 +154,7 @@ export async function cmdTaskShow(args) {
154
154
  const id = (args._ || [])[0];
155
155
  if (!id) return fail("show", "id required");
156
156
  const pid = await resolveProjectId(args?.flags?.project);
157
- const t = await http.get(`/projects/${pid}/tasks/${encodeURIComponent(id)}`);
157
+ const t = await http.get(`/api/projects/${pid}/tasks/${encodeURIComponent(id)}`);
158
158
  renderDetail(t);
159
159
  }
160
160
 
@@ -164,7 +164,7 @@ export async function cmdTaskDone(args) {
164
164
  if (!id) return fail("done", "id required");
165
165
  const pid = await resolveProjectId(args?.flags?.project);
166
166
  const t = await http.post(
167
- `/projects/${pid}/tasks/${encodeURIComponent(id)}/done`,
167
+ `/api/projects/${pid}/tasks/${encodeURIComponent(id)}/done`,
168
168
  { by: args.flags?.by || null }
169
169
  );
170
170
  console.log(`done: ${t.id} — ${t.title}`);
@@ -176,7 +176,7 @@ export async function cmdTaskDrop(args) {
176
176
  if (!id) return fail("drop", "id required");
177
177
  const pid = await resolveProjectId(args?.flags?.project);
178
178
  const t = await http.post(
179
- `/projects/${pid}/tasks/${encodeURIComponent(id)}/drop`,
179
+ `/api/projects/${pid}/tasks/${encodeURIComponent(id)}/drop`,
180
180
  { by: args.flags?.by || null }
181
181
  );
182
182
  console.log(`dropped: ${t.id} — ${t.title}`);
@@ -187,7 +187,7 @@ export async function cmdTaskReopen(args) {
187
187
  const id = (args._ || [])[0];
188
188
  if (!id) return fail("reopen", "id required");
189
189
  const pid = await resolveProjectId(args?.flags?.project);
190
- const t = await http.post(`/projects/${pid}/tasks/${encodeURIComponent(id)}/reopen`);
190
+ const t = await http.post(`/api/projects/${pid}/tasks/${encodeURIComponent(id)}/reopen`);
191
191
  console.log(`reopened: ${t.id} — ${t.title}`);
192
192
  }
193
193
 
@@ -205,6 +205,6 @@ export async function cmdTaskPatch(args) {
205
205
  if (Object.keys(patch).length === 0) {
206
206
  return fail("patch", "at least one --title|--body|--due|--agent|--tag required");
207
207
  }
208
- const t = await http.patch(`/projects/${pid}/tasks/${encodeURIComponent(id)}`, { patch });
208
+ const t = await http.patch(`/api/projects/${pid}/tasks/${encodeURIComponent(id)}`, { patch });
209
209
  renderDetail(t);
210
210
  }
@@ -7,7 +7,7 @@ export async function cmdTelegramSend(args) {
7
7
  const chat_id = args.flags.chat === true ? undefined : args.flags.chat;
8
8
  // --interrupt / --force: send immediately bypassing any pending agent queue
9
9
  const interrupt = !!(args.flags.interrupt || args.flags.force);
10
- const result = await http.post("/telegram/send", { chat_id, text, interrupt });
10
+ const result = await http.post("/api/telegram/send", { chat_id, text, interrupt });
11
11
  if (interrupt) {
12
12
  console.log(`⚡ sent (interrupt, message_id=${result.message_id})`);
13
13
  } else {
@@ -16,7 +16,7 @@ export async function cmdTelegramSend(args) {
16
16
  }
17
17
 
18
18
  export async function cmdTelegramStatus() {
19
- const s = await http.get("/telegram/status");
19
+ const s = await http.get("/api/telegram/status");
20
20
  console.log(`enabled: ${s.enabled}`);
21
21
  if (!s.channels || s.channels.length === 0) {
22
22
  console.log("(no channels configured)");
@@ -38,7 +38,7 @@ export async function cmdTelegramStatus() {
38
38
  }
39
39
 
40
40
  export async function cmdTelegramStart() {
41
- const r = await http.post("/telegram/start", {});
41
+ const r = await http.post("/api/telegram/start", {});
42
42
  const channels = r.status?.channels || [];
43
43
  const polling = channels.filter((c) => c.polling).length;
44
44
  if (channels.length === 0) {
@@ -56,7 +56,7 @@ export async function cmdTelegramStart() {
56
56
  }
57
57
 
58
58
  export async function cmdTelegramStop() {
59
- await http.post("/telegram/stop", {});
59
+ await http.post("/api/telegram/stop", {});
60
60
  console.log("⏹ telegram polling stopped (config unchanged — apx telegram start to resume)");
61
61
  }
62
62
 
@@ -71,7 +71,7 @@ function ask(rl, prompt) {
71
71
 
72
72
  async function reloadDaemon() {
73
73
  try {
74
- await http.post("/admin/reload", {});
74
+ await http.post("/api/admin/reload", {});
75
75
  } catch (e) {
76
76
  console.log(`⚠️ reload failed: ${e.message} (changes saved, restart daemon to apply)`);
77
77
  }
@@ -79,7 +79,7 @@ async function reloadDaemon() {
79
79
 
80
80
  async function listProjects() {
81
81
  try {
82
- return await http.get("/projects");
82
+ return await http.get("/api/projects");
83
83
  } catch {
84
84
  return [];
85
85
  }
@@ -87,7 +87,7 @@ async function listProjects() {
87
87
 
88
88
  async function listAgentsForProject(projectId) {
89
89
  try {
90
- const ags = await http.get(`/projects/${projectId}/agents`);
90
+ const ags = await http.get(`/api/projects/${projectId}/agents`);
91
91
  return Array.isArray(ags) ? ags : (ags?.agents || []);
92
92
  } catch {
93
93
  return [];
@@ -113,7 +113,7 @@ function printChannelLine(c) {
113
113
  }
114
114
 
115
115
  export async function cmdTelegramChannelList() {
116
- const { channels } = await http.get("/telegram/channels");
116
+ const { channels } = await http.get("/api/telegram/channels");
117
117
  if (!channels || channels.length === 0) {
118
118
  console.log("(no channels configured — try `apx telegram channel add`)");
119
119
  return;
@@ -125,7 +125,7 @@ export async function cmdTelegramChannelList() {
125
125
  export async function cmdTelegramChannelShow(args) {
126
126
  const name = args._[0];
127
127
  if (!name) throw new Error("apx telegram channel show: missing <name>");
128
- const { channels } = await http.get("/telegram/channels");
128
+ const { channels } = await http.get("/api/telegram/channels");
129
129
  const ch = (channels || []).find((c) => c.name === name);
130
130
  if (!ch) throw new Error(`no such channel: ${name}`);
131
131
  console.log(JSON.stringify(ch, null, 2));
@@ -144,7 +144,7 @@ export async function cmdTelegramChannelAdd(args) {
144
144
  const b = parseBool(args.flags["respond-engine"]);
145
145
  if (b !== null) patch.respond_with_engine = b;
146
146
  }
147
- const result = await http.post("/telegram/channels", patch);
147
+ const result = await http.post("/api/telegram/channels", patch);
148
148
  await reloadDaemon();
149
149
  console.log(`${result.created ? "✅ created" : "ℹ️ updated"} channel "${name}"`);
150
150
  return;
@@ -201,7 +201,7 @@ export async function cmdTelegramChannelAdd(args) {
201
201
  if (agent) patch.route_to_agent = agent;
202
202
  patch.respond_with_engine = respond;
203
203
 
204
- const result = await http.post("/telegram/channels", patch);
204
+ const result = await http.post("/api/telegram/channels", patch);
205
205
  await reloadDaemon();
206
206
  console.log(`\n${result.created ? "✅ created" : "ℹ️ updated"} channel "${channelName}"`);
207
207
  } finally {
@@ -225,7 +225,7 @@ export async function cmdTelegramChannelSet(args) {
225
225
  if (Object.keys(patch).length === 0) {
226
226
  throw new Error("apx telegram channel set: nothing to update (use --project / --agent / --respond-engine / --bot-token / --chat-id)");
227
227
  }
228
- await http.patch(`/telegram/channels/${encodeURIComponent(name)}`, patch);
228
+ await http.patch(`/api/telegram/channels/${encodeURIComponent(name)}`, patch);
229
229
  await reloadDaemon();
230
230
  console.log(`✅ updated channel "${name}"`);
231
231
  }
@@ -243,7 +243,7 @@ export async function cmdTelegramChannelUnset(args) {
243
243
  throw new Error("apx telegram channel unset: specify at least one of --project --agent --bot-token --chat-id");
244
244
  }
245
245
  const body = Object.fromEntries(fields.map((f) => [f, null]));
246
- await http.patch(`/telegram/channels/${encodeURIComponent(name)}`, body);
246
+ await http.patch(`/api/telegram/channels/${encodeURIComponent(name)}`, body);
247
247
  await reloadDaemon();
248
248
  console.log(`✅ cleared ${fields.join(", ")} on "${name}"`);
249
249
  }
@@ -251,7 +251,7 @@ export async function cmdTelegramChannelUnset(args) {
251
251
  export async function cmdTelegramChannelRemove(args) {
252
252
  const name = args._[0];
253
253
  if (!name) throw new Error("apx telegram channel remove: missing <name>");
254
- await http.delete(`/telegram/channels/${encodeURIComponent(name)}`);
254
+ await http.delete(`/api/telegram/channels/${encodeURIComponent(name)}`);
255
255
  await reloadDaemon();
256
256
  console.log(`🗑 removed channel "${name}"`);
257
257
  }
@@ -268,7 +268,7 @@ function roleTag(c, owners) {
268
268
  }
269
269
 
270
270
  export async function cmdTelegramContacts() {
271
- const { contacts, channel_owners = [] } = await http.get("/telegram/contacts");
271
+ const { contacts, channel_owners = [] } = await http.get("/api/telegram/contacts");
272
272
  if (!contacts || contacts.length === 0) {
273
273
  console.log("(no contacts yet — they're recorded automatically when people message a bot)");
274
274
  return;
@@ -289,14 +289,14 @@ export async function cmdTelegramRole(args) {
289
289
  if (!userId || !role) {
290
290
  throw new Error("apx telegram role <user_id> <role> (e.g. apx telegram role 123 editor)");
291
291
  }
292
- const r = await http.patch(`/telegram/contacts/${encodeURIComponent(userId)}`, { role });
292
+ const r = await http.patch(`/api/telegram/contacts/${encodeURIComponent(userId)}`, { role });
293
293
  console.log(`✅ ${r.contact?.name || userId} → role "${role}"`);
294
294
  }
295
295
 
296
296
  export async function cmdTelegramContactRemove(args) {
297
297
  const userId = args._[0];
298
298
  if (!userId) throw new Error("apx telegram contact rm <user_id>");
299
- await http.delete(`/telegram/contacts/${encodeURIComponent(userId)}`);
299
+ await http.delete(`/api/telegram/contacts/${encodeURIComponent(userId)}`);
300
300
  console.log(`🗑 removed contact ${userId}`);
301
301
  }
302
302
 
@@ -306,7 +306,7 @@ export async function cmdTelegramOwner(args) {
306
306
  if (!channel || !userId) {
307
307
  throw new Error("apx telegram owner <channel> <user_id>");
308
308
  }
309
- await http.patch(`/telegram/channels/${encodeURIComponent(channel)}`, {
309
+ await http.patch(`/api/telegram/channels/${encodeURIComponent(channel)}`, {
310
310
  owner_user_id: /^\d+$/.test(String(userId)) ? Number(userId) : userId,
311
311
  });
312
312
  await reloadDaemon();
@@ -322,19 +322,19 @@ export async function cmdTelegramRoles(args) {
322
322
  let tools = [];
323
323
  if (raw === "*" || raw === true) tools = "*";
324
324
  else if (typeof raw === "string") tools = raw.split(",").map((s) => s.trim()).filter(Boolean);
325
- await http.put(`/telegram/roles/${encodeURIComponent(name)}`, { tools });
325
+ await http.put(`/api/telegram/roles/${encodeURIComponent(name)}`, { tools });
326
326
  console.log(`✅ role "${name}" → tools ${tools === "*" ? "*" : `[${tools.join(", ")}]`}`);
327
327
  return;
328
328
  }
329
329
  if (sub === "rm" || sub === "remove") {
330
330
  const name = args._[1];
331
331
  if (!name) throw new Error("apx telegram roles rm <name>");
332
- await http.delete(`/telegram/roles/${encodeURIComponent(name)}`);
332
+ await http.delete(`/api/telegram/roles/${encodeURIComponent(name)}`);
333
333
  console.log(`🗑 removed role "${name}"`);
334
334
  return;
335
335
  }
336
336
  // default: list
337
- const { roles } = await http.get("/telegram/roles");
337
+ const { roles } = await http.get("/api/telegram/roles");
338
338
  const names = Object.keys(roles || {});
339
339
  if (names.length === 0) {
340
340
  console.log("(no roles defined)");
@@ -10,8 +10,8 @@
10
10
  // themselves.
11
11
 
12
12
  import fs from "node:fs";
13
- import os from "node:os";
14
13
  import path from "node:path";
14
+ import { RECORDINGS_TMP_DIR } from "#core/config/paths.js";
15
15
  import { spawn, spawnSync, execFileSync } from "node:child_process";
16
16
  import { http } from "../http.js";
17
17
 
@@ -78,7 +78,7 @@ function recordToFile(outPath, { seconds, recorder }) {
78
78
  // the recorder cleanly (we forward SIGINT to the child).
79
79
  return new Promise((resolve, reject) => {
80
80
  let args;
81
- let bin = recorder.bin;
81
+ const bin = recorder.bin;
82
82
  if (bin === "rec" || bin === "sox") {
83
83
  // SoX:
84
84
  // rec -q -c 1 -r 16000 out.wav silence 1 0.1 1% 1 1.5 1%
@@ -152,7 +152,7 @@ export async function cmdVoiceSay(args) {
152
152
  process.stdout.write(` ${fmt.d("Synthesizing…")} `);
153
153
  let result;
154
154
  try {
155
- result = await http.post("/tts/say", { text, provider, voice });
155
+ result = await http.post("/api/tts/say", { text, provider, voice });
156
156
  } catch (e) {
157
157
  console.log(fmt.r("failed"));
158
158
  console.error(` ${fmt.r("✗")} ${e.message}\n`);
@@ -183,7 +183,7 @@ export async function cmdVoiceListen(args) {
183
183
  process.exit(1);
184
184
  }
185
185
 
186
- const tmpDir = path.join(os.homedir(), ".apx", "tmp", "recordings");
186
+ const tmpDir = RECORDINGS_TMP_DIR;
187
187
  fs.mkdirSync(tmpDir, { recursive: true });
188
188
  const inFile = path.join(tmpDir, `listen-${Date.now()}.wav`);
189
189
 
@@ -212,7 +212,7 @@ export async function cmdVoiceListen(args) {
212
212
  const audioB64 = fs.readFileSync(inFile).toString("base64");
213
213
  let result;
214
214
  try {
215
- result = await http.post("/voice/turn", {
215
+ result = await http.post("/api/voice/turn", {
216
216
  audio: audioB64,
217
217
  format: "wav",
218
218
  provider,
@@ -240,7 +240,7 @@ export async function cmdVoiceListen(args) {
240
240
  export async function cmdVoiceProviders() {
241
241
  let info;
242
242
  try {
243
- info = await http.get("/tts/providers");
243
+ info = await http.get("/api/tts/providers");
244
244
  } catch (e) {
245
245
  console.error(`\n ${fmt.r("✗")} ${e.message}\n`);
246
246
  process.exit(1);