@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.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.graphics.Bitmap;
|
|
5
|
+
import android.graphics.BitmapFactory;
|
|
6
|
+
import android.graphics.Canvas;
|
|
7
|
+
import android.graphics.Color;
|
|
8
|
+
import android.graphics.Paint;
|
|
9
|
+
import android.graphics.Path;
|
|
10
|
+
import android.graphics.RectF;
|
|
11
|
+
import android.os.Handler;
|
|
12
|
+
import android.os.Looper;
|
|
13
|
+
import android.view.MotionEvent;
|
|
14
|
+
import android.view.View;
|
|
15
|
+
|
|
16
|
+
final class MascotView extends View {
|
|
17
|
+
interface Listener {
|
|
18
|
+
void onDragStarted();
|
|
19
|
+
void onMove(float rawX, float rawY, float offsetX, float offsetY);
|
|
20
|
+
void onDragEnded(boolean cancelled);
|
|
21
|
+
void onTapped();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// This view sits on top of whatever the owner is actually doing, all day.
|
|
25
|
+
// A frame costs a full software-rendered redraw of a 210x225dp bitmap, and
|
|
26
|
+
// it used to ask for one every 32 ms forever — thirty of them a second,
|
|
27
|
+
// over the launcher, over the browser, over a video, from the moment the
|
|
28
|
+
// app went to the background until the phone was rebooted. That is the
|
|
29
|
+
// "APX está consumiendo batería" notice, and it bought nothing while
|
|
30
|
+
// nothing was moving.
|
|
31
|
+
//
|
|
32
|
+
// So motion is now a state, not the default: 32 ms frames while the blob
|
|
33
|
+
// is being dragged, hopping, or showing a message, and between those a
|
|
34
|
+
// still pose that wakes twice per blink cycle. Idle went from ~31 frames a
|
|
35
|
+
// second to ~0.4.
|
|
36
|
+
private static final long FRAME_MS = 32L;
|
|
37
|
+
private static final long HOP_MS = 520L;
|
|
38
|
+
private static final long BLINK_CYCLE_MS = 5_400L;
|
|
39
|
+
private static final long BLINK_MS = 230L;
|
|
40
|
+
|
|
41
|
+
private Bitmap body;
|
|
42
|
+
private MascotBlobCatalog.Preset preset;
|
|
43
|
+
private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
|
|
44
|
+
private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
45
|
+
private final Handler handler = new Handler(Looper.getMainLooper());
|
|
46
|
+
private final Listener listener;
|
|
47
|
+
private String message;
|
|
48
|
+
private Runnable hideMessage;
|
|
49
|
+
private float downRawX;
|
|
50
|
+
private float downRawY;
|
|
51
|
+
private float offsetX;
|
|
52
|
+
private float offsetY;
|
|
53
|
+
private boolean dragged;
|
|
54
|
+
private boolean dragging;
|
|
55
|
+
private long hopStarted;
|
|
56
|
+
|
|
57
|
+
MascotView(Context context, String avatar, Listener listener) {
|
|
58
|
+
super(context);
|
|
59
|
+
this.listener = listener;
|
|
60
|
+
setAvatar(avatar);
|
|
61
|
+
textPaint.setColor(Color.WHITE);
|
|
62
|
+
textPaint.setTextSize(dp(12.5f));
|
|
63
|
+
textPaint.setTypeface(android.graphics.Typeface.create("sans", android.graphics.Typeface.NORMAL));
|
|
64
|
+
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void setAvatar(String key) {
|
|
68
|
+
MascotBlobCatalog.Preset next = MascotBlobCatalog.forKey(key);
|
|
69
|
+
Bitmap nextBody = BitmapFactory.decodeResource(getResources(), next.drawable);
|
|
70
|
+
if (nextBody == null) return;
|
|
71
|
+
preset = next;
|
|
72
|
+
body = nextBody;
|
|
73
|
+
invalidate();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void showMessage(String value) {
|
|
77
|
+
message = value == null ? null : value.trim();
|
|
78
|
+
if (message == null || message.isEmpty()) return;
|
|
79
|
+
hopStarted = System.currentTimeMillis();
|
|
80
|
+
if (hideMessage != null) handler.removeCallbacks(hideMessage);
|
|
81
|
+
long duration = Math.min(9_000, Math.max(3_500, 1_500 + message.length() * 45L));
|
|
82
|
+
hideMessage = () -> {
|
|
83
|
+
message = null;
|
|
84
|
+
invalidate();
|
|
85
|
+
};
|
|
86
|
+
handler.postDelayed(hideMessage, duration);
|
|
87
|
+
invalidate();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@Override
|
|
91
|
+
protected void onDraw(Canvas canvas) {
|
|
92
|
+
super.onDraw(canvas);
|
|
93
|
+
long now = System.currentTimeMillis();
|
|
94
|
+
long hopAge = now - hopStarted;
|
|
95
|
+
boolean hopping = hopAge >= 0 && hopAge < HOP_MS;
|
|
96
|
+
// Alive while it is being handled, landing a hop, or speaking; at rest
|
|
97
|
+
// otherwise. At rest it holds the pose instead of walking and bobbing
|
|
98
|
+
// through it.
|
|
99
|
+
boolean lively = dragging || hopping || message != null;
|
|
100
|
+
float width = getWidth();
|
|
101
|
+
float bodySize = dp(122);
|
|
102
|
+
float walk = dragging || !lively ? 0 : (float) (dp(13) * Math.sin(now / 1_035.0));
|
|
103
|
+
float bob = dragging ? -dp(20) : !lively ? 0 : (float) (-dp(7) * (0.5 + 0.5 * Math.sin(now / 780.0)));
|
|
104
|
+
float hop = hopping ? (float) (-dp(16) * Math.sin(Math.PI * hopAge / 260.0) * (1.0 - hopAge / 700.0)) : 0;
|
|
105
|
+
float left = (width - bodySize) / 2f + walk;
|
|
106
|
+
float top = getHeight() - bodySize - dp(7) + bob + hop;
|
|
107
|
+
|
|
108
|
+
paint.setColor(0x50000000);
|
|
109
|
+
float shadowInset = dragging ? dp(34) : dp(24);
|
|
110
|
+
int shadowAlpha = dragging ? 0x28000000 : 0x50000000;
|
|
111
|
+
paint.setColor(shadowAlpha);
|
|
112
|
+
canvas.drawOval(new RectF(left + shadowInset, getHeight() - dp(17), left + bodySize - shadowInset, getHeight() - dp(5)), paint);
|
|
113
|
+
|
|
114
|
+
float tilt = dragging
|
|
115
|
+
? (float) (13 + 4 * Math.sin(now / 125.0))
|
|
116
|
+
: !lively ? 0 : (float) (3 * Math.sin(now / 780.0));
|
|
117
|
+
float look = !lively ? 0 : (float) (Math.sin(now / 980.0) * 8f);
|
|
118
|
+
canvas.save();
|
|
119
|
+
canvas.rotate(tilt, left + bodySize / 2f, top + bodySize * 0.88f);
|
|
120
|
+
paint.setColor(Color.WHITE);
|
|
121
|
+
canvas.drawBitmap(body, null, new RectF(left, top, left + bodySize, top + bodySize), paint);
|
|
122
|
+
drawEyes(canvas, left, top, bodySize, now, look);
|
|
123
|
+
canvas.restore();
|
|
124
|
+
if (message != null) drawBubble(canvas, message, top - dp(8));
|
|
125
|
+
// Ask for the next frame only for as long as there is one to draw.
|
|
126
|
+
// At rest the only thing left that moves is the blink, so sleep until
|
|
127
|
+
// the eyes are due to change.
|
|
128
|
+
postInvalidateDelayed(lively ? FRAME_MS : untilNextBlinkFrame(now));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* How long the resting blob can hold perfectly still: until its eyes are
|
|
133
|
+
* due to close, or — if they are shut right now — until they open again.
|
|
134
|
+
*/
|
|
135
|
+
private static long untilNextBlinkFrame(long now) {
|
|
136
|
+
long phase = now % BLINK_CYCLE_MS;
|
|
137
|
+
long closesAt = BLINK_CYCLE_MS - BLINK_MS;
|
|
138
|
+
return Math.max(FRAME_MS, phase < closesAt ? closesAt - phase : BLINK_CYCLE_MS - phase);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private void drawEyes(Canvas canvas, float left, float top, float size, long now, float lookOffset) {
|
|
142
|
+
if (preset == null) return;
|
|
143
|
+
float scale = size / 256f;
|
|
144
|
+
float look = lookOffset * scale;
|
|
145
|
+
boolean blink = now % BLINK_CYCLE_MS > BLINK_CYCLE_MS - BLINK_MS;
|
|
146
|
+
float blinkScale = blink ? 0.10f : 1f;
|
|
147
|
+
paint.setColor(preset.eyeColor);
|
|
148
|
+
for (float[] eye : preset.eyes) {
|
|
149
|
+
drawEye(
|
|
150
|
+
canvas,
|
|
151
|
+
left + eye[0] * scale + look,
|
|
152
|
+
top + eye[1] * scale,
|
|
153
|
+
eye[2] * scale,
|
|
154
|
+
eye[3] * scale,
|
|
155
|
+
eye[4] * scale,
|
|
156
|
+
blinkScale
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private void drawEye(Canvas canvas, float x, float y, float width, float height, float radius, float blinkScale) {
|
|
162
|
+
float middle = y + height / 2f;
|
|
163
|
+
float half = height * blinkScale / 2f;
|
|
164
|
+
canvas.drawRoundRect(new RectF(x, middle - half, x + width, middle + half), radius, radius, paint);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private void drawBubble(Canvas canvas, String value, float bottom) {
|
|
168
|
+
float margin = dp(8);
|
|
169
|
+
float padding = dp(11);
|
|
170
|
+
float maxWidth = getWidth() - margin * 2;
|
|
171
|
+
String[] lines = wrap(value, maxWidth - padding * 2);
|
|
172
|
+
float lineHeight = dp(17);
|
|
173
|
+
float height = padding * 2 + lines.length * lineHeight;
|
|
174
|
+
float top = Math.max(dp(2), bottom - height);
|
|
175
|
+
RectF bubble = new RectF(margin, top, getWidth() - margin, bottom);
|
|
176
|
+
paint.setColor(0xEE14181C);
|
|
177
|
+
paint.setShadowLayer(dp(12), 0, dp(6), 0x77000000);
|
|
178
|
+
canvas.drawRoundRect(bubble, dp(14), dp(14), paint);
|
|
179
|
+
paint.clearShadowLayer();
|
|
180
|
+
Path tail = new Path();
|
|
181
|
+
tail.moveTo(getWidth() / 2f - dp(8), bottom);
|
|
182
|
+
tail.lineTo(getWidth() / 2f + dp(8), bottom);
|
|
183
|
+
tail.lineTo(getWidth() / 2f, bottom + dp(9));
|
|
184
|
+
tail.close();
|
|
185
|
+
canvas.drawPath(tail, paint);
|
|
186
|
+
float y = top + padding - textPaint.ascent();
|
|
187
|
+
for (String line : lines) {
|
|
188
|
+
canvas.drawText(line, margin + padding, y, textPaint);
|
|
189
|
+
y += lineHeight;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private String[] wrap(String value, float maxWidth) {
|
|
194
|
+
java.util.ArrayList<String> lines = new java.util.ArrayList<>();
|
|
195
|
+
StringBuilder current = new StringBuilder();
|
|
196
|
+
for (String word : value.split("\\s+")) {
|
|
197
|
+
String candidate = current.length() == 0 ? word : current + " " + word;
|
|
198
|
+
if (textPaint.measureText(candidate) <= maxWidth || current.length() == 0) {
|
|
199
|
+
current.setLength(0);
|
|
200
|
+
current.append(candidate);
|
|
201
|
+
} else {
|
|
202
|
+
lines.add(current.toString());
|
|
203
|
+
current.setLength(0);
|
|
204
|
+
current.append(word);
|
|
205
|
+
}
|
|
206
|
+
if (lines.size() == 3) break;
|
|
207
|
+
}
|
|
208
|
+
if (current.length() > 0 && lines.size() < 4) lines.add(current.toString());
|
|
209
|
+
return lines.toArray(new String[0]);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@Override
|
|
213
|
+
public boolean onTouchEvent(MotionEvent event) {
|
|
214
|
+
switch (event.getActionMasked()) {
|
|
215
|
+
case MotionEvent.ACTION_DOWN:
|
|
216
|
+
downRawX = event.getRawX();
|
|
217
|
+
downRawY = event.getRawY();
|
|
218
|
+
offsetX = event.getX();
|
|
219
|
+
offsetY = event.getY();
|
|
220
|
+
dragged = false;
|
|
221
|
+
dragging = true;
|
|
222
|
+
invalidate();
|
|
223
|
+
return true;
|
|
224
|
+
case MotionEvent.ACTION_MOVE:
|
|
225
|
+
if (!dragged && Math.hypot(event.getRawX() - downRawX, event.getRawY() - downRawY) > dp(6)) {
|
|
226
|
+
dragged = true;
|
|
227
|
+
listener.onDragStarted();
|
|
228
|
+
}
|
|
229
|
+
listener.onMove(event.getRawX(), event.getRawY(), offsetX, offsetY);
|
|
230
|
+
return true;
|
|
231
|
+
case MotionEvent.ACTION_UP:
|
|
232
|
+
case MotionEvent.ACTION_CANCEL:
|
|
233
|
+
dragging = false;
|
|
234
|
+
invalidate();
|
|
235
|
+
if (dragged) listener.onDragEnded(event.getActionMasked() == MotionEvent.ACTION_CANCEL);
|
|
236
|
+
else {
|
|
237
|
+
hopStarted = System.currentTimeMillis();
|
|
238
|
+
listener.onTapped();
|
|
239
|
+
}
|
|
240
|
+
return true;
|
|
241
|
+
default:
|
|
242
|
+
return super.onTouchEvent(event);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private float dp(float value) {
|
|
247
|
+
return value * getResources().getDisplayMetrics().density;
|
|
248
|
+
}
|
|
249
|
+
}
|
package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import org.json.JSONArray;
|
|
4
|
+
import org.json.JSONObject;
|
|
5
|
+
|
|
6
|
+
import java.util.ArrayList;
|
|
7
|
+
import java.util.LinkedHashMap;
|
|
8
|
+
import java.util.List;
|
|
9
|
+
import java.util.Map;
|
|
10
|
+
|
|
11
|
+
final class MessageFrameParser {
|
|
12
|
+
private MessageFrameParser() {}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* One bubble, and the kind of news it is.
|
|
16
|
+
*
|
|
17
|
+
* `channel` is null when the daemon sent only the flat `notifications`
|
|
18
|
+
* list — an older build than this one. Null means "always ring": see
|
|
19
|
+
* NotifyChannels.known.
|
|
20
|
+
*/
|
|
21
|
+
record Notice(String text, String channel) {}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A proximity alert, complete.
|
|
25
|
+
*
|
|
26
|
+
* Unlike a Notice this carries its whole payload rather than a "go look"
|
|
27
|
+
* line: the phone cannot re-fetch it in a tunnel, and the card has to
|
|
28
|
+
* become four buttons within a second of driving past the place.
|
|
29
|
+
*
|
|
30
|
+
* `address` and `task` may be null — the daemon omits what it does not
|
|
31
|
+
* know rather than inventing it. Nothing here contains an emoji: Android
|
|
32
|
+
* Auto hands the card to Assistant, which reads it aloud.
|
|
33
|
+
*/
|
|
34
|
+
record MobilityAlert(
|
|
35
|
+
String id,
|
|
36
|
+
/** The ERRAND — what this card is about. Titles the row and the screen. */
|
|
37
|
+
String title,
|
|
38
|
+
/** The shop it points at. Detail, not heading: you have several errands. */
|
|
39
|
+
String place,
|
|
40
|
+
String address,
|
|
41
|
+
String body,
|
|
42
|
+
String distanceLabel,
|
|
43
|
+
String task,
|
|
44
|
+
double latitude,
|
|
45
|
+
double longitude,
|
|
46
|
+
String navigateUrl,
|
|
47
|
+
String addStopUrl,
|
|
48
|
+
List<Action> actions
|
|
49
|
+
) {}
|
|
50
|
+
|
|
51
|
+
/** One labelled answer. The id is what goes back to the daemon. */
|
|
52
|
+
record Action(String id, String label) {}
|
|
53
|
+
|
|
54
|
+
/** The `mobility_alert` frame, or null for any other frame. */
|
|
55
|
+
static MobilityAlert mobilityAlert(String text) {
|
|
56
|
+
try {
|
|
57
|
+
JSONObject frame = new JSONObject(text);
|
|
58
|
+
if (!"mobility_alert".equals(frame.optString("type"))) return null;
|
|
59
|
+
JSONObject alert = frame.optJSONObject("alert");
|
|
60
|
+
if (alert == null) return null;
|
|
61
|
+
String id = alert.optString("id", "").trim();
|
|
62
|
+
String title = alert.optString("title", "").trim();
|
|
63
|
+
if (id.isEmpty() || title.isEmpty()) return null;
|
|
64
|
+
|
|
65
|
+
List<Action> actions = new ArrayList<>();
|
|
66
|
+
JSONArray raw = alert.optJSONArray("actions");
|
|
67
|
+
for (int i = 0; raw != null && i < raw.length(); i++) {
|
|
68
|
+
JSONObject action = raw.optJSONObject(i);
|
|
69
|
+
if (action == null) continue;
|
|
70
|
+
String actionId = action.optString("id", "").trim();
|
|
71
|
+
String label = action.optString("label", "").trim();
|
|
72
|
+
if (!actionId.isEmpty() && !label.isEmpty()) actions.add(new Action(actionId, label));
|
|
73
|
+
}
|
|
74
|
+
return new MobilityAlert(
|
|
75
|
+
id,
|
|
76
|
+
title,
|
|
77
|
+
blankToNull(alert.optString("place", "")),
|
|
78
|
+
blankToNull(alert.optString("address", "")),
|
|
79
|
+
alert.optString("body", title).trim(),
|
|
80
|
+
blankToNull(alert.optString("distance_label", "")),
|
|
81
|
+
blankToNull(alert.optString("task", "")),
|
|
82
|
+
alert.optDouble("latitude", Double.NaN),
|
|
83
|
+
alert.optDouble("longitude", Double.NaN),
|
|
84
|
+
blankToNull(alert.optString("navigate_url", "")),
|
|
85
|
+
blankToNull(alert.optString("add_stop_url", "")),
|
|
86
|
+
actions
|
|
87
|
+
);
|
|
88
|
+
} catch (Exception ignored) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private static String blankToNull(String value) {
|
|
94
|
+
String trimmed = value == null ? "" : value.trim();
|
|
95
|
+
return trimmed.isEmpty() ? null : trimmed;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static String avatar(String text) {
|
|
99
|
+
try {
|
|
100
|
+
JSONObject frame = new JSONObject(text);
|
|
101
|
+
String type = frame.optString("type");
|
|
102
|
+
if (!"hello".equals(type) && !"settings".equals(type)) return null;
|
|
103
|
+
JSONObject settings = frame.optJSONObject("settings");
|
|
104
|
+
JSONObject superAgent = settings == null ? null : settings.optJSONObject("super_agent");
|
|
105
|
+
String icon = superAgent == null ? "" : superAgent.optString("icon", "").trim();
|
|
106
|
+
return icon.isBlank() ? null : icon;
|
|
107
|
+
} catch (Exception ignored) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static List<Notice> notices(String text) {
|
|
113
|
+
List<Notice> messages = new ArrayList<>();
|
|
114
|
+
try {
|
|
115
|
+
JSONObject frame = new JSONObject(text);
|
|
116
|
+
if (!"messages".equals(frame.optString("type"))) return messages;
|
|
117
|
+
// Daemon-computed copy is the contract: an empty array means the
|
|
118
|
+
// owner's send is not news and must not fall through to a guess.
|
|
119
|
+
// `notices` carries the channel each line is about and wins when
|
|
120
|
+
// present; `notifications` is the same lines without it, kept for
|
|
121
|
+
// the reverse case — this APK against a daemon from before the tag
|
|
122
|
+
// existed.
|
|
123
|
+
if (frame.has("notices")) {
|
|
124
|
+
JSONArray ready = frame.optJSONArray("notices");
|
|
125
|
+
if (ready == null) return messages;
|
|
126
|
+
for (int i = 0; i < ready.length(); i++) {
|
|
127
|
+
JSONObject notice = ready.optJSONObject(i);
|
|
128
|
+
if (notice == null) continue;
|
|
129
|
+
String line = notice.optString("text", "").trim();
|
|
130
|
+
if (line.isEmpty()) continue;
|
|
131
|
+
String channel = notice.optString("channel", "").trim();
|
|
132
|
+
messages.add(new Notice(line, channel.isEmpty() ? null : channel));
|
|
133
|
+
}
|
|
134
|
+
return messages;
|
|
135
|
+
}
|
|
136
|
+
if (frame.has("notifications")) {
|
|
137
|
+
JSONArray ready = frame.optJSONArray("notifications");
|
|
138
|
+
if (ready == null) return messages;
|
|
139
|
+
for (int i = 0; i < ready.length(); i++) {
|
|
140
|
+
String line = ready.optString(i, "").trim();
|
|
141
|
+
if (!line.isEmpty()) messages.add(new Notice(line, null));
|
|
142
|
+
}
|
|
143
|
+
return messages;
|
|
144
|
+
}
|
|
145
|
+
JSONArray events = frame.optJSONArray("events");
|
|
146
|
+
if (events == null) return messages;
|
|
147
|
+
appendMobility(messages, events);
|
|
148
|
+
appendRoutineDeliveries(messages, events);
|
|
149
|
+
appendAgentFinals(messages, events);
|
|
150
|
+
} catch (Exception ignored) {
|
|
151
|
+
// A malformed live frame has no notification value.
|
|
152
|
+
}
|
|
153
|
+
return messages;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private static void appendMobility(List<Notice> messages, JSONArray events) {
|
|
157
|
+
for (int i = 0; i < events.length(); i++) {
|
|
158
|
+
JSONObject event = events.optJSONObject(i);
|
|
159
|
+
if (event == null) continue;
|
|
160
|
+
if (!"mobility_delivery".equals(event.optString("via"))) continue;
|
|
161
|
+
String notice = event.optString("notify", "").trim();
|
|
162
|
+
if (!notice.isBlank()) messages.add(new Notice(notice, NotifyChannels.MOBILITY));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private static void appendRoutineDeliveries(List<Notice> messages, JSONArray events) {
|
|
167
|
+
Map<String, String> byAgent = new LinkedHashMap<>();
|
|
168
|
+
for (int i = 0; i < events.length(); i++) {
|
|
169
|
+
JSONObject event = events.optJSONObject(i);
|
|
170
|
+
if (event == null) continue;
|
|
171
|
+
if (!"routine_delivery".equals(event.optString("via"))) continue;
|
|
172
|
+
if (!"web".equals(event.optString("channel"))) continue;
|
|
173
|
+
String agent = event.optString("agent_slug", "").trim();
|
|
174
|
+
if (agent.isEmpty() || "super_agent".equals(agent)) continue;
|
|
175
|
+
String notify = event.optString("notify", "").trim();
|
|
176
|
+
if (notify.isEmpty()) notify = byAgent.getOrDefault(agent, "");
|
|
177
|
+
byAgent.put(agent, notify);
|
|
178
|
+
}
|
|
179
|
+
for (Map.Entry<String, String> entry : byAgent.entrySet()) {
|
|
180
|
+
String notify = entry.getValue();
|
|
181
|
+
messages.add(new Notice(
|
|
182
|
+
notify.isEmpty()
|
|
183
|
+
? entry.getKey() + " te dejó un mensaje"
|
|
184
|
+
: entry.getKey() + ": " + notify,
|
|
185
|
+
NotifyChannels.ROUTINE
|
|
186
|
+
));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private static void appendAgentFinals(List<Notice> messages, JSONArray events) {
|
|
191
|
+
Map<String, Notice> byAgent = new LinkedHashMap<>();
|
|
192
|
+
for (int i = 0; i < events.length(); i++) {
|
|
193
|
+
JSONObject event = events.optJSONObject(i);
|
|
194
|
+
if (event == null) continue;
|
|
195
|
+
if (!isAgentFinal(event)) continue;
|
|
196
|
+
String agent = speakerName(event);
|
|
197
|
+
String channel = event.optString("channel");
|
|
198
|
+
byAgent.put(
|
|
199
|
+
channel + "|" + agent,
|
|
200
|
+
new Notice(agent + " respondió en " + channelLabel(channel), channel)
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
messages.addAll(byAgent.values());
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private static boolean isAgentFinal(JSONObject event) {
|
|
207
|
+
if (!"out".equals(event.optString("direction"))) return false;
|
|
208
|
+
String type = event.optString("type", "");
|
|
209
|
+
if (!type.isEmpty() && !"agent".equals(type)) return false;
|
|
210
|
+
String channel = event.optString("channel");
|
|
211
|
+
if (!"telegram".equals(channel) && !"group".equals(channel) && !"a2a".equals(channel)) return false;
|
|
212
|
+
if (event.optBoolean("streamed", false)) return false;
|
|
213
|
+
String via = event.optString("via", "");
|
|
214
|
+
if ("routine_delivery".equals(via) || "mobility_delivery".equals(via)) return false;
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private static String speakerName(JSONObject event) {
|
|
219
|
+
String author = event.optString("author", "").trim();
|
|
220
|
+
if (!author.isEmpty() && !"user".equals(author) && !"owner".equals(author) && !author.startsWith("@")) {
|
|
221
|
+
return author;
|
|
222
|
+
}
|
|
223
|
+
String slug = event.optString("agent_slug", "").trim();
|
|
224
|
+
return slug.isEmpty() ? "agente" : slug;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private static String channelLabel(String channel) {
|
|
228
|
+
if (channel == null || channel.isBlank()) return "APX";
|
|
229
|
+
return switch (channel) {
|
|
230
|
+
case "telegram" -> "Telegram";
|
|
231
|
+
case "group" -> "Grupo";
|
|
232
|
+
case "a2a" -> "A2A";
|
|
233
|
+
case "web", "web_sidebar", "web_code" -> "Web";
|
|
234
|
+
case "cli" -> "Terminal";
|
|
235
|
+
case "routine" -> "Rutinas";
|
|
236
|
+
case "deck" -> "Deck";
|
|
237
|
+
default -> channel.substring(0, 1).toUpperCase() + channel.substring(1);
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Which kinds of news this phone's bell may ring for.
|
|
7
|
+
*
|
|
8
|
+
* Five, and the list is closed: the daemon tags every bubble with one of them
|
|
9
|
+
* (see core/events/mascot-notify.js, NOTICE_CHANNELS). That is what makes the
|
|
10
|
+
* settings dialog honest — it offers exactly what can ever arrive, instead of
|
|
11
|
+
* a catalog of every channel APX speaks on, most of which never reach the pet.
|
|
12
|
+
*
|
|
13
|
+
* A delivery is tagged by what it IS, not by the ledger channel it was filed
|
|
14
|
+
* on: a routine delivery lives on `web` and a mobility notice rides Telegram,
|
|
15
|
+
* but silencing Telegram must not silence the car. So "the errands on the way
|
|
16
|
+
* home" and "Telegram" are two separate ticks, which is the whole reason the
|
|
17
|
+
* owner wanted this.
|
|
18
|
+
*/
|
|
19
|
+
final class NotifyChannels {
|
|
20
|
+
static final String TELEGRAM = "telegram";
|
|
21
|
+
static final String GROUP = "group";
|
|
22
|
+
static final String A2A = "a2a";
|
|
23
|
+
static final String ROUTINE = "routine";
|
|
24
|
+
static final String MOBILITY = "mobility";
|
|
25
|
+
|
|
26
|
+
/** Menu order: loudest and most contested first. */
|
|
27
|
+
static final List<String> ALL = List.of(TELEGRAM, GROUP, A2A, ROUTINE, MOBILITY);
|
|
28
|
+
|
|
29
|
+
private NotifyChannels() {}
|
|
30
|
+
|
|
31
|
+
static String label(String channel) {
|
|
32
|
+
if (channel == null) return "APX";
|
|
33
|
+
return switch (channel) {
|
|
34
|
+
case TELEGRAM -> "Telegram";
|
|
35
|
+
case GROUP -> "Grupos";
|
|
36
|
+
case A2A -> "Entre agentes";
|
|
37
|
+
case ROUTINE -> "Rutinas";
|
|
38
|
+
case MOBILITY -> "Viajes y mandados";
|
|
39
|
+
default -> channel.substring(0, 1).toUpperCase() + channel.substring(1);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Telegram alone starts silent, and only here.
|
|
45
|
+
*
|
|
46
|
+
* The same rule the panel has followed per device since lib/channels.ts,
|
|
47
|
+
* for the same reason and now on the device it was written about: Telegram
|
|
48
|
+
* is installed ON this phone, so an APX bubble about a Telegram reply is
|
|
49
|
+
* the second time that news arrives, seconds after Telegram's own. Every
|
|
50
|
+
* other channel has no other way to reach the phone at all.
|
|
51
|
+
*
|
|
52
|
+
* A default, not a decision: one tick in the menu overrides it, and that
|
|
53
|
+
* choice is what gets stored.
|
|
54
|
+
*/
|
|
55
|
+
static boolean enabledByDefault(String channel) {
|
|
56
|
+
return !TELEGRAM.equals(channel);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* An untagged line — an older daemon, or a bubble raised locally by the
|
|
61
|
+
* "test message" action — always rings. A notice whose channel we cannot
|
|
62
|
+
* read is not one to guess at and drop: news lost in silence is worse than
|
|
63
|
+
* news arriving on a muted channel, and it is the case the owner can see
|
|
64
|
+
* and fix.
|
|
65
|
+
*/
|
|
66
|
+
static boolean known(String channel) {
|
|
67
|
+
return channel != null && ALL.contains(channel);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import android.content.BroadcastReceiver;
|
|
4
|
+
import android.content.Context;
|
|
5
|
+
import android.content.Intent;
|
|
6
|
+
import android.net.Uri;
|
|
7
|
+
import android.util.Log;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* What a tap on one of the four proximity buttons does.
|
|
11
|
+
*
|
|
12
|
+
* TWO THINGS, IN THIS ORDER, and the order is the point. The answer goes to the
|
|
13
|
+
* daemon FIRST, then Maps opens. Launching Maps hands the foreground away, and
|
|
14
|
+
* an OEM that freezes the app on the way out would lose the answer — the tap
|
|
15
|
+
* would have started a route APX never learned about, so the end-of-trip
|
|
16
|
+
* follow-up would never ask whether the errand got done.
|
|
17
|
+
*
|
|
18
|
+
* The card is dismissed either way: it was answered, and a proximity alert that
|
|
19
|
+
* stays on screen after being answered is the one thing guaranteed to be tapped
|
|
20
|
+
* twice at the next red light.
|
|
21
|
+
*/
|
|
22
|
+
public class ProximityActionReceiver extends BroadcastReceiver {
|
|
23
|
+
private static final String TAG = "APXTravel";
|
|
24
|
+
|
|
25
|
+
@Override
|
|
26
|
+
public void onReceive(Context context, Intent intent) {
|
|
27
|
+
if (!ProximityNotification.ACTION_ANSWER.equals(intent.getAction())) return;
|
|
28
|
+
String alertId = intent.getStringExtra(ProximityNotification.EXTRA_ALERT_ID);
|
|
29
|
+
String actionId = intent.getStringExtra(ProximityNotification.EXTRA_ACTION_ID);
|
|
30
|
+
String url = intent.getStringExtra(ProximityNotification.EXTRA_URL);
|
|
31
|
+
int notificationId = intent.getIntExtra(ProximityNotification.EXTRA_NOTIFICATION_ID, -1);
|
|
32
|
+
if (alertId == null || actionId == null) return;
|
|
33
|
+
|
|
34
|
+
Log.i(TAG, "proximity answer " + actionId + " for " + alertId);
|
|
35
|
+
|
|
36
|
+
ApxPreferences preferences = new ApxPreferences(context);
|
|
37
|
+
DaemonClient.answerAlert(
|
|
38
|
+
preferences.daemonUrl(),
|
|
39
|
+
preferences.token(),
|
|
40
|
+
alertId,
|
|
41
|
+
actionId,
|
|
42
|
+
new DaemonClient.AnswerCallback() {
|
|
43
|
+
@Override public void onAnswered() {
|
|
44
|
+
Log.i(TAG, "proximity answer " + actionId + " recorded");
|
|
45
|
+
}
|
|
46
|
+
@Override public void onAnswerFailed(String message) {
|
|
47
|
+
// Logged, not surfaced: the driver already pressed the
|
|
48
|
+
// button and is looking at the road. The alert stays
|
|
49
|
+
// recorded on the daemon side as unanswered, which is the
|
|
50
|
+
// honest state — nothing here pretends otherwise.
|
|
51
|
+
Log.w(TAG, "proximity answer " + actionId + " failed: " + message);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Gone from the head unit too: answering on the phone must not leave
|
|
57
|
+
// the chip offering the same four buttons for the same place.
|
|
58
|
+
CarAlertStore.remove(alertId);
|
|
59
|
+
if (notificationId >= 0) ProximityNotification.cancel(context, notificationId);
|
|
60
|
+
|
|
61
|
+
if (url != null && !url.isBlank()) {
|
|
62
|
+
try {
|
|
63
|
+
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
|
64
|
+
.setPackage("com.google.android.apps.maps")
|
|
65
|
+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
|
66
|
+
} catch (Exception ignored) {
|
|
67
|
+
// Maps missing or refusing the intent: fall back to whatever
|
|
68
|
+
// does handle it rather than dropping the tap.
|
|
69
|
+
try {
|
|
70
|
+
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
|
71
|
+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
|
72
|
+
} catch (Exception error) {
|
|
73
|
+
Log.w(TAG, "could not open " + url + ": " + error.getMessage());
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|