@agentprojectcontext/apx 1.80.2 → 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 +134 -0
  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,150 @@
1
+ // Accent tones that read in BOTH themes.
2
+ //
3
+ // A bare `text-emerald-400` is a *dark-mode* colour: it was picked against a
4
+ // near-black ground. On a white card the same class is a pale smear — which is
5
+ // exactly how every engine badge, status chip and toggle looked in light mode.
6
+ //
7
+ // Every tone below ships as a light/dark pair: the light value is the ink-weight
8
+ // shade (600-800, measured to clear 4.5:1 on its own tint — the lightest hues
9
+ // need one step more), the dark value is the shade the app already used. Dark
10
+ // mode is therefore unchanged by construction — the old class is still there,
11
+ // just behind `dark:`.
12
+ //
13
+ // Use these instead of writing a colour class by hand. If a hue is missing, add
14
+ // it here rather than inlining a one-off.
15
+
16
+ export type Tone =
17
+ | "emerald" | "green" | "lime" | "teal" | "cyan" | "sky" | "blue" | "indigo"
18
+ | "violet" | "purple" | "pink" | "rose" | "red" | "orange" | "amber" | "slate";
19
+
20
+ /** Accent ink for text and icons on a plain surface. No background. */
21
+ export const toneText: Record<Tone, string> = {
22
+ emerald: "text-emerald-700 dark:text-emerald-400",
23
+ green: "text-green-700 dark:text-green-400",
24
+ lime: "text-lime-700 dark:text-lime-400",
25
+ teal: "text-teal-700 dark:text-teal-400",
26
+ cyan: "text-cyan-700 dark:text-cyan-400",
27
+ sky: "text-sky-700 dark:text-sky-400",
28
+ blue: "text-blue-700 dark:text-blue-400",
29
+ indigo: "text-indigo-700 dark:text-indigo-400",
30
+ violet: "text-violet-700 dark:text-violet-400",
31
+ purple: "text-purple-700 dark:text-purple-400",
32
+ pink: "text-pink-700 dark:text-pink-400",
33
+ rose: "text-rose-700 dark:text-rose-400",
34
+ red: "text-red-700 dark:text-red-400",
35
+ orange: "text-orange-700 dark:text-orange-400",
36
+ amber: "text-amber-700 dark:text-amber-400",
37
+ slate: "text-slate-600 dark:text-slate-400",
38
+ };
39
+
40
+ /** Same ink, one step brighter — for hover targets and links. */
41
+ export const toneTextHover: Record<Tone, string> = {
42
+ emerald: "hover:text-emerald-800 dark:hover:text-emerald-300",
43
+ green: "hover:text-green-800 dark:hover:text-green-300",
44
+ lime: "hover:text-lime-800 dark:hover:text-lime-300",
45
+ teal: "hover:text-teal-800 dark:hover:text-teal-300",
46
+ cyan: "hover:text-cyan-800 dark:hover:text-cyan-300",
47
+ sky: "hover:text-sky-800 dark:hover:text-sky-300",
48
+ blue: "hover:text-blue-800 dark:hover:text-blue-300",
49
+ indigo: "hover:text-indigo-800 dark:hover:text-indigo-300",
50
+ violet: "hover:text-violet-800 dark:hover:text-violet-300",
51
+ purple: "hover:text-purple-800 dark:hover:text-purple-300",
52
+ pink: "hover:text-pink-800 dark:hover:text-pink-300",
53
+ rose: "hover:text-rose-800 dark:hover:text-rose-300",
54
+ red: "hover:text-red-800 dark:hover:text-red-300",
55
+ orange: "hover:text-orange-800 dark:hover:text-orange-300",
56
+ amber: "hover:text-amber-800 dark:hover:text-amber-300",
57
+ slate: "hover:text-slate-700 dark:hover:text-slate-300",
58
+ };
59
+
60
+ /**
61
+ * Filled chip / badge: tinted ground, visible edge, readable label. Carries its
62
+ * own `border` width, so a call site only needs shape + padding classes.
63
+ *
64
+ * The light tint stays low (12%) on purpose: a white card is already bright, so
65
+ * definition comes from the border and the ink, not from a louder fill. The ink
66
+ * is one step darker than `toneText` for the same reason: it is measured against
67
+ * the tint, not against the card, and chips carry the smallest type in the app.
68
+ */
69
+ export const toneChip: Record<Tone, string> = {
70
+ emerald: "border border-emerald-600/25 bg-emerald-500/12 text-emerald-800 dark:border-emerald-500/40 dark:bg-emerald-500/20 dark:text-emerald-300",
71
+ green: "border border-green-600/25 bg-green-500/12 text-green-800 dark:border-green-500/40 dark:bg-green-500/20 dark:text-green-300",
72
+ lime: "border border-lime-600/25 bg-lime-500/12 text-lime-800 dark:border-lime-500/40 dark:bg-lime-500/20 dark:text-lime-300",
73
+ teal: "border border-teal-600/25 bg-teal-500/12 text-teal-800 dark:border-teal-500/40 dark:bg-teal-500/20 dark:text-teal-300",
74
+ cyan: "border border-cyan-600/25 bg-cyan-500/12 text-cyan-800 dark:border-cyan-500/40 dark:bg-cyan-500/20 dark:text-cyan-300",
75
+ sky: "border border-sky-600/25 bg-sky-500/12 text-sky-800 dark:border-sky-500/40 dark:bg-sky-500/20 dark:text-sky-300",
76
+ blue: "border border-blue-600/25 bg-blue-500/12 text-blue-800 dark:border-blue-500/40 dark:bg-blue-500/20 dark:text-blue-300",
77
+ indigo: "border border-indigo-600/25 bg-indigo-500/12 text-indigo-800 dark:border-indigo-500/40 dark:bg-indigo-500/20 dark:text-indigo-300",
78
+ violet: "border border-violet-600/25 bg-violet-500/12 text-violet-800 dark:border-violet-500/40 dark:bg-violet-500/20 dark:text-violet-300",
79
+ purple: "border border-purple-600/25 bg-purple-500/12 text-purple-800 dark:border-purple-500/40 dark:bg-purple-500/20 dark:text-purple-300",
80
+ pink: "border border-pink-600/25 bg-pink-500/12 text-pink-800 dark:border-pink-500/40 dark:bg-pink-500/20 dark:text-pink-300",
81
+ rose: "border border-rose-600/25 bg-rose-500/12 text-rose-800 dark:border-rose-500/40 dark:bg-rose-500/20 dark:text-rose-300",
82
+ red: "border border-red-600/25 bg-red-500/12 text-red-800 dark:border-red-500/40 dark:bg-red-500/20 dark:text-red-300",
83
+ orange: "border border-orange-600/25 bg-orange-500/12 text-orange-800 dark:border-orange-500/40 dark:bg-orange-500/20 dark:text-orange-300",
84
+ amber: "border border-amber-600/25 bg-amber-500/12 text-amber-800 dark:border-amber-500/40 dark:bg-amber-500/20 dark:text-amber-300",
85
+ slate: "border border-slate-500/25 bg-slate-500/12 text-slate-800 dark:border-slate-500/40 dark:bg-slate-500/20 dark:text-slate-300",
86
+ };
87
+
88
+ /**
89
+ * "This one is picked" outline: accent edge, barely-there fill, accent ink.
90
+ * Used by the toggle pills (active provider, schedule presets, skill chips).
91
+ * Carries its own `border` width.
92
+ */
93
+ export const toneOutline: Record<Tone, string> = {
94
+ emerald: "border border-emerald-600/40 bg-emerald-500/8 text-emerald-700 dark:border-emerald-500/50 dark:bg-emerald-500/10 dark:text-emerald-400",
95
+ green: "border border-green-600/40 bg-green-500/8 text-green-700 dark:border-green-500/50 dark:bg-green-500/10 dark:text-green-400",
96
+ lime: "border border-lime-600/40 bg-lime-500/8 text-lime-700 dark:border-lime-500/50 dark:bg-lime-500/10 dark:text-lime-400",
97
+ teal: "border border-teal-600/40 bg-teal-500/8 text-teal-700 dark:border-teal-500/50 dark:bg-teal-500/10 dark:text-teal-400",
98
+ cyan: "border border-cyan-600/40 bg-cyan-500/8 text-cyan-700 dark:border-cyan-500/50 dark:bg-cyan-500/10 dark:text-cyan-400",
99
+ sky: "border border-sky-600/40 bg-sky-500/8 text-sky-700 dark:border-sky-500/50 dark:bg-sky-500/10 dark:text-sky-400",
100
+ blue: "border border-blue-600/40 bg-blue-500/8 text-blue-700 dark:border-blue-500/50 dark:bg-blue-500/10 dark:text-blue-400",
101
+ indigo: "border border-indigo-600/40 bg-indigo-500/8 text-indigo-700 dark:border-indigo-500/50 dark:bg-indigo-500/10 dark:text-indigo-400",
102
+ violet: "border border-violet-600/40 bg-violet-500/8 text-violet-700 dark:border-violet-500/50 dark:bg-violet-500/10 dark:text-violet-400",
103
+ purple: "border border-purple-600/40 bg-purple-500/8 text-purple-700 dark:border-purple-500/50 dark:bg-purple-500/10 dark:text-purple-400",
104
+ pink: "border border-pink-600/40 bg-pink-500/8 text-pink-700 dark:border-pink-500/50 dark:bg-pink-500/10 dark:text-pink-400",
105
+ rose: "border border-rose-600/40 bg-rose-500/8 text-rose-700 dark:border-rose-500/50 dark:bg-rose-500/10 dark:text-rose-400",
106
+ red: "border border-red-600/40 bg-red-500/8 text-red-700 dark:border-red-500/50 dark:bg-red-500/10 dark:text-red-400",
107
+ orange: "border border-orange-600/40 bg-orange-500/8 text-orange-700 dark:border-orange-500/50 dark:bg-orange-500/10 dark:text-orange-400",
108
+ amber: "border border-amber-600/40 bg-amber-500/8 text-amber-700 dark:border-amber-500/50 dark:bg-amber-500/10 dark:text-amber-400",
109
+ slate: "border border-slate-500/40 bg-slate-500/8 text-slate-700 dark:border-slate-500/50 dark:bg-slate-500/10 dark:text-slate-400",
110
+ };
111
+
112
+ /** Square icon-holder behind a status glyph: soft tint + accent ink, no edge. */
113
+ export const toneTint: Record<Tone, string> = {
114
+ emerald: "bg-emerald-500/12 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
115
+ green: "bg-green-500/12 text-green-700 dark:bg-green-500/15 dark:text-green-400",
116
+ lime: "bg-lime-500/12 text-lime-700 dark:bg-lime-500/15 dark:text-lime-400",
117
+ teal: "bg-teal-500/12 text-teal-700 dark:bg-teal-500/15 dark:text-teal-400",
118
+ cyan: "bg-cyan-500/12 text-cyan-700 dark:bg-cyan-500/15 dark:text-cyan-400",
119
+ sky: "bg-sky-500/12 text-sky-700 dark:bg-sky-500/15 dark:text-sky-400",
120
+ blue: "bg-blue-500/12 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400",
121
+ indigo: "bg-indigo-500/12 text-indigo-700 dark:bg-indigo-500/15 dark:text-indigo-400",
122
+ violet: "bg-violet-500/12 text-violet-700 dark:bg-violet-500/15 dark:text-violet-400",
123
+ purple: "bg-purple-500/12 text-purple-700 dark:bg-purple-500/15 dark:text-purple-400",
124
+ pink: "bg-pink-500/12 text-pink-700 dark:bg-pink-500/15 dark:text-pink-400",
125
+ rose: "bg-rose-500/12 text-rose-700 dark:bg-rose-500/15 dark:text-rose-400",
126
+ red: "bg-red-500/12 text-red-700 dark:bg-red-500/15 dark:text-red-400",
127
+ orange: "bg-orange-500/12 text-orange-700 dark:bg-orange-500/15 dark:text-orange-400",
128
+ amber: "bg-amber-500/12 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400",
129
+ slate: "bg-slate-500/12 text-slate-700 dark:bg-slate-500/15 dark:text-slate-400",
130
+ };
131
+
132
+ /** Solid dot / bullet fill. Small and opaque, so it needs weight in light. */
133
+ export const toneDot: Record<Tone, string> = {
134
+ emerald: "bg-emerald-600 dark:bg-emerald-400",
135
+ green: "bg-green-600 dark:bg-green-400",
136
+ lime: "bg-lime-600 dark:bg-lime-400",
137
+ teal: "bg-teal-600 dark:bg-teal-400",
138
+ cyan: "bg-cyan-600 dark:bg-cyan-400",
139
+ sky: "bg-sky-600 dark:bg-sky-400",
140
+ blue: "bg-blue-600 dark:bg-blue-400",
141
+ indigo: "bg-indigo-600 dark:bg-indigo-400",
142
+ violet: "bg-violet-600 dark:bg-violet-400",
143
+ purple: "bg-purple-600 dark:bg-purple-400",
144
+ pink: "bg-pink-600 dark:bg-pink-400",
145
+ rose: "bg-rose-600 dark:bg-rose-400",
146
+ red: "bg-red-600 dark:bg-red-400",
147
+ orange: "bg-orange-600 dark:bg-orange-400",
148
+ amber: "bg-amber-600 dark:bg-amber-400",
149
+ slate: "bg-slate-500 dark:bg-slate-400",
150
+ };
@@ -4,11 +4,22 @@ import { BrowserRouter } from "react-router-dom";
4
4
  import "./styles.css";
