@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
@@ -1,11 +1,15 @@
1
1
  import fs from "node:fs";
2
- import path from "node:path";
3
- import { findApfRoot, readAgents, readVaultAgents, readVaultAgent, VAULT_DIR, SLUG_RE } from "#core/apc/parser.js";
2
+ import { findApfRoot, readAgents, readVaultAgents, readVaultAgent, vaultAgentFile, VAULT_DIR, SLUG_RE } from "#core/apc/parser.js";
4
3
  import { apcAgentFile } from "#core/apc/paths.js";
5
4
  import { writeAgentFile, writeVaultAgentFile, removeVaultAgent, restoreVaultAgent, addImportedAgent, ensureAgentDir } from "#core/apc/scaffold.js";
6
5
  import { ensureAgentRuntimeDir, agentMemoryPath } from "#core/agent/memory.js";
6
+ import {
7
+ AGENT_TYPE_VALUES, BLOB_KEYS, isBlobKey, normalizeAgentType, pickBlob,
8
+ } from "#core/apc/agent-identity.js";
9
+ import { readOrganization, resolveAreaSlug } from "#core/stores/organization.js";
7
10
  import { http } from "../http.js";
8
- import { resolveProjectId } from "./project.js";
11
+ import { readStdinSync } from "../stdin.js";
12
+ import { resolveProjectId, resolveProjectRoot } from "./project.js";
9
13
 
10
14
  // ── ANSI ──────────────────────────────────────────────────────────────────────
11
15
  const c = { reset:"\x1b[0m", bold:"\x1b[1m", dim:"\x1b[2m", cyan:"\x1b[36m", green:"\x1b[32m", yellow:"\x1b[33m", gray:"\x1b[90m" };
@@ -15,10 +19,81 @@ const cyan = (s) => `${c.cyan}${s}${c.reset}`;
15
19
  const gray = (s) => `${c.gray}${s}${c.reset}`;
16
20
  const tag = (s) => `${c.yellow}${s}${c.reset}`;
17
21
 
