@agentprojectcontext/apx 1.81.0 → 1.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/package.json +9 -8
  2. package/skills/apc-context/SKILL.md +14 -7
  3. package/skills/apx/SKILL.md +62 -2
  4. package/skills/apx-mcp/SKILL.md +42 -15
  5. package/src/core/agent/a2a/peers.js +161 -0
  6. package/src/core/agent/a2a/reply.js +379 -27
  7. package/src/core/agent/abort.js +25 -0
  8. package/src/core/agent/agent-model.js +58 -0
  9. package/src/core/agent/agent-tools.js +101 -0
  10. package/src/core/agent/author-line.js +110 -0
  11. package/src/core/agent/build-agent-system.js +52 -18
  12. package/src/core/agent/channels/voice-context.js +17 -2
  13. package/src/core/agent/closing-floor.js +117 -0
  14. package/src/core/agent/constants.js +119 -11
  15. package/src/core/agent/engine-call.js +56 -0
  16. package/src/core/agent/group/run-group-turn.js +218 -0
  17. package/src/core/agent/group/turn-resolver.js +165 -0
  18. package/src/core/agent/judge.js +138 -11
  19. package/src/core/agent/loop/side-effects.js +106 -3
  20. package/src/core/agent/memory.js +31 -18
  21. package/src/core/agent/model-capabilities.js +47 -0
  22. package/src/core/agent/model-router.js +11 -40
  23. package/src/core/agent/prompt-builder.js +47 -0
  24. package/src/core/agent/prompts/channels/a2a.md +12 -0
  25. package/src/core/agent/prompts/channels/code.md +3 -1
  26. package/src/core/agent/prompts/channels/telegram.md +2 -0
  27. package/src/core/agent/prompts/channels/web_code.md +1 -1
  28. package/src/core/agent/prompts/channels/whatsapp.md +37 -0
  29. package/src/core/agent/prompts/core/agent-base.md +2 -0
  30. package/src/core/agent/prompts/discipline/action.md +1 -0
  31. package/src/core/agent/prompts/discipline/two-segment.md +2 -1
  32. package/src/core/agent/prompts/modes/mobility.md +36 -0
  33. package/src/core/agent/retry.js +42 -0
  34. package/src/core/agent/run-agent.js +322 -25
  35. package/src/core/agent/run-turn.js +253 -0
  36. package/src/core/agent/self-memory.js +18 -52
  37. package/src/core/agent/skills/agent-skills.js +118 -0
  38. package/src/core/agent/skills/catalog.js +1 -1
  39. package/src/core/agent/skills/declared.js +13 -0
  40. package/src/core/agent/skills/index-store.js +8 -1
  41. package/src/core/agent/skills/inspector.js +20 -3
  42. package/src/core/agent/skills/loader.js +18 -3
  43. package/src/core/agent/skills/media.js +121 -0
  44. package/src/core/agent/skills/origin.js +61 -0
  45. package/src/core/agent/skills/sections.js +136 -0
  46. package/src/core/agent/super-agent.js +54 -14
  47. package/src/core/agent/tools/handlers/_calendar.js +50 -0
  48. package/src/core/agent/tools/handlers/add-mcp.js +103 -0
  49. package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
  50. package/src/core/agent/tools/handlers/attach-media.js +56 -0
  51. package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
  52. package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
  53. package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
  54. package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
  55. package/src/core/agent/tools/handlers/call-agent.js +14 -6
  56. package/src/core/agent/tools/handlers/call-runtime.js +27 -49
  57. package/src/core/agent/tools/handlers/comment-task.js +78 -0
  58. package/src/core/agent/tools/handlers/complete-task.js +60 -0
  59. package/src/core/agent/tools/handlers/configure-agent.js +70 -0
  60. package/src/core/agent/tools/handlers/create-agent.js +68 -0
  61. package/src/core/agent/tools/handlers/create-task.js +41 -3
  62. package/src/core/agent/tools/handlers/import-agent.js +5 -5
  63. package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
  64. package/src/core/agent/tools/handlers/list-routines.js +46 -0
  65. package/src/core/agent/tools/handlers/list-tasks.js +8 -1
  66. package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
  67. package/src/core/agent/tools/handlers/read-skill.js +64 -0
  68. package/src/core/agent/tools/handlers/remember-routine.js +2 -8
  69. package/src/core/agent/tools/handlers/remember.js +82 -6
  70. package/src/core/agent/tools/handlers/remove-agent.js +42 -0
  71. package/src/core/agent/tools/handlers/run-routine.js +94 -0
  72. package/src/core/agent/tools/handlers/run-shell.js +44 -2
  73. package/src/core/agent/tools/handlers/send-telegram.js +41 -19
  74. package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
  75. package/src/core/agent/tools/handlers/view-media.js +69 -0
  76. package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
  77. package/src/core/agent/tools/helpers.js +36 -4
  78. package/src/core/agent/tools/names.js +64 -0
  79. package/src/core/agent/tools/registry-bridge.js +24 -1
  80. package/src/core/agent/tools/registry.js +79 -0
  81. package/src/core/agent/tools/tool-call-parser.js +136 -13
  82. package/src/core/agent/vision-bridge.js +69 -0
  83. package/src/core/apc/agent-identity.js +74 -0
  84. package/src/core/apc/agent-rename-refs.js +187 -0
  85. package/src/core/apc/agent-write.js +312 -0
  86. package/src/core/apc/agents-vault.js +1 -1
  87. package/src/core/apc/blob-keys.js +42 -0
  88. package/src/core/apc/frontmatter.js +166 -10
  89. package/src/core/apc/parser.js +33 -83
  90. package/src/core/apc/paths.js +4 -6
  91. package/src/core/apc/project-memory.js +44 -0
  92. package/src/core/apc/projects-helpers.js +33 -0
  93. package/src/core/apc/scaffold.js +36 -16
  94. package/src/core/channels/telegram/ask-callbacks.js +103 -0
  95. package/src/core/channels/telegram/dispatch.js +154 -30
  96. package/src/core/channels/telegram/helpers.js +59 -7
  97. package/src/core/channels/telegram/inbound/audio.js +26 -30
  98. package/src/core/channels/telegram/inbound/file.js +22 -32
  99. package/src/core/channels/telegram/inbound/photo.js +24 -28
  100. package/src/core/channels/telegram/progress-gate.js +76 -0
  101. package/src/core/channels/telegram/reply.js +151 -43
  102. package/src/core/channels/telegram/voice-note.js +150 -0
  103. package/src/core/config/index.js +53 -54
  104. package/src/core/config/paths.js +117 -31
  105. package/src/core/config/redact.js +89 -4
  106. package/src/core/config/secret-values.js +2 -4
  107. package/src/core/constants/actors.js +5 -0
  108. package/src/core/constants/channels.js +3 -1
  109. package/src/core/constants/task-categories.js +73 -0
  110. package/src/core/constants/task-fields.js +28 -0
  111. package/src/core/engines/_globs.js +33 -0
  112. package/src/core/engines/anthropic.js +19 -1
  113. package/src/core/engines/catalog.js +20 -0
  114. package/src/core/engines/gemini.js +84 -16
  115. package/src/core/engines/index.js +19 -3
  116. package/src/core/engines/mock.js +145 -1
  117. package/src/core/engines/openai-compatible.js +150 -15
  118. package/src/core/engines/presets.js +36 -9
  119. package/src/core/engines/zen.js +131 -0
  120. package/src/core/events/bus.js +140 -0
  121. package/src/core/events/mascot-notify.js +156 -0
  122. package/src/core/http-tools/browser.js +366 -36
  123. package/src/core/http-tools/catalog.js +206 -22
  124. package/src/core/http-tools/grep.js +62 -7
  125. package/src/core/http-tools/registry.js +3 -1
  126. package/src/core/i18n/en.js +34 -3
  127. package/src/core/i18n/es.js +36 -4
  128. package/src/core/i18n/index.js +5 -5
  129. package/src/core/i18n/pt.js +32 -3
  130. package/src/core/identity/self.js +14 -1
  131. package/src/core/images/engines/a1111.js +219 -0
  132. package/src/core/images/engines/index.js +187 -0
  133. package/src/core/images/engines/mock.js +74 -0
  134. package/src/core/images/engines/openai.js +130 -0
  135. package/src/core/images/engines/sdcpp.js +204 -0
  136. package/src/core/images/engines/shared.js +218 -0
  137. package/src/core/images/generate.js +260 -0
  138. package/src/core/integrations/catalog.js +8 -3
  139. package/src/core/integrations/plugins/_google-oauth.js +179 -0
  140. package/src/core/integrations/plugins/asana.js +7 -3
  141. package/src/core/integrations/plugins/calendar.js +404 -0
  142. package/src/core/integrations/store.js +2 -0
  143. package/src/core/memory/broker.js +16 -1
  144. package/src/core/memory/compactor.js +19 -3
  145. package/src/core/memory/consolidate.js +2 -2
  146. package/src/core/memory/dated-log.js +66 -0
  147. package/src/core/memory/embed-engines/custom.js +59 -0
  148. package/src/core/memory/embed-engines/gemini.js +9 -3
  149. package/src/core/memory/embed-engines/index.js +87 -15
  150. package/src/core/memory/embeddings.js +52 -24
  151. package/src/core/memory/index.js +13 -3
  152. package/src/core/memory/indexer.js +83 -27
  153. package/src/core/memory/prune.js +182 -0
  154. package/src/core/memory/store.js +22 -0
  155. package/src/core/memory/summarizer.js +72 -8
  156. package/src/core/mobility/answer.js +80 -0
  157. package/src/core/mobility/geofence.js +667 -0
  158. package/src/core/mobility/osm-route.js +282 -0
  159. package/src/core/mobility/preferences.js +91 -0
  160. package/src/core/mobility/state.js +245 -0
  161. package/src/core/mobility/trip-event.js +384 -0
  162. package/src/core/net/tailscale.js +168 -0
  163. package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
  164. package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
  165. package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
  166. package/src/core/profiles/bundled/secretary/profile.json +3 -1
  167. package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
  168. package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
  169. package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
  170. package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
  171. package/src/core/profiles/lifecycle.js +243 -19
  172. package/src/core/profiles/paths.js +12 -0
  173. package/src/core/profiles/store.js +47 -0
  174. package/src/core/routines/active-runs.js +213 -0
  175. package/src/core/routines/delivery.js +612 -0
  176. package/src/core/routines/header.js +88 -0
  177. package/src/core/routines/index.js +26 -0
  178. package/src/core/routines/run-log.js +78 -0
  179. package/src/core/routines/runner.js +629 -66
  180. package/src/core/routines/signals.js +75 -0
  181. package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
  182. package/src/core/runtime-skills/apx/SKILL.md +93 -1
  183. package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
  184. package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
  185. package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
  186. package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
  187. package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
  188. package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
  189. package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
  190. package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
  191. package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
  192. package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
  193. package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
  194. package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
  195. package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
  196. package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
  197. package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
  198. package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
  199. package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
  200. package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
  201. package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
  202. package/src/core/runtimes/_spawn.js +9 -1
  203. package/src/core/runtimes/claude-code.js +11 -2
  204. package/src/core/runtimes/codex.js +44 -10
  205. package/src/core/runtimes/index.js +17 -2
  206. package/src/core/runtimes/opencode.js +88 -9
  207. package/src/core/runtimes/outcome.js +119 -0
  208. package/src/core/sessions/index.js +193 -1
  209. package/src/core/stores/agent-inbox.js +109 -23
  210. package/src/core/stores/code-sessions.js +21 -0
  211. package/src/core/stores/commitments.js +27 -3
  212. package/src/core/stores/conversations.js +220 -20
  213. package/src/core/stores/deliveries.js +177 -0
  214. package/src/core/stores/media-archive.js +228 -0
  215. package/src/core/stores/messages.js +1096 -112
  216. package/src/core/stores/organization.js +34 -0
  217. package/src/core/stores/project-memory.js +71 -0
  218. package/src/core/stores/routine-memory.js +16 -8
  219. package/src/core/stores/routines.js +27 -49
  220. package/src/core/stores/sessions.js +4 -8
  221. package/src/core/stores/tasks.js +212 -18
  222. package/src/core/stores/turn-record.js +209 -0
  223. package/src/core/tasks/columns.js +136 -0
  224. package/src/core/tasks/comment-turn.js +258 -0
  225. package/src/core/util/time.js +13 -0
  226. package/src/core/voice/engines/index.js +54 -1
  227. package/src/core/voice/engines/openai.js +50 -4
  228. package/src/core/voice/opus.js +67 -0
  229. package/src/core/voice/pronounceable.js +43 -0
  230. package/src/core/voice/transcription.js +4 -0
  231. package/src/core/voice/tts.js +114 -24
  232. package/src/host/daemon/active-turns.js +188 -0
  233. package/src/host/daemon/api/admin-config.js +9 -0
  234. package/src/host/daemon/api/agents.js +99 -90
  235. package/src/host/daemon/api/artifact-preview.js +7 -6
  236. package/src/host/daemon/api/artifacts.js +3 -2
  237. package/src/host/daemon/api/code.js +55 -9
  238. package/src/host/daemon/api/commitments.js +11 -0
  239. package/src/host/daemon/api/confirm.js +3 -2
  240. package/src/host/daemon/api/conversations.js +543 -35
  241. package/src/host/daemon/api/deck.js +9 -8
  242. package/src/host/daemon/api/deliveries.js +33 -0
  243. package/src/host/daemon/api/desktop.js +5 -4
  244. package/src/host/daemon/api/embeddings.js +15 -6
  245. package/src/host/daemon/api/engines.js +59 -8
  246. package/src/host/daemon/api/exec.js +437 -121
  247. package/src/host/daemon/api/groups.js +215 -0
  248. package/src/host/daemon/api/images.js +107 -0
  249. package/src/host/daemon/api/inbox.js +123 -2
  250. package/src/host/daemon/api/integrations.js +64 -2
  251. package/src/host/daemon/api/mcps.js +7 -6
  252. package/src/host/daemon/api/media.js +283 -0
  253. package/src/host/daemon/api/mobility.js +177 -0
  254. package/src/host/daemon/api/net.js +182 -0
  255. package/src/host/daemon/api/pairing.js +38 -5
  256. package/src/host/daemon/api/profiles.js +30 -2
  257. package/src/host/daemon/api/routines.js +36 -4
  258. package/src/host/daemon/api/runtimes.js +74 -39
  259. package/src/host/daemon/api/sessions-search.js +7 -2
  260. package/src/host/daemon/api/sessions.js +44 -2
  261. package/src/host/daemon/api/shared.js +127 -20
  262. package/src/host/daemon/api/skills.js +11 -4
  263. package/src/host/daemon/api/super-agent.js +384 -53
  264. package/src/host/daemon/api/tasks.js +180 -10
  265. package/src/host/daemon/api/telegram.js +11 -10
  266. package/src/host/daemon/api/thread-faces.js +159 -0
  267. package/src/host/daemon/api/top-level.js +3 -3
  268. package/src/host/daemon/api/transcribe.js +11 -10
  269. package/src/host/daemon/api/tts.js +97 -4
  270. package/src/host/daemon/api/turn-abort.js +23 -0
  271. package/src/host/daemon/api/turns.js +49 -0
  272. package/src/host/daemon/api/voice.js +5 -4
  273. package/src/host/daemon/api/web.js +98 -0
  274. package/src/host/daemon/api.js +39 -0
  275. package/src/host/daemon/delivery-sweep.js +58 -0
  276. package/src/host/daemon/desktop-ws.js +5 -23
  277. package/src/host/daemon/events-ws.js +273 -0
  278. package/src/host/daemon/index.js +59 -15
  279. package/src/host/daemon/plugins/desktop/index.js +17 -4
  280. package/src/host/daemon/plugins/telegram/index.js +78 -40
  281. package/src/host/daemon/pty-bridge.py +99 -0
  282. package/src/host/daemon/routines-scheduler.js +1 -0
  283. package/src/host/daemon/smoke.js +1 -2
  284. package/src/host/daemon/terminal-ws.js +132 -0
  285. package/src/host/daemon/tts-keepwarm.js +87 -0
  286. package/src/host/daemon/wakeup.js +11 -6
  287. package/src/host/daemon/whisper-server.js +44 -0
  288. package/src/host/daemon/whisper-server.py +70 -13
  289. package/src/host/daemon/ws-auth.js +28 -0
  290. package/src/interfaces/android/app/build.gradle +42 -0
  291. package/src/interfaces/android/app/proguard-rules.pro +4 -0
  292. package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
  293. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
  294. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
  295. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
  296. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
  297. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
  298. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
  299. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
  300. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
  301. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
  302. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
  303. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
  304. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
  305. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
  306. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
  307. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
  308. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
  309. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
  310. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
  311. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
  312. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
  313. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
  314. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
  315. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
  316. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
  317. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
  318. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
  319. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
  320. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
  321. package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
  322. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
  323. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
  324. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
  325. package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
  326. package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
  327. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
  328. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
  329. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
  330. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
  331. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
  332. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
  333. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
  334. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
  335. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
  336. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
  337. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
  338. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
  339. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
  340. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
  341. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
  342. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
  343. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
  344. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
  345. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
  346. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
  347. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
  348. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
  349. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
  350. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
  351. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
  352. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
  353. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
  354. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
  355. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
  356. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
  357. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
  358. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
  359. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
  360. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
  361. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
  362. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  363. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  364. package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
  365. package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
  366. package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
  367. package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
  368. package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
  369. package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
  370. package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
  371. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
  372. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
  373. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
  374. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
  375. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
  376. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
  377. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
  378. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
  379. package/src/interfaces/android/build.gradle +3 -0
  380. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  381. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
  382. package/src/interfaces/android/gradle.properties +3 -0
  383. package/src/interfaces/android/gradlew +248 -0
  384. package/src/interfaces/android/gradlew.bat +82 -0
  385. package/src/interfaces/android/settings.gradle +18 -0
  386. package/src/interfaces/cli/commands/a2a.js +145 -4
  387. package/src/interfaces/cli/commands/agent.js +247 -22
  388. package/src/interfaces/cli/commands/code.js +1 -1
  389. package/src/interfaces/cli/commands/commitment.js +5 -0
  390. package/src/interfaces/cli/commands/config.js +85 -6
  391. package/src/interfaces/cli/commands/exec.js +90 -1
  392. package/src/interfaces/cli/commands/image.js +314 -0
  393. package/src/interfaces/cli/commands/mcp.js +87 -23
  394. package/src/interfaces/cli/commands/memory.js +35 -22
  395. package/src/interfaces/cli/commands/panel.js +94 -0
  396. package/src/interfaces/cli/commands/profile.js +14 -0
  397. package/src/interfaces/cli/commands/project.js +29 -0
  398. package/src/interfaces/cli/commands/routine.js +45 -10
  399. package/src/interfaces/cli/commands/runtime.js +30 -7
  400. package/src/interfaces/cli/commands/session.js +90 -38
  401. package/src/interfaces/cli/commands/sessions.js +35 -2
  402. package/src/interfaces/cli/commands/skills.js +15 -9
  403. package/src/interfaces/cli/commands/status.js +2 -3
  404. package/src/interfaces/cli/commands/task.js +54 -5
  405. package/src/interfaces/cli/commands/telegram.js +12 -4
  406. package/src/interfaces/cli/commands/transcribe.js +177 -0
  407. package/src/interfaces/cli/help/index.js +311 -72
  408. package/src/interfaces/cli/http.js +61 -13
  409. package/src/interfaces/cli/index.js +1 -1
  410. package/src/interfaces/cli/routes/agent.js +5 -4
  411. package/src/interfaces/cli/routes/commitment.js +3 -2
  412. package/src/interfaces/cli/routes/config.js +7 -2
  413. package/src/interfaces/cli/routes/image.js +11 -0
  414. package/src/interfaces/cli/routes/index.js +2 -0
  415. package/src/interfaces/cli/routes/log.js +1 -1
  416. package/src/interfaces/cli/routes/memory.js +3 -2
  417. package/src/interfaces/cli/routes/panel.js +15 -2
  418. package/src/interfaces/cli/routes/profile.js +3 -2
  419. package/src/interfaces/cli/routes/transcribe.js +10 -0
  420. package/src/interfaces/cli/stdin.js +29 -0
  421. package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
  422. package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
  423. package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
  424. package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
  425. package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
  426. package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
  427. package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
  428. package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
  429. package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
  430. package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
  431. package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
  432. package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
  433. package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
  434. package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
  435. package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
  436. package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
  437. package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
  438. package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
  439. package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
  440. package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
  441. package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
  442. package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
  443. package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
  444. package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
  445. package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
  446. package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
  447. package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
  448. package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
  449. package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
  450. package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
  451. package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
  452. package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
  453. package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
  454. package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
  455. package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
  456. package/src/interfaces/desktop/assets/notification.mp3 +0 -0
  457. package/src/interfaces/desktop/main.js +473 -29
  458. package/src/interfaces/desktop/mascot-blobs.js +41 -0
  459. package/src/interfaces/desktop/mascot-preload.js +32 -0
  460. package/src/interfaces/desktop/mascot.css +186 -0
  461. package/src/interfaces/desktop/mascot.html +40 -0
  462. package/src/interfaces/desktop/mascot.js +163 -0
  463. package/src/interfaces/desktop/preload.js +10 -0
  464. package/src/interfaces/desktop/renderer.js +308 -48
  465. package/src/interfaces/desktop/style.css +34 -0
  466. package/src/interfaces/mcp-server/index.js +87 -0
  467. package/src/interfaces/tui/_shims/util-locale.ts +0 -2
  468. package/src/interfaces/tui/app.tsx +0 -6
  469. package/src/interfaces/tui/attach.ts +0 -1
  470. package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
  471. package/src/interfaces/tui/plugin/api.tsx +0 -3
  472. package/src/interfaces/tui/plugin/runtime.ts +0 -3
  473. package/src/interfaces/tui/thread.ts +0 -16
  474. package/src/interfaces/web/README.md +22 -14
  475. package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
  476. package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
  477. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
  478. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
  479. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
  480. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
  481. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
  482. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
  483. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
  484. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
  485. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
  486. package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
  487. package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
  488. package/src/interfaces/web/dist/index.html +22 -6
  489. package/src/interfaces/web/dist/index.html.br +0 -0
  490. package/src/interfaces/web/dist/index.html.gz +0 -0
  491. package/src/interfaces/web/dist/manifest.webmanifest +25 -0
  492. package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
  493. package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
  494. package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
  495. package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
  496. package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
  497. package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
  498. package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
  499. package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
  500. package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
  501. package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
  502. package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
  503. package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
  504. package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
  505. package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
  506. package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
  507. package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
  508. package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
  509. package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
  510. package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
  511. package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
  512. package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
  513. package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
  514. package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
  515. package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
  516. package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
  517. package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
  518. package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
  519. package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
  520. package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
  521. package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
  522. package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
  523. package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
  524. package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
  525. package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
  526. package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
  527. package/src/interfaces/web/dist/sw.js +106 -0
  528. package/src/interfaces/web/dist/sw.js.br +0 -0
  529. package/src/interfaces/web/dist/sw.js.gz +0 -0
  530. package/src/interfaces/web/eslint.config.js +83 -0
  531. package/src/interfaces/web/index.html +20 -4
  532. package/src/interfaces/web/package-lock.json +1651 -1280
  533. package/src/interfaces/web/package.json +9 -10
  534. package/src/interfaces/web/pnpm-lock.yaml +867 -869
  535. package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
  536. package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
  537. package/src/interfaces/web/public/manifest.webmanifest +25 -0
  538. package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
  539. package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
  540. package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
  541. package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
  542. package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
  543. package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
  544. package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
  545. package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
  546. package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
  547. package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
  548. package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
  549. package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
  550. package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
  551. package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
  552. package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
  553. package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
  554. package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
  555. package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
  556. package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
  557. package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
  558. package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
  559. package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
  560. package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
  561. package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
  562. package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
  563. package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
  564. package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
  565. package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
  566. package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
  567. package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
  568. package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
  569. package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
  570. package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
  571. package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
  572. package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
  573. package/src/interfaces/web/public/sw.js +106 -0
  574. package/src/interfaces/web/src/App.tsx +106 -10
  575. package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
  576. package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
  577. package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
  578. package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
  579. package/src/interfaces/web/src/components/Combobox.tsx +201 -0
  580. package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
  581. package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
  582. package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
  583. package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
  584. package/src/interfaces/web/src/components/Roby.tsx +5 -3
  585. package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
  586. package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
  587. package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
  588. package/src/interfaces/web/src/components/Toast.tsx +50 -14
  589. package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
  590. package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
  591. package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
  592. package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
  593. package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
  594. package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
  595. package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
  596. package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
  597. package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
  598. package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
  599. package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
  600. package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
  601. package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
  602. package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
  603. package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
  604. package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
  605. package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
  606. package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
  607. package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
  608. package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
  609. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
  610. package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
  611. package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
  612. package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
  613. package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
  614. package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
  615. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
  616. package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
  617. package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
  618. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
  619. package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
  620. package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
  621. package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
  622. package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
  623. package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
  624. package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
  625. package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
  626. package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
  627. package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
  628. package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
  629. package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
  630. package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
  631. package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
  632. package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
  633. package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
  634. package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
  635. package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
  636. package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
  637. package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
  638. package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
  639. package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
  640. package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
  641. package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
  642. package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
  643. package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
  644. package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
  645. package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
  646. package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
  647. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
  648. package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
  649. package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
  650. package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
  651. package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
  652. package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
  653. package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
  654. package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
  655. package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
  656. package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
  657. package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
  658. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
  659. package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
  660. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
  661. package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
  662. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
  663. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
  664. package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
  665. package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
  666. package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
  667. package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
  668. package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
  669. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
  670. package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
  671. package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
  672. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
  673. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
  674. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
  675. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
  676. package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
  677. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
  678. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
  679. package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
  680. package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
  681. package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
  682. package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
  683. package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
  684. package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
  685. package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
  686. package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
  687. package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
  688. package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
  689. package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
  690. package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
  691. package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
  692. package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
  693. package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
  694. package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
  695. package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
  696. package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
  697. package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
  698. package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
  699. package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
  700. package/src/interfaces/web/src/components/ui.tsx +62 -23
  701. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
  702. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
  703. package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
  704. package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
  705. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
  706. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
  707. package/src/interfaces/web/src/constants/index.ts +1 -0
  708. package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
  709. package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
  710. package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
  711. package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
  712. package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
  713. package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
  714. package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
  715. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
  716. package/src/interfaces/web/src/i18n/en.ts +832 -175
  717. package/src/interfaces/web/src/i18n/es.ts +841 -188
  718. package/src/interfaces/web/src/lib/api/agents.ts +23 -4
  719. package/src/interfaces/web/src/lib/api/code.ts +17 -0
  720. package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
  721. package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
  722. package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
  723. package/src/interfaces/web/src/lib/api/engines.ts +14 -0
  724. package/src/interfaces/web/src/lib/api/groups.ts +93 -0
  725. package/src/interfaces/web/src/lib/api/images.ts +193 -0
  726. package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
  727. package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
  728. package/src/interfaces/web/src/lib/api/media.ts +126 -0
  729. package/src/interfaces/web/src/lib/api/net.ts +44 -0
  730. package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
  731. package/src/interfaces/web/src/lib/api/projects.ts +9 -1
  732. package/src/interfaces/web/src/lib/api/routines.ts +9 -1
  733. package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
  734. package/src/interfaces/web/src/lib/api/skills.ts +8 -0
  735. package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
  736. package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
  737. package/src/interfaces/web/src/lib/api/tools.ts +2 -0
  738. package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
  739. package/src/interfaces/web/src/lib/api/turns.ts +20 -0
  740. package/src/interfaces/web/src/lib/api/voice.ts +72 -2
  741. package/src/interfaces/web/src/lib/api.ts +3 -0
  742. package/src/interfaces/web/src/lib/channels.ts +214 -0
  743. package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
  744. package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
  745. package/src/interfaces/web/src/lib/code-context.ts +0 -2
  746. package/src/interfaces/web/src/lib/http.ts +51 -17
  747. package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
  748. package/src/interfaces/web/src/lib/live.ts +252 -0
  749. package/src/interfaces/web/src/lib/net.ts +211 -0
  750. package/src/interfaces/web/src/lib/notify.ts +331 -0
  751. package/src/interfaces/web/src/lib/projectNav.ts +40 -0
  752. package/src/interfaces/web/src/lib/pwa.ts +115 -0
  753. package/src/interfaces/web/src/lib/qvox.ts +24 -0
  754. package/src/interfaces/web/src/lib/slug.ts +3 -0
  755. package/src/interfaces/web/src/lib/tone.ts +150 -0
  756. package/src/interfaces/web/src/main.tsx +15 -4
  757. package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
  758. package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
  759. package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
  760. package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
  761. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
  762. package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
  763. package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
  764. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
  765. package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
  766. package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
  767. package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
  768. package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
  769. package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
  770. package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
  771. package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
  772. package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
  773. package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
  774. package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
  775. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
  776. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
  777. package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
  778. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
  779. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
  780. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
  781. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
  782. package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
  783. package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
  784. package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
  785. package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
  786. package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
  787. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
  788. package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
  789. package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
  790. package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
  791. package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
  792. package/src/interfaces/web/src/styles.css +106 -31
  793. package/src/interfaces/web/src/types/daemon.ts +246 -2
  794. package/src/interfaces/web/src/vite-env.d.ts +20 -0
  795. package/src/interfaces/tui/plugin/command-shim.ts +0 -109
  796. package/src/interfaces/web/components.json +0 -25
  797. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
  798. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
  799. package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
  800. package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
  801. package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
  802. package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
  803. package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
  804. package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
  805. package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
  806. package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
  807. package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
  808. package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
  809. package/src/interfaces/web/src/components/ui/card.tsx +0 -103
  810. package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
  811. package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
  812. package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
  813. package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
  814. package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
  815. package/src/interfaces/web/src/components/ui/command.tsx +0 -196
  816. package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
  817. package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
  818. package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
  819. package/src/interfaces/web/src/components/ui/field.tsx +0 -236
  820. package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
  821. package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
  822. package/src/interfaces/web/src/components/ui/item.tsx +0 -201
  823. package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
  824. package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
  825. package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
  826. package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
  827. package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
  828. package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
  829. package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
  830. package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
  831. package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
  832. package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
  833. package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
  834. package/src/interfaces/web/src/components/ui/table.tsx +0 -116
  835. package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
  836. package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
  837. package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
  838. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