5
5
  import { App } from "./App";
6
6
  import { ThemeProvider } from "./hooks/useTheme";
7
- import { loadEnginePresets } from "./components/settings/providers/typeStyles";
7
+ import { registerServiceWorker } from "./lib/pwa";
8
+ import { startAgentNotifications } from "./lib/notify";
8
9
 
9
- // Hydrate the shared model catalog (GET /engines/presets) in the background so
10
- // provider forms show up-to-date model lists. Non-blocking: app renders anyway.
11
- void loadEnginePresets();
10
+ // The shared model catalog (GET /engines/presets) is hydrated by
11
+ // useTokenBootstrap once the bearer token is known good it is an
12
+ // authenticated endpoint, so it cannot be fetched this early.
13
+
14
+ // Installing the panel to a phone's home screen needs a service worker that
15
+ // handles fetch — that is Chrome's rule, not ours. It also needs a secure
16
+ // context, which http:// on a LAN address is not; see lib/pwa.
17
+ registerServiceWorker();
18
+
19
+ // Agent notifications resume on their own if they were ever switched on: the
20
+ // permission belongs to the browser and the preference to this device, so a
21
+ // reload should not be a second decision. No-op when either says no.
22
+ startAgentNotifications();
12
23
 
13
24
  ReactDOM.createRoot(document.getElementById("root")!).render(
14
25
  <React.StrictMode>
@@ -13,6 +13,7 @@ import { useTelegramStatus, useTelegramChannels } from "../hooks/useTelegram";
13
13
  import { TelegramChannelDialog } from "../components/TelegramChannelDialog";
14
14
  import { TelegramSendDialog } from "../components/TelegramSendDialog";
15
15
  import { TelegramContactsPanel } from "../components/settings/TelegramContactsPanel";
16
+ import { ConfirmDialog } from "../components/common/ConfirmDialog";
16
17
  import { t } from "../i18n";
17
18
  import type { TelegramChannel } from "../types/daemon";
18
19
 
@@ -28,6 +29,12 @@ export function ApxAdminScreen() {
28
29
 
29
30
  const [editing, setEditing] = useState<TelegramChannel | null>(null);
30
31
  const [sendTarget, setSendTarget] = useState<TelegramChannel | null>(null);
32
+ // One state drives both destructive confirms (channel delete vs project unregister).
33
+ const [confirm, setConfirm] = useState<
34
+ | { kind: "channel"; name: string }
35
+ | { kind: "unregister"; id: string; label: string }
36
+ | null
37
+ >(null);
31
38
 
32
39
  const reload = async () => {
33
40
  try { await Admin.reload(); toast.success(t("admin.reload_success")); }
@@ -40,15 +47,15 @@ export function ApxAdminScreen() {
40
47
  mutateTgStatus();
41
48
  } catch (e) { toast.error((e as Error).message); }
42
49
  };
43
- const removeChannel = async (name: string) => {
44
- if (!confirm(t("telegram_channels.delete_confirm", { name }))) return;
45
- try { await Telegram.channels.remove(name); toast.success(t("admin.telegram_channel_removed")); mutateChannels(); }
46
- catch (e) { toast.error((e as Error).message); }
47
- };
48
- const removeProject = async (id: string, label: string) => {
49
- if (!confirm(t("admin.unregister_confirm", { label }))) return;
50
- try { await Projects.remove(id); toast.success(t("project.unregistered")); mutateProjects(); }
51
- catch (e) { toast.error((e as Error).message); }
50
+ const doConfirm = async () => {
51
+ if (!confirm) return;
52
+ if (confirm.kind === "channel") {
53
+ try { await Telegram.channels.remove(confirm.name); toast.success(t("admin.telegram_channel_removed")); mutateChannels(); }
54
+ catch (e) { toast.error((e as Error).message); }
55
+ } else {
56
+ try { await Projects.remove(confirm.id); toast.success(t("project.unregistered")); mutateProjects(); }
57
+ catch (e) { toast.error((e as Error).message); }
58
+ }
52
59
  };
53
60
 
54
61
  return (
@@ -116,7 +123,7 @@ export function ApxAdminScreen() {
116
123
  <Send size={13} /> {t("admin.telegram_send_test")}
117
124
  </Button>
118
125
  <Button size="sm" variant="secondary" onClick={() => setEditing(c)}>{t("common.edit")}</Button>
119
- <Button size="sm" variant="destructive" onClick={() => removeChannel(c.name)}>{t("common.delete")}</Button>
126
+ <Button size="sm" variant="destructive" onClick={() => setConfirm({ kind: "channel", name: c.name })}>{t("common.delete")}</Button>
120
127
  </div>
121
128
  </div>
122
129
  <div className="mt-1 grid grid-cols-3 gap-2 text-xs text-muted-fg">
@@ -147,7 +154,7 @@ export function ApxAdminScreen() {
147
154
  </button>
148
155
  <Badge>{(p.agents ?? 0)} {t("admin.agents_badge")}</Badge>
149
156
  {Number(p.id) !== 0 && (
150
- <Button size="sm" variant="destructive" onClick={() => removeProject(String(p.id), p.name || p.path)}>
157
+ <Button size="sm" variant="destructive" onClick={() => setConfirm({ kind: "unregister", id: String(p.id), label: p.name || p.path })}>
151
158
  {t("admin.unregister")}
152
159
  </Button>
153
160
  )}
@@ -165,6 +172,21 @@ export function ApxAdminScreen() {
165
172
  channel={sendTarget}
166
173
  onClose={() => setSendTarget(null)}
167
174
  />
175
+
176
+ <ConfirmDialog
177
+ open={!!confirm}
178
+ onClose={() => setConfirm(null)}
179
+ onConfirm={doConfirm}
180
+ title={
181
+ confirm?.kind === "channel"
182
+ ? t("telegram_channels.delete_confirm", { name: confirm.name })
183
+ : confirm?.kind === "unregister"
184
+ ? t("admin.unregister_confirm", { label: confirm.label })
185
+ : ""
186
+ }
187
+ confirmLabel={confirm?.kind === "unregister" ? t("admin.unregister") : t("common.delete")}
188
+ testId="admin-confirm"
189
+ />
168
190
  </div>
169
191
  );
170
192
  }
@@ -1,11 +1,14 @@
1
1
  import { useEffect, useState } from "react";
2
2
  import { useNavigate } from "react-router-dom";
3
- import { ArrowUpRight, EyeOff, Eye } from "lucide-react";
4
- import { Button, Loading } from "../components/ui";
3
+ import { EyeOff, Eye, Inbox } from "lucide-react";
4
+ import { Button, Empty, Loading } from "../components/ui";
5
5
  import { Tip } from "../components/ui/tip";
6
6
  import { InboxList, rowKey } from "../components/inbox/InboxList";
7
+ import { agentCardUrl } from "./mobile/routes";
8
+ import { NewChatSheet } from "./mobile/NewChatSheet";
7
9
  import { ChatTab } from "./project/ChatTab";
8
10
  import { useInbox } from "../hooks/useInbox";
11
+ import { threadMoved } from "../lib/inbox-selection";
9
12
  import type { InboxRow } from "../lib/api/inbox";
10
13
  import type { ChatKey } from "../components/chat/ChatList";
11
14
  import { t } from "../i18n";
@@ -22,12 +25,19 @@ import { t } from "../i18n";
22
25
  * having an inbox at all. The right pane embeds the real chat surface rather
23
26
  * than a read-only rendering of it: if you can see what an agent said, you can
24
27
  * answer it there and then.
28
+ *
29
+ * The screen draws NO chrome of its own: no page heading (the breadcrumb
30
+ * already names it), no card (the shell is the card), and no per-selection
31
+ * header (the thread's own header says who you picked). Every one of those was
32
+ * a second frame around something already framed — a title stuck to the top
33
+ * edge, and a card inside a card inside a card.
25
34
  */
26
35
  export function InboxScreen() {
27
36
  const navigate = useNavigate();
28
37
  const [includeEmpty, setIncludeEmpty] = useState(false);
29
- const { rows, isLoading } = useInbox(includeEmpty);
38
+ const { rows, isLoading, mutate } = useInbox(includeEmpty);
30
39
  const [selected, setSelected] = useState<InboxRow | null>(null);
40
+ const [newOpen, setNewOpen] = useState(false);
31
41
 
32
42
  // Open the most recent conversation on arrival. An inbox that lands on an
33
43
  // empty pane makes you click twice to see the thing you came for.
@@ -35,10 +45,25 @@ export function InboxScreen() {
35
45
  if (!selected && rows.length) setSelected(rows[0]);
36
46
  }, [rows, selected]);
37
47
 
38
- if (isLoading) return <Loading />;
48
+ // Follow the row, not the snapshot of it. The list refreshes underneath as
49
+ // messages arrive, and the same agent can point at a DIFFERENT thread than it
50
+ // did a minute ago — the ledger is a file per day, so the first message after
51
+ // midnight starts a new one. A selection frozen at click time would leave you
52
+ // reading yesterday while today filled up.
53
+ useEffect(() => {
54
+ if (!selected) return;
55
+ const fresh = rows.find((r) => rowKey(r) === rowKey(selected));
56
+ if (!fresh) return;
57
+ // What counts as "moved" is in lib/inbox-selection — channel AND id, for a
58
+ // reason worth reading before touching this.
59
+ if (threadMoved(selected, fresh)) setSelected(fresh);
60
+ }, [rows, selected]);
61
+
62
+ // Padded: the screen itself is flush to the shell's edges, so a bare
63
+ // spinner would sit in the very corner.
64
+ if (isLoading) return <div className="p-4"><Loading /></div>;
39
65
 
40
66
  const pid = selected ? String(selected.project_id ?? 0) : null;
41
- const title = selected ? (selected.agent_name || selected.agent_slug) : "";
42
67
 
43
68
  /**
44
69
  * Which conversation the chat pane should open.
@@ -54,80 +79,110 @@ export function InboxScreen() {
54
79
  ? { kind: "thread", channel: row.channel, threadId: row.conversation_id }
55
80
  : undefined;
56
81
  }
82
+ // An a2a or group chat opens its thread, not any single agent's conversation.
83
+ if ((row.kind === "a2a" || row.kind === "group") && row.conversation_id) {
84
+ return { kind: "thread", channel: row.kind, threadId: row.conversation_id };
85
+ }
57
86
  return row.conversation_id
58
87
  ? { kind: "conv", agentSlug: row.agent_slug, convId: row.conversation_id }
59
88
  : { kind: "live", agentSlug: row.agent_slug };
60
89
  };
61
90
 
62
- return (
63
- <div className="flex h-full min-h-0 flex-col gap-3" data-testid="inbox-screen">
64
- <div className="flex shrink-0 items-baseline justify-between gap-3">
65
- <div>
66
- <h1 className="text-lg font-semibold">{t("inbox.title")}</h1>
67
- <p className="text-xs text-muted-fg">{t("inbox.subtitle")}</p>
68
- </div>
69
- <Tip content={includeEmpty ? t("inbox.hide_quiet") : t("inbox.show_quiet")}>
70
- <Button size="sm" variant={includeEmpty ? "primary" : "ghost"} onClick={() => setIncludeEmpty((v) => !v)}>
71
- {includeEmpty ? <EyeOff size={14} /> : <Eye size={14} />}
72
- <span className="hidden sm:inline">{t("inbox.show_quiet")}</span>
73
- </Button>
74
- </Tip>
75
- </div>
91
+ const openLive = (row: InboxRow) => {
92
+ setSelected({
93
+ ...row,
94
+ conversation_id: null,
95
+ channel: "web",
96
+ messages: 0,
97
+ preview: null,
98
+ last_activity_at: new Date().toISOString(),
99
+ });
100
+ };
76
101
 
77
- <div className="flex min-h-0 flex-1 overflow-hidden rounded-xl border border-border bg-card/40">
78
- <InboxList
79
- rows={rows}
80
- selectedKey={selected ? rowKey(selected) : null}
81
- onSelect={setSelected}
82
- />
102
+ const openGroup = async (info: {
103
+ id: string;
104
+ title: string;
105
+ participants: string[];
106
+ project_id: number | string;
107
+ }) => {
108
+ const fresh = await mutate();
109
+ const hit = (fresh || []).find(
110
+ (r) => r.kind === "group" && r.conversation_id === info.id,
111
+ );
112
+ setSelected(
113
+ hit || {
114
+ project_id: info.project_id,
115
+ project_name: null,
116
+ project_path: null,
117
+ agent_slug: `group:${info.id}`,
118
+ agent_name: info.title,
119
+ agent_emoji: null,
120
+ agent_icon: null,
121
+ kind: "group",
122
+ participants: info.participants,
123
+ pinned: false,
124
+ conversation_id: info.id,
125
+ channel: "group",
126
+ messages: 0,
127
+ preview: null,
128
+ last_activity_at: new Date().toISOString(),
129
+ },
130
+ );
131
+ };
132
+
133
+ return (
134
+ <div className="flex h-full min-h-0 overflow-hidden" data-testid="inbox-screen">
135
+ <InboxList
136
+ rows={rows}
137
+ selectedKey={selected ? rowKey(selected) : null}
138
+ onSelect={setSelected}
139
+ onNew={() => setNewOpen(true)}
140
+ action={
141
+ <Tip content={includeEmpty ? t("inbox.hide_quiet") : t("inbox.show_quiet")}>
142
+ <Button
143
+ size="sm"
144
+ variant={includeEmpty ? "primary" : "ghost"}
145
+ aria-label={includeEmpty ? t("inbox.hide_quiet") : t("inbox.show_quiet")}
146
+ onClick={() => setIncludeEmpty((v) => !v)}
147
+ >
148
+ {includeEmpty ? <EyeOff size={14} /> : <Eye size={14} />}
149
+ </Button>
150
+ </Tip>
151
+ }
152
+ />
83
153
 
84
- <section className="flex min-w-0 flex-1 flex-col">
85
- {!selected ? (
86
- <div className="flex h-full items-center justify-center p-8">
87
- <p className="text-sm text-muted-fg">{t("inbox.empty")}</p>
88
- </div>
89
- ) : (
90
- <>
91
- <header className="flex shrink-0 items-center justify-between gap-3 border-b border-border px-4 py-2.5">
92
- <div className="min-w-0">
93
- <h2 className="truncate text-sm font-semibold">{title}</h2>
94
- <p className="truncate text-[11px] text-muted-fg">
95
- {selected.project_name || t("inbox.super_agent_scope")}
96
- {selected.channel ? ` · ${selected.channel}` : ""}
97
- </p>
98
- </div>
99
- {/* The structural way out. The inbox is a second axis over the
100
- same data, so getting from a conversation to its project
101
- must always be one click. */}
102
- <Button
103
- size="sm"
104
- variant="ghost"
105
- onClick={() =>
106
- navigate(
107
- selected.kind === "super_agent"
108
- ? "/p/0/chat"
109
- : `/p/${selected.project_id}/agents/${encodeURIComponent(selected.agent_slug)}`,
110
- )}
111
- >
112
- {t("inbox.open_in_project")} <ArrowUpRight size={13} />
113
- </Button>
114
- </header>
154
+ <NewChatSheet
155
+ open={newOpen}
156
+ onClose={() => setNewOpen(false)}
157
+ onPick={openLive}
158
+ onGroupCreated={(info) => void openGroup(info)}
159
+ />
115
160
 
116
- <div className="min-h-0 flex-1">
117
- {/* Remounted per selection: the chat surface holds its own
118
- session state, and carrying one agent's stream into another
119
- agent's pane would be worse than a moment's reload. */}
120
- <ChatTab
121
- key={rowKey(selected)}
122
- pid={pid as string}
123
- hideSidebar
124
- initialSelection={selectionFor(selected)}
125
- />
126
- </div>
127
- </>
128
- )}
129
- </section>
130
- </div>
161
+ <section className="flex min-w-0 flex-1 flex-col">
162
+ {!selected ? (
163
+ <Empty fill icon={Inbox}>{t("inbox.empty")}</Empty>
164
+ ) : (
165
+ /* Remounted per selection: the chat surface holds its own session
166
+ state, and carrying one agent's stream into another agent's pane
167
+ would be worse than a moment's reload. */
168
+ <ChatTab
169
+ /* The thread is part of the identity: when the selected agent moves
170
+ to a new day's thread the pane must reopen on it, and ChatTab
171
+ reads its initial selection once, at mount. */
172
+ key={`${rowKey(selected)}::${selected.channel ?? ""}::${selected.conversation_id ?? ""}`}
173
+ pid={pid as string}
174
+ hideSidebar
175
+ bare
176
+ channelScope="web"
177
+ initialSelection={selectionFor(selected)}
178
+ /* The structural way out. The inbox is a second axis over the same
179
+ data, so getting from a conversation to its project must always
180
+ be one click — it just lives in the thread's own button row now
181
+ instead of a header duplicating the agent's name above it. */
182
+ onOpenInProject={() => navigate(agentCardUrl(selected))}
183
+ />
184
+ )}
185
+ </section>
131
186
  </div>
132
187
  );
133
188
  }
@@ -15,6 +15,7 @@ import { RobyEmpty } from "../components/Roby";
15
15
  import { Button } from "../components/ui/button";
16
16
  import { useProject } from "../hooks/useProjects";
17
17
  import { STORAGE } from "../constants";
18
+ import { toneText } from "../lib/tone";
18
19
  import { t } from "../i18n";
19
20
  import { Overview } from "./project/Overview";
20
21
  import { WorkspacesTab } from "./base/WorkspacesTab";
@@ -22,7 +23,6 @@ import { LogsTab } from "./base/LogsTab";
22
23
  import { ModelsTab } from "./base/ModelsTab";
23
24
  import { AgentDefaultsTab } from "./base/AgentDefaultsTab";
24
25
  import { SessionsTab } from "./base/SessionsTab";
25
- import { GlobalTasksTab } from "./base/GlobalTasksTab";
26
26
  import { CommitmentsTab } from "./base/CommitmentsTab";
27
27
  import { ConfigTab } from "./project/ConfigTab";
28
28
  import { AgentsTab } from "./project/AgentsTab";
@@ -61,7 +61,7 @@ export function ProjectScreen() {
61
61
  const obsidianActive = obsidianEntry?.status?.status === "active" && !!obsidianEntry?.status?.is_enabled;
62
62
 
63
63
  const sections: TabSection[] = useMemo(() => {
64
- const memoriesMark = obsidianActive ? <ObsidianLogo className="size-3 text-purple-400" /> : undefined;
64
+ const memoriesMark = obsidianActive ? <ObsidianLogo className={`size-3 ${toneText.purple}`} /> : undefined;
65
65
  // One shared taxonomy for both Base and projects, in the same order, so the
66
66
  // two menus mirror each other. Base additionally gets a "General" admin
67
67
  // section (workspaces / engines / agent defaults) and drops "Content"
@@ -185,14 +185,18 @@ export function ProjectScreen() {
185
185
  <Route path="memories" element={<MemoriesTab pid={pid} />} />
186
186
  <Route path="skills" element={<SkillsTab pid={pid} />} />
187
187
  <Route path="routines" element={<RoutinesTab pid={pid} />} />
188
- <Route path="tasks" element={isBase ? <GlobalTasksTab /> : <TasksTab pid={pid} />} />
188
+ <Route path="tasks" element={<TasksTab pid={isBase ? undefined : pid} />} />
189
189
  <Route path="commitments" element={<CommitmentsTab pid={isBase ? undefined : pid} />} />
190
190
  <Route path="mcps" element={<McpsTab pid={pid} />} />
191
191
  <Route path="integrations" element={<IntegrationsTab pid={pid} />} />
192
192
  <Route path="artifacts" element={<ArtifactsTab pid={pid} />} />
193
193
  <Route path="vars" element={<VarsTab pid={pid} />} />
194
194
  <Route path="threads" element={<Navigate to={`/p/${pid}/chat`} replace />} />
195
- <Route path="chat" element={<ChatTab pid={pid} />} />
195
+ {/* Keyed by pid: React Router keeps this screen mounted across a project
196
+ switch, and the chat pane owns real state (which conversation is
197
+ open, the loaded messages). Without the key you land on the new
198
+ project still reading the old one's chat. */}
199
+ <Route path="chat" element={<ChatTab key={pid} pid={pid} />} />
196
200
  <Route path="*" element={<Overview pid={pid} />} />
197
201
  </Routes>
198
202
  </TabLayout>
@@ -1,7 +1,7 @@
1
1
  import { type ReactElement } from "react";
2
2
  import { useLocation, useNavigate } from "react-router-dom";
3
3
  import {
4
- BellRing, Bot, Cpu, Database, Globe, IdCard, KeyRound, LayoutGrid, MessageCircle, Mic, Monitor, ScrollText, Send, Smartphone, Sparkles, User,
4
+ BellRing, Bot, Cpu, Database, Globe, IdCard, Image as ImageIcon, KeyRound, LayoutGrid, MessageCircle, Mic, Monitor, ScrollText, Send, Smartphone, Sparkles, User,
5
5
  } from "lucide-react";
6
6
  import { useNavCollapse, type TabSection } from "../components/common/TabNav";
7
7
  import { TabLayout } from "../components/common/TabLayout";
@@ -18,13 +18,14 @@ import { AdvancedPanel } from "../components/settings/AdvancedPanel";
18
18
  import { WebPanel } from "../components/settings/WebPanel";
19
19
  import { DesktopSettingsPanel } from "../components/settings/DesktopSettingsPanel";
20
20
  import { VoiceScreen } from "./modules/VoiceScreen";
21
+ import { ImagesScreen } from "./modules/ImagesScreen";
21
22
  import { DeckScreen } from "./modules/DeckScreen";
22
23
  import { STORAGE } from "../constants";
23
24
  import { t } from "../i18n";
24
25
 
25
26
  type TabKey =
26
27
  | "identity" | "super_agent" | "profile" | "nudge" | "engines" | "memory" | "skills" | "telegram" | "devices"
27
- | "voice" | "deck" | "desktop" | "web" | "advanced";
28
+ | "voice" | "images" | "deck" | "desktop" | "web" | "advanced";
28
29
 
29
30
  const SECTIONS: TabSection[] = [
30
31
  {
@@ -65,6 +66,7 @@ const SECTIONS: TabSection[] = [
65
66
  title: t("settings.modules_section"),
66
67
  items: [
67
68
  { key: "voice", label: t("nav.modules.voice"), icon: Mic },
69
+ { key: "images", label: t("nav.modules.images"), icon: ImageIcon },
68
70
  { key: "desktop", label: t("nav.modules.desktop"), icon: Monitor },
69
71
  { key: "deck", label: t("nav.modules.deck"), icon: LayoutGrid },
70
72
  { key: "web", label: t("nav.modules.web"), icon: Globe },
@@ -82,7 +84,7 @@ const SECTIONS: TabSection[] = [
82
84
  // on xl (and so wants full available width). Single-section panels (identity,
83
85
  // super agent, devices, advanced) keep a cosier reading width so wide displays
84
86
  // don't blow form fields up to absurd widths.
85
- const WIDE_TABS = new Set<TabKey>(["engines", "telegram", "memory", "skills", "web", "voice", "profile"]);
87
+ const WIDE_TABS = new Set<TabKey>(["engines", "telegram", "memory", "skills", "web", "voice", "images", "profile"]);
86
88
 
87
89
  const PANELS: Record<TabKey, () => ReactElement> = {
88
90
  identity: () => <IdentityPanel />,
@@ -95,6 +97,7 @@ const PANELS: Record<TabKey, () => ReactElement> = {
95
97
  telegram: () => <TelegramSettingsTabs />,
96
98
  devices: () => <DevicesPanel />,
97
99
  voice: () => <VoiceScreen />,
100
+ images: () => <ImagesScreen />,
98
101
  deck: () => <DeckScreen />,
99
102
  desktop: () => <DesktopSettingsPanel />,
100
103
  web: () => <WebPanel />,
@@ -137,10 +140,10 @@ function tabFromPath(pathname: string): TabKey {
137
140
  case "telegram": return "telegram";
138
141
  case "devices": return "devices";
139
142
  case "voice": return "voice";
143
+ case "images": return "images";
140
144
  case "deck": return "deck";
141
145
  case "desktop": return "desktop";
142
146
  case "web": return "web";
143
- case "appearance": return "web"; // legacy route → Web module
144
147
  case "config":
145
148
  case "advanced": return "advanced";
146
149
  default: return "identity";