@agentprojectcontext/apx 1.81.0 → 1.89.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 (838) hide show
  1. package/package.json +9 -8
  2. package/skills/apc-context/SKILL.md +14 -7
  3. package/skills/apx/SKILL.md +62 -2
  4. package/skills/apx-mcp/SKILL.md +42 -15
  5. package/src/core/agent/a2a/peers.js +161 -0
  6. package/src/core/agent/a2a/reply.js +379 -27
  7. package/src/core/agent/abort.js +25 -0
  8. package/src/core/agent/agent-model.js +58 -0
  9. package/src/core/agent/agent-tools.js +101 -0
  10. package/src/core/agent/author-line.js +110 -0
  11. package/src/core/agent/build-agent-system.js +52 -18
  12. package/src/core/agent/channels/voice-context.js +17 -2
  13. package/src/core/agent/closing-floor.js +117 -0
  14. package/src/core/agent/constants.js +119 -11
  15. package/src/core/agent/engine-call.js +56 -0
  16. package/src/core/agent/group/run-group-turn.js +218 -0
  17. package/src/core/agent/group/turn-resolver.js +165 -0
  18. package/src/core/agent/judge.js +138 -11
  19. package/src/core/agent/loop/side-effects.js +106 -3
  20. package/src/core/agent/memory.js +31 -18
  21. package/src/core/agent/model-capabilities.js +47 -0
  22. package/src/core/agent/model-router.js +11 -40
  23. package/src/core/agent/prompt-builder.js +47 -0
  24. package/src/core/agent/prompts/channels/a2a.md +12 -0
  25. package/src/core/agent/prompts/channels/code.md +3 -1
  26. package/src/core/agent/prompts/channels/telegram.md +2 -0
  27. package/src/core/agent/prompts/channels/web_code.md +1 -1
  28. package/src/core/agent/prompts/channels/whatsapp.md +37 -0
  29. package/src/core/agent/prompts/core/agent-base.md +2 -0
  30. package/src/core/agent/prompts/discipline/action.md +1 -0
  31. package/src/core/agent/prompts/discipline/two-segment.md +2 -1
  32. package/src/core/agent/prompts/modes/mobility.md +36 -0
  33. package/src/core/agent/retry.js +42 -0
  34. package/src/core/agent/run-agent.js +322 -25
  35. package/src/core/agent/run-turn.js +253 -0
  36. package/src/core/agent/self-memory.js +18 -52
  37. package/src/core/agent/skills/agent-skills.js +118 -0
  38. package/src/core/agent/skills/catalog.js +1 -1
  39. package/src/core/agent/skills/declared.js +13 -0
  40. package/src/core/agent/skills/index-store.js +8 -1
  41. package/src/core/agent/skills/inspector.js +20 -3
  42. package/src/core/agent/skills/loader.js +18 -3
  43. package/src/core/agent/skills/media.js +121 -0
  44. package/src/core/agent/skills/origin.js +61 -0
  45. package/src/core/agent/skills/sections.js +136 -0
  46. package/src/core/agent/super-agent.js +54 -14
  47. package/src/core/agent/tools/handlers/_calendar.js +50 -0
  48. package/src/core/agent/tools/handlers/add-mcp.js +103 -0
  49. package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
  50. package/src/core/agent/tools/handlers/attach-media.js +56 -0
  51. package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
  52. package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
  53. package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
  54. package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
  55. package/src/core/agent/tools/handlers/call-agent.js +14 -6
  56. package/src/core/agent/tools/handlers/call-runtime.js +27 -49
  57. package/src/core/agent/tools/handlers/comment-task.js +78 -0
  58. package/src/core/agent/tools/handlers/complete-task.js +60 -0
  59. package/src/core/agent/tools/handlers/configure-agent.js +70 -0
  60. package/src/core/agent/tools/handlers/create-agent.js +68 -0
  61. package/src/core/agent/tools/handlers/create-task.js +41 -3
  62. package/src/core/agent/tools/handlers/import-agent.js +5 -5
  63. package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
  64. package/src/core/agent/tools/handlers/list-routines.js +46 -0
  65. package/src/core/agent/tools/handlers/list-tasks.js +8 -1
  66. package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
  67. package/src/core/agent/tools/handlers/read-skill.js +64 -0
  68. package/src/core/agent/tools/handlers/remember-routine.js +2 -8
  69. package/src/core/agent/tools/handlers/remember.js +82 -6
  70. package/src/core/agent/tools/handlers/remove-agent.js +42 -0
  71. package/src/core/agent/tools/handlers/run-routine.js +94 -0
  72. package/src/core/agent/tools/handlers/run-shell.js +44 -2
  73. package/src/core/agent/tools/handlers/send-telegram.js +41 -19
  74. package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
  75. package/src/core/agent/tools/handlers/view-media.js +69 -0
  76. package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
  77. package/src/core/agent/tools/helpers.js +36 -4
  78. package/src/core/agent/tools/names.js +64 -0
  79. package/src/core/agent/tools/registry-bridge.js +24 -1
  80. package/src/core/agent/tools/registry.js +79 -0
  81. package/src/core/agent/tools/tool-call-parser.js +136 -13
  82. package/src/core/agent/vision-bridge.js +69 -0
  83. package/src/core/apc/agent-identity.js +74 -0
  84. package/src/core/apc/agent-rename-refs.js +187 -0
  85. package/src/core/apc/agent-write.js +312 -0
  86. package/src/core/apc/agents-vault.js +1 -1
  87. package/src/core/apc/blob-keys.js +42 -0
  88. package/src/core/apc/frontmatter.js +166 -10
  89. package/src/core/apc/parser.js +33 -83
  90. package/src/core/apc/paths.js +4 -6
  91. package/src/core/apc/project-memory.js +44 -0
  92. package/src/core/apc/projects-helpers.js +33 -0
  93. package/src/core/apc/scaffold.js +36 -16
  94. package/src/core/channels/telegram/ask-callbacks.js +103 -0
  95. package/src/core/channels/telegram/dispatch.js +154 -30
  96. package/src/core/channels/telegram/helpers.js +59 -7
  97. package/src/core/channels/telegram/inbound/audio.js +26 -30
  98. package/src/core/channels/telegram/inbound/file.js +22 -32
  99. package/src/core/channels/telegram/inbound/photo.js +24 -28
  100. package/src/core/channels/telegram/progress-gate.js +76 -0
  101. package/src/core/channels/telegram/reply.js +151 -43
  102. package/src/core/channels/telegram/voice-note.js +150 -0
  103. package/src/core/config/index.js +53 -54
  104. package/src/core/config/paths.js +117 -31
  105. package/src/core/config/redact.js +89 -4
  106. package/src/core/config/secret-values.js +2 -4
  107. package/src/core/constants/actors.js +5 -0
  108. package/src/core/constants/channels.js +3 -1
  109. package/src/core/constants/task-categories.js +73 -0
  110. package/src/core/constants/task-fields.js +28 -0
  111. package/src/core/engines/_globs.js +33 -0
  112. package/src/core/engines/anthropic.js +19 -1
  113. package/src/core/engines/catalog.js +20 -0
  114. package/src/core/engines/gemini.js +84 -16
  115. package/src/core/engines/index.js +19 -3
  116. package/src/core/engines/mock.js +145 -1
  117. package/src/core/engines/openai-compatible.js +150 -15
  118. package/src/core/engines/presets.js +36 -9
  119. package/src/core/engines/zen.js +131 -0
  120. package/src/core/events/bus.js +140 -0
  121. package/src/core/events/mascot-notify.js +156 -0
  122. package/src/core/http-tools/browser.js +366 -36
  123. package/src/core/http-tools/catalog.js +206 -22
  124. package/src/core/http-tools/grep.js +62 -7
  125. package/src/core/http-tools/registry.js +3 -1
  126. package/src/core/i18n/en.js +34 -3
  127. package/src/core/i18n/es.js +36 -4
  128. package/src/core/i18n/index.js +5 -5
  129. package/src/core/i18n/pt.js +32 -3
  130. package/src/core/identity/self.js +14 -1
  131. package/src/core/images/engines/a1111.js +219 -0
  132. package/src/core/images/engines/index.js +187 -0
  133. package/src/core/images/engines/mock.js +74 -0
  134. package/src/core/images/engines/openai.js +130 -0
  135. package/src/core/images/engines/sdcpp.js +204 -0
  136. package/src/core/images/engines/shared.js +218 -0
  137. package/src/core/images/generate.js +260 -0
  138. package/src/core/integrations/catalog.js +8 -3
  139. package/src/core/integrations/plugins/_google-oauth.js +179 -0
  140. package/src/core/integrations/plugins/asana.js +7 -3
  141. package/src/core/integrations/plugins/calendar.js +404 -0
  142. package/src/core/integrations/store.js +2 -0
  143. package/src/core/memory/broker.js +16 -1
  144. package/src/core/memory/compactor.js +19 -3
  145. package/src/core/memory/consolidate.js +2 -2
  146. package/src/core/memory/dated-log.js +66 -0
  147. package/src/core/memory/embed-engines/custom.js +59 -0
  148. package/src/core/memory/embed-engines/gemini.js +9 -3
  149. package/src/core/memory/embed-engines/index.js +87 -15
  150. package/src/core/memory/embeddings.js +52 -24
  151. package/src/core/memory/index.js +13 -3
  152. package/src/core/memory/indexer.js +83 -27
  153. package/src/core/memory/prune.js +182 -0
  154. package/src/core/memory/store.js +22 -0
  155. package/src/core/memory/summarizer.js +72 -8
  156. package/src/core/mobility/answer.js +80 -0
  157. package/src/core/mobility/geofence.js +667 -0
  158. package/src/core/mobility/osm-route.js +282 -0
  159. package/src/core/mobility/preferences.js +91 -0
  160. package/src/core/mobility/state.js +245 -0
  161. package/src/core/mobility/trip-event.js +384 -0
  162. package/src/core/net/tailscale.js +168 -0
  163. package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
  164. package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
  165. package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
  166. package/src/core/profiles/bundled/secretary/profile.json +3 -1
  167. package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
  168. package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
  169. package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
  170. package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
  171. package/src/core/profiles/lifecycle.js +243 -19
  172. package/src/core/profiles/paths.js +12 -0
  173. package/src/core/profiles/store.js +47 -0
  174. package/src/core/routines/active-runs.js +213 -0
  175. package/src/core/routines/delivery.js +612 -0
  176. package/src/core/routines/header.js +88 -0
  177. package/src/core/routines/index.js +26 -0
  178. package/src/core/routines/run-log.js +78 -0
  179. package/src/core/routines/runner.js +629 -66
  180. package/src/core/routines/signals.js +75 -0
  181. package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
  182. package/src/core/runtime-skills/apx/SKILL.md +93 -1
  183. package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
  184. package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
  185. package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
  186. package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
  187. package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
  188. package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
  189. package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
  190. package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
  191. package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
  192. package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
  193. package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
  194. package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
  195. package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
  196. package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
  197. package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
  198. package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
  199. package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
  200. package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
  201. package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
  202. package/src/core/runtimes/_spawn.js +9 -1
  203. package/src/core/runtimes/claude-code.js +11 -2
  204. package/src/core/runtimes/codex.js +44 -10
  205. package/src/core/runtimes/index.js +17 -2
  206. package/src/core/runtimes/opencode.js +88 -9
  207. package/src/core/runtimes/outcome.js +119 -0
  208. package/src/core/sessions/index.js +193 -1
  209. package/src/core/stores/agent-inbox.js +109 -23
  210. package/src/core/stores/code-sessions.js +21 -0
  211. package/src/core/stores/commitments.js +27 -3
  212. package/src/core/stores/conversations.js +220 -20
  213. package/src/core/stores/deliveries.js +177 -0
  214. package/src/core/stores/media-archive.js +228 -0
  215. package/src/core/stores/messages.js +1096 -112
  216. package/src/core/stores/organization.js +34 -0
  217. package/src/core/stores/project-memory.js +71 -0
  218. package/src/core/stores/routine-memory.js +16 -8
  219. package/src/core/stores/routines.js +27 -49
  220. package/src/core/stores/sessions.js +4 -8
  221. package/src/core/stores/tasks.js +212 -18
  222. package/src/core/stores/turn-record.js +209 -0
  223. package/src/core/tasks/columns.js +136 -0
  224. package/src/core/tasks/comment-turn.js +258 -0
  225. package/src/core/util/time.js +13 -0
  226. package/src/core/voice/engines/index.js +54 -1
  227. package/src/core/voice/engines/openai.js +50 -4
  228. package/src/core/voice/opus.js +67 -0
  229. package/src/core/voice/pronounceable.js +43 -0
  230. package/src/core/voice/transcription.js +4 -0
  231. package/src/core/voice/tts.js +114 -24
  232. package/src/host/daemon/active-turns.js +188 -0
  233. package/src/host/daemon/api/admin-config.js +9 -0
  234. package/src/host/daemon/api/agents.js +99 -90
  235. package/src/host/daemon/api/artifact-preview.js +7 -6
  236. package/src/host/daemon/api/artifacts.js +3 -2
  237. package/src/host/daemon/api/code.js +55 -9
  238. package/src/host/daemon/api/commitments.js +11 -0
  239. package/src/host/daemon/api/confirm.js +3 -2
  240. package/src/host/daemon/api/conversations.js +543 -35
  241. package/src/host/daemon/api/deck.js +9 -8
  242. package/src/host/daemon/api/deliveries.js +33 -0
  243. package/src/host/daemon/api/desktop.js +5 -4
  244. package/src/host/daemon/api/embeddings.js +15 -6
  245. package/src/host/daemon/api/engines.js +59 -8
  246. package/src/host/daemon/api/exec.js +437 -121
  247. package/src/host/daemon/api/groups.js +215 -0
  248. package/src/host/daemon/api/images.js +107 -0
  249. package/src/host/daemon/api/inbox.js +123 -2
  250. package/src/host/daemon/api/integrations.js +64 -2
  251. package/src/host/daemon/api/mcps.js +7 -6
  252. package/src/host/daemon/api/media.js +283 -0
  253. package/src/host/daemon/api/mobility.js +177 -0
  254. package/src/host/daemon/api/net.js +182 -0
  255. package/src/host/daemon/api/pairing.js +38 -5
  256. package/src/host/daemon/api/profiles.js +30 -2
  257. package/src/host/daemon/api/routines.js +36 -4
  258. package/src/host/daemon/api/runtimes.js +74 -39
  259. package/src/host/daemon/api/sessions-search.js +7 -2
  260. package/src/host/daemon/api/sessions.js +44 -2
  261. package/src/host/daemon/api/shared.js +127 -20
  262. package/src/host/daemon/api/skills.js +11 -4
  263. package/src/host/daemon/api/super-agent.js +384 -53
  264. package/src/host/daemon/api/tasks.js +180 -10
  265. package/src/host/daemon/api/telegram.js +11 -10
  266. package/src/host/daemon/api/thread-faces.js +159 -0
  267. package/src/host/daemon/api/top-level.js +3 -3
  268. package/src/host/daemon/api/transcribe.js +11 -10
  269. package/src/host/daemon/api/tts.js +97 -4
  270. package/src/host/daemon/api/turn-abort.js +23 -0
  271. package/src/host/daemon/api/turns.js +49 -0
  272. package/src/host/daemon/api/voice.js +5 -4
  273. package/src/host/daemon/api/web.js +98 -0
  274. package/src/host/daemon/api.js +39 -0
  275. package/src/host/daemon/delivery-sweep.js +58 -0
  276. package/src/host/daemon/desktop-ws.js +5 -23
  277. package/src/host/daemon/events-ws.js +273 -0
  278. package/src/host/daemon/index.js +59 -15
  279. package/src/host/daemon/plugins/desktop/index.js +17 -4
  280. package/src/host/daemon/plugins/telegram/index.js +78 -40
  281. package/src/host/daemon/pty-bridge.py +99 -0
  282. package/src/host/daemon/routines-scheduler.js +1 -0
  283. package/src/host/daemon/smoke.js +1 -2
  284. package/src/host/daemon/terminal-ws.js +132 -0
  285. package/src/host/daemon/tts-keepwarm.js +87 -0
  286. package/src/host/daemon/wakeup.js +11 -6
  287. package/src/host/daemon/whisper-server.js +44 -0
  288. package/src/host/daemon/whisper-server.py +70 -13
  289. package/src/host/daemon/ws-auth.js +28 -0
  290. package/src/interfaces/android/app/build.gradle +42 -0
  291. package/src/interfaces/android/app/proguard-rules.pro +4 -0
  292. package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
  293. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
  294. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
  295. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
  296. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
  297. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
  298. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
  299. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
  300. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
  301. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
  302. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
  303. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
  304. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
  305. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
  306. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
  307. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
  308. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
  309. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
  310. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
  311. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
  312. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
  313. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
  314. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
  315. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
  316. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
  317. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
  318. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
  319. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
  320. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
  321. package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
  322. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
  323. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
  324. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
  325. package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
  326. package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
  327. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
  328. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
  329. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
  330. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
  331. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
  332. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
  333. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
  334. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
  335. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
  336. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
  337. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
  338. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
  339. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
  340. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
  341. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
  342. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
  343. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
  344. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
  345. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
  346. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
  347. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
  348. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
  349. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
  350. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
  351. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
  352. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
  353. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
  354. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
  355. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
  356. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
  357. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
  358. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
  359. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
  360. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
  361. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
  362. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  363. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  364. package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
  365. package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
  366. package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
  367. package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
  368. package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
  369. package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
  370. package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
  371. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
  372. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
  373. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
  374. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
  375. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
  376. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
  377. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
  378. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
  379. package/src/interfaces/android/build.gradle +3 -0
  380. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  381. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
  382. package/src/interfaces/android/gradle.properties +3 -0
  383. package/src/interfaces/android/gradlew +248 -0
  384. package/src/interfaces/android/gradlew.bat +82 -0
  385. package/src/interfaces/android/settings.gradle +18 -0
  386. package/src/interfaces/cli/commands/a2a.js +145 -4
  387. package/src/interfaces/cli/commands/agent.js +247 -22
  388. package/src/interfaces/cli/commands/code.js +1 -1
  389. package/src/interfaces/cli/commands/commitment.js +5 -0
  390. package/src/interfaces/cli/commands/config.js +85 -6
  391. package/src/interfaces/cli/commands/exec.js +90 -1
  392. package/src/interfaces/cli/commands/image.js +314 -0
  393. package/src/interfaces/cli/commands/mcp.js +87 -23
  394. package/src/interfaces/cli/commands/memory.js +35 -22
  395. package/src/interfaces/cli/commands/panel.js +94 -0
  396. package/src/interfaces/cli/commands/profile.js +14 -0
  397. package/src/interfaces/cli/commands/project.js +29 -0
  398. package/src/interfaces/cli/commands/routine.js +45 -10
  399. package/src/interfaces/cli/commands/runtime.js +30 -7
  400. package/src/interfaces/cli/commands/session.js +90 -38
  401. package/src/interfaces/cli/commands/sessions.js +35 -2
  402. package/src/interfaces/cli/commands/skills.js +15 -9
  403. package/src/interfaces/cli/commands/status.js +2 -3
  404. package/src/interfaces/cli/commands/task.js +54 -5
  405. package/src/interfaces/cli/commands/telegram.js +12 -4
  406. package/src/interfaces/cli/commands/transcribe.js +177 -0
  407. package/src/interfaces/cli/help/index.js +311 -72
  408. package/src/interfaces/cli/http.js +61 -13
  409. package/src/interfaces/cli/index.js +1 -1
  410. package/src/interfaces/cli/routes/agent.js +5 -4
  411. package/src/interfaces/cli/routes/commitment.js +3 -2
  412. package/src/interfaces/cli/routes/config.js +7 -2
  413. package/src/interfaces/cli/routes/image.js +11 -0
  414. package/src/interfaces/cli/routes/index.js +2 -0
  415. package/src/interfaces/cli/routes/log.js +1 -1
  416. package/src/interfaces/cli/routes/memory.js +3 -2
  417. package/src/interfaces/cli/routes/panel.js +15 -2
  418. package/src/interfaces/cli/routes/profile.js +3 -2
  419. package/src/interfaces/cli/routes/transcribe.js +10 -0
  420. package/src/interfaces/cli/stdin.js +29 -0
  421. package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
  422. package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
  423. package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
  424. package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
  425. package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
  426. package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
  427. package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
  428. package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
  429. package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
  430. package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
  431. package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
  432. package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
  433. package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
  434. package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
  435. package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
  436. package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
  437. package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
  438. package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
  439. package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
  440. package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
  441. package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
  442. package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
  443. package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
  444. package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
  445. package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
  446. package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
  447. package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
  448. package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
  449. package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
  450. package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
  451. package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
  452. package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
  453. package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
  454. package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
  455. package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
  456. package/src/interfaces/desktop/assets/notification.mp3 +0 -0
  457. package/src/interfaces/desktop/main.js +473 -29
  458. package/src/interfaces/desktop/mascot-blobs.js +41 -0
  459. package/src/interfaces/desktop/mascot-preload.js +32 -0
  460. package/src/interfaces/desktop/mascot.css +186 -0
  461. package/src/interfaces/desktop/mascot.html +40 -0
  462. package/src/interfaces/desktop/mascot.js +163 -0
  463. package/src/interfaces/desktop/preload.js +10 -0
  464. package/src/interfaces/desktop/renderer.js +308 -48
  465. package/src/interfaces/desktop/style.css +34 -0
  466. package/src/interfaces/mcp-server/index.js +87 -0
  467. package/src/interfaces/tui/_shims/util-locale.ts +0 -2
  468. package/src/interfaces/tui/app.tsx +0 -6
  469. package/src/interfaces/tui/attach.ts +0 -1
  470. package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
  471. package/src/interfaces/tui/plugin/api.tsx +0 -3
  472. package/src/interfaces/tui/plugin/runtime.ts +0 -3
  473. package/src/interfaces/tui/thread.ts +0 -16
  474. package/src/interfaces/web/README.md +22 -14
  475. package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
  476. package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
  477. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
  478. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
  479. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
  480. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
  481. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
  482. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
  483. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
  484. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
  485. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
  486. package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
  487. package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
  488. package/src/interfaces/web/dist/index.html +22 -6
  489. package/src/interfaces/web/dist/index.html.br +0 -0
  490. package/src/interfaces/web/dist/index.html.gz +0 -0
  491. package/src/interfaces/web/dist/manifest.webmanifest +25 -0
  492. package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
  493. package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
  494. package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
  495. package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
  496. package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
  497. package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
  498. package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
  499. package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
  500. package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
  501. package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
  502. package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
  503. package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
  504. package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
  505. package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
  506. package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
  507. package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
  508. package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
  509. package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
  510. package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
  511. package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
  512. package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
  513. package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
  514. package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
  515. package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
  516. package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
  517. package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
  518. package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
  519. package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
  520. package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
  521. package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
  522. package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
  523. package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
  524. package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
  525. package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
  526. package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
  527. package/src/interfaces/web/dist/sw.js +106 -0
  528. package/src/interfaces/web/dist/sw.js.br +0 -0
  529. package/src/interfaces/web/dist/sw.js.gz +0 -0
  530. package/src/interfaces/web/eslint.config.js +83 -0
  531. package/src/interfaces/web/index.html +20 -4
  532. package/src/interfaces/web/package-lock.json +1651 -1280
  533. package/src/interfaces/web/package.json +9 -10
  534. package/src/interfaces/web/pnpm-lock.yaml +867 -869
  535. package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
  536. package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
  537. package/src/interfaces/web/public/manifest.webmanifest +25 -0
  538. package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
  539. package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
  540. package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
  541. package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
  542. package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
  543. package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
  544. package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
  545. package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
  546. package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
  547. package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
  548. package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
  549. package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
  550. package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
  551. package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
  552. package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
  553. package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
  554. package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
  555. package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
  556. package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
  557. package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
  558. package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
  559. package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
  560. package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
  561. package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
  562. package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
  563. package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
  564. package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
  565. package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
  566. package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
  567. package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
  568. package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
  569. package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
  570. package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
  571. package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
  572. package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
  573. package/src/interfaces/web/public/sw.js +106 -0
  574. package/src/interfaces/web/src/App.tsx +106 -10
  575. package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
  576. package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
  577. package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
  578. package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
  579. package/src/interfaces/web/src/components/Combobox.tsx +201 -0
  580. package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
  581. package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
  582. package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
  583. package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
  584. package/src/interfaces/web/src/components/Roby.tsx +5 -3
  585. package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
  586. package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
  587. package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
  588. package/src/interfaces/web/src/components/Toast.tsx +50 -14
  589. package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
  590. package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
  591. package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
  592. package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
  593. package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
  594. package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
  595. package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
  596. package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
  597. package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
  598. package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
  599. package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
  600. package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
  601. package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
  602. package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
  603. package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
  604. package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
  605. package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
  606. package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
  607. package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
  608. package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
  609. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
  610. package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
  611. package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
  612. package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
  613. package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
  614. package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
  615. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
  616. package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
  617. package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
  618. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
  619. package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
  620. package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
  621. package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
  622. package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
  623. package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
  624. package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
  625. package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
  626. package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
  627. package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
  628. package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
  629. package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
  630. package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
  631. package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
  632. package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
  633. package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
  634. package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
  635. package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
  636. package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
  637. package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
  638. package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
  639. package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
  640. package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
  641. package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
  642. package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
  643. package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
  644. package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
  645. package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
  646. package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
  647. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
  648. package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
  649. package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
  650. package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
  651. package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
  652. package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
  653. package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
  654. package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
  655. package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
  656. package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
  657. package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
  658. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
  659. package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
  660. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
  661. package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
  662. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
  663. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
  664. package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
  665. package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
  666. package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
  667. package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
  668. package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
  669. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
  670. package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
  671. package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
  672. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
  673. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
  674. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
  675. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
  676. package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
  677. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
  678. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
  679. package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
  680. package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
  681. package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
  682. package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
  683. package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
  684. package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
  685. package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
  686. package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
  687. package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
  688. package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
  689. package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
  690. package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
  691. package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
  692. package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
  693. package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
  694. package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
  695. package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
  696. package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
  697. package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
  698. package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
  699. package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
  700. package/src/interfaces/web/src/components/ui.tsx +62 -23
  701. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
  702. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
  703. package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
  704. package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
  705. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
  706. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
  707. package/src/interfaces/web/src/constants/index.ts +1 -0
  708. package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
  709. package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
  710. package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
  711. package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
  712. package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
  713. package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
  714. package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
  715. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
  716. package/src/interfaces/web/src/i18n/en.ts +832 -175
  717. package/src/interfaces/web/src/i18n/es.ts +841 -188
  718. package/src/interfaces/web/src/lib/api/agents.ts +23 -4
  719. package/src/interfaces/web/src/lib/api/code.ts +17 -0
  720. package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
  721. package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
  722. package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
  723. package/src/interfaces/web/src/lib/api/engines.ts +14 -0
  724. package/src/interfaces/web/src/lib/api/groups.ts +93 -0
  725. package/src/interfaces/web/src/lib/api/images.ts +193 -0
  726. package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
  727. package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
  728. package/src/interfaces/web/src/lib/api/media.ts +126 -0
  729. package/src/interfaces/web/src/lib/api/net.ts +44 -0
  730. package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
  731. package/src/interfaces/web/src/lib/api/projects.ts +9 -1
  732. package/src/interfaces/web/src/lib/api/routines.ts +9 -1
  733. package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
  734. package/src/interfaces/web/src/lib/api/skills.ts +8 -0
  735. package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
  736. package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
  737. package/src/interfaces/web/src/lib/api/tools.ts +2 -0
  738. package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
  739. package/src/interfaces/web/src/lib/api/turns.ts +20 -0
  740. package/src/interfaces/web/src/lib/api/voice.ts +72 -2
  741. package/src/interfaces/web/src/lib/api.ts +3 -0
  742. package/src/interfaces/web/src/lib/channels.ts +214 -0
  743. package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
  744. package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
  745. package/src/interfaces/web/src/lib/code-context.ts +0 -2
  746. package/src/interfaces/web/src/lib/http.ts +51 -17
  747. package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
  748. package/src/interfaces/web/src/lib/live.ts +252 -0
  749. package/src/interfaces/web/src/lib/net.ts +211 -0
  750. package/src/interfaces/web/src/lib/notify.ts +331 -0
  751. package/src/interfaces/web/src/lib/projectNav.ts +40 -0
  752. package/src/interfaces/web/src/lib/pwa.ts +115 -0
  753. package/src/interfaces/web/src/lib/qvox.ts +24 -0
  754. package/src/interfaces/web/src/lib/slug.ts +3 -0
  755. package/src/interfaces/web/src/lib/tone.ts +150 -0
  756. package/src/interfaces/web/src/main.tsx +15 -4
  757. package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
  758. package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
  759. package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
  760. package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
  761. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
  762. package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
  763. package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
  764. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
  765. package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
  766. package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
  767. package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
  768. package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
  769. package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
  770. package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
  771. package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
  772. package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
  773. package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
  774. package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
  775. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
  776. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
  777. package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
  778. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
  779. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
  780. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
  781. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
  782. package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
  783. package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
  784. package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
  785. package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
  786. package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
  787. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
  788. package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
  789. package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
  790. package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
  791. package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
  792. package/src/interfaces/web/src/styles.css +106 -31
  793. package/src/interfaces/web/src/types/daemon.ts +246 -2
  794. package/src/interfaces/web/src/vite-env.d.ts +20 -0
  795. package/src/interfaces/tui/plugin/command-shim.ts +0 -109
  796. package/src/interfaces/web/components.json +0 -25
  797. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
  798. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
  799. package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
  800. package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
  801. package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
  802. package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
  803. package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
  804. package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
  805. package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
  806. package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
  807. package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
  808. package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
  809. package/src/interfaces/web/src/components/ui/card.tsx +0 -103
  810. package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
  811. package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
  812. package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
  813. package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
  814. package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
  815. package/src/interfaces/web/src/components/ui/command.tsx +0 -196
  816. package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
  817. package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
  818. package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
  819. package/src/interfaces/web/src/components/ui/field.tsx +0 -236
  820. package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
  821. package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
  822. package/src/interfaces/web/src/components/ui/item.tsx +0 -201
  823. package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
  824. package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
  825. package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
  826. package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
  827. package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
  828. package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
  829. package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
  830. package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
  831. package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
  832. package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
  833. package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
  834. package/src/interfaces/web/src/components/ui/table.tsx +0 -116
  835. package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
  836. package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
  837. package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
  838. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