@@ -0,0 +1,66 @@
1
+ // AUTO-GENERATED by scripts/export_android_mascot_assets.py — do not edit by hand.
2
+ package dev.agentprojectcontext.apx;
3
+
4
+ import android.graphics.Color;
5
+
6
+ final class MascotBlobCatalog {
7
+ static final String DEFAULT_KEY = "noche";
8
+
9
+ static final class Preset {
10
+ final String key;
11
+ final int drawable;
12
+ final int eyeColor;
13
+ final float[][] eyes;
14
+
15
+ Preset(String key, int drawable, int eyeColor, float[][] eyes) {
16
+ this.key = key;
17
+ this.drawable = drawable;
18
+ this.eyeColor = eyeColor;
19
+ this.eyes = eyes;
20
+ }
21
+ }
22
+
23
+ static Preset forKey(String value) {
24
+ String key = value == null ? DEFAULT_KEY : value.trim();
25
+ return switch (key) {
26
+ case "menta" -> new Preset("menta", R.drawable.mascot_menta, Color.parseColor("#15181C"), new float[][]{new float[]{121.9f, 93.1f, 16.0f, 33.8f, 6.4f}, new float[]{151.9f, 93.1f, 16.0f, 33.8f, 6.4f}});
27
+ case "parche" -> new Preset("parche", R.drawable.mascot_parche, Color.parseColor("#15181C"), new float[][]{new float[]{133.6f, 88.6f, 17.3f, 33.8f, 6.9f}, new float[]{166.1f, 88.6f, 17.3f, 33.8f, 6.9f}});
28
+ case "trino" -> new Preset("trino", R.drawable.mascot_trino, Color.parseColor("#15181C"), new float[][]{new float[]{105.5f, 130.1f, 18.0f, 29.7f, 7.2f}, new float[]{141.5f, 130.1f, 18.0f, 29.7f, 7.2f}});
29
+ case "cubi" -> new Preset("cubi", R.drawable.mascot_cubi, Color.parseColor("#15181C"), new float[][]{new float[]{103.2f, 93.1f, 17.2f, 33.8f, 6.9f}, new float[]{135.6f, 93.1f, 17.2f, 33.8f, 6.9f}});
30
+ case "nimbo" -> new Preset("nimbo", R.drawable.mascot_nimbo, Color.parseColor("#15181C"), new float[][]{new float[]{103.3f, 93.1f, 17.1f, 33.8f, 6.9f}, new float[]{135.6f, 93.1f, 17.1f, 33.8f, 6.9f}});
31
+ case "papa" -> new Preset("papa", R.drawable.mascot_papa, Color.parseColor("#15181C"), new float[][]{new float[]{125.5f, 90.9f, 18.5f, 30.5f, 7.4f}, new float[]{161.6f, 90.9f, 18.5f, 30.5f, 7.4f}});
32
+ case "noche" -> new Preset("noche", R.drawable.mascot_noche, Color.parseColor("#3AE7B0"), new float[][]{new float[]{123.8f, 133.6f, 15.9f, 33.8f, 6.4f}, new float[]{157.6f, 133.6f, 15.9f, 33.8f, 6.4f}});
33
+ case "kiwi" -> new Preset("kiwi", R.drawable.mascot_kiwi, Color.parseColor("#15181C"), new float[][]{new float[]{123.0f, 84.1f, 13.1f, 29.3f, 5.2f}, new float[]{147.7f, 84.1f, 13.1f, 29.3f, 5.2f}});
34
+ case "gajo" -> new Preset("gajo", R.drawable.mascot_gajo, Color.parseColor("#15181C"), new float[][]{new float[]{107.9f, 95.3f, 16.6f, 29.3f, 6.7f}, new float[]{139.3f, 95.3f, 16.6f, 29.3f, 6.7f}});
35
+ case "campana" -> new Preset("campana", R.drawable.mascot_campana, Color.parseColor("#15181C"), new float[][]{new float[]{108.6f, 86.3f, 15.8f, 29.3f, 6.3f}, new float[]{135.5f, 86.3f, 15.8f, 29.3f, 6.3f}});
36
+ case "cobalto" -> new Preset("cobalto", R.drawable.mascot_cobalto, Color.parseColor("#15181C"), new float[][]{new float[]{125.5f, 95.3f, 16.8f, 29.3f, 6.7f}, new float[]{157.2f, 95.3f, 16.8f, 29.3f, 6.7f}});
37
+ case "rubi" -> new Preset("rubi", R.drawable.mascot_rubi, Color.parseColor("#15181C"), new float[][]{new float[]{123.0f, 84.1f, 13.1f, 29.3f, 5.2f}, new float[]{147.7f, 84.1f, 13.1f, 29.3f, 5.2f}});
38
+ case "trebol" -> new Preset("trebol", R.drawable.mascot_trebol, Color.parseColor("#15181C"), new float[][]{new float[]{123.6f, 120.1f, 17.2f, 29.3f, 6.9f}, new float[]{155.1f, 120.1f, 17.2f, 29.3f, 6.9f}});
39
+ case "saturno" -> new Preset("saturno", R.drawable.mascot_saturno, Color.parseColor("#15181C"), new float[][]{});
40
+ case "onyx" -> new Preset("onyx", R.drawable.mascot_onyx, Color.parseColor("#3AE7B0"), new float[][]{new float[]{119.7f, 124.6f, 16.6f, 29.3f, 6.6f}, new float[]{152.9f, 124.6f, 16.6f, 29.3f, 6.6f}});
41
+ case "perla" -> new Preset("perla", R.drawable.mascot_perla, Color.parseColor("#15181C"), new float[][]{new float[]{121.4f, 108.4f, 13.5f, 21.4f, 5.4f}, new float[]{148.5f, 108.4f, 13.5f, 21.4f, 5.4f}});
42
+ case "faro" -> new Preset("faro", R.drawable.mascot_faro, Color.parseColor("#15181C"), new float[][]{new float[]{94.4f, 100.0f, 14.2f, 20.3f, 5.7f}, new float[]{122.7f, 100.0f, 14.2f, 20.3f, 5.7f}});
43
+ case "brasa" -> new Preset("brasa", R.drawable.mascot_brasa, Color.parseColor("#15181C"), new float[][]{new float[]{94.8f, 95.2f, 16.9f, 18.6f, 6.8f}, new float[]{126.3f, 95.2f, 16.9f, 18.6f, 6.8f}});
44
+ case "aqua" -> new Preset("aqua", R.drawable.mascot_aqua, Color.parseColor("#15181C"), new float[][]{new float[]{92.9f, 105.8f, 10.9f, 20.3f, 4.4f}, new float[]{114.7f, 105.8f, 10.9f, 20.3f, 4.4f}});
45
+ case "coral" -> new Preset("coral", R.drawable.mascot_coral, Color.parseColor("#15181C"), new float[][]{new float[]{99.4f, 147.0f, 14.5f, 19.1f, 5.8f}, new float[]{129.3f, 147.0f, 14.5f, 19.1f, 5.8f}});
46
+ case "zafiro" -> new Preset("zafiro", R.drawable.mascot_zafiro, Color.parseColor("#15181C"), new float[][]{new float[]{105.7f, 116.5f, 14.3f, 21.4f, 5.7f}, new float[]{132.4f, 116.5f, 14.3f, 21.4f, 5.7f}});
47
+ case "pino" -> new Preset("pino", R.drawable.mascot_pino, Color.parseColor("#15181C"), new float[][]{new float[]{125.0f, 123.2f, 13.4f, 20.3f, 5.4f}, new float[]{151.9f, 123.2f, 13.4f, 20.3f, 5.4f}});
48
+ case "eclipse" -> new Preset("eclipse", R.drawable.mascot_eclipse, Color.parseColor("#060709"), new float[][]{new float[]{102.8f, 111.9f, 15.5f, 20.3f, 6.2f}, new float[]{131.5f, 111.9f, 15.5f, 20.3f, 6.2f}});
49
+ case "peon" -> new Preset("peon", R.drawable.mascot_peon, Color.parseColor("#15181C"), new float[][]{new float[]{109.1f, 85.6f, 10.2f, 18.0f, 4.1f}, new float[]{132.9f, 85.6f, 10.2f, 18.0f, 4.1f}});
50
+ case "ovni" -> new Preset("ovni", R.drawable.mascot_ovni, Color.parseColor("#15181C"), new float[][]{new float[]{106.6f, 105.0f, 15.8f, 16.0f, 6.3f}, new float[]{138.1f, 105.0f, 15.8f, 16.0f, 6.3f}});
51
+ case "amatista" -> new Preset("amatista", R.drawable.mascot_amatista, Color.parseColor("#15181C"), new float[][]{new float[]{85.8f, 103.4f, 16.9f, 18.3f, 6.8f}, new float[]{117.3f, 103.4f, 16.9f, 18.3f, 6.8f}});
52
+ case "volcan" -> new Preset("volcan", R.drawable.mascot_volcan, Color.parseColor("#15181C"), new float[][]{new float[]{100.6f, 97.4f, 13.4f, 19.1f, 5.4f}, new float[]{127.5f, 97.4f, 13.4f, 19.1f, 5.4f}});
53
+ case "quad" -> new Preset("quad", R.drawable.mascot_quad, Color.parseColor("#15181C"), new float[][]{new float[]{80.9f, 68.2f, 17.6f, 21.8f, 7.0f}, new float[]{148.5f, 68.2f, 17.6f, 21.8f, 7.0f}});
54
+ case "cometa" -> new Preset("cometa", R.drawable.mascot_cometa, Color.parseColor("#15181C"), new float[][]{new float[]{107.5f, 94.8f, 15.7f, 21.4f, 6.3f}, new float[]{136.9f, 94.8f, 15.7f, 21.4f, 6.3f}});
55
+ case "lila" -> new Preset("lila", R.drawable.mascot_lila, Color.parseColor("#15181C"), new float[][]{new float[]{104.8f, 104.3f, 14.1f, 20.3f, 5.6f}, new float[]{133.0f, 104.3f, 14.1f, 20.3f, 5.6f}});
56
+ case "orbita" -> new Preset("orbita", R.drawable.mascot_orbita, Color.parseColor("#060709"), new float[][]{new float[]{104.3f, 96.7f, 15.8f, 18.7f, 6.3f}, new float[]{135.9f, 96.7f, 15.8f, 18.7f, 6.3f}});
57
+ case "caracol" -> new Preset("caracol", R.drawable.mascot_caracol, Color.parseColor("#15181C"), new float[][]{new float[]{149.9f, 109.4f, 14.6f, 17.1f, 5.9f}, new float[]{181.4f, 109.4f, 14.6f, 17.1f, 5.9f}});
58
+ case "iris" -> new Preset("iris", R.drawable.mascot_iris, Color.parseColor("#15181C"), new float[][]{new float[]{97.7f, 106.6f, 13.7f, 20.3f, 5.5f}, new float[]{125.1f, 106.6f, 13.7f, 20.3f, 5.5f}});
59
+ case "laguna" -> new Preset("laguna", R.drawable.mascot_laguna, Color.parseColor("#15181C"), new float[][]{new float[]{106.6f, 83.8f, 15.8f, 18.5f, 6.3f}, new float[]{138.1f, 83.8f, 15.8f, 18.5f, 6.3f}});
60
+ case "carbon" -> new Preset("carbon", R.drawable.mascot_carbon, Color.parseColor("#060709"), new float[][]{new float[]{93.7f, 99.3f, 16.3f, 21.4f, 6.5f}, new float[]{124.2f, 99.3f, 16.3f, 21.4f, 6.5f}});
61
+ default -> forKey(DEFAULT_KEY);
62
+ };
63
+ }
64
+
65
+ private MascotBlobCatalog() {}
66
+ }
@@ -0,0 +1,448 @@
1
+ package dev.agentprojectcontext.apx;
2
+
3
+ import android.app.Notification;
4
+ import android.app.NotificationChannel;
5
+ import android.app.NotificationManager;
6
+ import android.app.PendingIntent;
7
+ import android.app.Service;
8
+ import android.content.BroadcastReceiver;
9
+ import android.content.Context;
10
+ import android.content.Intent;
11
+ import android.content.IntentFilter;
12
+ import android.content.res.AssetFileDescriptor;
13
+ import android.graphics.PixelFormat;
14
+ import android.media.AudioAttributes;
15
+ import android.media.MediaPlayer;
16
+ import android.net.ConnectivityManager;
17
+ import android.net.Network;
18
+ import android.os.Build;
19
+ import android.os.Handler;
20
+ import android.os.IBinder;
21
+ import android.os.Looper;
22
+ import android.provider.Settings;
23
+ import android.view.Gravity;
24
+ import android.view.WindowManager;
25
+
26
+ import okhttp3.Request;
27
+ import okhttp3.Response;
28
+ import okhttp3.WebSocket;
29
+ import okhttp3.WebSocketListener;
30
+
31
+ public final class MascotOverlayService extends Service {
32
+ static final String ACTION_STOP = "dev.agentprojectcontext.apx.STOP_MASCOT";
33
+ static final String ACTION_SHOW = "dev.agentprojectcontext.apx.SHOW_MASCOT";
34
+ static final String ACTION_APP_FOREGROUND = "dev.agentprojectcontext.apx.APP_FOREGROUND";
35
+ static final String ACTION_APP_BACKGROUND = "dev.agentprojectcontext.apx.APP_BACKGROUND";
36
+ static final String ACTION_TEST_MESSAGE = "dev.agentprojectcontext.apx.TEST_MESSAGE";
37
+ static final String EXTRA_TEST_MESSAGE = "test_message";
38
+ private static final String SERVICE_CHANNEL = "apx_mascot";
39
+ private static final int SERVICE_NOTIFICATION = 7001;
40
+
41
+ // Two reconnect ladders, because the socket is worth two different amounts
42
+ // of battery. On a drive it is the only path a proximity card has, so a
43
+ // drop is repaired in seconds. Parked — which is most of the day — the
44
+ // daemon is often simply not addressable from where the phone is, and
45
+ // redialling it every 15 seconds for eight hours is a couple of thousand
46
+ // radio wakeups that cannot succeed. That is what the battery screen was
47
+ // reporting, and it is the whole reason this app looked expensive.
48
+ private static final long TRIP_MAX_BACKOFF_MS = 15_000L;
49
+ private static final long IDLE_MAX_BACKOFF_MS = 5 * 60_000L;
50
+
51
+ private final Handler main = new Handler(Looper.getMainLooper());
52
+ private WindowManager windowManager;
53
+ private WindowManager.LayoutParams params;
54
+ private MascotView mascotView;
55
+ private android.widget.TextView dismissTarget;
56
+ private boolean overDismissTarget;
57
+ private ApxPreferences preferences;
58
+ private WebSocket socket;
59
+ private boolean destroyed;
60
+ private boolean foregroundStarted;
61
+ private boolean appForeground;
62
+ private int reconnectAttempts;
63
+ private ConnectivityManager connectivity;
64
+ private final Runnable reconnect = this::connect;
65
+ private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
66
+ @Override public void onAvailable(Network network) {
67
+ // A network arriving is better news than any timer: dial now and
68
+ // drop the ladder, instead of waiting out a backoff that was
69
+ // scheduled while the phone had no way to reach anything.
70
+ main.post(() -> {
71
+ main.removeCallbacks(reconnect);
72
+ reconnectAttempts = 0;
73
+ if (socket == null) connect();
74
+ });
75
+ }
76
+
77
+ @Override public void onLost(Network network) {
78
+ // Nothing left to dial. Stop the ladder and wait to be told there
79
+ // is a network again — onAvailable is what restarts it.
80
+ main.post(() -> {
81
+ if (!networkUp()) main.removeCallbacks(reconnect);
82
+ });
83
+ }
84
+ };
85
+ private final BroadcastReceiver travelReceiver = new BroadcastReceiver() {
86
+ @Override public void onReceive(Context context, Intent intent) {
87
+ if (!preferences.travelActive()) return;
88
+ // Traveller mode just opened. Whatever idle backoff was pending,
89
+ // the socket carries proximity cards now — connect straight away.
90
+ main.removeCallbacks(reconnect);
91
+ reconnectAttempts = 0;
92
+ if (socket == null) connect();
93
+ }
94
+ };
95
+
96
+ @Override
97
+ public void onCreate() {
98
+ super.onCreate();
99
+ preferences = new ApxPreferences(this);
100
+ createChannels();
101
+ connectivity = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
102
+ try {
103
+ connectivity.registerDefaultNetworkCallback(networkCallback);
104
+ } catch (RuntimeException unavailable) {
105
+ // Without the callback the ladder is the only way back; it still
106
+ // works, it just cannot wake early.
107
+ android.util.Log.w("APX", "No connectivity callback: " + unavailable.getMessage());
108
+ }
109
+ IntentFilter travel = new IntentFilter(MapsNavigationListenerService.ACTION_TRAVEL_STATE_CHANGED);
110
+ if (Build.VERSION.SDK_INT >= 33) registerReceiver(travelReceiver, travel, RECEIVER_NOT_EXPORTED);
111
+ else registerReceiver(travelReceiver, travel);
112
+ }
113
+
114
+ @Override
115
+ public int onStartCommand(Intent intent, int flags, int startId) {
116
+ if (intent != null && ACTION_STOP.equals(intent.getAction())) {
117
+ preferences.setMascotEnabled(false);
118
+ removeOverlay();
119
+ }
120
+ if (intent != null && ACTION_SHOW.equals(intent.getAction())) {
121
+ preferences.setMascotEnabled(true);
122
+ }
123
+ if (intent != null && ACTION_APP_FOREGROUND.equals(intent.getAction())) appForeground = true;
124
+ if (intent != null && ACTION_APP_BACKGROUND.equals(intent.getAction())) appForeground = false;
125
+ if (!foregroundStarted) {
126
+ startForeground(SERVICE_NOTIFICATION, serviceNotification());
127
+ foregroundStarted = true;
128
+ }
129
+ if (!preferences.paired()) {
130
+ stopSelf();
131
+ return START_NOT_STICKY;
132
+ }
133
+ if (appForeground || !preferences.mascotEnabled() || !Settings.canDrawOverlays(this)) {
134
+ removeOverlay();
135
+ } else if (mascotView == null) {
136
+ addOverlay();
137
+ }
138
+ if (foregroundStarted) {
139
+ ((NotificationManager) getSystemService(NOTIFICATION_SERVICE))
140
+ .notify(SERVICE_NOTIFICATION, serviceNotification());
141
+ }
142
+ if (socket == null) connect();
143
+ if (intent != null && ACTION_TEST_MESSAGE.equals(intent.getAction())) {
144
+ String message = intent.getStringExtra(EXTRA_TEST_MESSAGE);
145
+ main.post(() -> presentMessage(message == null || message.isBlank()
146
+ ? "Prueba APX: aviso directo en Android Auto."
147
+ : message));
148
+ }
149
+ return START_STICKY;
150
+ }
151
+
152
+ private void addOverlay() {
153
+ windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
154
+ int width = dp(210);
155
+ int height = dp(225);
156
+ android.util.DisplayMetrics metrics = getResources().getDisplayMetrics();
157
+ int fallbackX = Math.max(0, metrics.widthPixels - width - dp(10));
158
+ int fallbackY = Math.max(0, metrics.heightPixels - height - dp(60));
159
+ params = new WindowManager.LayoutParams(
160
+ width,
161
+ height,
162
+ Build.VERSION.SDK_INT >= 26 ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE,
163
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
164
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
165
+ WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
166
+ PixelFormat.TRANSLUCENT
167
+ );
168
+ params.gravity = Gravity.TOP | Gravity.START;
169
+ params.x = preferences.mascotX(fallbackX);
170
+ params.y = preferences.mascotY(fallbackY);
171
+
172
+ mascotView = new MascotView(this, preferences.mascotAvatar(), new MascotView.Listener() {
173
+ @Override public void onDragStarted() {
174
+ showDismissTarget();
175
+ }
176
+
177
+ @Override public void onMove(float rawX, float rawY, float offsetX, float offsetY) {
178
+ params.x = Math.round(rawX - offsetX);
179
+ params.y = Math.round(rawY - offsetY);
180
+ try { windowManager.updateViewLayout(mascotView, params); } catch (RuntimeException ignored) {}
181
+ updateDismissTarget(rawX, rawY);
182
+ }
183
+
184
+ @Override public void onDragEnded(boolean cancelled) {
185
+ boolean dismiss = !cancelled && overDismissTarget;
186
+ hideDismissTarget();
187
+ if (dismiss) {
188
+ preferences.setMascotEnabled(false);
189
+ removeOverlay();
190
+ ((NotificationManager) getSystemService(NOTIFICATION_SERVICE))
191
+ .notify(SERVICE_NOTIFICATION, serviceNotification());
192
+ } else {
193
+ preferences.saveMascotPosition(params.x, params.y);
194
+ }
195
+ }
196
+
197
+ @Override public void onTapped() {
198
+ openMobile();
199
+ }
200
+ });
201
+ windowManager.addView(mascotView, params);
202
+ }
203
+
204
+ private void showDismissTarget() {
205
+ if (dismissTarget != null || windowManager == null) return;
206
+ dismissTarget = new android.widget.TextView(this);
207
+ dismissTarget.setText("×");
208
+ dismissTarget.setTextSize(34);
209
+ dismissTarget.setTextColor(android.graphics.Color.WHITE);
210
+ dismissTarget.setGravity(Gravity.CENTER);
211
+ dismissTarget.setTypeface(null, android.graphics.Typeface.BOLD);
212
+ setDismissTargetActive(false);
213
+
214
+ WindowManager.LayoutParams dismissParams = new WindowManager.LayoutParams(
215
+ dp(76),
216
+ dp(76),
217
+ Build.VERSION.SDK_INT >= 26 ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE,
218
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
219
+ WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
220
+ WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
221
+ PixelFormat.TRANSLUCENT
222
+ );
223
+ dismissParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
224
+ dismissParams.y = dp(28);
225
+ try { windowManager.addView(dismissTarget, dismissParams); } catch (RuntimeException ignored) {
226
+ dismissTarget = null;
227
+ }
228
+ }
229
+
230
+ private void updateDismissTarget(float rawX, float rawY) {
231
+ if (dismissTarget == null) return;
232
+ android.util.DisplayMetrics metrics = getResources().getDisplayMetrics();
233
+ float targetX = metrics.widthPixels / 2f;
234
+ float targetY = metrics.heightPixels - dp(66);
235
+ boolean active = Math.hypot(rawX - targetX, rawY - targetY) <= dp(92);
236
+ if (active == overDismissTarget) return;
237
+ overDismissTarget = active;
238
+ setDismissTargetActive(active);
239
+ dismissTarget.animate().scaleX(active ? 1.18f : 1f).scaleY(active ? 1.18f : 1f).setDuration(120).start();
240
+ }
241
+
242
+ private void setDismissTargetActive(boolean active) {
243
+ if (dismissTarget == null) return;
244
+ android.graphics.drawable.GradientDrawable background = new android.graphics.drawable.GradientDrawable();
245
+ background.setShape(android.graphics.drawable.GradientDrawable.OVAL);
246
+ background.setColor(active
247
+ ? android.graphics.Color.rgb(224, 64, 64)
248
+ : android.graphics.Color.argb(205, 74, 79, 78));
249
+ dismissTarget.setBackground(background);
250
+ }
251
+
252
+ private void hideDismissTarget() {
253
+ overDismissTarget = false;
254
+ if (dismissTarget == null || windowManager == null) return;
255
+ try { windowManager.removeView(dismissTarget); } catch (RuntimeException ignored) {}
256
+ dismissTarget = null;
257
+ }
258
+
259
+ private void connect() {
260
+ if (destroyed || !preferences.paired()) return;
261
+ Request request = new Request.Builder()
262
+ .url(DaemonAddress.webSocketUrl(preferences.daemonUrl(), preferences.token()))
263
+ .build();
264
+ socket = DaemonClient.HTTP.newWebSocket(request, new WebSocketListener() {
265
+ @Override public void onOpen(WebSocket webSocket, Response response) {
266
+ reconnectAttempts = 0;
267
+ }
268
+
269
+ @Override public void onMessage(WebSocket webSocket, String text) {
270
+ handleFrame(text);
271
+ }
272
+
273
+ @Override public void onClosed(WebSocket webSocket, int code, String reason) {
274
+ clearAndReconnect(webSocket);
275
+ }
276
+
277
+ @Override public void onFailure(WebSocket webSocket, Throwable error, Response response) {
278
+ clearAndReconnect(webSocket);
279
+ }
280
+ });
281
+ }
282
+
283
+ private void clearAndReconnect(WebSocket failed) {
284
+ if (socket == failed) socket = null;
285
+ if (destroyed) return;
286
+ if (!networkUp()) {
287
+ // Airplane mode, no signal, Wi-Fi off. Retrying would burn the
288
+ // radio to reach a daemon that is not addressable from here; the
289
+ // connectivity callback wakes us when that changes.
290
+ main.removeCallbacks(reconnect);
291
+ return;
292
+ }
293
+ long ceiling = preferences.travelActive() ? TRIP_MAX_BACKOFF_MS : IDLE_MAX_BACKOFF_MS;
294
+ long delay = Math.min(ceiling, 1_000L << Math.min(reconnectAttempts++, 8));
295
+ main.removeCallbacks(reconnect);
296
+ main.postDelayed(reconnect, delay);
297
+ }
298
+
299
+ /**
300
+ * Is there any network at all? Deliberately not a check for internet
301
+ * capability — the daemon usually lives on the LAN or a tailnet, and a
302
+ * Wi-Fi that Android has decided has no internet still reaches it.
303
+ */
304
+ private boolean networkUp() {
305
+ if (connectivity == null) return true;
306
+ try {
307
+ return connectivity.getActiveNetwork() != null;
308
+ } catch (RuntimeException unknown) {
309
+ return true;
310
+ }
311
+ }
312
+
313
+ private void handleFrame(String text) {
314
+ String avatar = MessageFrameParser.avatar(text);
315
+ if (avatar != null) {
316
+ preferences.setMascotAvatar(avatar);
317
+ main.post(() -> {
318
+ if (mascotView != null) mascotView.setAvatar(avatar);
319
+ });
320
+ }
321
+ // A proximity alert is its own frame and its own card — four buttons,
322
+ // not a bubble. It is gated on the same "mobility" channel the owner
323
+ // can mute, because it interrupts exactly like the rest.
324
+ MessageFrameParser.MobilityAlert alert = MessageFrameParser.mobilityAlert(text);
325
+ if (alert != null) {
326
+ if (preferences.notifyChannelEnabled("mobility")) {
327
+ // The head unit reads from the store; the phone gets a card.
328
+ // Both, always: the driver may be looking at either one.
329
+ CarAlertStore.put(alert);
330
+ main.post(() -> {
331
+ ProximityNotification.show(this, alert);
332
+ if (mascotView != null) mascotView.showMessage(alert.body());
333
+ if (preferences.soundEnabled()) playNotificationSound();
334
+ });
335
+ }
336
+ return;
337
+ }
338
+
339
+ for (MessageFrameParser.Notice notice : MessageFrameParser.notices(text)) {
340
+ // One gate for the bubble, the sound and the car card: a channel
341
+ // the owner muted must not reach him by any of the three. He can
342
+ // still read every one of them in /mobile — this decides what
343
+ // INTERRUPTS, not what exists.
344
+ if (!preferences.notifyChannelEnabled(notice.channel())) continue;
345
+ main.post(() -> presentMessage(notice.text()));
346
+ }
347
+ }
348
+
349
+ private void presentMessage(String message) {
350
+ if (mascotView != null) mascotView.showMessage(message);
351
+ if (preferences.soundEnabled()) playNotificationSound();
352
+ CarMessageNotification.show(this, message);
353
+ }
354
+
355
+ private void playNotificationSound() {
356
+ MediaPlayer player = new MediaPlayer();
357
+ player.setAudioAttributes(new AudioAttributes.Builder()
358
+ .setUsage(AudioAttributes.USAGE_MEDIA)
359
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
360
+ .build());
361
+ try (AssetFileDescriptor audio = getResources().openRawResourceFd(R.raw.apx_notification)) {
362
+ player.setDataSource(audio.getFileDescriptor(), audio.getStartOffset(), audio.getLength());
363
+ player.setOnCompletionListener(MediaPlayer::release);
364
+ player.setOnErrorListener((failed, what, extra) -> {
365
+ failed.release();
366
+ return true;
367
+ });
368
+ player.prepare();
369
+ player.start();
370
+ android.util.Log.i("APX", "Message sound started");
371
+ } catch (Exception error) {
372
+ player.release();
373
+ android.util.Log.w("APX", "Could not play message sound", error);
374
+ }
375
+ }
376
+
377
+ private void removeOverlay() {
378
+ hideDismissTarget();
379
+ if (mascotView == null || windowManager == null) return;
380
+ try { windowManager.removeView(mascotView); } catch (RuntimeException ignored) {}
381
+ mascotView = null;
382
+ }
383
+
384
+ private void createChannels() {
385
+ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
386
+ NotificationChannel service = new NotificationChannel(SERVICE_CHANNEL, getString(R.string.mascot_channel), NotificationManager.IMPORTANCE_LOW);
387
+ service.setDescription("Mantiene mascota APX y conexión local activas.");
388
+ manager.createNotificationChannel(service);
389
+ NotificationChannel messages = new NotificationChannel(CarMessageNotification.CHANNEL, getString(R.string.messages_channel), NotificationManager.IMPORTANCE_HIGH);
390
+ messages.setDescription("Mensajes nuevos recibidos por APX.");
391
+ messages.setSound(null, null);
392
+ manager.createNotificationChannel(messages);
393
+ }
394
+
395
+ private Notification serviceNotification() {
396
+ Intent open = new Intent(this, MainActivity.class).putExtra(MainActivity.EXTRA_PATH, "/mobile");
397
+ boolean mascotVisible = preferences.mascotEnabled();
398
+ Intent mascotAction = new Intent(this, MascotOverlayService.class)
399
+ .setAction(mascotVisible ? ACTION_STOP : ACTION_SHOW);
400
+ return new Notification.Builder(this, SERVICE_CHANNEL)
401
+ .setSmallIcon(R.drawable.ic_apx_notification)
402
+ .setContentTitle("APX conectado")
403
+ .setContentText("Mensajes directos y avisos activos")
404
+ .setContentIntent(pendingActivity(open, 1))
405
+ .addAction(new Notification.Action.Builder(
406
+ null,
407
+ mascotVisible ? "Ocultar mascota" : "Mostrar mascota",
408
+ pendingService(mascotAction, mascotVisible ? 2 : 3)
409
+ ).build())
410
+ .setOngoing(true)
411
+ .build();
412
+ }
413
+
414
+ private PendingIntent pendingActivity(Intent intent, int requestCode) {
415
+ return PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
416
+ }
417
+
418
+ private PendingIntent pendingService(Intent intent, int requestCode) {
419
+ return PendingIntent.getService(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
420
+ }
421
+
422
+ private void openMobile() {
423
+ Intent intent = new Intent(this, MainActivity.class)
424
+ .putExtra(MainActivity.EXTRA_PATH, "/mobile")
425
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
426
+ startActivity(intent);
427
+ }
428
+
429
+ @Override
430
+ public void onDestroy() {
431
+ destroyed = true;
432
+ main.removeCallbacksAndMessages(null);
433
+ try { connectivity.unregisterNetworkCallback(networkCallback); } catch (RuntimeException ignored) {}
434
+ try { unregisterReceiver(travelReceiver); } catch (RuntimeException ignored) {}
435
+ if (socket != null) {
436
+ socket.close(1000, "service stopped");
437
+ socket = null;
438
+ }
439
+ removeOverlay();
440
+ super.onDestroy();
441
+ }
442
+
443
+ @Override public IBinder onBind(Intent intent) { return null; }
444
+
445
+ private int dp(int value) {
446
+ return Math.round(value * getResources().getDisplayMetrics().density);
447
+ }
448
+ }