@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
@@ -0,0 +1,239 @@
1
+ import type { ChatKey } from "../../components/chat/ChatList";
2
+ import type { InboxRow } from "../../lib/api/inbox";
3
+
4
+ /**
5
+ * The phone surface in the URL.
6
+ *
7
+ * /m → /m/chat
8
+ * /m/chat the chat list
9
+ * /m/chat/:pid/:slug a chat, on whatever it last used
10
+ * /m/chat/:pid/:slug/:session a chat, on one specific session
11
+ * /m/tasks every project's tasks
12
+ * /m/commitments every project's promises
13
+ * /m/team/:pid one project's team
14
+ *
15
+ * `/m` and not `/mobile`, and each surface named after WHAT IT SHOWS rather
16
+ * than what device is holding it. The phone stopped being a single screen the
17
+ * day it grew a tab bar: "/mobile" could only ever mean the one thing, and the
18
+ * second thing had to be `/mobile/tasks` — a path that says the device twice
19
+ * and the subject once.
20
+ *
21
+ * Old links still land: `/mobile/*` redirects here (App.tsx). They are not
22
+ * historical — the Android shell hardcodes `/mobile`, QR codes are printed and
23
+ * scanned, and an installed PWA keeps whatever start_url it was installed with.
24
+ *
25
+ * Navigation used to be `useState`, which meant a reload — or the phone
26
+ * discarding the tab in the background, which it does constantly — dropped you
27
+ * back on the list and lost the thread you were reading. Anything you can be
28
+ * looking at has to be somewhere you can be sent back to.
29
+ *
30
+ * `~` separates a channel from a thread id because it is one of the handful of
31
+ * characters a URL never has to escape (RFC 3986 unreserved), so the path stays
32
+ * readable: /m/chat/0/roby/telegram~2026-08-19.
33
+ */
34
+
35
+ /** The phone surface's namespace. Every screen below hangs off it. */
36
+ export const MOBILE_ROOT = "/m";
37
+
38
+ /** The three tabs, in the order the bottom bar shows them. */
39
+ export const CHAT_ROOT = `${MOBILE_ROOT}/chat`;
40
+ export const TASKS_ROOT = `${MOBILE_ROOT}/tasks`;
41
+ export const COMMITMENTS_ROOT = `${MOBILE_ROOT}/commitments`;
42
+
43
+ /**
44
+ * The pre-`/m` spelling, kept alive by a redirect rather than by a second set
45
+ * of routes — one place to translate, and nothing downstream has to know two
46
+ * shapes. `/mobile` alone is the list, which is now `/m/chat`.
47
+ */
48
+ export const LEGACY_MOBILE_ROOT = "/mobile";
49
+
50
+ export function fromLegacyMobilePath(pathname: string): string {
51
+ const rest = pathname.slice(LEGACY_MOBILE_ROOT.length).replace(/^\/+/, "");
52
+ return rest ? `${MOBILE_ROOT}/${rest}` : CHAT_ROOT;
53
+ }
54
+
55
+ /**
56
+ * The daemon-level super-agent belongs to no project: its inbox row carries
57
+ * `project_id: null`. Left as an empty string that becomes `/m/chat//roby`
58
+ * — a path with an empty segment, which matches no route at all, so opening
59
+ * Roby bounced straight back to the list.
60
+ *
61
+ * `-` and not `0`: zero is a REAL project id here, and a sentinel that collides
62
+ * with live data is a bug waiting for the one user who has that project.
63
+ */
64
+ const NO_PROJECT = "-";
65
+
66
+ /** The `:pid` segment for a row. */
67
+ export function pidOf(row: Pick<InboxRow, "project_id">): string {
68
+ return row.project_id === null || row.project_id === undefined ? NO_PROJECT : String(row.project_id);
69
+ }
70
+
71
+ /** The project id a `:pid` segment stands for — null for the super-agent. */
72
+ export function projectOf(pid: string): number | string | null {
73
+ return pid === NO_PROJECT ? null : pid;
74
+ }
75
+
76
+ /** The session segment for a selection, or null when it is just "the latest". */
77
+ export function sessionParam(key: ChatKey): string | null {
78
+ if (key.kind === "thread") return `${key.channel}~${key.threadId}`;
79
+ if (key.kind === "conv") return key.convId;
80
+ return null;
81
+ }
82
+
83
+ /** Query string ChatTab writes for a selection (`/p/:pid/chat` and `/inbox`). */
84
+ export function queryForChat(key: ChatKey): URLSearchParams {
85
+ const next = new URLSearchParams();
86
+ if (key.kind === "conv") {
87
+ next.set("agent", key.agentSlug);
88
+ next.set("conv", key.convId);
89
+ } else if (key.kind === "thread") {
90
+ next.set("channel", key.channel);
91
+ next.set("thread", key.threadId);
92
+ } else {
93
+ next.set("agent", key.agentSlug);
94
+ }
95
+ return next;
96
+ }
97
+
98
+ export function chatPath(pid: string, slug: string, key?: ChatKey): string {
99
+ const base = `${CHAT_ROOT}/${encodeURIComponent(pid)}/${encodeURIComponent(slug)}`;
100
+ const session = key ? sessionParam(key) : null;
101
+ return session ? `${base}/${encodeURIComponent(session)}` : base;
102
+ }
103
+
104
+ export function teamPath(pid: string): string {
105
+ return `${MOBILE_ROOT}/team/${encodeURIComponent(pid)}`;
106
+ }
107
+
108
+ /**
109
+ * Where an agent's card / project view lives — the ficha (`AgentDetailScreen`)
110
+ * for a project agent, the workspace chat for the super-agent (it has no project
111
+ * ficha), and the pair thread for an a2a row. Shared so the inbox (self) and the
112
+ * phone (new tab) send you to the same place.
113
+ */
114
+ export function agentCardUrl(row: InboxRow): string {
115
+ if (row.kind === "super_agent") return "/p/0/chat";
116
+ const pid = row.project_id ?? 0;
117
+ if (row.kind === "a2a" || row.kind === "group") {
118
+ return `/p/${pid}/chat?channel=${row.kind}&thread=${encodeURIComponent(row.conversation_id || "")}`;
119
+ }
120
+ return `/p/${pid}/agents/${encodeURIComponent(row.agent_slug)}`;
121
+ }
122
+
123
+ /**
124
+ * Where a row opens by default: the super-agent has channel threads, a project
125
+ * agent has conversation files, and either can have neither yet.
126
+ */
127
+ export function keyFor(row: InboxRow, sessionId?: string, channel?: string): ChatKey {
128
+ // An a2a row is a conversation BETWEEN two agents, addressed as a thread on the
129
+ // "a2a" channel — never one agent's conversation file (its agent_slug is the
130
+ // synthetic "a2a:<pair>", which owns no file). Missing this made the phone open
131
+ // a blank pane with the raw pair id in the header.
132
+ if (row.kind === "a2a" || row.kind === "group") {
133
+ const id = sessionId || row.conversation_id || "";
134
+ return id ? { kind: "thread", channel: row.kind, threadId: id } : { kind: "live", agentSlug: row.agent_slug };
135
+ }
136
+ if (row.kind === "super_agent") {
137
+ const ch = channel || row.channel || "web";
138
+ const id = sessionId || row.conversation_id || "";
139
+ return id ? { kind: "thread", channel: ch, threadId: id } : { kind: "live", agentSlug: row.agent_slug };
140
+ }
141
+ const id = sessionId || row.conversation_id || "";
142
+ return id ? { kind: "conv", agentSlug: row.agent_slug, convId: id } : { kind: "live", agentSlug: row.agent_slug };
143
+ }
144
+
145
+ /**
146
+ * Does this URL mean the person is already reading this inbox row?
147
+ *
148
+ * ChatTab addresses a session two ways: query (`?channel=&thread=` or
149
+ * `?agent=&conv=`) on `/p/:pid/chat` and `/inbox`, and a path on the phone
150
+ * (`/m/chat/:pid/:slug/:session`). Matching only `?agent=` missed groups
151
+ * and the inbox — both write `channel`+`thread` and have no agent param.
152
+ */
153
+ export function urlLooksAt(href: string, row: InboxRow): boolean {
154
+ const url = new URL(href, "http://localhost");
155
+ const key = keyFor(row);
156
+
157
+ // Both spellings: a notification raised before this rename still carries
158
+ // `/mobile/chat/...`, and "am I already reading this?" must not answer no
159
+ // just because the tab has not been redirected yet.
160
+ const mobile = url.pathname.match(/^\/(?:m|mobile)\/chat\/[^/]+\/([^/]+)(?:\/([^/]+))?/);
161
+ if (mobile) {
162
+ if (decodeURIComponent(mobile[1]) !== row.agent_slug) return false;
163
+ if (!mobile[2]) return true;
164
+ return decodeURIComponent(mobile[2]) === (sessionParam(key) ?? "");
165
+ }
166
+
167
+ const want = queryForChat(key);
168
+ if (want.has("thread")) {
169
+ return url.searchParams.get("channel") === want.get("channel")
170
+ && url.searchParams.get("thread") === want.get("thread");
171
+ }
172
+ if (want.has("conv")) {
173
+ return url.searchParams.get("agent") === want.get("agent")
174
+ && url.searchParams.get("conv") === want.get("conv");
175
+ }
176
+ if (want.has("agent")) return url.searchParams.get("agent") === want.get("agent");
177
+ return false;
178
+ }
179
+
180
+ /** The selection a URL asks for, falling back to the row's own default. */
181
+ export function selectionFromParam(param: string | undefined, row: InboxRow): ChatKey {
182
+ // An a2a row has exactly one thread; there are no alternate sessions to pick,
183
+ // so the pair thread is the selection regardless of any URL session segment.
184
+ if (row.kind === "a2a" || row.kind === "group") return keyFor(row);
185
+ if (!param) return keyFor(row);
186
+ const raw = decodeURIComponent(param);
187
+ if (row.kind === "super_agent") {
188
+ const cut = raw.indexOf("~");
189
+ // A thread with no channel in it is a URL from somewhere else (or hand
190
+ // typed); fall back rather than building a selection that loads nothing.
191
+ if (cut <= 0) return keyFor(row);
192
+ return { kind: "thread", channel: raw.slice(0, cut), threadId: raw.slice(cut + 1) };
193
+ }
194
+ return { kind: "conv", agentSlug: row.agent_slug, convId: raw };
195
+ }
196
+
197
+ /**
198
+ * A row for an agent the inbox does not list.
199
+ *
200
+ * Deep links outlive the inbox: it only carries agents that have been talked
201
+ * to, and it is filtered and paged. Landing on a chat that is not in the list
202
+ * should open the chat with the slug as its name, not bounce to the list —
203
+ * being sent somewhere else is worse than a missing avatar.
204
+ */
205
+ export function placeholderRow(pid: string, slug: string, known: InboxRow[]): InboxRow {
206
+ // Whether this is the super-agent is decided by the inbox's own answer for
207
+ // that slug when it has one, so this file never hardcodes its spelling.
208
+ const sameSlug = known.find((r) => r.agent_slug === slug);
209
+ const isGroup = slug.startsWith("group:");
210
+ const isA2a = slug.startsWith("a2a:");
211
+ const kind = sameSlug?.kind ?? (isGroup ? "group" : isA2a ? "a2a" : "agent");
212
+ const conversation_id = isGroup
213
+ ? slug.slice("group:".length)
214
+ : isA2a
215
+ ? slug.slice("a2a:".length)
216
+ : null;
217
+ return {
218
+ project_id: projectOf(pid),
219
+ project_name: null,
220
+ project_path: null,
221
+ agent_slug: slug,
222
+ agent_name: sameSlug?.agent_name ?? null,
223
+ agent_emoji: sameSlug?.agent_emoji ?? null,
224
+ agent_icon: sameSlug?.agent_icon ?? null,
225
+ kind,
226
+ pinned: false,
227
+ conversation_id: sameSlug?.conversation_id ?? conversation_id,
228
+ channel: kind === "group" || kind === "a2a" ? kind : null,
229
+ messages: 0,
230
+ preview: null,
231
+ last_activity_at: "",
232
+ };
233
+ }
234
+
235
+ /** The row a /m/chat/:pid/:slug URL points at. */
236
+ export function findRow(rows: InboxRow[], pid: string, slug: string): InboxRow {
237
+ const hit = rows.find((r) => pidOf(r) === pid && r.agent_slug === slug);
238
+ return hit || placeholderRow(pid, slug, rows);
239
+ }
@@ -5,30 +5,33 @@ import { Bot, FolderTree, MessageSquare, PanelLeft, PanelRight, Terminal, X } fr
5
5
  import { Group as PanelGroup, Panel, Separator as PanelResizeHandle } from "react-resizable-panels";