@@ -67,6 +67,35 @@ export async function cmdProjectRebuild(args) {
67
67
  console.log(`Rebuilt project #${id}: ${result.agents} agents`);
68
68
  }
69
69
 
70
+ /**
71
+ * The filesystem root of a project, from the same selectors resolveProjectId
72
+ * accepts (numeric id, path, exact name, fuzzy name/path).
73
+ *
74
+ * WHY THIS EXISTS. Commands that edit files under `.apc/` need the path, not the
75
+ * id, and they all resolved it by walking up from cwd. So `apx agent set magui
76
+ * --tools …` run from anywhere but that one checkout failed with "not inside an
77
+ * APC project (run `apx init` first)" — advice that would have scaffolded a
78
+ * second project on top of the shell's cwd instead of editing the agent the
79
+ * user named. `--project` already works everywhere else; now it works here.
80
+ */
81
+ export async function resolveProjectRoot(target) {
82
+ if (target === true) {
83
+ throw new Error("--project needs a value: a project name, id, or path (`apx project list` shows them)");
84
+ }
85
+ if (target === undefined || target === null || target === "") {
86
+ const root = findApfRoot();
87
+ if (root) return root;
88
+ throw new Error(
89
+ "not inside an APC project — cd into one, run `apx init` here, or name the project with --project <name|id|path>"
90
+ );
91
+ }
92
+ const id = await resolveProjectId(target);
93
+ const projects = await http.get("/api/projects");
94
+ const found = projects.find((p) => Number(p.id) === Number(id));
95
+ if (!found) throw new Error(`--project "${target}" is not registered — run \`apx project list\``);
96
+ return found.path;
97
+ }
98
+
70
99
  // Resolve a project id from one of:
71
100
  // numeric id ("2")
72
101
  // absolute path ("/abs/path/to/project")
@@ -1,6 +1,12 @@
1
1
  import { http } from "../http.js";
2
2
  import { resolveProjectId } from "./project.js";
3
3
  import { listRoutines } from "#core/stores/routines.js";
4
+ import {
5
+ deliveryChannelIds,
6
+ normalizeDeliverTo,
7
+ PROFILE_DELIVERY,
8
+ NO_DELIVERY,
9
+ } from "#core/routines/index.js";
4
10
  import { projectStorageRoot } from "#core/config/index.js";
5
11
  import {
6
12
  routineMemoryPath,
@@ -9,6 +15,13 @@ import {
9
15
  ensureRoutineMemory,
10
16
  } from "#core/stores/routine-memory.js";
11
17
 
18
+ // Flags that belong to the routine record itself, not to its `spec`.
19
+ const ROUTINE_FLAGS = [
20
+ "name", "kind", "schedule", "spec", "verbose", "project",
21
+ "permission-mode", "allowed-tools",
22
+ "pre-commands", "post-commands", "skip-prompt-on", "deliver-to",
23
+ ];
24
+
12
25
  function parseSpec(args) {
13
26
  // Build spec from --spec '<json>' or from --K=V pairs
14
27
  if (args.flags.spec && args.flags.spec !== true) {
@@ -20,7 +33,11 @@ function parseSpec(args) {
20
33
  }
21
34
  const spec = {};
22
35
  for (const [k, v] of Object.entries(args.flags)) {
23
- if (["name", "kind", "schedule", "spec", "verbose", "permission-mode", "allowed-tools"].includes(k)) continue;
36
+ // Every flag `cmdRoutineAdd` reads for itself. A name missing from this
37
+ // list does not just get ignored — it lands in `spec` as a stray key the
38
+ // handler never reads, which is how `--post-commands` used to end up
39
+ // stored twice, once parsed and once as raw text.
40
+ if (ROUTINE_FLAGS.includes(k)) continue;
24
41
  if (v === true) continue;
25
42
  // try to JSON-parse the value (numbers, bools), else keep as string
26
43
  let val = v;
@@ -86,12 +103,26 @@ export async function cmdRoutineAdd(args) {
86
103
  const skip_prompt_on = args.flags["skip-prompt-on"] && args.flags["skip-prompt-on"] !== true
87
104
  ? args.flags["skip-prompt-on"]
88
105
  : undefined;
106
+ // Where the output goes: `--deliver-to telegram,web`, `--deliver-to profile`
107
+ // to take it from the active agent profile, `--deliver-to none` to say out
108
+ // loud that this one delivers nowhere. Omitted leaves the field unset, which
109
+ // is not the same as empty — see deliver_to in core/stores/routines.js.
110
+ const deliver_to = args.flags["deliver-to"] && args.flags["deliver-to"] !== true
111
+ ? normalizeDeliverTo(String(args.flags["deliver-to"]))
112
+ : undefined;
113
+ if (deliver_to) {
114
+ const known = [...deliveryChannelIds(), PROFILE_DELIVERY, NO_DELIVERY];
115
+ const bad = deliver_to.filter((c) => !known.includes(c));
116
+ if (bad.length)
117
+ throw new Error(`apx routine add: unknown --deliver-to channel: ${bad.join(", ")} (known: ${known.join(", ")})`);
118
+ }
89
119
  const pid = await resolveProjectId(args?.flags?.project);
90
- const r = await http.post(`/api/projects/${pid}/routines`, { name, kind, schedule, spec, permission_mode, allowed_tools, pre_commands, post_commands, skip_prompt_on });
120
+ const r = await http.post(`/api/projects/${pid}/routines`, { name, kind, schedule, spec, permission_mode, allowed_tools, pre_commands, post_commands, skip_prompt_on, deliver_to });
91
121
  console.log(`added routine "${r.name}" (${r.kind}, ${r.schedule}) → next ${r.next_run_at}`);
92
122
  if (r.pre_commands?.length) console.log(` pre: ${r.pre_commands.join(", ")}`);
93
123
  if (r.post_commands?.length) console.log(` post: ${r.post_commands.join(", ")}`);
94
124
  if (r.skip_prompt_on && r.skip_prompt_on !== "signal") console.log(` skip_prompt_on: ${r.skip_prompt_on}`);
125
+ if (r.deliver_to) console.log(` deliver_to: ${r.deliver_to.length ? r.deliver_to.join(", ") : "(nowhere)"}`);
95
126
  }
96
127
 
97
128
  export async function cmdRoutineRemove(args) {
@@ -182,16 +213,20 @@ export async function cmdRoutineHistory(args) {
182
213
  if (!name) throw new Error("apx routine history: missing <name>");
183
214
  const pid = await resolveProjectId(args?.flags?.project);
184
215
  const limit = args.flags.n || args.flags.last || "50";
185
- const rows = await http.get(`/api/projects/${pid}/messages?channel=routine&limit=${encodeURIComponent(limit)}`);
186
- const filtered = rows
187
- .filter((r) => r.meta?.routine === name)
188
- .reverse();
189
- if (filtered.length === 0) {
216
+ // The daemon decides what counts as a run (core/routines/run-log.js). This
217
+ // used to read the raw routine channel and keep every row carrying
218
+ // `meta.routine`, which is one row per TOOL CALL plus the "routine created /
219
+ // updated" rows — so `history` printed a run's internals interleaved with
220
+ // edits and called all of it history. Same bug the panel had; same fix.
221
+ const runs = await http.get(
222
+ `/api/projects/${pid}/routines/${encodeURIComponent(name)}/runs?limit=${encodeURIComponent(limit)}`
223
+ );
224
+ if (runs.length === 0) {
190
225
  console.log("(no routine history)");
191
226
  return;
192
227
  }
193
- for (const r of filtered) {
194
- const status = r.meta?.status ? ` ${r.meta.status}` : "";
195
- console.log(`${r.ts}${status} ${r.author || ""}: ${r.body}`);
228
+ for (const r of [...runs].reverse()) {
229
+ const chat = r.conversation_id ? ` [chat ${r.agent_slug}/${r.conversation_id}]` : "";
230
+ console.log(`${r.ts} ${r.status} ${r.body}${chat}`);
196
231
  }
197
232
  }
@@ -1,13 +1,36 @@
1
1
  import { http } from "../http.js";
2
2
  import { resolveProjectId } from "./project.js";
3
3
 
4
+ const SLUG_RE = /^[a-z][a-z0-9_-]*$/;
5
+
6
+ // Resolve the OPTIONAL agent and the prompt positionals for `apx run`. The APX
7
+ // agent only shapes the system prompt handed to the external CLI — the CLI has
8
+ // its own agency — so no agent means a pass-through:
9
+ // apx run --runtime claude-code "<prompt>" → { slug: null } (pass-through)
10
+ // apx run -a reviewer --runtime claude-code "<prompt>" → { slug: "reviewer" }
11
+ // apx run reviewer --runtime claude-code "<prompt>" → legacy positional (still works)
12
+ // A SINGLE positional is always the prompt, so a quoted pass-through prompt is
13
+ // never mistaken for an agent.
14
+ export function resolveRunAgent(flags = {}, positionals = []) {
15
+ const flagVal =
16
+ (flags.agent && flags.agent !== true) ? String(flags.agent) :
17
+ (flags.a && flags.a !== true) ? String(flags.a) : null;
18
+ let slug = flagVal;
19
+ let rest = positionals.slice();
20
+ if (!slug && rest.length >= 2 && SLUG_RE.test(rest[0])) {
21
+ slug = rest[0];
22
+ rest = rest.slice(1);
23
+ }
24
+ return { slug: slug || null, positionals: rest };
25
+ }
26
+
4
27
  export async function cmdRun(args) {
5
- const slug = args._[0];
6
- if (!slug) throw new Error("apx run: usage: apx run <agent> --runtime <id> \"<prompt>\"");
7
28
  const runtime = args.flags.runtime === true ? null : args.flags.runtime;
8
29
  if (!runtime) throw new Error("apx run: --runtime required (claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code | antigravity)");
9
30
 
10
- let prompt = args._.slice(1).join(" ").trim();
31
+ const { slug, positionals } = resolveRunAgent(args.flags, args._);
32
+
33
+ let prompt = positionals.join(" ").trim();
11
34
  if (!prompt || prompt === "-") {
12
35
  const fs = await import("node:fs");
13
36
  if (!process.stdin.isTTY) {
@@ -30,10 +53,10 @@ export async function cmdRun(args) {
30
53
  ? parseInt(args.flags.timeout, 10) * 1000
31
54
  : undefined;
32
55
 
33
- const result = await http.post(
34
- `/api/projects/${pid}/agents/${slug}/runtime`,
35
- { runtime, prompt, timeoutMs }
36
- );
56
+ const endpoint = slug
57
+ ? `/api/projects/${pid}/agents/${slug}/runtime`
58
+ : `/api/projects/${pid}/runtime`;
59
+ const result = await http.post(endpoint, { runtime, prompt, timeoutMs });
37
60
 
38
61
  if (result.output) process.stdout.write(result.output + "\n");
39
62
  if (process.stderr.isTTY || args.flags.verbose) {
@@ -6,6 +6,7 @@ import { getOrCreateApxId } from "#core/apc/scaffold.js";
6
6
  import { generateSessionId } from "#core/stores/sessions.js";
7
7
  import { projectStorageRoot } from "#core/config/index.js";
8
8
  import { http } from "../http.js";
9
+ import { readStdinSync } from "../stdin.js";
9
10
  import { resolveProjectId } from "./project.js";
10
11
  import {
11
12
  ENGINES,
@@ -30,20 +31,6 @@ function requireStorageRoot(root) {
30
31
 
31
32
  const nowIso = () => new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
32
33
 
33
- function readStdinSync() {
34
- const chunks = [];
35
- const buf = Buffer.alloc(65536);
36
- try {
37
- while (true) {
38
- const bytes = fs.readSync(0, buf, 0, buf.length);
39
- if (!bytes) break;
40
- chunks.push(buf.slice(0, bytes).toString("utf8"));
41
- }
42
- } catch {}
43
- return chunks.join("");
44
- }
45
-
46
-
47
34
 
48
35
  function listAllSessions(root) {
49
36
  const agentsDir = path.join(requireStorageRoot(root), "agents");
@@ -173,8 +160,8 @@ export function cmdSessionList(args) {
173
160
  /**
174
161
  * `apx session get <id>` — single-record fetch.
175
162
  *
176
- * - Default: search the current APC project's local sessions (legacy
177
- * behaviour, fast, no daemon, no engine scan).
163
+ * - Default: search the current APC project's local sessions (fast, no
164
+ * daemon, no engine scan).
178
165
  * - --engine <id> : look only inside that engine's storage (apx, claude,
179
166
  * codex). Useful when you want the raw transcript of a
180
167
  * Claude/Codex session by id.
@@ -214,7 +201,7 @@ export function cmdSessionGet(args) {
214
201
  return printEngineSession(hits[0], args);
215
202
  }
216
203
 
217
- // Legacy / default — local APC project session lookup.
204
+ // Default — local APC project session lookup.
218
205
  const root = requireRoot();
219
206
  const s = findSessionById(root, id);
220
207
  if (!s) {
@@ -489,30 +476,76 @@ export async function cmdSessionResume(args) {
489
476
  }
490
477
  }
491
478
 
492
- // ── 4. Optional spawn of native CLI to continue ──────────────────────────
493
- if (args.flags.continue) {
494
- const spec = spawnContinueSpec(meta);
495
- if (!spec) {
496
- console.log("");
497
- console.log(`(--continue not supported for engine "${meta.engine}")`);
479
+ // ── 4. Continue the session ──────────────────────────────────────────────
480
+ // Two shapes share one flag family:
481
+ // --continue → interactive: hand the terminal to the native
482
+ // CLI (claude --resume / codex resume) so a
483
+ // HUMAN keeps typing. (stdio inherited)
484
+ // --continue --msg "<text>" → headless: inject one message into the
485
+ // existing transcript (full context) and
486
+ // capture the reply. This is how an APX agent
487
+ // answers a coding session it doesn't share a
488
+ // live process with — the return leg of a
489
+ // CLI ⇄ agent hand-off. `--msg` implies continue.
490
+ const relayMsgFlag = args.flags.msg ?? args.flags.text ?? args.flags.m;
491
+ const wantsRelay = relayMsgFlag !== undefined && relayMsgFlag !== false;
492
+ if (args.flags.continue || wantsRelay) {
493
+ if (wantsRelay) {
494
+ const message = relayMsgFlag === true || relayMsgFlag === "-" ? readStdinSync().trim() : String(relayMsgFlag);
495
+ if (!message) throw new Error('apx session resume --msg: message is empty (pass "<text>" or pipe it on stdin)');
496
+ const spec = spawnHeadlessMsgSpec(meta, message);
497
+ if (!spec) {
498
+ console.log("");
499
+ console.log(`(--msg headless delivery not supported for engine "${meta.engine}" yet — claude only; use --continue without --msg for interactive)`);
500
+ process.exitCode = 2;
501
+ } else {
502
+ console.error(`→ delivering to ${meta.engine}:${meta.id}${spec.cwd ? ` (cwd: ${spec.cwd})` : ""}`);
503
+ const child = spawn(spec.bin, spec.args, {
504
+ cwd: spec.cwd || process.cwd(),
505
+ stdio: ["ignore", "pipe", "pipe"],
506
+ });
507
+ let out = "";
508
+ let err = "";
509
+ child.stdout.on("data", (d) => (out += d));
510
+ child.stderr.on("data", (d) => (err += d));
511
+ const code = await new Promise((resolve) => {
512
+ child.on("exit", (c) => resolve(c));
513
+ child.on("error", (e) => {
514
+ err += `\n(failed to launch ${spec.bin}: ${e.message})`;
515
+ resolve(-1);
516
+ });
517
+ });
518
+ const text = out.trim();
519
+ if (text) console.log(text);
520
+ if (code !== 0) {
521
+ if (err.trim()) console.error(err.trim().slice(0, 800));
522
+ process.exitCode = code === -1 ? 1 : code;
523
+ }
524
+ }
498
525
  } else {
499
- console.log("");
500
- console.log(`→ launching: ${spec.bin} ${spec.args.join(" ")}`);
501
- if (spec.cwd) console.log(` cwd: ${spec.cwd}`);
502
- const child = spawn(spec.bin, spec.args, {
503
- cwd: spec.cwd || process.cwd(),
504
- stdio: "inherit",
505
- });
506
- await new Promise((resolve) => {
507
- child.on("exit", (code) => {
508
- if (code !== 0) console.log(`(native CLI exited with code ${code})`);
509
- resolve();
526
+ const spec = spawnContinueSpec(meta);
527
+ if (!spec) {
528
+ console.log("");
529
+ console.log(`(--continue not supported for engine "${meta.engine}")`);
530
+ } else {
531
+ console.log("");
532
+ console.log(`→ launching: ${spec.bin} ${spec.args.join(" ")}`);
533
+ if (spec.cwd) console.log(` cwd: ${spec.cwd}`);
534
+ const child = spawn(spec.bin, spec.args, {
535
+ cwd: spec.cwd || process.cwd(),
536
+ stdio: "inherit",
510
537
  });
511
- child.on("error", (e) => {
512
- console.log(`(failed to launch ${spec.bin}: ${e.message})`);
513
- resolve();
538
+ await new Promise((resolve) => {
539
+ child.on("exit", (code) => {
540
+ if (code !== 0) console.log(`(native CLI exited with code ${code})`);
541
+ resolve();
542
+ });
543
+ child.on("error", (e) => {
544
+ console.log(`(failed to launch ${spec.bin}: ${e.message})`);
545
+ resolve();
546
+ });
514
547
  });
515
- });
548
+ }
516
549
  }
517
550
  }
518
551
 
@@ -752,6 +785,25 @@ function spawnContinueSpec(meta) {
752
785
  return null;
753
786
  }
754
787
 
788
+ // Map (engine, id, cwd, message) → how to spawn the native CLI HEADLESS with a
789
+ // new message injected into the existing transcript. This is the async-relay
790
+ // counterpart to spawnContinueSpec: `--continue` opens the session for a human
791
+ // to keep typing (stdio inherited); `--continue --msg` hands one message into an
792
+ // idle session non-interactively and captures what it does, so any APX agent can
793
+ // relay a user's reply back into a coding-CLI session it doesn't share a live
794
+ // process with. Claude only for now (`claude -p "<msg>" --resume <id>`); other
795
+ // engines fall through to an explicit "not supported yet".
796
+ function spawnHeadlessMsgSpec(meta, message) {
797
+ if (meta.engine === "claude") {
798
+ return {
799
+ bin: "claude",
800
+ args: ["-p", message, "--resume", meta.id, "--output-format", "text"],
801
+ cwd: meta.cwd && fs.existsSync(meta.cwd) ? meta.cwd : null,
802
+ };
803
+ }
804
+ return null;
805
+ }
806
+
755
807
  // Create a new APX session whose body is the summary of an existing session.
756
808
  // Used by `apx session resume <id> --into apx[:slug]`. Picks a sensible
757
809
  // default agent slug when none is given.
@@ -116,6 +116,31 @@ function printSessions(engine, dir, result, limit) {
116
116
  }
117
117
  }
118
118
 
119
+ // OpenCode keeps no project tree — it answers with every session at once, so
120
+ // there is nothing to group by. Same table as printSessions, minus the
121
+ // directory it doesn't have.
122
+ function printAllSessions(engine, rows, limit) {
123
+ if (!rows.length) {
124
+ console.log(" (sin nada)");
125
+ return;
126
+ }
127
+ const sessions = limit && limit > 0 ? rows.slice(0, limit) : rows;
128
+ console.log(`${engine.label} sessions:`);
129
+ console.log("");
130
+ console.log(`${"DATE".padEnd(12)} ${"SESSION ID".padEnd(38)} TITLE`);
131
+ console.log(`${"─".repeat(12)} ${"─".repeat(38)} ${"─".repeat(40)}`);
132
+ for (const s of sessions) {
133
+ console.log(
134
+ `${fmtDate(s.mtime).padEnd(12)} ${String(s.id).padEnd(38)} ${String(s.title).slice(0, 70)}`
135
+ );
136
+ }
137
+ if (engine.resumeHint && sessions[0]) {
138
+ console.log("");
139
+ console.log("Resume:");
140
+ console.log(` specific: ${engine.resumeHint(sessions[0].id)}`);
141
+ }
142
+ }
143
+
119
144
  function printProjects(engine, projects) {
120
145
  if (projects.length === 0) {
121
146
  console.log(`(no ${engine.label} projects found)`);
@@ -158,8 +183,10 @@ function listSingleEngine(engine, args, opts, { headerPrefix = "" } = {}) {
158
183
 
159
184
  if (dir) {
160
185
  printSessions(engine, dir, engine.listSessions(dir, opts), limit);
161
- } else {
186
+ } else if (typeof engine.listProjects === "function") {
162
187
  printProjects(engine, engine.listProjects(opts));
188
+ } else {
189
+ printAllSessions(engine, engine.listAllSessions(opts), limit);
163
190
  }
164
191
  return true;
165
192
  }
@@ -211,13 +238,19 @@ export function cmdSessionsList(args, opts = {}) {
211
238
  } else {
212
239
  printSessions(engine, dir, result, limit);
213
240
  }
214
- } else {
241
+ } else if (typeof engine.listProjects === "function") {
215
242
  const list = engine.listProjects(opts);
216
243
  if (list.length === 0) {
217
244
  console.log(" (sin nada)");
218
245
  } else {
219
246
  printProjects(engine, list);
220
247
  }
248
+ } else {
249
+ // Engines that list flat (OpenCode). `implemented` is true for them —
250
+ // they list fine, just not by project — so the check above lets them
251
+ // through and this is where they land. Calling listProjects here is what
252
+ // made `apx sessions list` exit 1 for everyone with OpenCode installed.
253
+ printAllSessions(engine, engine.listAllSessions(opts), limit);
221
254
  }
222
255
  }
223
256
  if (!anyDetected) {
@@ -12,7 +12,7 @@ import {
12
12
  installGlobalSkills,
13
13
  listBundledSkills,
14
14
  listEngineSkills,
15
- listLegacyPruneSlugs,
15
+ listRetiredSkillSlugs,
16
16
  } from "#core/apc/scaffold.js";
17
17
  import {
18
18
  ensureIndex,
@@ -174,7 +174,7 @@ export async function cmdSkillsSync(args) {
174
174
  for (const k of ["created", "updated", "unchanged", "pruned"]) {
175
175
  if (counts[k]) parts.push(`${counts[k]} ${k}`);
176
176
  }
177
- const tag = entries[0]?.scope === "legacy" ? " [legacy]" : "";
177
+ const tag = entries[0]?.scope === "retired" ? " [retired]" : "";
178
178
  console.log(` ${slug.padEnd(sw)}${tag.padEnd(10)} ${parts.join(", ")}`);
179
179
  }
180
180
  console.log("");
@@ -214,11 +214,17 @@ export async function cmdSkillsList(args = {}) {
214
214
  console.log("(no skills available)");
215
215
  return;
216
216
  }
217
- console.log(`SLUG`.padEnd(28) + "SOURCE".padEnd(10) + "STATE".padEnd(10) + "DESCRIPTION");
217
+ console.log(`SLUG`.padEnd(28) + "SOURCE".padEnd(10) + "ORIGIN".padEnd(10) + "STATE".padEnd(10) + "DESCRIPTION");
218
218
  for (const s of out.skills) {
219
219
  const desc = (s.description || "").slice(0, 70);
220
220
  const state = s.private ? "private" : s.enabled === false ? "off" : "on";
221
- console.log(s.slug.padEnd(28) + (s.source || "?").padEnd(10) + state.padEnd(10) + desc);
221
+ console.log(
222
+ s.slug.padEnd(28)
223
+ + (s.source || "?").padEnd(10)
224
+ + (s.origin || "—").padEnd(10)
225
+ + state.padEnd(10)
226
+ + desc,
227
+ );
222
228
  }
223
229
  return;
224
230
  }
@@ -245,7 +251,7 @@ export async function cmdSkillsStatus() {
245
251
 
246
252
  const engineSet = listEngineSkills(); // what we publish to engines
247
253
  const bundled = listBundledSkills(); // what stays in-repo for the super-agent
248
- const legacy = listLegacyPruneSlugs(); // slugs APX shipped historically — pruned on sync
254
+ const retired = listRetiredSkillSlugs(); // slugs APX shipped historically — pruned on sync
249
255
 
250
256
  console.log(
251
257
  `Engine skill set (replicated to global dirs): ${engineSet.length} ` +
@@ -260,7 +266,7 @@ export async function cmdSkillsStatus() {
260
266
  { label: "Codex", dir: path.join(os.homedir(), ".codex", "skills") },
261
267
  { label: "Antigravity / others", dir: path.join(os.homedir(), ".agents", "skills") },
262
268
  ];
263
- const allSlugs = [...engineSet.map((s) => s.slug), ...legacy];
269
+ const allSlugs = [...engineSet.map((s) => s.slug), ...retired];
264
270
  const sw = Math.max(...allSlugs.map((s) => s.length), 8);
265
271
  for (const { label, dir } of GLOBAL_DIRS) {
266
272
  console.log(`\n ${label} — ${dir.replace(os.homedir(), "~")}`);
@@ -270,12 +276,12 @@ export async function cmdSkillsStatus() {
270
276
  const state = present ? "✓ installed" : "✗ MISSING (run `apx skills sync`)";
271
277
  console.log(` ${slug.padEnd(sw)} ${state}`);
272
278
  }
273
- const stale = legacy.filter((slug) =>
279
+ const stale = retired.filter((slug) =>
274
280
  fs.existsSync(path.join(dir, slug, "SKILL.md"))
275
281
  );
276
282
  if (stale.length) {
277
283
  for (const slug of stale) {
278
- console.log(` ${slug.padEnd(sw)} [legacy] ⚠ stale (run \`apx skills sync\` to prune)`);
284
+ console.log(` ${slug.padEnd(sw)} [retired] ⚠ stale (run \`apx skills sync\` to prune)`);
279
285
  }
280
286
  }
281
287
  }
@@ -475,7 +481,7 @@ export async function cmdSkillsInspector(args) {
475
481
  if (sub === "disable" || sub === "off") {
476
482
  ensureInspectorBlock(cfg).skills.inspector.enabled = false;
477
483
  writeConfig(cfg);
478
- console.log("Skill Inspector disabled. Falling back to the legacy slug hint + passive RAG nudge.");
484
+ console.log("Skill Inspector disabled. Falling back to the static slug hint + passive RAG nudge.");
479
485
  return;
480
486
  }
481
487
  if (sub === "set") {
@@ -88,8 +88,7 @@ export async function cmdStatus() {
88
88
 
89
89
  // ── Telegram ───────────────────────────────────────────────────────────────
90
90
  // Prefer the daemon's live view (real polling state). Fall back to the
91
- // config file only when the daemon is unreachable. The config check must
92
- // honour BOTH the legacy top-level bot_token AND per-channel tokens.
91
+ // config file only when the daemon is unreachable.
93
92
  console.log(sec("Telegram"));
94
93
  const tg = cfg.telegram || {};
95
94
  let tgLive = null;
@@ -117,7 +116,7 @@ export async function cmdStatus() {
117
116
  }
118
117
  } else {
119
118
  // Daemon down — best-effort from config. Token may be top-level or per-channel.
120
- const hasToken = !!tg.bot_token || (tg.channels || []).some((c) => c.bot_token);
119
+ const hasToken = (tg.channels || []).some((c) => c.bot_token);
121
120
  if (tg.enabled && hasToken) {
122
121
  console.log(` ${off("configured")} ${DI}daemon down — start it to see live status${R}`);
123
122
  console.log(`${key("channels")}${val((tg.channels?.length || 1) + " configured")}`);
@@ -1,13 +1,20 @@
1
1
  // apx task — per-project TODO list. Backed by /projects/:pid/tasks.
2
2
  //
3
- // apx task add "<title>" [--project X] [--body Y] [--tag t] [--due 2026-05-30] [--agent A]
3
+ // apx task add "<title>" [--project X] [--description D] [--body Y] [--tag t]
4
+ // [--due 2026-05-30] [--agent A]
5
+ // [--category trip] [--place "Farmacia X"] [--at "-41.13,-71.31"] [--radius 1500]
4
6
  // apx task list [--all | --project X] [--state ...] [--status ...] [--tag X] [--agent Y]
5
7
  // [--due-before ISO] [--due-after ISO] [--updated-since ISO] [--limit N]
6
8
  // apx task show <id> [--project X]
7
9
  // apx task done <id> [--project X] [--by name]
8
10
  // apx task drop <id> [--project X] [--by name]
9
11
  // apx task reopen <id> [--project X]
10
- // apx task patch <id> [--project X] [--title T] [--body B] [--due D] [--agent A] [--tag t]
12
+ // apx task patch <id> [--project X] [--title T] [--description D] [--body B] [--due D]
13
+ // [--agent A] [--tag t]
14
+ //
15
+ // --description is what YOU have to do; --body is the prompt an agent receives
16
+ // when it runs the task. Keeping them apart is what makes `apx task list`
17
+ // readable as a to-do rather than as a dispatch queue.
11
18
  //
12
19
  // Each subcommand exports a usage string + a usageX() helper. The top-level
13
20
  // help (apx task --help / apx task <sub> --help) is wired through HELP_TOPICS
@@ -18,13 +25,13 @@ import { resolveProjectId } from "./project.js";
18
25
 
19
26
  // ── Usage strings (also used by index.js help topics) ────────────────────────
20
27
  export const TASK_USAGE = {
21
- add: 'apx task add "<title>" [--project X] [--body Y] [--tag t]... [--due 2026-05-30] [--agent A]',
28
+ add: 'apx task add "<title>" [--project X] [--description D] [--body Y] [--tag t]... [--due 2026-05-30] [--agent A] [--category trip] [--place "Farmacia X"] [--at "lat,lon"] [--radius 1500]',
22
29
  list: "apx task list [--all | --project X] [--state open|done|dropped|all] [--status pending|running|in_review|blocked] [--tag X] [--agent Y] [--due-before ISO] [--due-after ISO] [--updated-since ISO] [--limit N]",
23
30
  show: "apx task show <id> [--project X]",
24
31
  done: "apx task done <id> [--project X] [--by name]",
25
32
  drop: "apx task drop <id> [--project X] [--by name]",
26
33
  reopen: "apx task reopen <id> [--project X]",
27
- patch: "apx task patch <id> [--project X] [--title T] [--body B] [--due D] [--agent A] [--tag t]",
34
+ patch: "apx task patch <id> [--project X] [--title T] [--description D] [--body B] [--due D] [--agent A] [--tag t]",
28
35
  };
29
36
 
30
37
  // Print "<msg>\nUsage: <usage>" to stderr and exit 1. Each cmd has a tiny
@@ -83,8 +90,13 @@ function renderDetail(t) {
83
90
  id: t.id,
84
91
  state: t.state,
85
92
  title: t.title,
93
+ description: t.description || undefined,
86
94
  body: t.body,
87
95
  tags: t.tags,
96
+ // Only when it says something: a "general" category on every row is noise,
97
+ // and an absent location should read as absent rather than as null.
98
+ category: t.category && t.category !== "general" ? t.category : undefined,
99
+ location: t.location || undefined,
88
100
  due: t.due,
89
101
  agent: t.agent,
90
102
  source: t.source,
@@ -95,6 +107,36 @@ function renderDetail(t) {
95
107
  }, null, 2));
96
108
  }
97
109
 
110
+ /**
111
+ * Build the `location` field from the place flags, or return {} when none were
112
+ * given so a patch that touches nothing else stays a no-op.
113
+ *
114
+ * `--at` takes "lat,lon" as one argument because that is how coordinates are
115
+ * copied out of Maps — asking for two separate flags guarantees one of them is
116
+ * eventually forgotten, and half a coordinate is worse than none.
117
+ */
118
+ function locationFrom(flags = {}) {
119
+ const place = flags.place;
120
+ const address = flags.address;
121
+ const at = flags.at;
122
+ const radius = flags.radius;
123
+ if (place === undefined && address === undefined && at === undefined && radius === undefined) return {};
124
+ // An explicitly empty --place clears the location.
125
+ if (place === "" && at === undefined && address === undefined) return { location: null };
126
+ const location = {};
127
+ if (place) location.place = place;
128
+ if (address) location.address = address;
129
+ if (at) {
130
+ const [lat, lon] = String(at).split(",").map((part) => Number(part.trim()));
131
+ if (Number.isFinite(lat) && Number.isFinite(lon)) {
132
+ location.latitude = lat;
133
+ location.longitude = lon;
134
+ }
135
+ }
136
+ if (radius) location.radius_m = Number(radius);
137
+ return { location };
138
+ }
139
+
98
140
  // ── add ───────────────────────────────────────────────────────────────────────
99
141
  export async function cmdTaskAdd(args) {
100
142
  const title = (args._ || []).join(" ").trim();
@@ -102,11 +144,14 @@ export async function cmdTaskAdd(args) {
102
144
  const pid = await resolveProjectId(args?.flags?.project);
103
145
  const body = {
104
146
  title,
147
+ description: args.flags?.description || null,
105
148
  body: args.flags?.body || null,
106
149
  due: args.flags?.due || null,
107
150
  agent: args.flags?.agent || null,
108
151
  source: args.flags?.source || "cli",
109
152
  tags: asArray(args.flags?.tag).filter(Boolean),
153
+ ...(args.flags?.category ? { category: args.flags.category } : {}),
154
+ ...locationFrom(args.flags),
110
155
  };
111
156
  const task = await http.post(`/api/projects/${pid}/tasks`, body);
112
157
  console.log(`added task ${task.id}: ${task.title}`);
@@ -198,12 +243,16 @@ export async function cmdTaskPatch(args) {
198
243
  const pid = await resolveProjectId(args?.flags?.project);
199
244
  const patch = {};
200
245
  if (args.flags?.title !== undefined) patch.title = args.flags.title;
246
+ if (args.flags?.description !== undefined) patch.description = args.flags.description || null;
201
247
  if (args.flags?.body !== undefined) patch.body = args.flags.body;
202
248
  if (args.flags?.due !== undefined) patch.due = args.flags.due || null;
203
249
  if (args.flags?.agent !== undefined) patch.agent = args.flags.agent || null;
204
250
  if (args.flags?.tag !== undefined) patch.tags = asArray(args.flags.tag).filter(Boolean);
251
+ if (args.flags?.category !== undefined) patch.category = args.flags.category;
252
+ const located = locationFrom(args.flags);
253
+ if ("location" in located) patch.location = located.location;
205
254
  if (Object.keys(patch).length === 0) {
206
- return fail("patch", "at least one --title|--body|--due|--agent|--tag required");
255
+ return fail("patch", "at least one --title|--description|--body|--due|--agent|--tag|--category|--place|--at required");
207
256
  }
208
257
  const t = await http.patch(`/api/projects/${pid}/tasks/${encodeURIComponent(id)}`, { patch });
209
258
  renderDetail(t);