@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
@@ -64,6 +64,26 @@ export const TOOL_DEFINITIONS = Object.freeze([
64
64
  },
65
65
  examples: [{ path: "src" }],
66
66
  },
67
+ {
68
+ // Native loop tool. Listed so the agent picker can toggle it; HTTP /call
69
+ // is 501 — the exec_agent loop runs the in-process handler.
70
+ name: "edit_file",
71
+ category: "file",
72
+ description: "Replace one exact string with another inside a project file. Prefer this over write_file for small edits.",
73
+ endpoint: null,
74
+ parameters: {
75
+ type: "object",
76
+ properties: {
77
+ path: { type: "string", description: "Relative path inside the project" },
78
+ search: { type: "string", description: "Exact text to replace" },
79
+ replace: { type: "string", description: "Replacement text" },
80
+ all: { type: "boolean", description: "Replace every match; default false" },
81
+ project: { type: "string" },
82
+ },
83
+ required: ["path", "search", "replace"],
84
+ },
85
+ examples: [{ path: "README.md", search: "old", replace: "new" }],
86
+ },
67
87
 
68
88
  // ── shell ─────────────────────────────────────────────────────────────────
69
89
  {
@@ -339,7 +359,7 @@ export const TOOL_DEFINITIONS = Object.freeze([
339
359
  {
340
360
  name: "browser_navigate",
341
361
  category: "browser",
342
- description: "Navigate the headless browser to a URL. Launches Chromium lazily on first call. Auto-retries and falls back to a more permissive wait strategy on redirect-heavy sites.",
362
+ description: "Navigate the headless browser to a URL. Launches Chromium lazily on first call. Auto-retries and falls back to a more permissive wait strategy on redirect-heavy sites. Pass snapshot:true to get the page's accessibility tree back in the same call — that is the normal way to drive a page: navigate → read refs → act on refs.",
343
363
  endpoint: { method: "POST", path: "/api/tools/browser/navigate" },
344
364
  parameters: {
345
365
  type: "object",
@@ -350,12 +370,28 @@ export const TOOL_DEFINITIONS = Object.freeze([
350
370
  enum: ["load", "domcontentloaded", "networkidle0", "networkidle2"],
351
371
  description: "Puppeteer wait strategy (default networkidle2). Use 'domcontentloaded' for slow/redirect-heavy sites; navigate auto-falls back to it on failure anyway.",
352
372
  },
373
+ snapshot: { type: "boolean", description: "Also return the accessibility snapshot (with refs) after the page settles. Saves a round trip." },
353
374
  launch_options: { type: "object", description: "Puppeteer launch overrides (headless, args, defaultViewport, etc.)." },
354
375
  allow_dangerous: { type: "boolean", description: "Allow dangerous launch args (--no-sandbox, --single-process, etc.)." },
355
376
  },
356
377
  required: ["url"],
357
378
  },
358
- examples: [{ url: "https://example.com" }],
379
+ examples: [{ url: "https://example.com", snapshot: true }],
380
+ },
381
+ {
382
+ name: "browser_snapshot",
383
+ category: "browser",
384
+ description: "Read the current page as an accessibility tree: role, accessible name, state, one line per element, with every interactive control stamped [ref_N]. THIS is how you see a page — call it after navigating and after any action that changes the DOM, then pass a ref to browser_click / browser_type / browser_select / browser_hover instead of guessing a CSS selector from HTML. Refs are invalidated by navigation or re-render; take a fresh snapshot when an action reports a stale ref.",
385
+ endpoint: { method: "POST", path: "/api/tools/browser/snapshot" },
386
+ parameters: {
387
+ type: "object",
388
+ properties: {
389
+ selector: { type: "string", description: "Limit the snapshot to a subtree (e.g. \"main\", \"#results\"). Use it on big pages." },
390
+ interactive_only: { type: "boolean", description: "Only controls — drop headings and page copy. Smallest output.", default: false },
391
+ max_nodes: { type: "number", description: "Node cap before truncation (default 400, max 1500).", default: 400 },
392
+ },
393
+ },
394
+ examples: [{}, { selector: "form" }, { interactive_only: true }],
359
395
  },
360
396
  {
361
397
  name: "browser_screenshot",
@@ -366,6 +402,7 @@ export const TOOL_DEFINITIONS = Object.freeze([
366
402
  type: "object",
367
403
  properties: {
368
404
  selector: { type: "string", description: "CSS selector of element to capture. Omit for full viewport/page." },
405
+ ref: { type: "string", description: "Snapshot ref (e.g. \"ref_12\") of the element to capture. Wins over selector." },
369
406
  full_page: { type: "boolean", default: false },
370
407
  width: { type: "number", description: "Viewport width (capped at 1920)." },
371
408
  height: { type: "number", description: "Viewport height (capped at 1080)." },
@@ -379,57 +416,66 @@ export const TOOL_DEFINITIONS = Object.freeze([
379
416
  {
380
417
  name: "browser_click",
381
418
  category: "browser",
382
- description: "Click a CSS selector on the current browser page.",
419
+ description: "Click an element on the current browser page. Prefer `ref` from browser_snapshot — a CSS selector guessed from HTML is what makes browsing brittle.",
383
420
  endpoint: { method: "POST", path: "/api/tools/browser/click" },
384
421
  parameters: {
385
422
  type: "object",
386
- properties: { selector: { type: "string" } },
387
- required: ["selector"],
423
+ properties: {
424
+ ref: { type: "string", description: "Snapshot ref (e.g. \"ref_12\"). Preferred." },
425
+ selector: { type: "string", description: "CSS selector, when no snapshot ref applies." },
426
+ snapshot: { type: "boolean", description: "Return the accessibility snapshot after the click. Saves a round trip." },
427
+ },
388
428
  },
389
- examples: [{ selector: "button#submit" }],
429
+ examples: [{ ref: "ref_12" }, { ref: "ref_12", snapshot: true }, { selector: "button#submit" }],
390
430
  },
391
431
  {
392
432
  name: "browser_type",
393
433
  category: "browser",
394
- description: "Type text into a CSS selector. Uses focus + Ctrl+A + Backspace to clear, then types with realistic delay.",
434
+ description: "Type text into a field. Prefer `ref` from browser_snapshot. Uses focus + Ctrl+A + Backspace to clear, then types with realistic delay.",
395
435
  endpoint: { method: "POST", path: "/api/tools/browser/type" },
396
436
  parameters: {
397
437
  type: "object",
398
438
  properties: {
399
- selector: { type: "string" },
400
- text: { type: "string" },
401
- clear: { type: "boolean", default: true },
439
+ ref: { type: "string", description: "Snapshot ref (e.g. \"ref_3\"). Preferred." },
440
+ selector: { type: "string", description: "CSS selector, when no snapshot ref applies." },
441
+ text: { type: "string" },
442
+ clear: { type: "boolean", default: true },
443
+ snapshot: { type: "boolean", description: "Return the accessibility snapshot after typing." },
402
444
  },
403
- required: ["selector", "text"],
445
+ required: ["text"],
404
446
  },
405
- examples: [{ selector: "input#search", text: "hello world" }],
447
+ examples: [{ ref: "ref_3", text: "hello world" }, { selector: "input#search", text: "hello world" }],
406
448
  },
407
449
  {
408
450
  name: "browser_select",
409
451
  category: "browser",
410
- description: "Choose an option in a <select> element by its value.",
452
+ description: "Choose an option in a <select> element by its value. Prefer `ref` from browser_snapshot.",
411
453
  endpoint: { method: "POST", path: "/api/tools/browser/select" },
412
454
  parameters: {
413
455
  type: "object",
414
456
  properties: {
415
- selector: { type: "string" },
416
- value: { type: "string" },
457
+ ref: { type: "string", description: "Snapshot ref of the <select>. Preferred." },
458
+ selector: { type: "string", description: "CSS selector, when no snapshot ref applies." },
459
+ value: { type: "string" },
460
+ snapshot: { type: "boolean", description: "Return the accessibility snapshot after selecting." },
417
461
  },
418
- required: ["selector", "value"],
462
+ required: ["value"],
419
463
  },
420
- examples: [{ selector: "select#country", value: "AR" }],
464
+ examples: [{ ref: "ref_7", value: "AR" }, { selector: "select#country", value: "AR" }],
421
465
  },
422
466
  {
423
467
  name: "browser_hover",
424
468
  category: "browser",
425
- description: "Hover the cursor over an element (triggers tooltips, dropdowns, hover states).",
469
+ description: "Hover the cursor over an element (triggers tooltips, dropdowns, hover states). Prefer `ref` from browser_snapshot.",
426
470
  endpoint: { method: "POST", path: "/api/tools/browser/hover" },
427
471
  parameters: {
428
472
  type: "object",
429
- properties: { selector: { type: "string" } },
430
- required: ["selector"],
473
+ properties: {
474
+ ref: { type: "string", description: "Snapshot ref. Preferred." },
475
+ selector: { type: "string", description: "CSS selector, when no snapshot ref applies." },
476
+ },
431
477
  },
432
- examples: [{ selector: "nav .menu-item" }],
478
+ examples: [{ ref: "ref_5" }, { selector: "nav .menu-item" }],
433
479
  },
434
480
  {
435
481
  name: "browser_evaluate",
@@ -457,7 +503,7 @@ export const TOOL_DEFINITIONS = Object.freeze([
457
503
  {
458
504
  name: "browser_get_content",
459
505
  category: "browser",
460
- description: "Return raw innerHTML of the page or a single element (truncated at 1MB).",
506
+ description: "Return raw innerHTML of the page or a single element (truncated at 1MB). Expensive — prefer browser_snapshot to find elements and browser_get_text to read copy; reach for raw HTML only when you need the markup itself.",
461
507
  endpoint: { method: "POST", path: "/api/tools/browser/get_content" },
462
508
  parameters: {
463
509
  type: "object",
@@ -548,4 +594,142 @@ export const TOOL_DEFINITIONS = Object.freeze([
548
594
  parameters: { type: "object", properties: {} },
549
595
  examples: [{}],
550
596
  },
597
+
598
+ // ── skills (native) ───────────────────────────────────────────────────────
599
+ {
600
+ name: "list_skills",
601
+ category: "skill",
602
+ description: "List available skills (slug + one-line description). Call load_skill to fetch a body.",
603
+ endpoint: null,
604
+ parameters: {
605
+ type: "object",
606
+ properties: {
607
+ project_path: { type: "string", description: "Optional project root to also scan .apc/skills" },
608
+ },
609
+ },
610
+ examples: [{}],
611
+ },
612
+ {
613
+ name: "load_skill",
614
+ category: "skill",
615
+ description: "Load the full body of a named skill into this turn.",
616
+ endpoint: null,
617
+ parameters: {
618
+ type: "object",
619
+ properties: {
620
+ slug: { type: "string", description: "Skill slug from list_skills" },
621
+ project_path: { type: "string" },
622
+ },
623
+ required: ["slug"],
624
+ },
625
+ examples: [{ slug: "apx-routine" }],
626
+ },
627
+
628
+ // ── telegram (native) ─────────────────────────────────────────────────────
629
+ {
630
+ name: "send_telegram",
631
+ category: "telegram",
632
+ description: "Send a Telegram message (text; optional photo/document). Dangerous — confirm or run under total.",
633
+ endpoint: null,
634
+ parameters: {
635
+ type: "object",
636
+ properties: {
637
+ text: { type: "string" },
638
+ chat_id: { type: "string" },
639
+ },
640
+ required: ["text"],
641
+ },
642
+ examples: [{ text: "Magui: listo el lote de ideas." }],
643
+ },
644
+
645
+ // ── asana (native plugin) ─────────────────────────────────────────────────
646
+ {
647
+ name: "asana_list_projects",
648
+ category: "integrations",
649
+ description: "List Asana projects visible to the configured token.",
650
+ endpoint: null,
651
+ parameters: { type: "object", properties: { project: { type: "string" } } },
652
+ examples: [{}],
653
+ },
654
+ {
655
+ name: "asana_list_tasks",
656
+ category: "integrations",
657
+ description: "List tasks in an Asana project.",
658
+ endpoint: null,
659
+ parameters: {
660
+ type: "object",
661
+ properties: {
662
+ project_gid: { type: "string" },
663
+ completed: { type: "boolean" },
664
+ project: { type: "string" },
665
+ },
666
+ required: ["project_gid"],
667
+ },
668
+ examples: [{ project_gid: "123" }],
669
+ },
670
+ {
671
+ name: "asana_create_task",
672
+ category: "integrations",
673
+ description: "Create a task in an Asana project.",
674
+ endpoint: null,
675
+ parameters: {
676
+ type: "object",
677
+ properties: {
678
+ project_gid: { type: "string" },
679
+ name: { type: "string" },
680
+ notes: { type: "string" },
681
+ project: { type: "string" },
682
+ },
683
+ required: ["project_gid", "name"],
684
+ },
685
+ examples: [{ project_gid: "123", name: "Reel agro" }],
686
+ },
687
+ {
688
+ name: "asana_update_task",
689
+ category: "integrations",
690
+ description: "Update an Asana task (name, notes, completed, section).",
691
+ endpoint: null,
692
+ parameters: {
693
+ type: "object",
694
+ properties: {
695
+ task_gid: { type: "string" },
696
+ name: { type: "string" },
697
+ completed: { type: "boolean" },
698
+ project: { type: "string" },
699
+ },
700
+ required: ["task_gid"],
701
+ },
702
+ examples: [{ task_gid: "456", completed: true }],
703
+ },
704
+ ]);
705
+
706
+ // Tools a freshly created agent gets out of the box. Read/search the project,
707
+ // keep its own memory, and look itself up in the org — everything with a side
708
+ // effect (shell, write, browser, MCP, network) stays opt-in per agent.
709
+ // One source of truth: the daemon applies these on create, and the web
710
+ // preselects them so the create dialog needs no tool picker at all.
711
+ export const DEFAULT_AGENT_TOOLS = Object.freeze([
712
+ "read_file",
713
+ "list_files",
714
+ "glob",
715
+ "grep",
716
+ "memory_get",
717
+ "memory_set",
718
+ "memory_append",
719
+ "memory_list",
720
+ "agent_list",
721
+ "agent_get",
722
+ "project_info",
723
+ ]);
724
+
725
+ // Worker / editor agents (Magui and friends): the safe default PLUS write,
726
+ // surgical edit, shell, and on-demand skills. Browser, HTTP, MCP, and
727
+ // session tools stay opt-in. Asana / Telegram are extra per-agent.
728
+ export const EDITOR_AGENT_TOOLS = Object.freeze([
729
+ ...DEFAULT_AGENT_TOOLS,
730
+ "write_file",
731
+ "edit_file",
732
+ "run_command",
733
+ "list_skills",
734
+ "load_skill",
551
735
  ]);
@@ -15,7 +15,19 @@ const execFileAsync = promisify(execFile);
15
15
  // ripgrep backend
16
16
  // ---------------------------------------------------------------------------
17
17
 
18
- async function grepWithRg({ pattern, searchPath, glob, caseSensitive, context = 0, limit }) {
18
+ /**
19
+ * What to call a hit, relative to what was searched.
20
+ *
21
+ * `path.relative(searchPath, file)` is the answer for a directory search and
22
+ * the empty string when the search path IS the file — which is how a grep of
23
+ * one file reported its match against a file named "". A single file is still
24
+ * a file, so it gets its name.
25
+ */
26
+ function fileLabel(searchPath, file, searchPathIsFile) {
27
+ return searchPathIsFile ? path.basename(file) : path.relative(searchPath, file);
28
+ }
29
+
30
+ async function grepWithRg({ pattern, searchPath, searchPathIsFile, glob, caseSensitive, context = 0, limit }) {
19
31
  const fullArgs = [
20
32
  "--json",
21
33
  "--max-filesize", "1M",
@@ -45,10 +57,20 @@ async function grepWithRg({ pattern, searchPath, glob, caseSensitive, context =
45
57
  const lineNum = obj.data?.line_number;
46
58
  const text = obj.data?.lines?.text?.replace(/\n$/, "") || "";
47
59
  const last = matches[matches.length - 1];
48
- if (last && last.file === file) {
60
+ // Grouped on the ABSOLUTE path, which is what `file` holds. Comparing it
61
+ // to `last.file` — the RELATIVE label stored below — never matched, so
62
+ // every hit opened a new group and `files_with_matches` was really a
63
+ // second copy of `total_matches`: four hits in two files reported four
64
+ // files. rg emits a file's matches consecutively, so comparing against
65
+ // the last group is enough.
66
+ if (last && last.absolute === file) {
49
67
  last.matches.push({ line: lineNum, text });
50
68
  } else {
51
- matches.push({ file: path.relative(searchPath, file), absolute: file, matches: [{ line: lineNum, text }] });
69
+ matches.push({
70
+ file: fileLabel(searchPath, file, searchPathIsFile),
71
+ absolute: file,
72
+ matches: [{ line: lineNum, text }],
73
+ });
52
74
  }
53
75
  if (matches.reduce((s, m) => s + m.matches.length, 0) >= limit) break;
54
76
  }
@@ -72,9 +94,28 @@ function globToRegex(g) {
72
94
  );
73
95
  }
74
96
 
97
+ /**
98
+ * Every file under `dir` — or `dir` itself when it IS a file.
99
+ *
100
+ * That second case is not an edge: `grep(path: "work/marketing/magui/brain.md")`
101
+ * is how an agent reads one known file, and it is what ripgrep does without
102
+ * being asked. Here the walk began with `readdirSync` on the path, which throws
103
+ * ENOTDIR for a file; the catch below swallowed it, the queue emptied, and the
104
+ * search returned NO MATCHES — not an error, an empty answer, to a question
105
+ * about a file sitting right there with the word in it.
106
+ *
107
+ * It only ever happened without ripgrep installed, which is why it survived: a
108
+ * dev machine with `brew install ripgrep` never reaches this backend, and the
109
+ * CI runner reaches nothing else.
110
+ */
75
111
  function walkFiles(dir, { globPattern, dot = false, maxFiles = 2000 } = {}) {
76
112
  const globRe = globPattern ? globToRegex(globPattern) : null;
77
113
  const result = [];
114
+ try {
115
+ if (fs.statSync(dir).isFile()) return [dir];
116
+ } catch {
117
+ return result;
118
+ }
78
119
  const queue = [dir];
79
120
  while (queue.length && result.length < maxFiles) {
80
121
  const current = queue.shift();
@@ -93,7 +134,7 @@ function walkFiles(dir, { globPattern, dot = false, maxFiles = 2000 } = {}) {
93
134
  return result;
94
135
  }
95
136
 
96
- async function grepWithNode({ pattern, searchPath, glob, caseSensitive, context = 0, limit }) {
137
+ async function grepWithNode({ pattern, searchPath, searchPathIsFile, glob, caseSensitive, context = 0, limit }) {
97
138
  const re = new RegExp(pattern, caseSensitive ? "" : "i");
98
139
  const files = walkFiles(searchPath, { globPattern: glob, dot: false });
99
140
  const matches = [];
@@ -121,7 +162,7 @@ async function grepWithNode({ pattern, searchPath, glob, caseSensitive, context
121
162
 
122
163
  if (fileMatches.length > 0) {
123
164
  matches.push({
124
- file: path.relative(searchPath, file),
165
+ file: fileLabel(searchPath, file, searchPathIsFile),
125
166
  absolute: file,
126
167
  matches: fileMatches,
127
168
  });
@@ -144,8 +185,20 @@ export async function grepFiles({
144
185
  cwd,
145
186
  }) {
146
187
  if (!pattern) throw new Error("pattern required");
147
- const basePath = path.resolve(searchPathArg || cwd || process.cwd());
148
- if (!fs.existsSync(basePath)) throw new Error(`path does not exist: ${basePath}`);
188
+ // A relative `path` is relative TO `cwd` the caller's project, when one was
189
+ // sent. It used to be `path.resolve(searchPathArg || cwd || )`, where any
190
+ // path at all short-circuited `cwd` and the relative one then resolved against
191
+ // the DAEMON's own directory: an agent searching `work/marketing/…` in its
192
+ // project was answered "path does not exist" with the apx checkout prefixed to
193
+ // it. An absolute path is unaffected — path.resolve ignores the base then.
194
+ const basePath = path.resolve(cwd || process.cwd(), searchPathArg || ".");
195
+ // Answers "does it exist" and "is it one file" in a single stat, and both
196
+ // backends are told: searching ONE file is a normal thing to ask for, and
197
+ // each of them gets it wrong in its own way without being told. See
198
+ // walkFiles() and fileLabel().
199
+ let baseStat;
200
+ try { baseStat = fs.statSync(basePath); } catch { throw new Error(`path does not exist: ${basePath}`); }
201
+ const baseIsFile = baseStat.isFile();
149
202
 
150
203
  const lim = Math.min(parseInt(limit, 10) || 100, 1000);
151
204
  const ctx = Math.min(parseInt(context, 10) || 0, 10);
@@ -158,6 +211,7 @@ export async function grepFiles({
158
211
  result = await grepWithRg({
159
212
  pattern,
160
213
  searchPath: basePath,
214
+ searchPathIsFile: baseIsFile,
161
215
  glob,
162
216
  caseSensitive: !!case_sensitive,
163
217
  context: ctx,
@@ -167,6 +221,7 @@ export async function grepFiles({
167
221
  result = await grepWithNode({
168
222
  pattern,
169
223
  searchPath: basePath,
224
+ searchPathIsFile: baseIsFile,
170
225
  glob,
171
226
  caseSensitive: !!case_sensitive,
172
227
  context: ctx,
@@ -7,7 +7,7 @@
7
7
  //
8
8
  // The catalog itself lives in ./catalog.js and the in-process executors in
9
9
  // ./inline-handlers.js. This module only indexes and serves them.
10
- import { TOOL_DEFINITIONS } from "./catalog.js";
10
+ import { TOOL_DEFINITIONS, DEFAULT_AGENT_TOOLS } from "./catalog.js";
11
11
  import { makeInlineHandlers } from "./inline-handlers.js";
12
12
 
13
13
 
@@ -22,6 +22,8 @@ function listTools() {
22
22
  name,
23
23
  description,
24
24
  category,
25
+ // Whether a new agent gets this tool by default (see DEFAULT_AGENT_TOOLS).
26
+ default_for_agents: DEFAULT_AGENT_TOOLS.includes(name),
25
27
  schema_url: `/api/tools/${name}`,
26
28
  endpoint_method: endpoint?.method || "inline",
27
29
  endpoint_path: endpoint?.path || null,
@@ -1,11 +1,42 @@
1
1
  // Backend strings — English (en). This is also the default fallback locale.
2
2
  export default {
3
- "telegram.heads_up": "On it working on that… 🛠️",
3
+ // Floors, not copy: the model writes the ack and the closing itself
4
+ // (core/agent/author-line.js); these go out only when it couldn't. The two
5
+ // `reply.*` ones are every surface's floor, not just Telegram's — see
6
+ // core/agent/closing-floor.js.
4
7
  "telegram.reset_ack": "Done, context cleared. Starting fresh. What do you need?",
5
- "telegram.fallback_listo": "Done.",
6
- "telegram.fallback_continue": "Made some headway. Want me to keep going?",
8
+ "reply.fallback_done": "Done.",
9
+ "reply.fallback_continue": "Made some headway. Want me to keep going?",
7
10
  // Host-emitted error floors (the model itself failed, so it can't author
8
11
  // these — they stay templated, but at least follow the user's language).
9
12
  "telegram.error_agent": "⚠️ The agent hit an error ({error}).",
10
13
  "telegram.error_generic": "⚠️ Couldn't reply right now ({error}).",
14
+ // Mobility — the buttons and one-line reminders the DAEMON sends while a trip
15
+ // is running (core/mobility/geofence.js). Host-emitted, not model-authored:
16
+ // a driver reads these at a glance, so they stay fixed and short.
17
+ "mobility.near": "You're near {place}, {distance} away.",
18
+ "mobility.near_bare": "You're {distance} away.",
19
+ "mobility.unit_m": "metres",
20
+ "mobility.unit_km": "kilometres",
21
+ "mobility.task": "Task",
22
+ "mobility.address": "Address",
23
+ // The native card's four answers, in the order they are offered. No emoji:
24
+ // Android Auto hands the card to Assistant, which reads it out loud.
25
+ "mobility.navigate": "Navigate now",
26
+ "mobility.add_stop": "Add to route",
27
+ "mobility.later": "Later",
28
+ "mobility.dismiss": "Not now",
29
+ "mobility.ack_dismissed": "Fine — nothing more about this one on this trip.",
30
+ "mobility.going": "I'll go",
31
+ "mobility.not_today": "Not today",
32
+ "mobility.alert_next": "Tell me at the next one",
33
+ "mobility.followup": "Did you make it to {place}?",
34
+ "mobility.done": "Done",
35
+ "mobility.still_open": "Not yet",
36
+ "mobility.ack_going": "Noted — you're going.",
37
+ "mobility.ack_skipped": "Fine, not today.",
38
+ "mobility.ack_next": "Fine, I'll tell you at the next one.",
39
+ "mobility.ack_done": "Closed the task.",
40
+ "mobility.ack_still_open": "Leaving it open.",
41
+ "mobility.transcript": "[Transcript]",
11
42
  };
@@ -1,13 +1,45 @@
1
1
  // Backend strings — Spanish (es). Keep this file flat dot-paths only; the
2
2
  // web admin has its own i18n tree.
3
3
  export default {
4
- // Telegram channel
5
- "telegram.heads_up": "Dale, estoy con eso… 🛠️",
4
+ // Pisos, no copy: el ack y los cierres los escribe el modelo
5
+ // (core/agent/author-line.js) y estos textos salen solo si no pudo. Los dos
6
+ // `reply.*` son el piso de TODAS las superficies, no solo el de Telegram —
7
+ // ver core/agent/closing-floor.js.
6
8
  "telegram.reset_ack": "Listo, contexto borrado. Arranco un hilo nuevo, ¿qué necesitás?",
7
- "telegram.fallback_listo": "Listo.",
8
- "telegram.fallback_continue": "Avancé con eso. ¿Querés que siga?",
9
+ "reply.fallback_done": "Listo.",
10
+ "reply.fallback_continue": "Avancé con eso. ¿Querés que siga?",
9
11
  // Pisos de error emitidos por el host (el modelo falló, no puede redactarlos
10
12
  // él mismo — quedan fijos, pero al menos respetan el idioma del usuario).
11
13
  "telegram.error_agent": "⚠️ El agente tuvo un error ({error}).",
12
14
  "telegram.error_generic": "⚠️ No pude responder ahora mismo ({error}).",
15
+ // Movilidad — los botones y recordatorios de una línea que manda el DAEMON
16
+ // durante un viaje (core/mobility/geofence.js). Los emite el host, no el
17
+ // modelo: se leen manejando, así que quedan fijos y cortos.
18
+ "mobility.near": "Estás cerca de {place}, a {distance}.",
19
+ // Sin lugar con nombre propio: el título ya lo dijo, así que la línea sólo
20
+ // aporta la distancia.
21
+ "mobility.near_bare": "Estás a {distance}.",
22
+ "mobility.unit_m": "metros",
23
+ "mobility.unit_km": "kilómetros",
24
+ "mobility.task": "Tarea",
25
+ "mobility.address": "Dirección",
26
+ // Las cuatro respuestas de la tarjeta nativa, en el orden en que se ofrecen.
27
+ // Sin emojis: Android Auto se las da al Assistant y las lee en voz alta.
28
+ "mobility.navigate": "Navegar ahora",
29
+ "mobility.add_stop": "Sumar a la ruta",
30
+ "mobility.later": "Para después",
31
+ "mobility.dismiss": "No ahora",
32
+ "mobility.ack_dismissed": "Listo, no te aviso más de esta en este viaje.",
33
+ "mobility.going": "Voy",
34
+ "mobility.not_today": "Hoy no",
35
+ "mobility.alert_next": "Avisar en la siguiente",
36
+ "mobility.followup": "¿Pasaste por {place}?",
37
+ "mobility.done": "Hecho",
38
+ "mobility.still_open": "Todavía no",
39
+ "mobility.ack_going": "Anotado: vas.",
40
+ "mobility.ack_skipped": "Listo, hoy no.",
41
+ "mobility.ack_next": "Listo, te aviso en la siguiente.",
42
+ "mobility.ack_done": "Cerré la tarea.",
43
+ "mobility.ack_still_open": "La dejo abierta.",
44
+ "mobility.transcript": "[Transcripción]",
13
45
  };
@@ -1,12 +1,12 @@
1
- // Backend i18n for daemon-side messages (Telegram heads-up, system replies,
2
- // any other user-facing string emitted from the host/core layer). The web
3
- // admin has its own dict tree under src/interfaces/web/src/i18n/ — that one
4
- // stays separate, this is for what the daemon sends back.
1
+ // Backend i18n for daemon-side messages (command acks, error floors, any other
2
+ // user-facing string emitted from the host/core layer). The web admin has its
3
+ // own dict tree under src/interfaces/web/src/i18n/ — that one stays separate,
4
+ // this is for what the daemon sends back.
5
5
  //
6
6
  // Usage:
7
7
  // import { t, resolveLang } from "#core/i18n/index.js";
8
8
  // const lang = resolveLang(globalConfig);
9
- // await sendTelegram(t("telegram.heads_up", { lang }));
9
+ // await sendTelegram(t("telegram.reset_ack", { lang }));
10
10
  //
11
11
  // Adding a key: pick a clear dotted path, add it to every locale dict, and
12
12
  // the unit test in tests/i18n.test.js will assert parity (no missing
@@ -1,11 +1,40 @@
1
1
  // Backend strings — Portuguese (pt).
2
2
  export default {
3
- "telegram.heads_up": "Já estou nisso… 🛠️",
3
+ // Pisos, não copy: o ack e o fecho são escritos pelo modelo
4
+ // (core/agent/author-line.js); estes só saem quando ele não conseguiu. Os
5
+ // dois `reply.*` são o piso de todas as superfícies, não só o do Telegram —
6
+ // ver core/agent/closing-floor.js.
4
7
  "telegram.reset_ack": "Pronto, contexto limpo. Começando do zero — do que você precisa?",
5
- "telegram.fallback_listo": "Pronto.",
6
- "telegram.fallback_continue": "Avancei com isso. Quer que eu continue?",
8
+ "reply.fallback_done": "Pronto.",
9
+ "reply.fallback_continue": "Avancei com isso. Quer que eu continue?",
7
10
  // Pisos de erro emitidos pelo host (o modelo falhou, não pode redigi-los —
8
11
  // ficam fixos, mas ao menos seguem o idioma do usuário).
9
12
  "telegram.error_agent": "⚠️ O agente encontrou um erro ({error}).",
10
13
  "telegram.error_generic": "⚠️ Não consegui responder agora ({error}).",
14
+ // Mobilidade — os botões e lembretes de uma linha que o DAEMON envia durante
15
+ // uma viagem (core/mobility/geofence.js). Emitidos pelo host, não pelo
16
+ // modelo: são lidos dirigindo, então ficam fixos e curtos.
17
+ "mobility.near": "Você está perto de {place}, a {distance}.",
18
+ "mobility.near_bare": "Você está a {distance}.",
19
+ "mobility.unit_m": "metros",
20
+ "mobility.unit_km": "quilômetros",
21
+ "mobility.task": "Tarefa",
22
+ "mobility.address": "Endereço",
23
+ "mobility.navigate": "Navegar agora",
24
+ "mobility.add_stop": "Adicionar parada",
25
+ "mobility.later": "Mais tarde",
26
+ "mobility.dismiss": "Agora não",
27
+ "mobility.ack_dismissed": "Certo, não aviso mais sobre esta nesta viagem.",
28
+ "mobility.going": "Vou",
29
+ "mobility.not_today": "Hoje não",
30
+ "mobility.alert_next": "Avisar na próxima",
31
+ "mobility.followup": "Você passou em {place}?",
32
+ "mobility.done": "Feito",
33
+ "mobility.still_open": "Ainda não",
34
+ "mobility.ack_going": "Anotado: você vai.",
35
+ "mobility.ack_skipped": "Certo, hoje não.",
36
+ "mobility.ack_next": "Certo, aviso na próxima.",
37
+ "mobility.ack_done": "Fechei a tarefa.",
38
+ "mobility.ack_still_open": "Deixo em aberto.",
39
+ "mobility.transcript": "[Transcrição]",
11
40
  };
@@ -20,7 +20,7 @@ export function readIdentity() {
20
20
  }
21
21
 
22
22
  // Resolve the super-agent's DISPLAY name (the persona shown to users). Order:
23
- // identity.json personalegacy super_agent.name → "APX". This is the single
23
+ // identity.json agent_name → super_agent.name → "APX". This is the single
24
24
  // source of truth for "what is the super-agent called"; callers must not read
25
25
  // super_agent.name directly. The stable id for storage is SUPERAGENT_ACTOR_ID.
26
26
  export function resolveAgentName(globalConfig = {}) {
@@ -32,6 +32,19 @@ export function resolveAgentName(globalConfig = {}) {
32
32
  );
33
33
  }
34
34
 
35
+ // Shown when the owner has not told the agent their name. Neutral on purpose:
36
+ // a name written into a shipped prompt is ONE install's owner introducing
37
+ // himself in everybody else's.
38
+ export const OWNER_DISPLAY_FALLBACK = "the owner";
39
+
40
+ // Resolve the OWNER's display name — the person the super-agent works for —
41
+ // from identity.json (`owner_name`, written by `set_identity`). Every prompt
42
+ // that addresses the owner by name goes through here; none may hardcode one.
43
+ export function resolveOwnerName() {
44
+ const identity = readIdentity();
45
+ return identity?.owner_name || OWNER_DISPLAY_FALLBACK;
46
+ }
47
+
35
48
  export function writeIdentity(fields) {
36
49
  const existing = readIdentity() || {};
37
50
  const now = new Date().toISOString();