18
- function requireRoot() {
19
- const root = findApfRoot();
20
- if (!root) throw new Error("not inside an APC project (run `apx init` first)");
21
- return root;
22
+ // The project these subcommands read and write: `--project <name|id|path>`
23
+ // when given, otherwise the one cwd sits inside.
24
+ function resolveRoot(args) {
25
+ return resolveProjectRoot(args?.flags?.project);
26
+ }
27
+
28
+ // For the two commands that only WANT a project if there is one (they fall back
29
+ // to the vault). Honours --project, returns null instead of throwing.
30
+ async function resolveRootOptional(args) {
31
+ if (args?.flags?.project) return resolveRoot(args);
32
+ return findApfRoot();
33
+ }
34
+
35
+ function flagValue(flags, ...names) {
36
+ for (const n of names) {
37
+ const v = flags?.[n];
38
+ if (v !== undefined && v !== true && v !== "") return String(v);
39
+ }
40
+ return null;
41
+ }
42
+
43
+ /**
44
+ * The agent's system prompt — everything after the frontmatter in
45
+ * `.apc/agents/<slug>.md`, injected by buildAgentSystem() as
46
+ * "# Custom instructions".
47
+ *
48
+ * WHY THIS EXISTS. `apx agent add` used to write frontmatter only: there was no
49
+ * flag for the body and `writeAgentFile`'s 4th argument was never passed. The
50
+ * command exited 0, so an agent created from the CLI (or by the super-agent,
51
+ * which follows the apx-agent skill) silently ran on three metadata fields with
52
+ * no instructions at all — while the daemon API and the web UI have always been
53
+ * able to write it via `system`. This closes that gap.
54
+ *
55
+ * Three ways in, because a system prompt is many lines and paragraphs:
56
+ * --prompt "text" inline, for one-liners
57
+ * --prompt-file <path> read from a file
58
+ * --prompt - read from stdin (heredoc / pipe) — the practical one
59
+ */
60
+ function readPromptFlag(flags) {
61
+ const file = flagValue(flags, "prompt-file", "system-file");
62
+ if (file) {
63
+ if (!fs.existsSync(file)) throw new Error(`--prompt-file: no such file "${file}"`);
64
+ return fs.readFileSync(file, "utf8").trim();
65
+ }
66
+ const inline = flagValue(flags, "prompt", "system");
67
+ if (inline === "-") return readStdinSync().trim();
68
+ if (inline) return inline;
69
+ return null;
70
+ }
71
+
72
+ function readTypeFlag(flags) {
73
+ const raw = flagValue(flags, "type");
74
+ if (!raw) return null;
75
+ const type = normalizeAgentType(raw);
76
+ if (!type) {
77
+ throw new Error(`invalid --type "${raw}" — one of: ${AGENT_TYPE_VALUES.join(", ")}`);
78
+ }
79
+ return type;
80
+ }
81
+
82
+ /**
83
+ * The agent's avatar: a blob preset key. `--icon <key>` pins one, otherwise one
84
+ * is drawn from the presets this project isn't using yet — an agent with no
85
+ * `Icon` renders as a grey lettered disc in every surface, which is what every
86
+ * CLI- and MCP-created agent used to get.
87
+ */
88
+ function resolveIconFlag(flags, roster) {
89
+ const raw = flagValue(flags, "icon", "avatar", "blob");
90
+ if (raw) {
91
+ if (!isBlobKey(raw)) {
92
+ throw new Error(`invalid --icon "${raw}" — one of: ${BLOB_KEYS.join(", ")}`);
93
+ }
94
+ return raw;
95
+ }
96
+ return pickBlob({ taken: roster.map((a) => a.fields?.Icon).filter(Boolean) });
22
97
  }
23
98
 
24
99
  async function nudgeDaemon(root) {
@@ -35,7 +110,7 @@ export async function cmdAgentAdd(args) {
35
110
  if (!slug) throw new Error("apx agent add: missing <slug>");
36
111
  if (!SLUG_RE.test(slug)) throw new Error(`invalid slug "${slug}"`);
37
112
 
38
- const root = requireRoot();
113
+ const root = await resolveRoot(args);
39
114
  const existing = readAgents(root);
40
115
  if (existing.some((a) => a.slug === slug)) {
41
116
  throw new Error(`agent "${slug}" already exists`);
@@ -47,10 +122,34 @@ export async function cmdAgentAdd(args) {
47
122
  if (f.model && f.model !== true) fields.Model = f.model;
48
123
  if (f.language && f.language !== true) fields.Language = f.language;
49
124
  if (f.description && f.description !== true) fields.Description = f.description;
125
+ if (f.area && f.area !== true) {
126
+ const area = resolveAreaSlug(String(f.area), readOrganization(root));
127
+ if (area) fields.Area = area;
128
+ }
129
+ if (f.parent && f.parent !== true) fields.Parent = String(f.parent);
50
130
  if (f.skills && f.skills !== true) fields.Skills = String(f.skills).split(",").map((s) => s.trim()).filter(Boolean);
51
- if (f.tools && f.tools !== true) fields.Tools = String(f.tools).split(",").map((s) => s.trim()).filter(Boolean);
52
131
 
53
- writeAgentFile(root, slug, fields);
132
+ const type = readTypeFlag(f);
133
+ if (type) {
134
+ fields.Type = type;
135
+ // An orchestrator is a master; the daemon and the web already tie the two
136
+ // together on create, so the CLI can't be the one that disagrees.
137
+ if (type === "orchestrator") fields.Master = true;
138
+ }
139
+ // Every agent gets a face, same as the daemon API does. Drawn from the blobs
140
+ // this project isn't using yet so the team stays distinguishable.
141
+ fields.Icon = resolveIconFlag(f, existing);
142
+ // Omitted tools ⇒ leave the field UNDECLARED, matching the daemon API. A
143
+ // declared list is a deliberate narrowing that wins forever; writing one on
144
+ // create froze the agent to a snapshot of the catalog instead of letting it
145
+ // inherit the broad default.
146
+ if (f.tools && f.tools !== true) {
147
+ fields.Tools = String(f.tools).split(",").map((s) => s.trim()).filter(Boolean);
148
+ }
149
+
150
+ const prompt = readPromptFlag(f);
151
+
152
+ writeAgentFile(root, slug, fields, prompt || "");
54
153
  ensureAgentDir(root, slug);
55
154
  ensureAgentRuntimeDir(root, slug);
56
155
  await nudgeDaemon(root);
@@ -59,18 +158,117 @@ export async function cmdAgentAdd(args) {
59
158
  for (const [k, v] of Object.entries(fields)) {
60
159
  console.log(` ${k}: ${Array.isArray(v) ? v.join(", ") : v}`);
61
160
  }
161
+ // Say it out loud either way. A prompt-less agent runs on its frontmatter
162
+ // alone, which is almost never what the author meant — and the old silence
163
+ // is exactly why that went unnoticed.
164
+ if (prompt) {
165
+ console.log(` Prompt: ${Buffer.byteLength(prompt)} bytes`);
166
+ } else {
167
+ console.log(
168
+ `\n ${tag("no system prompt")} — this agent has metadata but no instructions.` +
169
+ `\n Add one with: apx agent set ${slug} --prompt - <<'EOF' … EOF`
170
+ );
171
+ }
172
+ }
173
+
174
+ // Edit an existing agent: merge frontmatter fields and/or replace the system
175
+ // prompt. The CLI had no edit path at all, so an agent created without a prompt
176
+ // could never get one without hand-editing the file (which the skill forbids,
177
+ // since AGENTS.md has to be regenerated).
178
+ export async function cmdAgentSet(args) {
179
+ const slug = args._[0];
180
+ if (!slug) throw new Error("apx agent set: missing <slug>");
181
+
182
+ const root = await resolveRoot(args);
183
+ const existing = readAgents(root).find((a) => a.slug === slug);
184
+ if (!existing) {
185
+ throw new Error(`agent "${slug}" not found — run \`apx agent list\` to see this project's agents`);
186
+ }
187
+ if (existing.source !== "local") {
188
+ throw new Error(
189
+ `agent "${slug}" comes from the ${existing.source} layer — run \`apx agent import ${slug} --copy\` first to get a local copy to edit`
190
+ );
191
+ }
192
+
193
+ const fields = { ...(existing.fields || {}) };
194
+ const f = args.flags;
195
+ const set = (key, flag) => {
196
+ const v = flagValue(f, flag);
197
+ if (v === null) return false;
198
+ fields[key] = v;
199
+ return true;
200
+ };
201
+ let touched = false;
202
+ for (const [key, flag] of [
203
+ ["Role", "role"], ["Model", "model"], ["Language", "language"],
204
+ ["Description", "description"], ["Emoji", "emoji"],
205
+ ["Parent", "parent"],
206
+ ]) {
207
+ if (set(key, flag)) touched = true;
208
+ }
209
+ for (const [key, flag] of [["Skills", "skills"], ["Tools", "tools"]]) {
210
+ const v = flagValue(f, flag);
211
+ if (v === null) continue;
212
+ fields[key] = v.split(",").map((s) => s.trim()).filter(Boolean);
213
+ touched = true;
214
+ }
215
+ const type = readTypeFlag(f);
216
+ if (type) {
217
+ fields.Type = type;
218
+ if (type === "orchestrator") fields.Master = true;
219
+ touched = true;
220
+ }
221
+ const icon = flagValue(f, "icon", "avatar", "blob");
222
+ if (icon) {
223
+ if (!isBlobKey(icon)) throw new Error(`invalid --icon "${icon}" — one of: ${BLOB_KEYS.join(", ")}`);
224
+ fields.Icon = icon;
225
+ touched = true;
226
+ }
227
+ const areaRaw = flagValue(f, "area");
228
+ if (areaRaw !== null) {
229
+ const area = resolveAreaSlug(areaRaw, readOrganization(root));
230
+ if (area) fields.Area = area;
231
+ else delete fields.Area;
232
+ touched = true;
233
+ }
234
+
235
+ const prompt = readPromptFlag(f);
236
+ if (prompt === null && !touched) {
237
+ throw new Error(
238
+ "apx agent set: nothing to change — pass --prompt/--prompt-file or a field flag (--role, --model, --description, …)"
239
+ );
240
+ }
241
+
242
+ // A field-only edit must not wipe the prompt the agent already had.
243
+ const body = prompt === null ? (existing.body || "") : prompt;
244
+ writeAgentFile(root, slug, fields, body);
245
+ ensureAgentDir(root, slug);
246
+ ensureAgentRuntimeDir(root, slug);
247
+ await nudgeDaemon(root);
248
+
249
+ console.log(`Updated agent ${slug}`);
250
+ for (const [k, v] of Object.entries(fields)) {
251
+ console.log(` ${k}: ${Array.isArray(v) ? v.join(", ") : v}`);
252
+ }
253
+ if (prompt !== null) console.log(` Prompt: ${Buffer.byteLength(body)} bytes`);
62
254
  }
63
255
 
64
- export function cmdAgentList() {
65
- const root = requireRoot();
256
+ export async function cmdAgentList(args) {
257
+ // --all: every agent across every registered project, with the project next to
258
+ // it. This is what makes cross-project addressing possible — when you want to
259
+ // message an agent (a2a) you need to know which project owns it, and two
260
+ // projects can each have a "rocky". Needs the daemon (project registry).
261
+ if (args?.flags?.all) return cmdAgentListAll();
262
+
263
+ const root = await resolveRoot(args);
66
264
  const agents = readAgents(root);
67
265
  if (agents.length === 0) {
68
- console.log(dim("(no agents — try `apx agent add <slug>` or `apx agent import <slug>`)"));
266
+ console.log(dim("(no agents — try `apx agent add <slug>` or `apx agent import <slug>`, or `apx agent list --all` across projects)"));
69
267
  return;
70
268
  }
71
269
  console.log();
72
270
  for (const a of agents) {
73
- const src = a.source === "vault" ? tag(" ↑ vault") : a.source === "legacy" ? gray(" ↑ legacy") : "";
271
+ const src = a.source === "vault" ? tag(" ↑ vault") : "";
74
272
  const role = a.fields.Role ? dim(a.fields.Role) : gray("—");
75
273
  const model = a.fields.Model ? dim(a.fields.Model) : gray("—");
76
274
  console.log(` ${bold(a.slug)}${src} ${role} ${cyan(model)}`);
@@ -78,10 +276,35 @@ export function cmdAgentList() {
78
276
  console.log();
79
277
  }
80
278
 
81
- export function cmdAgentGet(args) {
279
+ // `apx agent list --all` — one line per (agent, project) across the whole
280
+ // registry, plus the super-agent. The right-hand project column is the address
281
+ // you pass to `apx send … --project <name>`.
282
+ async function cmdAgentListAll() {
283
+ const projects = await http.get("/api/projects");
284
+ console.log();
285
+ console.log(` ${bold("super-agent")} ${gray("→")} ${dim("default")} ${gray("(reachable as the daemon fallback)")}`);
286
+ let total = 0;
287
+ for (const proj of projects) {
288
+ let agents = [];
289
+ try { agents = readAgents(proj.path); } catch { /* unreadable project */ }
290
+ if (agents.length === 0) continue;
291
+ console.log();
292
+ console.log(` ${cyan(proj.name)} ${gray(`#${proj.id}`)}`);
293
+ for (const a of agents) {
294
+ const role = a.fields.Role ? dim(a.fields.Role) : gray("—");
295
+ console.log(` ${bold(a.slug)} ${role}`);
296
+ total++;
297
+ }
298
+ }
299
+ console.log();
300
+ console.log(dim(` ${total} agent(s) across ${projects.length} project(s). Address one with: apx send <from> <slug> --project <name>`));
301
+ console.log();
302
+ }
303
+
304
+ export async function cmdAgentGet(args) {
82
305
  const slug = args._[0];
83
306
  if (!slug) throw new Error("apx agent get: missing <slug>");
84
- const root = requireRoot();
307
+ const root = await resolveRoot(args);
85
308
  const a = readAgents(root).find((x) => x.slug === slug);
86
309
  if (!a) {
87
310
  // Check vault and suggest import
@@ -92,7 +315,7 @@ export function cmdAgentGet(args) {
92
315
  }
93
316
  throw new Error(`agent "${slug}" not found`);
94
317
  }
95
- const src = a.source === "vault" ? tag(" ↑ vault") : a.source === "legacy" ? gray(" ↑ legacy") : "";
318
+ const src = a.source === "vault" ? tag(" ↑ vault") : "";
96
319
  console.log(`\n ${bold(a.slug)}${src}`);
97
320
  for (const [k, v] of Object.entries(a.fields)) {
98
321
  console.log(` ${gray(k.padEnd(12))} ${Array.isArray(v) ? v.join(", ") : v}`);
@@ -106,7 +329,7 @@ export async function cmdAgentRemove(args) {
106
329
  if (!slug) throw new Error("apx agent remove: missing <slug> — usage: apx agent remove <slug>");
107
330
  // Resolve locally first so we can give a clear message + suggestions instead
108
331
  // of a bare 404 when the slug is wrong.
109
- const root = findApfRoot();
332
+ const root = await resolveRootOptional(args);
110
333
  if (root) {
111
334
  const local = readAgents(root).find((a) => a.slug === slug);
112
335
  if (!local) {
@@ -150,7 +373,7 @@ export async function cmdAgentVaultAdd(args) {
150
373
  if (!slug || !SLUG_RE.test(slug)) throw new Error("apx agent vault add: missing or invalid <slug>");
151
374
 
152
375
  // If we're inside a project, offer to copy the local agent to vault
153
- const root = findApfRoot();
376
+ const root = await resolveRootOptional(args);
154
377
  if (root) {
155
378
  const local = readAgents(root).find((a) => a.slug === slug && a.source === "local");
156
379
  if (local) {
@@ -206,10 +429,12 @@ export function cmdAgentVaultRestore(args) {
206
429
  export async function cmdAgentImport(args) {
207
430
  const slug = args._[0];
208
431
  if (!slug) throw new Error("apx agent import: missing <slug>");
209
- const root = requireRoot();
432
+ const root = await resolveRoot(args);
210
433
 
211
- const vaultPath = path.join(VAULT_DIR, `${slug}.md`);
212
- if (!fs.existsSync(vaultPath)) {
434
+ // Layered lookup (user file → bundled default) — see vaultAgentFile. Reading
435
+ // the user layer alone made every bundled agent unimportable.
436
+ const vaultPath = vaultAgentFile(slug);
437
+ if (!vaultPath) {
213
438
  const vault = readVaultAgents();
214
439
  const available = vault.map((a) => a.slug).join(", ") || "(none)";
215
440
  throw new Error(`"${slug}" not found in vault. Available: ${available}`);
@@ -1,6 +1,6 @@
1
1
  // `apx code` — launch the APX terminal coding assistant (Solid.js TUI).
2
2
  // The TUI runs its TypeScript source directly under bun; there is no
3
- // legacy readline fallback anymore (removed with the old sys.js chat).
3
+ // readline fallback anymore (it went with the old sys.js chat).
4
4
  import { existsSync } from "node:fs";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { dirname, resolve } from "node:path";
@@ -7,6 +7,7 @@
7
7
  // apx commitment show <id> [--project X]
8
8
  // apx commitment kept <id> [--project X] [--note "..."]
9
9
  // apx commitment missed <id> [--project X] [--note "..."]
10
+ // apx commitment drop <id> [--project X] [--note "..."] filed by mistake
10
11
  // apx commitment renegotiate <id> --due <ISO> [--project X] [--note "..."]
11
12
  //
12
13
  // A task is something to do; a commitment is something you promised a person.
@@ -20,6 +21,7 @@ export const COMMITMENT_USAGE = {
20
21
  show: "apx commitment show <id> [--project X]",
21
22
  kept: 'apx commitment kept <id> [--project X] [--note "..."]',
22
23
  missed: 'apx commitment missed <id> [--project X] [--note "..."]',
24
+ drop: 'apx commitment drop <id> [--project X] [--note "..."]',
23
25
  renegotiate: 'apx commitment renegotiate <id> --due <ISO> [--project X] [--note "..."]',
24
26
  };
25
27
 
@@ -139,6 +141,9 @@ async function close(args, sub) {
139
141
 
140
142
  export const cmdCommitmentKept = (args) => close(args, "kept");
141
143
  export const cmdCommitmentMissed = (args) => close(args, "missed");
144
+ // Not an alias of `missed`: nobody was waiting on a promise filed by mistake,
145
+ // so it must not land in the broken-promise count.
146
+ export const cmdCommitmentDrop = (args) => close(args, "drop");
142
147
 
143
148
  export async function cmdCommitmentRenegotiate(args) {
144
149
  const id = args?._?.[0];
@@ -1,6 +1,21 @@
1
+ // `apx config` — read and edit configuration at either layer.
2
+ //
3
+ // APX has two config layers and this command reaches both:
4
+ // default the PROJECT layer, `.apc/config.json` (committed)
5
+ // --global the GLOBAL layer, `~/.apx/config.json` (machine-local)
6
+ //
7
+ // The global branch goes through the daemon's `/api/admin/config` route rather
8
+ // than calling writeConfig() here. That route writes the file AND hot-reloads
9
+ // the daemon's in-memory copy, re-registers log masking for any secret just
10
+ // stored, and refreshes the scheduler/plugin views. Writing the file directly
11
+ // would leave every one of those stale until the next restart.
12
+ //
13
+ // Scope vocabulary matches `apx obsidian` (project|global), not the MCP one
14
+ // (shared|runtime|global) — see the scope row in AGENTS.md's glossary.
1
15
  import { http } from "../http.js";
2
16
  import { resolveProjectId } from "./project.js";
3
- import { readConfig, writeConfig } from "#core/config/index.js";
17
+ import { readConfig, writeConfig, CONFIG_PATH } from "#core/config/index.js";
18
+ import { isSecretKey } from "#core/config/redact.js";
4
19
  import { DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
5
20
 
6
21
  function parseValue(raw) {
@@ -13,7 +28,46 @@ function parseValue(raw) {
13
28
  }
14
29
  }
15
30
 
31
+ // `--global` (boolean) or `--scope global|project`. Anything else is a typo
32
+ // worth failing on rather than silently treating as project scope — writing a
33
+ // global key like engines.*.api_key into a committed .apc/config.json is the
34
+ // exact accident this flag exists to prevent.
35
+ export function isGlobalScope(flags = {}) {
36
+ if (flags.global) return true;
37
+ if (flags.scope === undefined || flags.scope === null || flags.scope === "") return false;
38
+ const s = String(flags.scope).toLowerCase();
39
+ if (s === "global" || s === "default") return true;
40
+ if (s === "project") return false;
41
+ throw new Error(`unknown --scope "${flags.scope}" (use project|global)`);
42
+ }
43
+
44
+ // --effective and --only-overrides both name the project↔global merge, which
45
+ // does not exist when the global file *is* the whole story.
46
+ function rejectMergeFlags(flags, cmd) {
47
+ const bad = ["effective", "only-overrides"].filter((f) => flags[f]);
48
+ if (bad.length) {
49
+ throw new Error(
50
+ `apx ${cmd}: --${bad[0]} describes the project/global merge and does not apply to --global; ` +
51
+ `drop --global to inspect a project, or drop --${bad[0]} to print ${CONFIG_PATH}`
52
+ );
53
+ }
54
+ }
55
+
56
+ async function showGlobal(args) {
57
+ rejectMergeFlags(args.flags, "config show");
58
+ const { config } = await http.get("/api/admin/config");
59
+ // Header goes to stderr so `apx config show --global | jq .` still gets clean
60
+ // JSON on stdout. Secrets arrive redacted from the route — rule 3 forbids
61
+ // captured output carrying a real key.
62
+ process.stderr.write(
63
+ `# ${CONFIG_PATH} (global — secrets redacted)\n` +
64
+ `# project overrides: apx config show (inside a project)\n\n`
65
+ );
66
+ process.stdout.write(JSON.stringify(config, null, 2) + "\n");
67
+ }
68
+
16
69
  export async function cmdConfigShow(args) {
70
+ if (isGlobalScope(args.flags)) return showGlobal(args);
17
71
  const pid = await resolveProjectId(args?.flags?.project);
18
72
  const data = await http.get(`/api/projects/${pid}/config`);
19
73
  if (args.flags.effective) {
@@ -41,20 +95,45 @@ export async function cmdConfigSet(args) {
41
95
  const key = args._[0];
42
96
  const valueRaw = args._.slice(1).join(" ");
43
97
  if (!key || !valueRaw) {
44
- throw new Error('apx config set: usage: apx config set <key.path> <value>');
98
+ throw new Error('apx config set: usage: apx config set [--global] <key.path> <value>');
45
99
  }
46
- const pid = await resolveProjectId(args?.flags?.project);
47
100
  const value = parseValue(valueRaw);
101
+ // Name the layer in the confirmation: the whole point of the flag is that
102
+ // "set" alone used to leave people guessing which file they just edited.
103
+ if (isGlobalScope(args.flags)) {
104
+ await http.patch("/api/admin/config", { set: { [key]: value } });
105
+ console.log(`set ${key} = ${JSON.stringify(value)} (global: ${CONFIG_PATH})`);
106
+ return;
107
+ }
108
+ // Warn, don't block: a project may legitimately override a non-secret key
109
+ // that trips the heuristic, and refusing would strand that case. But
110
+ // .apc/config.json is COMMITTED (rule 3), so a credential landing there is a
111
+ // leak the user needs to hear about before it reaches git — not after.
112
+ // Never echo the value itself into the warning.
113
+ if (isSecretKey(key)) {
114
+ process.stderr.write(
115
+ `apx: warning: "${key}" looks like a secret, and this writes the project's ` +
116
+ `.apc/config.json — which is committed to git.\n` +
117
+ ` Write it to ${CONFIG_PATH} instead:\n` +
118
+ ` apx config set --global ${key} <value>\n`
119
+ );
120
+ }
121
+ const pid = await resolveProjectId(args?.flags?.project);
48
122
  await http.patch(`/api/projects/${pid}/config`, { set: { [key]: value } });
49
- console.log(`set ${key} = ${JSON.stringify(value)}`);
123
+ console.log(`set ${key} = ${JSON.stringify(value)} (project: .apc/config.json)`);
50
124
  }
51
125
 
52
126
  export async function cmdConfigUnset(args) {
53
127
  const key = args._[0];
54
- if (!key) throw new Error("apx config unset: usage: apx config unset <key.path>");
128
+ if (!key) throw new Error("apx config unset: usage: apx config unset [--global] <key.path>");
129
+ if (isGlobalScope(args.flags)) {
130
+ await http.patch("/api/admin/config", { unset: [key] });
131
+ console.log(`unset ${key} (global: ${CONFIG_PATH})`);
132
+ return;
133
+ }
55
134
  const pid = await resolveProjectId(args?.flags?.project);
56
135
  await http.patch(`/api/projects/${pid}/config`, { unset: [key] });
57
- console.log(`unset ${key}`);
136
+ console.log(`unset ${key} (project: .apc/config.json)`);
58
137
  }
59
138
 
60
139
  export function cmdPermission(args = {}) {
@@ -121,6 +121,19 @@ function labelForEvent(event) {
121
121
  }
122
122
  }
123
123
 
124
+ // A session title has to be readable in a list of twenty, so it is the prompt's
125
+ // opening words rather than "New session" — the panel's session list is the
126
+ // only place a `--code` turn can be found again, and twelve rows all reading
127
+ // "New session" is the same as not finding it.
128
+ const TITLE_MAX = 60;
129
+ export function codeSessionTitle(prompt) {
130
+ const flat = String(prompt || "").replace(/\s+/g, " ").trim();
131
+ if (!flat) return "Code";
132
+ const firstLine = flat.split(/(?<=[.?!])\s/)[0] || flat;
133
+ const base = firstLine.length <= TITLE_MAX ? firstLine : flat;
134
+ return base.length <= TITLE_MAX ? base : base.slice(0, TITLE_MAX - 1).trimEnd() + "…";
135
+ }
136
+
124
137
  async function readPromptFromStdin() {
125
138
  const fs = await import("node:fs");
126
139
  if (process.stdin.isTTY) return "";
@@ -138,6 +151,72 @@ async function readPromptFromStdin() {
138
151
  return chunks.join("").trim();
139
152
  }
140
153
 
154
+ /**
155
+ * Run one `--code` turn inside a persistent code session.
156
+ *
157
+ * `--session <id>` continues an existing one (the session carries the history,
158
+ * mode, model and agent); without it a fresh session is created and titled from
159
+ * the prompt. Either way the id is printed on stderr so the caller — a human or
160
+ * an agent shelling out — knows exactly which session to open in the panel.
161
+ */
162
+ async function runCodeSessionTurn({ args, pid, prompt, model }) {
163
+ const flagged = args.flags.session;
164
+ let sid = typeof flagged === "string" && flagged.trim() ? flagged.trim() : null;
165
+ let created = false;
166
+
167
+ if (!sid) {
168
+ // No agentSlug here on purpose: `-a <slug>` never reaches this path — it
169
+ // sets useSuperAgent=false and routes to the agent's own exec endpoint.
170
+ const session = await http.post(`/api/projects/${pid}/code/sessions`, {
171
+ title: codeSessionTitle(prompt),
172
+ ...(model ? { model } : {}),
173
+ });
174
+ sid = session.id;
175
+ created = true;
176
+ }
177
+
178
+ const status = createExecStatus();
179
+ status.start();
180
+ let result;
181
+ try {
182
+ result = await http.streamPost(
183
+ `/api/projects/${pid}/code/sessions/${sid}/chat/stream`,
184
+ { prompt, channel: CHANNELS.CODE, cwd: process.cwd(), confirm: false },
185
+ (event) => status.set(labelForEvent(event))
186
+ );
187
+ } catch (e) {
188
+ // Name the session even on failure: the user turn is already stored there,
189
+ // so that is where the half-finished run can be inspected and resumed.
190
+ process.stderr.write(
191
+ `\n— code session ${sid}${created ? " (new)" : ""} | project ${pid} | ${http.baseUrl()}/code\n`
192
+ );
193
+ throw e;
194
+ } finally {
195
+ status.clear();
196
+ }
197
+
198
+ // A turn that produced no text is a failed turn, not an empty answer. Saying
199
+ // so beats a blank line and exit 0, which reads as "it worked, silently".
200
+ if (!result?.text) {
201
+ throw new Error(
202
+ `apx exec --code: the turn ended without a reply. Session ${sid} (project ${pid}) has the transcript: ${http.baseUrl()}/code`
203
+ );
204
+ }
205
+
206
+ process.stdout.write(result.text + "\n");
207
+ // Always tell the caller where the turn landed — a piped/scripted run needs
208
+ // the id to pass back as --session, and a human needs it to find the session
209
+ // in the panel. stderr keeps stdout clean for scripts.
210
+ process.stderr.write(
211
+ `\n— code session ${sid}${created ? " (new)" : ""} | project ${pid} | ${http.baseUrl()}/code\n`
212
+ );
213
+ if (process.stderr.isTTY || args.flags.verbose) {
214
+ process.stderr.write(
215
+ `— ${result.name || "super-agent"} | in=${result.usage?.input_tokens || "?"} out=${result.usage?.output_tokens || "?"}\n`
216
+ );
217
+ }
218
+ }
219
+
141
220
  export async function cmdExec(args) {
142
221
  const { slug, useSuperAgent, promptParts } = resolveExecRequest(args);
143
222
  let prompt = promptParts.join(" ").trim();
@@ -152,15 +231,25 @@ export async function cmdExec(args) {
152
231
  }
153
232
 
154
233
  const pid = await resolveProjectId(args?.flags?.project);
234
+ const channel = resolveExecChannel(args);
155
235
  const body = {
156
236
  prompt,
157
- channel: resolveExecChannel(args),
237
+ channel,
158
238
  channelMeta: { cwd: process.cwd() },
159
239
  };
160
240
  if (args.flags.model && args.flags.model !== true) body.model = args.flags.model;
161
241
  if (args.flags.temperature) body.temperature = parseFloat(args.flags.temperature);
162
242
  if (args.flags["max-tokens"]) body.maxTokens = parseInt(args.flags["max-tokens"], 10);
163
243
 
244
+ // The code channel runs through a persistent code session instead of the
245
+ // stateless super-agent route. Same output on stdout; the difference is that
246
+ // the turn is now READABLE afterwards in the web panel (/code) and by the
247
+ // next `--code` turn that continues the session, instead of existing only in
248
+ // whatever terminal happened to run it.
249
+ if (useSuperAgent && channel === CHANNELS.CODE) {
250
+ return runCodeSessionTurn({ args, pid, prompt, model: body.model });
251
+ }
252
+
164
253
  if (useSuperAgent) {
165
254
  // Stream the turn so we can render a live progress indicator instead of a
166
255
  // silent hang. `confirm: false` opts out of the interactive confirmation