@agentprojectcontext/apx 1.80.2 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +134 -0
- 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
package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import android.content.Context;
|
|
4
|
+
import android.graphics.Color;
|
|
5
|
+
import android.graphics.Typeface;
|
|
6
|
+
import android.graphics.drawable.GradientDrawable;
|
|
7
|
+
import android.view.Gravity;
|
|
8
|
+
import android.view.View;
|
|
9
|
+
import android.widget.LinearLayout;
|
|
10
|
+
import android.widget.ScrollView;
|
|
11
|
+
import android.widget.TextView;
|
|
12
|
+
|
|
13
|
+
import java.util.List;
|
|
14
|
+
import java.util.Locale;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The trip's errands, as a thread of cards rather than a list of rows.
|
|
18
|
+
*
|
|
19
|
+
* This used to be an AlertDialog.setItems() list where tapping a row opened
|
|
20
|
+
* Maps — one gesture, one meaning, and no way to say "voy" without leaving the
|
|
21
|
+
* app. The Telegram card for the same errand offers four choices, and the
|
|
22
|
+
* owner's point stands: the phone should show what Telegram shows. So each
|
|
23
|
+
* errand gets the card it gets in the chat — place, distance, task, and the
|
|
24
|
+
* same four chips underneath.
|
|
25
|
+
*
|
|
26
|
+
* Built in code, like TravelStatusBanner: this app has no XML layouts, and a
|
|
27
|
+
* card whose shape depends on the data (how many chips, whether it is already
|
|
28
|
+
* answered) is clearer assembled than inflated and hidden.
|
|
29
|
+
*
|
|
30
|
+
* No emoji on the chips. The car reads these labels aloud when the same text
|
|
31
|
+
* reaches a head unit, and "check mark button voy" is not a thing anyone
|
|
32
|
+
* wants to hear at 60 km/h.
|
|
33
|
+
*/
|
|
34
|
+
final class TripPlacesSheet {
|
|
35
|
+
|
|
36
|
+
/** What a tap means. The sheet knows the shapes; the activity does the work. */
|
|
37
|
+
interface Actions {
|
|
38
|
+
void navigate(DaemonClient.TripPlace place);
|
|
39
|
+
void addStop(DaemonClient.TripPlace place);
|
|
40
|
+
void answer(DaemonClient.TripPlace place, String answer);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Literal ARGB rather than Color.rgb(): these are class constants, and
|
|
44
|
+
// android.graphics.Color is a throwing stub in a plain JVM unit test — one
|
|
45
|
+
// call here made the whole class unloadable from TripPlacesSheetTest.
|
|
46
|
+
static final int GROUND = 0xFF0C1A16; // also paints the dialog frame
|
|
47
|
+
private static final int CARD = 0xFF153028; // the trip banner's ground
|
|
48
|
+
private static final int BRAND = 0xFF3AE7B0;
|
|
49
|
+
private static final int MUTED = 0xFFA6DCCA;
|
|
50
|
+
private static final int ON_BRAND = 0xFF061A14;
|
|
51
|
+
private static final int HAIRLINE = 0xFF2C5447;
|
|
52
|
+
|
|
53
|
+
private TripPlacesSheet() {}
|
|
54
|
+
|
|
55
|
+
/** The whole scrollable thread, ready to hand to AlertDialog.setView(). */
|
|
56
|
+
static View build(Context context, List<DaemonClient.TripPlace> places, Actions actions) {
|
|
57
|
+
LinearLayout thread = new LinearLayout(context);
|
|
58
|
+
thread.setOrientation(LinearLayout.VERTICAL);
|
|
59
|
+
thread.setPadding(dp(context, 14), dp(context, 10), dp(context, 14), dp(context, 14));
|
|
60
|
+
thread.setBackgroundColor(GROUND);
|
|
61
|
+
for (DaemonClient.TripPlace place : places) {
|
|
62
|
+
thread.addView(card(context, place, actions), rowParams(context));
|
|
63
|
+
}
|
|
64
|
+
ScrollView scroller = new ScrollView(context);
|
|
65
|
+
scroller.setBackgroundColor(GROUND);
|
|
66
|
+
scroller.addView(thread);
|
|
67
|
+
return scroller;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private static View card(Context context, DaemonClient.TripPlace place, Actions actions) {
|
|
71
|
+
LinearLayout bubble = new LinearLayout(context);
|
|
72
|
+
bubble.setOrientation(LinearLayout.VERTICAL);
|
|
73
|
+
bubble.setPadding(dp(context, 14), dp(context, 12), dp(context, 14), dp(context, 10));
|
|
74
|
+
GradientDrawable shape = new GradientDrawable();
|
|
75
|
+
shape.setColor(CARD);
|
|
76
|
+
shape.setCornerRadius(dp(context, 14));
|
|
77
|
+
bubble.setBackground(shape);
|
|
78
|
+
|
|
79
|
+
TextView heading = new TextView(context);
|
|
80
|
+
heading.setTextColor(Color.WHITE);
|
|
81
|
+
heading.setTextSize(15);
|
|
82
|
+
heading.setTypeface(null, Typeface.BOLD);
|
|
83
|
+
heading.setText(headline(place.place(), place.distanceM()));
|
|
84
|
+
bubble.addView(heading);
|
|
85
|
+
|
|
86
|
+
if (!place.task().isBlank()) {
|
|
87
|
+
TextView task = new TextView(context);
|
|
88
|
+
task.setTextColor(MUTED);
|
|
89
|
+
task.setTextSize(13);
|
|
90
|
+
task.setText(place.task());
|
|
91
|
+
task.setPadding(0, dp(context, 2), 0, 0);
|
|
92
|
+
bubble.addView(task);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
String state = stateLine(place.answer(), place.locked(), place.options());
|
|
96
|
+
if (!state.isBlank()) {
|
|
97
|
+
TextView hint = new TextView(context);
|
|
98
|
+
hint.setTextColor(BRAND);
|
|
99
|
+
hint.setTextSize(11);
|
|
100
|
+
hint.setText(state);
|
|
101
|
+
hint.setPadding(0, dp(context, 5), 0, 0);
|
|
102
|
+
bubble.addView(hint);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
LinearLayout links = new LinearLayout(context);
|
|
106
|
+
links.setOrientation(LinearLayout.HORIZONTAL);
|
|
107
|
+
links.setPadding(0, dp(context, 9), 0, 0);
|
|
108
|
+
links.addView(chip(context, "Navegar", false, () -> actions.navigate(place)), chipParams(context, true));
|
|
109
|
+
links.addView(chip(context, "Sumar a la ruta", false, () -> actions.addStop(place)), chipParams(context, false));
|
|
110
|
+
bubble.addView(links);
|
|
111
|
+
|
|
112
|
+
// Already answered? Then the question is closed, and re-offering it
|
|
113
|
+
// would invite a second answer that contradicts the first.
|
|
114
|
+
if (place.answer() == null || place.answer().isBlank()) {
|
|
115
|
+
LinearLayout answers = new LinearLayout(context);
|
|
116
|
+
answers.setOrientation(LinearLayout.HORIZONTAL);
|
|
117
|
+
answers.setPadding(0, dp(context, 7), 0, 0);
|
|
118
|
+
answers.addView(chip(context, "Voy", true, () -> actions.answer(place, "go")), chipParams(context, true));
|
|
119
|
+
// «Avisar en la siguiente»: declines THIS shop, not the errand — the
|
|
120
|
+
// same answer the Telegram card offers, so the two surfaces cannot
|
|
121
|
+
// mean different things by the same press.
|
|
122
|
+
answers.addView(chip(context, "En la siguiente", false, () -> actions.answer(place, "next")), chipParams(context, false));
|
|
123
|
+
bubble.addView(answers);
|
|
124
|
+
}
|
|
125
|
+
return bubble;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private static View chip(Context context, String label, boolean primary, Runnable onTap) {
|
|
129
|
+
TextView chip = new TextView(context);
|
|
130
|
+
chip.setText(label);
|
|
131
|
+
chip.setTextSize(13);
|
|
132
|
+
chip.setGravity(Gravity.CENTER);
|
|
133
|
+
chip.setTypeface(null, Typeface.BOLD);
|
|
134
|
+
chip.setPadding(dp(context, 10), dp(context, 9), dp(context, 10), dp(context, 9));
|
|
135
|
+
chip.setTextColor(primary ? ON_BRAND : BRAND);
|
|
136
|
+
GradientDrawable shape = new GradientDrawable();
|
|
137
|
+
shape.setCornerRadius(dp(context, 10));
|
|
138
|
+
if (primary) {
|
|
139
|
+
shape.setColor(BRAND);
|
|
140
|
+
} else {
|
|
141
|
+
shape.setColor(Color.TRANSPARENT);
|
|
142
|
+
shape.setStroke(dp(context, 1), HAIRLINE);
|
|
143
|
+
}
|
|
144
|
+
chip.setBackground(shape);
|
|
145
|
+
chip.setClickable(true);
|
|
146
|
+
chip.setFocusable(true);
|
|
147
|
+
chip.setOnClickListener(ignored -> onTap.run());
|
|
148
|
+
return chip;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// The label helpers below take plain values rather than a TripPlace on
|
|
152
|
+
// purpose: naming the transport record here would drag its OkHttp static
|
|
153
|
+
// initialiser into every JVM unit test, and what these decide — how far,
|
|
154
|
+
// how settled — has nothing to do with how the row arrived.
|
|
155
|
+
|
|
156
|
+
/** "Farmacia Pioneros Km 8 · 1.2 km" — the line the driver reads first. */
|
|
157
|
+
static String headline(String place, int distanceM) {
|
|
158
|
+
String distance = distanceLabel(distanceM);
|
|
159
|
+
return distance.isBlank() ? place : place + " · " + distance;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
static String distanceLabel(int meters) {
|
|
163
|
+
if (meters < 0) return "";
|
|
164
|
+
if (meters >= 1000) return String.format(Locale.getDefault(), "%.1f km", meters / 1000f);
|
|
165
|
+
return meters + " m";
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* The small print under the errand: what the owner already answered, or —
|
|
170
|
+
* when they have not — whether APX has actually decided where to send them.
|
|
171
|
+
*
|
|
172
|
+
* "3 lugares posibles" is not a hedge, it is the truth: bread can be bought
|
|
173
|
+
* at any of three supermarkets, and the one shown is only the nearest from
|
|
174
|
+
* here until someone settles it.
|
|
175
|
+
*/
|
|
176
|
+
static String stateLine(String answer, boolean locked, int options) {
|
|
177
|
+
String said = answer == null ? "" : answer;
|
|
178
|
+
if ("go".equals(said)) return "Dijiste que vas";
|
|
179
|
+
if ("next".equals(said)) return "Te aviso en la siguiente";
|
|
180
|
+
if ("skip".equals(said)) return "Lo dejaste para otro día";
|
|
181
|
+
if (locked) return "Lugar elegido";
|
|
182
|
+
if (options > 1) return options + " lugares posibles · te muestro el más cercano";
|
|
183
|
+
return "";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private static LinearLayout.LayoutParams rowParams(Context context) {
|
|
187
|
+
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
|
188
|
+
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
|
189
|
+
params.topMargin = dp(context, 8);
|
|
190
|
+
return params;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private static LinearLayout.LayoutParams chipParams(Context context, boolean first) {
|
|
194
|
+
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,
|
|
195
|
+
LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
|
|
196
|
+
if (!first) params.leftMargin = dp(context, 8);
|
|
197
|
+
return params;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private static int dp(Context context, int value) {
|
|
201
|
+
return Math.round(value * context.getResources().getDisplayMetrics().density);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
package dev.agentprojectcontext.apx;
|
|
2
|
+
|
|
3
|
+
import androidx.annotation.NonNull;
|
|
4
|
+
import androidx.car.app.CarContext;
|
|
5
|
+
import androidx.car.app.Screen;
|
|
6
|
+
import androidx.car.app.model.Action;
|
|
7
|
+
import androidx.car.app.model.CarIcon;
|
|
8
|
+
import androidx.car.app.model.ItemList;
|
|
9
|
+
import androidx.car.app.model.ListTemplate;
|
|
10
|
+
import androidx.car.app.model.Row;
|
|
11
|
+
import androidx.car.app.model.Template;
|
|
12
|
+
import androidx.core.graphics.drawable.IconCompat;
|
|
13
|
+
import androidx.lifecycle.DefaultLifecycleObserver;
|
|
14
|
+
import androidx.lifecycle.LifecycleOwner;
|
|
15
|
+
|
|
16
|
+
import java.util.ArrayList;
|
|
17
|
+
import java.util.List;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The chip's main screen: everything owed on this drive, in one list.
|
|
21
|
+
*
|
|
22
|
+
* TWO SOURCES, ONE LIST. What has come into RANGE sits at the top — that is
|
|
23
|
+
* the decision on the clock — and the rest of the trip's errands follow. The
|
|
24
|
+
* second half is the point of opening the app at all: the owner wanted the
|
|
25
|
+
* list to hand while driving, so it can be read at a light and ticked off
|
|
26
|
+
* there, rather than having to remember what was on it until the next alert
|
|
27
|
+
* fires. An errand with no alert yet is still an errand.
|
|
28
|
+
*
|
|
29
|
+
* The errand list is fetched, not pushed: it changes when a task is added or
|
|
30
|
+
* the car moves far enough to re-rank, neither of which is worth a socket.
|
|
31
|
+
* The alerts half is push (CarAlertStore) because it is the urgent one.
|
|
32
|
+
*/
|
|
33
|
+
final class TripScreen extends Screen implements DefaultLifecycleObserver {
|
|
34
|
+
|
|
35
|
+
/** Redraw when the alert set changes underneath us. */
|
|
36
|
+
private final Runnable onAlerts = this::invalidate;
|
|
37
|
+
|
|
38
|
+
/** The trip's errands, last time we asked. */
|
|
39
|
+
private List<DaemonClient.TripPlace> errands = new ArrayList<>();
|
|
40
|
+
private boolean asked = false;
|
|
41
|
+
|
|
42
|
+
TripScreen(@NonNull CarContext carContext) {
|
|
43
|
+
super(carContext);
|
|
44
|
+
getLifecycle().addObserver(this);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Override
|
|
48
|
+
public void onStart(@NonNull LifecycleOwner owner) {
|
|
49
|
+
CarAlertStore.addListener(onAlerts);
|
|
50
|
+
refreshErrands();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@Override
|
|
54
|
+
public void onStop(@NonNull LifecycleOwner owner) {
|
|
55
|
+
// A screen that keeps a listener after it is gone keeps the store
|
|
56
|
+
// holding a reference to a dead Screen for the rest of the drive.
|
|
57
|
+
CarAlertStore.removeListener(onAlerts);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Ask the daemon what is still owed. Read-only on purpose: the endpoint
|
|
62
|
+
* fires no reminder and spends no one-shot, so opening the chip never
|
|
63
|
+
* costs the owner an alert they had not been given yet.
|
|
64
|
+
*/
|
|
65
|
+
private void refreshErrands() {
|
|
66
|
+
ApxPreferences preferences = new ApxPreferences(getCarContext());
|
|
67
|
+
DaemonClient.fetchTripPlaces(
|
|
68
|
+
preferences.daemonUrl(),
|
|
69
|
+
preferences.token(),
|
|
70
|
+
new DaemonClient.TripCallback() {
|
|
71
|
+
@Override public void onTrip(List<DaemonClient.TripPlace> places) {
|
|
72
|
+
errands = places == null ? new ArrayList<>() : places;
|
|
73
|
+
asked = true;
|
|
74
|
+
getCarContext().getMainExecutor().execute(TripScreen.this::invalidate);
|
|
75
|
+
}
|
|
76
|
+
@Override public void onError(String message) {
|
|
77
|
+
// No trip, no pairing, no daemon: the screen falls back to
|
|
78
|
+
// whatever alerts it has rather than showing an error the
|
|
79
|
+
// driver can do nothing about.
|
|
80
|
+
asked = true;
|
|
81
|
+
getCarContext().getMainExecutor().execute(TripScreen.this::invalidate);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@Override
|
|
88
|
+
@NonNull
|
|
89
|
+
public Template onGetTemplate() {
|
|
90
|
+
ItemList.Builder items = new ItemList.Builder();
|
|
91
|
+
List<MessageFrameParser.MobilityAlert> alerts = CarAlertStore.all();
|
|
92
|
+
int rows = 0;
|
|
93
|
+
|
|
94
|
+
// In range now — tapping opens the four answers.
|
|
95
|
+
for (MessageFrameParser.MobilityAlert alert : alerts) {
|
|
96
|
+
Row.Builder row = new Row.Builder()
|
|
97
|
+
.setTitle(alert.title())
|
|
98
|
+
.setImage(new CarIcon.Builder(
|
|
99
|
+
IconCompat.createWithResource(getCarContext(), R.drawable.ic_trip_car)).build())
|
|
100
|
+
.setBrowsable(true)
|
|
101
|
+
.setOnClickListener(() -> getScreenManager().push(new AlertScreen(getCarContext(), alert.id())));
|
|
102
|
+
String detail = detailLine(alert.distanceLabel(), alert.place(), alert.address());
|
|
103
|
+
if (!detail.isEmpty()) row.addText(detail);
|
|
104
|
+
items.addItem(row.build());
|
|
105
|
+
rows++;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Still owed on this drive. Anything already alerted is skipped: it is
|
|
109
|
+
// in the list above, and one errand twice reads as two.
|
|
110
|
+
for (DaemonClient.TripPlace errand : errands) {
|
|
111
|
+
if (rows >= MAX_ROWS) break;
|
|
112
|
+
if (alreadyAlerted(alerts, errand)) continue;
|
|
113
|
+
Row.Builder row = new Row.Builder()
|
|
114
|
+
.setTitle(errandTitle(errand))
|
|
115
|
+
.setBrowsable(true)
|
|
116
|
+
.setOnClickListener(() ->
|
|
117
|
+
getScreenManager().push(new ErrandScreen(getCarContext(), errand)));
|
|
118
|
+
String detail = detailLine(distanceLabel(errand.distanceM()), errand.place(), null);
|
|
119
|
+
if (!detail.isEmpty()) row.addText(detail);
|
|
120
|
+
items.addItem(row.build());
|
|
121
|
+
rows++;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (rows == 0) {
|
|
125
|
+
items.addItem(new Row.Builder()
|
|
126
|
+
.setTitle(getCarContext().getString(
|
|
127
|
+
asked ? R.string.car_no_alerts : R.string.car_loading))
|
|
128
|
+
.build());
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return new ListTemplate.Builder()
|
|
132
|
+
.setSingleList(items.build())
|
|
133
|
+
.setTitle(getCarContext().getString(R.string.car_trip_title))
|
|
134
|
+
.setHeaderAction(Action.APP_ICON)
|
|
135
|
+
.build();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A head unit shows a handful of rows; past that nobody is reading. */
|
|
139
|
+
private static final int MAX_ROWS = 6;
|
|
140
|
+
|
|
141
|
+
private static boolean alreadyAlerted(
|
|
142
|
+
List<MessageFrameParser.MobilityAlert> alerts, DaemonClient.TripPlace errand
|
|
143
|
+
) {
|
|
144
|
+
for (MessageFrameParser.MobilityAlert alert : alerts) {
|
|
145
|
+
if (alert.title() != null && alert.title().equals(errand.task())) return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private static String errandTitle(DaemonClient.TripPlace errand) {
|
|
151
|
+
// The errand leads here too — it is what the row is about.
|
|
152
|
+
String task = errand.task();
|
|
153
|
+
if (task != null && !task.isBlank()) return task;
|
|
154
|
+
return errand.place() == null || errand.place().isBlank() ? "—" : errand.place();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** "1.4 km" from raw metres, or nothing when the distance is unknown. */
|
|
158
|
+
private static String distanceLabel(int metres) {
|
|
159
|
+
if (metres < 0) return null;
|
|
160
|
+
return metres >= 1000
|
|
161
|
+
? String.format(java.util.Locale.US, "%.1f km", metres / 1000.0)
|
|
162
|
+
: metres + " m";
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* "1.4 km · Farmacia del Puente · Av. San Martin 1234" — or as much of it
|
|
167
|
+
* as we actually know.
|
|
168
|
+
*
|
|
169
|
+
* The row's TITLE is the errand, so the shop belongs here: distance first
|
|
170
|
+
* because it decides whether to look at all, then which shop, then the
|
|
171
|
+
* door to aim at.
|
|
172
|
+
*/
|
|
173
|
+
private static String detailLine(String distance, String place, String address) {
|
|
174
|
+
StringBuilder out = new StringBuilder();
|
|
175
|
+
for (String part : new String[] { distance, place, address }) {
|
|
176
|
+
if (part == null || part.isBlank()) continue;
|
|
177
|
+
if (out.length() > 0) out.append(" · ");
|
|
178
|
+
out.append(part);
|
|
179
|
+
}
|
|
180
|
+
return out.toString();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
3
|
+
<item android:drawable="@color/apx_dark" />
|
|
4
|
+
<item
|
|
5
|
+
android:width="160dp"
|
|
6
|
+
android:height="160dp"
|
|
7
|
+
android:gravity="center">
|
|
8
|
+
<bitmap
|
|
9
|
+
android:gravity="fill"
|
|
10
|
+
android:src="@drawable/apx_logo" />
|
|
11
|
+
</item>
|
|
12
|
+
</layer-list>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
3
|
+
android:width="108dp"
|
|
4
|
+
android:height="108dp"
|
|
5
|
+
android:viewportWidth="108"
|
|
6
|
+
android:viewportHeight="108">
|
|
7
|
+
<path android:fillColor="#123A31" android:pathData="M0,0 H108 V108 H0 Z" />
|
|
8
|
+
<path android:fillColor="#38E1B5" android:pathData="M54,18 L20,88 H36 L54,48 L72,88 H88 Z" />
|
|
9
|
+
<path android:fillColor="#FFFFFFFF" android:pathData="M38,74 H70 L76,88 H32 Z" />
|
|
10
|
+
</vector>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
3
|
+
<item
|
|
4
|
+
android:left="12dp"
|
|
5
|
+
android:top="12dp"
|
|
6
|
+
android:right="12dp"
|
|
7
|
+
android:bottom="12dp">
|
|
8
|
+
<bitmap
|
|
9
|
+
android:gravity="fill"
|
|
10
|
+
android:src="@drawable/apx_logo" />
|
|
11
|
+
</item>
|
|
12
|
+
</layer-list>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
3
|
+
android:width="24dp"
|
|
4
|
+
android:height="24dp"
|
|
5
|
+
android:viewportWidth="24"
|
|
6
|
+
android:viewportHeight="24">
|
|
7
|
+
<path
|
|
8
|
+
android:fillColor="#FFFFFFFF"
|
|
9
|
+
android:pathData="M12,1 C13.1,1 17,4.9 17,6 C17,7.1 14.2,9.9 13,10 L13,6.5 C13,5.7 12.6,5.3 12,5.3 C11.4,5.3 11,5.7 11,6.5 L11,10 C9.8,9.9 7,7.1 7,6 C7,4.9 10.9,1 12,1 Z" />
|
|
10
|
+
<path
|
|
11
|
+
android:fillColor="#FFFFFFFF"
|
|
12
|
+
android:pathData="M23,12 C23,13.1 19.1,17 18,17 C16.9,17 14.1,14.2 14,13 L17.5,13 C18.3,13 18.7,12.6 18.7,12 C18.7,11.4 18.3,11 17.5,11 L14,11 C14.1,9.8 16.9,7 18,7 C19.1,7 23,10.9 23,12 Z" />
|
|
13
|
+
<path
|
|
14
|
+
android:fillColor="#FFFFFFFF"
|
|
15
|
+
android:pathData="M12,23 C10.9,23 7,19.1 7,18 C7,16.9 9.8,14.1 11,14 L11,17.5 C11,18.3 11.4,18.7 12,18.7 C12.6,18.7 13,18.3 13,17.5 L13,14 C14.2,14.1 17,16.9 17,18 C17,19.1 13.1,23 12,23 Z" />
|
|
16
|
+
<path
|
|
17
|
+
android:fillColor="#FFFFFFFF"
|
|
18
|
+
android:pathData="M1,12 C1,10.9 4.9,7 6,7 C7.1,7 9.9,9.8 10,11 L6.5,11 C5.7,11 5.3,11.4 5.3,12 C5.3,12.6 5.7,13 6.5,13 L10,13 C9.9,14.2 7.1,17 6,17 C4.9,17 1,13.1 1,12 Z" />
|
|
19
|
+
<path
|
|
20
|
+
android:fillColor="#FFFFFFFF"
|
|
21
|
+
android:pathData="M12,9.4 A2.6,2.6 0,1 1,12,14.6 A2.6,2.6 0,1 1,12,9.4 Z" />
|
|
22
|
+
</vector>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
The trip banner's mark. A drawn car rather than the 🚗 emoji: the emoji is
|
|
4
|
+
rendered by whichever font the OEM ships, so it changed shape and colour per
|
|
5
|
+
device and never matched the brand green next to it.
|
|
6
|
+
|
|
7
|
+
Wheels are cut in the banner's own background colour so they read as holes at
|
|
8
|
+
the size this is actually shown (28dp), where a stroked outline would blur.
|
|
9
|
+
-->
|
|
10
|
+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
11
|
+
android:width="28dp"
|
|
12
|
+
android:height="28dp"
|
|
13
|
+
android:viewportWidth="24"
|
|
14
|
+
android:viewportHeight="24">
|
|
15
|
+
<!-- cabin -->
|
|
16
|
+
<path
|
|
17
|
+
android:fillColor="#3AE7B0"
|
|
18
|
+
android:pathData="M7.3,6.1 C7.7,5.3 8.4,4.8 9.3,4.8 L14.7,4.8 C15.6,4.8 16.3,5.3 16.7,6.1 L18.6,10.3 L5.4,10.3 Z" />
|
|
19
|
+
<!-- body -->
|
|
20
|
+
<path
|
|
21
|
+
android:fillColor="#3AE7B0"
|
|
22
|
+
android:pathData="M3.4,12.6 C3.4,11.4 4.4,10.4 5.6,10.4 L18.4,10.4 C19.6,10.4 20.6,11.4 20.6,12.6 L20.6,15.9 C20.6,16.5 20.1,17 19.5,17 L4.5,17 C3.9,17 3.4,16.5 3.4,15.9 Z" />
|
|
23
|
+
<!-- wheel wells, punched in the banner ground -->
|
|
24
|
+
<path
|
|
25
|
+
android:fillColor="#153028"
|
|
26
|
+
android:pathData="M7.2,14.9 m-2.1,0 a2.1,2.1 0 1,0 4.2,0 a2.1,2.1 0 1,0 -4.2,0" />
|
|
27
|
+
<path
|
|
28
|
+
android:fillColor="#153028"
|
|
29
|
+
android:pathData="M16.8,14.9 m-2.1,0 a2.1,2.1 0 1,0 4.2,0 a2.1,2.1 0 1,0 -4.2,0" />
|
|
30
|
+
<!-- windows -->
|
|
31
|
+
<path
|
|
32
|
+
android:fillColor="#153028"
|
|
33
|
+
android:pathData="M8.5,6.6 L11.3,6.6 L11.3,9.2 L7.3,9.2 Z" />
|
|
34
|
+
<path
|
|
35
|
+
android:fillColor="#153028"
|
|
36
|
+
android:pathData="M12.7,6.6 L15.5,6.6 L16.7,9.2 L12.7,9.2 Z" />
|
|
37
|
+
</vector>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<resources>
|
|
2
|
+
<string name="app_name">APX</string>
|
|
3
|
+
<string name="mascot_channel">Mascota APX</string>
|
|
4
|
+
<string name="messages_channel">Mensajes APX</string>
|
|
5
|
+
<string name="proximity_channel">Avisos de proximidad</string>
|
|
6
|
+
<!-- Head-unit copy. Read aloud by Assistant, so: no emoji, no markup, and
|
|
7
|
+
short enough to be heard between two turns. -->
|
|
8
|
+
<string name="car_trip_title">APX</string>
|
|
9
|
+
<string name="car_no_alerts">Nada cerca</string>
|
|
10
|
+
<string name="car_loading">Buscando…</string>
|
|
11
|
+
<string name="car_alert_gone">Ya respondiste este aviso.</string>
|
|
12
|
+
<string name="car_navigate_failed">No pude abrir la navegación.</string>
|
|
13
|
+
<string name="car_ack_dismissed">Listo, no te aviso mas de esta en este viaje.</string>
|
|
14
|
+
<string name="car_ack_later">Listo, te aviso en la siguiente.</string>
|
|
15
|
+
<!-- Verbos de la lista de pendientes del viaje. -->
|
|
16
|
+
<string name="car_errand_done">Ya la hice</string>
|
|
17
|
+
<string name="car_ack_done">Listo, la cierro.</string>
|
|
18
|
+
<string name="mobility_navigate">Navegar ahora</string>
|
|
19
|
+
<string name="mobility_add_stop">Sumar a la ruta</string>
|
|
20
|
+
<string name="trip_tracking_channel">Viaje en curso</string>
|
|
21
|
+
<string name="trip_tracking_channel_description">Mientras hay un viaje activo, APX comparte tu posición con tu daemon para avisarte si pasás cerca de algo pendiente.</string>
|
|
22
|
+
<string name="trip_tracking_title">Viaje en curso</string>
|
|
23
|
+
<string name="trip_tracking_text">APX sigue tu posición para avisarte de pendientes cercanos</string>
|
|
24
|
+
<string name="trip_tracking_text_destination">En camino a %1$s</string>
|
|
25
|
+
</resources>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<resources>
|
|
2
|
+
<style name="AppTheme" parent="android:style/Theme.Material.NoActionBar">
|
|
3
|
+
<item name="android:fontFamily">sans</item>
|
|
4
|
+
<item name="android:colorAccent">@color/apx_green</item>
|
|
5
|
+
<item name="android:navigationBarColor">@color/apx_dark</item>
|
|
6
|
+
<item name="android:statusBarColor">@color/apx_dark</item>
|
|
7
|
+
<item name="android:windowLightStatusBar">false</item>
|
|
8
|
+
<item name="android:windowBackground">@drawable/app_background</item>
|
|
9
|
+
</style>
|
|
10
|
+
</resources>
|