6
6
  import { Code, Projects, Agents } from "../../lib/api";
7
7
  import { Artifacts } from "../../lib/api/artifacts";
8
- import { http } from "../../lib/http";
8
+ import { ProjectFiles } from "../../lib/api/projectFiles";
9
9
  import { Empty, Loading } from "../../components/ui";
10
10
  import { Tip } from "../../components/ui/tip";
11
- import { UiSelect } from "../../components/UiSelect";
12
11
  import { useSetPageLabel, useSetPageActions } from "../../hooks/useNavCollapseCtx";
13
12
  import { MessageList } from "../../components/chat/MessageList";
14
- import { CodeProjectPicker } from "../../components/code/CodeProjectPicker";
13
+ import { CodeProjectPicker, ALL_PROJECTS } from "../../components/code/CodeProjectPicker";
15
14
  import { CodeSessionList } from "../../components/code/CodeSessionList";
15
+ import {
16
+ NewCodeSessionDialog,
17
+ SUPER_AGENT_VALUE,
18
+ type NewSessionValues,
19
+ } from "../../components/code/NewCodeSessionDialog";
16
20
  import { CodeComposer } from "../../components/code/CodeComposer";
17
21
  import { CodeSidePanel } from "../../components/code/CodeSidePanel";
18
22
  import { CodeFileTree } from "../../components/code/CodeFileTree";
19
23
  import { CodeFileViewer } from "../../components/code/CodeFileViewer";
20
24
  import { CodeTerminal } from "../../components/code/CodeTerminal";
21
25
  import { InlineAskPanel, pendingAskQuestions } from "../../components/chat/InlineAskPanel";
26
+ import { ConfirmDialog } from "../../components/common/ConfirmDialog";
22
27
  import { useToast } from "../../components/Toast";
23
28
  import { t } from "../../i18n";
24
29
  import { applyStreamEvent, textOf, type ChatMsg } from "../../hooks/useChat";
25
- import type { CodeMode, CodeStreamEvent, CodeTurn } from "../../lib/api/code";
30
+ import type { CodeMode, CodeSessionRow, CodeStreamEvent, CodeTurn } from "../../lib/api/code";
26
31
 
27
32
  // Suppress unused import warning for textOf (kept for consumers)
28
33
  void textOf;
29
34
 
30
- const SUPER_AGENT_VALUE = "super-agent";
31
-
32
35
  // Hit area is wider than the visible line so the handle is comfortable to
33
36
  // grab — the inner ::before line is what the user sees.
34
37
  function ResizeHandle() {
@@ -53,9 +56,16 @@ export function CodeScreen() {
53
56
  const projects = useSWR("/api/projects", () => Projects.list());
54
57
  const projectList = useMemo(() => projects.data || [], [projects.data]);
55
58
 
59
+ // Two different projects live here, and conflating them was the bug.
60
+ // filterPid — what the session LIST shows. "" = every project (the default).
61
+ // pid — the project the OPEN session belongs to. Everything else in
62
+ // the module (files, terminal, artifacts, diff, agents) is
63
+ // scoped to this one, and it follows the session, not the filter.
64
+ const [filterPid, setFilterPid] = useState<string>(ALL_PROJECTS);
56
65
  const [pid, setPid] = useState<string>("");
57
66
  const [sid, setSid] = useState<string | null>(null);
58
- const [agentSlug, setAgentSlug] = useState<string>(SUPER_AGENT_VALUE);
67
+ const [newOpen, setNewOpen] = useState(false);
68
+ const [creating, setCreating] = useState(false);
59
69
  const [msgs, setMsgs] = useState<ChatMsg[]>([]);
60
70
  const [draft, setDraft] = useState("");
61
71
  const [busy, setBusy] = useState(false);
@@ -64,6 +74,9 @@ export function CodeScreen() {
64
74
  const [termOpen, setTermOpen] = useState(false);
65
75
  const [termInitCmd, setTermInitCmd] = useState("");
66
76
  const [worktreeOpen, setWorktreeOpen] = useState(false);
77
+ // Session pending delete confirmation — id AND project, since the list can
78
+ // span projects and an id alone does not address a session.
79
+ const [confirmDelete, setConfirmDelete] = useState<{ id: string; pid: string } | null>(null);
67
80
  const abortRef = useRef<AbortController | null>(null);
68
81
  const [searchParams, setSearchParams] = useSearchParams();
69
82
  const deepLinkDone = useRef(false);
@@ -85,14 +98,25 @@ export function CodeScreen() {
85
98
  setTermInitCmd(cmd);
86
99
  }, []);
87
100
 
88
- // Default to the first registered project once the list loads.
101
+ // Default to the first registered project once the list loads — only as the
102
+ // fallback scope for a screen with no session open yet.
89
103
  useEffect(() => {
90
104
  if (!pid && projectList.length) setPid(String(projectList[0].id));
91
105
  }, [pid, projectList]);
92
106
 
93
- // Sessions for the active project.
94
- const sessions = useSWR(pid ? ["code-sessions", pid] : null, () =>
95
- Code.sessions.list(pid),
107
+ // The session list. Unfiltered by default: a session started by
108
+ // `apx exec --code` belongs to whatever project that cwd resolved to, and
109
+ // scoping the list to the project in view made those invisible.
110
+ const sessions = useSWR(
111
+ filterPid ? ["code-sessions", filterPid] : ["code-sessions", "all"],
112
+ () => (filterPid ? Code.sessions.list(filterPid) : Code.sessions.listAll()),
113
+ );
114
+
115
+ // Rows carry their own pid only in the cross-project list; when the list is
116
+ // already scoped, the filter IS the pid.
117
+ const rowPid = useCallback(
118
+ (row: CodeSessionRow) => String(row.pid ?? filterPid ?? pid),
119
+ [filterPid, pid],
96
120
  );
97
121
 
98
122
  // Agents for the active project.
@@ -108,17 +132,16 @@ export function CodeScreen() {
108
132
  Code.changes(pid, sid!),
109
133
  );
110
134
 
111
- // Auto-select the newest session when the list loads / project changes.
135
+ // Auto-select the newest session when the list loads or the filter changes.
136
+ // Selecting also moves `pid`: the row's project is what makes it openable.
112
137
  useEffect(() => {
113
138
  const list = sessions.data || [];
114
- if (!sid && list.length) setSid(list[0].id);
115
- if (sid && list.length && !list.some((s) => s.id === sid)) setSid(list[0]?.id ?? null);
116
- }, [sessions.data, sid]);
117
-
118
- // Sync agentSlug from the active session when it loads.
119
- useEffect(() => {
120
- if (session.data) setAgentSlug(session.data.agentSlug || SUPER_AGENT_VALUE);
121
- }, [session.data]);
139
+ if (!list.length) return;
140
+ if (sid && list.some((s) => s.id === sid)) return;
141
+ const next = list[0];
142
+ setSid(next.id);
143
+ setPid(rowPid(next));
144
+ }, [sessions.data, sid, rowPid]);
122
145
 
123
146
  // Hydrate the message list whenever the active session's transcript loads.
124
147
  // (Not while streaming — we own the array then.)
@@ -135,52 +158,71 @@ export function CodeScreen() {
135
158
  const mode: CodeMode = active?.mode === "plan" ? "plan" : "build";
136
159
  const model = active?.model || "";
137
160
 
138
- const onPickProject = (next: string) => {
139
- if (next === pid || busy) return;
140
- setPid(next);
161
+ // Narrowing the LIST. It deliberately does not touch the open session's
162
+ // project the auto-select effect moves to whatever the new list holds.
163
+ const onFilterProject = (next: string) => {
164
+ if (next === filterPid || busy) return;
165
+ setFilterPid(next);
141
166
  setSid(null);
142
167
  setMsgs([]);
143
168
  };
144
169
 
145
- const onSelectSession = (id: string) => {
146
- if (busy || id === sid) return;
147
- setSid(id);
170
+ const onSelectSession = (row: CodeSessionRow) => {
171
+ if (busy || row.id === sid) return;
172
+ setPid(rowPid(row));
173
+ setSid(row.id);
148
174
  setMsgs([]);
149
175
  };
150
176
 
151
- const onCreateSession = async () => {
152
- if (!pid || busy) return;
177
+ const onCreateSession = async (values: NewSessionValues) => {
178
+ if (busy) return;
179
+ setCreating(true);
153
180
  try {
154
- const created = await Code.sessions.create(pid, {
155
- title: t("code_module.untitled"),
156
- agentSlug: agentSlug !== SUPER_AGENT_VALUE ? agentSlug : null,
181
+ const created = await Code.sessions.create(values.pid, {
182
+ title: values.title,
183
+ agentSlug: values.agentSlug,
184
+ mode: values.mode,
157
185
  });
158
- await sessions.mutate();
186
+ // The new session may live outside the current filter — show it rather
187
+ // than creating something the list then hides.
188
+ if (filterPid && filterPid !== values.pid) setFilterPid(values.pid);
189
+ setPid(values.pid);
159
190
  setSid(created.id);
160
191
  setMsgs([]);
192
+ setNewOpen(false);
193
+ await sessions.mutate();
161
194
  } catch (e) {
162
195
  toast.error((e as Error).message);
196
+ } finally {
197
+ setCreating(false);
163
198
  }
164
199
  };
165
200
 
166
- const onRenameSession = async (id: string, current: string) => {
201
+ const onRenameSession = async (row: CodeSessionRow, current: string) => {
167
202
  const title = window.prompt(t("code_module.rename"), current);
168
203
  if (!title || title === current) return;
169
204
  try {
170
- await Code.sessions.update(pid, id, { title });
205
+ await Code.sessions.update(rowPid(row), row.id, { title });
171
206
  await sessions.mutate();
172
- if (id === sid) await session.mutate();
207
+ if (row.id === sid) await session.mutate();
173
208
  } catch (e) {
174
209
  toast.error((e as Error).message);
175
210
  }
176
211
  };
177
212
 
178
- const onDeleteSession = async (id: string) => {
213
+ const onDeleteSession = (row: CodeSessionRow) => {
179
214
  if (busy) return;
180
- if (!window.confirm(t("code_module.delete_confirm"))) return;
215
+ // Keep the row's project: deleting by the project in view would 404 (or,
216
+ // worse, hit a same-id session elsewhere).
217
+ setConfirmDelete({ id: row.id, pid: rowPid(row) });
218
+ };
219
+
220
+ const doDeleteSession = async () => {
221
+ const target = confirmDelete;
222
+ if (!target) return;
181
223
  try {
182
- await Code.sessions.remove(pid, id);
183
- if (id === sid) {
224
+ await Code.sessions.remove(target.pid, target.id);
225
+ if (target.id === sid) {
184
226
  setSid(null);
185
227
  setMsgs([]);
186
228
  }
@@ -190,9 +232,12 @@ export function CodeScreen() {
190
232
  }
191
233
  };
192
234
 
193
- // Persist mode / model changes to the session (PATCH) + keep SWR in sync.
235
+ // Re-point THIS session at another agent. The choice is made when the session
236
+ // is created (see NewCodeSessionDialog); this is the correction, and it lives
237
+ // in the session's own properties panel so it cannot be mistaken for a global
238
+ // "who am I talking to" switch — which is exactly how the old rail dropdown
239
+ // read.
194
240
  const onAgentChange = async (slug: string) => {
195
- setAgentSlug(slug);
196
241
  if (!sid) return;
197
242
  try {
198
243
  await Code.sessions.update(pid, sid, {
@@ -204,6 +249,7 @@ export function CodeScreen() {
204
249
  }
205
250
  };
206
251
 
252
+ // Persist mode / model changes to the session (PATCH) + keep SWR in sync.
207
253
  const patchSession = useCallback(
208
254
  async (patch: { mode?: CodeMode; model?: string | null }) => {
209
255
  if (!sid) return;
@@ -292,14 +338,14 @@ export function CodeScreen() {
292
338
  if (prev.some((f) => f.path === path)) return prev; // already open
293
339
  return [...prev, { path, content: "", loading: true }];
294
340
  });
295
- // Fetch content async
296
- http
297
- .post<{ ok: boolean; stdout: string; stderr: string }>("/run", {
298
- cmd: `cat "${path}"`,
299
- project: pid,
300
- })
341
+ // Fetch content through the sandboxed project-files API — the path is
342
+ // user-controlled, so it must never reach a shell.
343
+ ProjectFiles.read(pid, path)
301
344
  .then((r) => {
302
- const content = r.stdout || r.stderr || t("modules_ui.code_file_empty");
345
+ const content =
346
+ r.encoding === "utf8" && typeof r.content === "string"
347
+ ? r.content || t("modules_ui.code_file_empty")
348
+ : t(r.too_large ? "files.too_large" : "files.no_preview");
303
349
  setOpenFiles((prev) =>
304
350
  prev.map((f) => (f.path === path ? { ...f, content, loading: false } : f)),
305
351
  );
@@ -349,7 +395,7 @@ export function CodeScreen() {
349
395
  [pid],
350
396
  );
351
397
 
352
- // Deep-link from the project Artifacts tab (/m/code?pid=..&cmd=.. or &edit=..).
398
+ // Deep-link from the project Artifacts tab (/code?pid=..&cmd=.. or &edit=..).
353
399
  // Select the requested project, then prefill the terminal with the artifact
354
400
  // command (so args like a URL can be typed) or open the file for editing.
355
401
  useEffect(() => {
@@ -389,13 +435,15 @@ export function CodeScreen() {
389
435
 
390
436
  const hasProjects = !projects.isLoading && projectList.length > 0;
391
437
 
438
+ // Roster of the OPEN session's project — the Context panel edits this
439
+ // session, so a slug from another project would be dropped on save.
392
440
  const agentOptions = useMemo(() => {
393
441
  const base = [{ value: SUPER_AGENT_VALUE, label: t("modules_ui.code_super_agent"), icon: Bot, description: t("modules_ui.code_super_agent_desc") }];
394
442
  const project = (agentsData.data || []).map((a) => ({
395
443
  value: a.slug,
396
- label: a.slug,
444
+ label: a.name || a.slug,
397
445
  icon: Bot,
398
- description: a.description || a.role || undefined,
446
+ description: a.description || a.role || a.slug,
399
447
  }));
400
448
  return [...base, ...project];
401
449
  }, [agentsData.data]);
@@ -408,6 +456,9 @@ export function CodeScreen() {
408
456
  const activeProject = useMemo(() => projectList.find((p) => String(p.id) === pid), [projectList, pid]);
409
457
  useSetPageLabel(activeTitle);
410
458
 
459
+ // The list spans projects unless narrowed, so rows must say which one.
460
+ const showProject = !filterPid;
461
+
411
462
  // Detect unanswered ask_questions in the last assistant turn. Local "dismissed"
412
463
  // ref keys off the turn id so the panel re-appears for a fresh batch.
413
464
  const [dismissedKey, setDismissedKey] = useState<string | null>(null);
@@ -469,7 +520,12 @@ export function CodeScreen() {
469
520
  {/* TOP: horizontal split across [left | tree | main | right] */}
470
521
  <Panel id="top" defaultSize={termOpen ? "55%" : "100%"} minSize="20%">
471
522
  <PanelGroup orientation="horizontal" id="code-layout" className="h-full">
472
- {/* Left panel: session list + agent selector */}
523
+ {/* Left panel: project FILTER over the session list.
524
+ The agent selector that used to sit at the bottom of this rail
525
+ is gone: it read as "who am I talking to" while silently
526
+ re-pointing whichever session was open. It now lives where the
527
+ choice is actually made (the New session dialog) and where it
528
+ is corrected (the session's Context panel). */}
473
529
  {leftOpen && (
474
530
  <>
475
531
  <Panel id="left" defaultSize="14%" minSize="8%">
@@ -477,8 +533,8 @@ export function CodeScreen() {
477
533
  <div className="shrink-0 border-b border-border p-2">
478
534
  <CodeProjectPicker
479
535
  projects={projectList}
480
- value={pid}
481
- onChange={onPickProject}
536
+ value={filterPid}
537
+ onChange={onFilterProject}
482
538
  disabled={busy}
483
539
  />
484
540
  </div>
@@ -487,21 +543,14 @@ export function CodeScreen() {
487
543
  sessions={sessions.data || []}
488
544
  activeId={sid}
489
545
  busy={busy}
546
+ showProject={showProject}
547
+ filtered={!!filterPid}
490
548
  onSelect={onSelectSession}
491
- onCreate={onCreateSession}
549
+ onCreate={() => setNewOpen(true)}
492
550
  onRename={onRenameSession}
493
551
  onDelete={onDeleteSession}
494
552
  />
495
553
  </div>
496
- <div className="shrink-0 border-t border-border p-2">
497
- <UiSelect
498
- value={agentSlug}
499
- onChange={onAgentChange}
500
- options={agentOptions}
501
- disabled={busy}
502
- showIcon={true}
503
- />
504
- </div>
505
554
  </aside>
506
555
  </Panel>
507
556
  <ResizeHandle />
@@ -655,9 +704,13 @@ export function CodeScreen() {
655
704
  createdAt: session.data.createdAt,
656
705
  updatedAt: session.data.updatedAt,
657
706
  agentSlug: session.data.agentSlug ?? null,
707
+ projectName: activeProject?.name ?? null,
658
708
  }
659
709
  : null
660
710
  }
711
+ agentOptions={agentOptions}
712
+ onAgentChange={onAgentChange}
713
+ busy={busy}
661
714
  onRunInTerminal={runInTerminal}
662
715
  onEditArtifact={openArtifact}
663
716
  />
@@ -679,6 +732,24 @@ export function CodeScreen() {
679
732
  )}
680
733
  </PanelGroup>
681
734
  )}
735
+
736
+ <NewCodeSessionDialog
737
+ open={newOpen}
738
+ projects={projectList}
739
+ defaultPid={pid || String(projectList[0]?.id ?? "")}
740
+ busy={creating}
741
+ onClose={() => setNewOpen(false)}
742
+ onCreate={(values) => void onCreateSession(values)}
743
+ />
744
+
745
+ <ConfirmDialog
746
+ open={!!confirmDelete}
747
+ onClose={() => setConfirmDelete(null)}
748
+ onConfirm={doDeleteSession}
749
+ title={t("code_module.delete_confirm")}
750
+ confirmLabel={t("common.delete")}
751
+ testId="code-delete-session-confirm"
752
+ />
682
753
  </div>
683
754
  );
684
755
  }
@@ -31,7 +31,6 @@ export function DeckScreen() {
31
31
  // release. The original implementation is kept intact, just unreachable.
32
32
  const handleToggle = async (widgetId: string, enabled: boolean) => {
33
33
  return; // no-op while Deck is pre-release — see note above.
34
- // eslint-disable-next-line no-unreachable
35
34
  try {
36
35
  await Deck.setWidget(widgetId, { enabled });
37
36
  // Optimistically update local data so the switch flips immediately.