@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
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
// components in ./ui/* — they keep a small, stable API (variant/tone/size,
|
|
3
3
|
// Dialog open/onClose, Field label/hint) so call sites don't churn, while the
|
|
4
4
|
// actual rendering comes from base-ui (proper focus, portaling, a11y).
|
|
5
|
-
import type { ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes
|
|
5
|
+
import type { ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes } from "react";
|
|
6
|
+
import type { LucideIcon } from "lucide-react";
|
|
6
7
|
import { cn } from "../lib/cn";
|
|
8
|
+
import { t } from "../i18n";
|
|
9
|
+
import { Logo } from "./layout/Logo";
|
|
7
10
|
import { Button as SButton } from "./ui/button";
|
|
8
11
|
import { Input as SInput } from "./ui/input";
|
|
9
12
|
import { Textarea as STextarea } from "./ui/textarea";
|
|
@@ -59,19 +62,6 @@ export function Textarea(props: TextareaHTMLAttributes<HTMLTextAreaElement>) {
|
|
|
59
62
|
return <STextarea {...props} />;
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
// Native select kept for legacy call sites; new code uses UiSelect (base-ui).
|
|
63
|
-
export function Select(props: SelectHTMLAttributes<HTMLSelectElement>) {
|
|
64
|
-
return (
|
|
65
|
-
<select
|
|
66
|
-
{...props}
|
|
67
|
-
className={cn(
|
|
68
|
-
"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 text-sm outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
|
|
69
|
-
props.className,
|
|
70
|
-
)}
|
|
71
|
-
/>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
65
|
// ── Field wrapper ───────────────────────────────────────────────────────────
|
|
76
66
|
|
|
77
67
|
export function Field({
|
|
@@ -96,7 +86,7 @@ export function Field({
|
|
|
96
86
|
)}
|
|
97
87
|
</span>
|
|
98
88
|
{children}
|
|
99
|
-
{hint && <span className="block text-[11px] text-muted-foreground
|
|
89
|
+
{hint && <span className="block text-[11px] text-muted-foreground">{hint}</span>}
|
|
100
90
|
</div>
|
|
101
91
|
);
|
|
102
92
|
}
|
|
@@ -137,12 +127,15 @@ export function Badge({
|
|
|
137
127
|
}) {
|
|
138
128
|
// muted/danger use built-in variants; the colored tones use outline + color.
|
|
139
129
|
const variant = tone === "danger" ? "destructive" : tone === "muted" ? "secondary" : "outline";
|
|
130
|
+
// Light ink matches lib/tone's chip scale (800, not 700): these badges land
|
|
131
|
+
// on muted rows as often as on a card, and 700 only clears 4.5:1 against
|
|
132
|
+
// white. See lib/tone.ts for the shared pairs.
|
|
140
133
|
const toneClass: Record<Tone, string> = {
|
|
141
134
|
muted: "",
|
|
142
135
|
danger: "",
|
|
143
|
-
success: "text-emerald-400 border-emerald-500/30",
|
|
144
|
-
warning: "text-amber-400 border-amber-500/30",
|
|
145
|
-
info: "text-sky-400 border-sky-500/30",
|
|
136
|
+
success: "text-emerald-800 dark:text-emerald-400 border-emerald-500/30",
|
|
137
|
+
warning: "text-amber-800 dark:text-amber-400 border-amber-500/30",
|
|
138
|
+
info: "text-sky-800 dark:text-sky-400 border-sky-500/30",
|
|
146
139
|
};
|
|
147
140
|
return (
|
|
148
141
|
<SBadge variant={variant} className={cn("rounded-md", toneClass[tone], className)}>
|
|
@@ -201,18 +194,64 @@ export function Spinner({ size = 14 }: { size?: number }) {
|
|
|
201
194
|
|
|
202
195
|
// ── Empty / Loading helpers ─────────────────────────────────────────────────
|
|
203
196
|
|
|
204
|
-
|
|
197
|
+
/**
|
|
198
|
+
* The house empty state: one centred illustration, the line that says what is
|
|
199
|
+
* missing, and optionally the button that fixes it. Every empty pane in the
|
|
200
|
+
* app goes through here, so they all read the same way.
|
|
201
|
+
*
|
|
202
|
+
* `icon` is the screen's own lucide glyph; without one the APX mark stands in.
|
|
203
|
+
* `fill` is for the empty half of a master-detail (or any pane with a height):
|
|
204
|
+
* it takes the whole pane and centres in it, instead of leaving a short dashed
|
|
205
|
+
* card pinned to the top edge with dead space under it. Inline (no `fill`) it
|
|
206
|
+
* is a card sized for the gap where the list would have been.
|
|
207
|
+
*/
|
|
208
|
+
export function Empty({
|
|
209
|
+
children,
|
|
210
|
+
icon: Icon,
|
|
211
|
+
action,
|
|
212
|
+
fill,
|
|
213
|
+
className,
|
|
214
|
+
}: {
|
|
215
|
+
children: ReactNode;
|
|
216
|
+
icon?: LucideIcon;
|
|
217
|
+
/** The one button that resolves the state — create the first item, retry. */
|
|
218
|
+
action?: ReactNode;
|
|
219
|
+
fill?: boolean;
|
|
220
|
+
className?: string;
|
|
221
|
+
}) {
|
|
205
222
|
return (
|
|
206
|
-
<div
|
|
207
|
-
{
|
|
223
|
+
<div
|
|
224
|
+
className={cn(
|
|
225
|
+
"flex flex-col items-center justify-center gap-4 text-center",
|
|
226
|
+
fill
|
|
227
|
+
? "h-full min-h-[200px] p-8"
|
|
228
|
+
: "rounded-lg border border-dashed border-border bg-muted/20 px-6 py-8",
|
|
229
|
+
className
|
|
230
|
+
)}
|
|
231
|
+
>
|
|
232
|
+
<div
|
|
233
|
+
className={cn(
|
|
234
|
+
"grid shrink-0 place-items-center rounded-full bg-muted/70 ring-1 ring-border/60",
|
|
235
|
+
fill ? "size-24" : "size-14"
|
|
236
|
+
)}
|
|
237
|
+
>
|
|
238
|
+
{Icon
|
|
239
|
+
? <Icon size={fill ? 42 : 24} strokeWidth={1.5} className="text-muted-fg" />
|
|
240
|
+
: <Logo size={fill ? 44 : 26} />}
|
|
241
|
+
</div>
|
|
242
|
+
<div className="max-w-[46ch] text-balance text-sm leading-relaxed text-muted-foreground">{children}</div>
|
|
243
|
+
{action}
|
|
208
244
|
</div>
|
|
209
245
|
);
|
|
210
246
|
}
|
|
211
247
|
|
|
212
|
-
|
|
248
|
+
// The label is i18n by default: most call sites just want "loading", and a
|
|
249
|
+
// hardcoded default here rendered Spanish inside the English UI.
|
|
250
|
+
export function Loading({ label }: { label?: string }) {
|
|
251
|
+
const text = label ?? t("common.loading");
|
|
213
252
|
return (
|
|
214
253
|
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
215
|
-
<Spinner /> {
|
|
254
|
+
<Spinner /> {text}
|
|
216
255
|
</div>
|
|
217
256
|
);
|
|
218
257
|
}
|
|
@@ -4,6 +4,7 @@ import { StatusDot } from "../Section";
|
|
|
4
4
|
import { cn } from "../../lib/cn";
|
|
5
5
|
import { TTS_PROVIDER_META, type TtsEngineInfo } from "../../lib/api/voice";
|
|
6
6
|
import { t } from "../../i18n";
|
|
7
|
+
import { toneOutline } from "../../lib/tone";
|
|
7
8
|
|
|
8
9
|
// TTS engine list — an ordered fallback chain (router). The arrows reorder the
|
|
9
10
|
// chain, the switch enables/disables an engine, and the first available engine
|
|
@@ -120,7 +121,7 @@ export function VoiceProviderList({
|
|
|
120
121
|
className={cn(
|
|
121
122
|
"rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:opacity-50",
|
|
122
123
|
e.emotionsOn
|
|
123
|
-
?
|
|
124
|
+
? toneOutline.emerald
|
|
124
125
|
: "border-border text-muted-fg hover:text-fg",
|
|
125
126
|
)}
|
|
126
127
|
>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
|
+
import useSWR from "swr";
|
|
2
3
|
import { Button, Dialog, Field, Input, Switch, Textarea } from "../ui";
|
|
3
4
|
import { UiSelect } from "../UiSelect";
|
|
4
5
|
import { isSecretMarker, secretSuffix } from "../../lib/secrets";
|
|
@@ -8,7 +9,10 @@ import {
|
|
|
8
9
|
GEMINI_TTS_VOICES,
|
|
9
10
|
OPENAI_TTS_MODELS,
|
|
10
11
|
OPENAI_TTS_VOICES,
|
|
12
|
+
QVOX_LANGUAGES,
|
|
11
13
|
TTS_PROVIDER_META,
|
|
14
|
+
Voice,
|
|
15
|
+
voiceLabel,
|
|
12
16
|
type CustomTtsConfig,
|
|
13
17
|
type ElevenLabsConfig,
|
|
14
18
|
type EmotionsConfig,
|
|
@@ -72,6 +76,15 @@ function EmotionsField({ on, setOn, tags, setTags }: {
|
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
export function VoiceProviderModal({ open, providerId, config, onClose, onSave }: Props) {
|
|
79
|
+
// The speakers this endpoint actually has. Resolved daemon-side from the
|
|
80
|
+
// SAVED base_url, so a provider still being created has no list — the field
|
|
81
|
+
// degrades to free text rather than to a wrong list.
|
|
82
|
+
const saved = open && providerId?.startsWith("custom:") ? providerId : null;
|
|
83
|
+
const { data: voiceList } = useSWR(saved ? ["tts-voices", saved] : null, () =>
|
|
84
|
+
Voice.voices(saved as string)
|
|
85
|
+
);
|
|
86
|
+
const serverVoices = voiceList?.voices ?? [];
|
|
87
|
+
|
|
75
88
|
const [busy, setBusy] = useState(false);
|
|
76
89
|
const [error, setError] = useState<string | null>(null);
|
|
77
90
|
|
|
@@ -100,7 +113,10 @@ export function VoiceProviderModal({ open, providerId, config, onClose, onSave }
|
|
|
100
113
|
label: str(p.label),
|
|
101
114
|
base_url: str(p.base_url),
|
|
102
115
|
model: str(p.model),
|
|
116
|
+
language: str(p.language),
|
|
103
117
|
voice: str(p.voice),
|
|
118
|
+
clone: str(p.clone),
|
|
119
|
+
ref_text: str(p.ref_text),
|
|
104
120
|
format: str(p.format),
|
|
105
121
|
style: str(p.style),
|
|
106
122
|
temperature: str(p.temperature),
|
|
@@ -155,21 +171,29 @@ export function VoiceProviderModal({ open, providerId, config, onClose, onSave }
|
|
|
155
171
|
|
|
156
172
|
const set: Record<string, unknown> = {};
|
|
157
173
|
const unset: string[] = [];
|
|
158
|
-
|
|
159
|
-
|
|
174
|
+
// Tolerates a field this provider's form never rendered: absent and
|
|
175
|
+
// blank both mean "clear it", never a crash on the way to saving.
|
|
176
|
+
const opt = (key: string, val: string | undefined) => {
|
|
177
|
+
if (val?.trim()) set[`${base}.${key}`] = val.trim();
|
|
160
178
|
else unset.push(`${base}.${key}`);
|
|
161
179
|
};
|
|
162
180
|
|
|
163
181
|
if (isCustom) {
|
|
164
182
|
set[`${base}.label`] = f.label.trim();
|
|
165
183
|
set[`${base}.base_url`] = f.base_url.trim();
|
|
184
|
+
opt("language", f.language);
|
|
185
|
+
// The three ways to pick a timbre. They are not additive — the server
|
|
186
|
+
// reads clone, then voice, then style — so all three are stored and the
|
|
187
|
+
// form says which one is winning rather than hiding the other two.
|
|
188
|
+
opt("voice", f.voice);
|
|
189
|
+
opt("clone", f.clone);
|
|
190
|
+
opt("ref_text", f.ref_text);
|
|
166
191
|
opt("style", f.style);
|
|
167
192
|
if (f.temperature.trim() && !Number.isNaN(Number(f.temperature)))
|
|
168
193
|
set[`${base}.temperature`] = Number(f.temperature);
|
|
169
194
|
else unset.push(`${base}.temperature`);
|
|
170
|
-
// Advanced (optional): model
|
|
195
|
+
// Advanced (optional): the model id, for servers that host several.
|
|
171
196
|
opt("model", f.model);
|
|
172
|
-
opt("voice", f.voice);
|
|
173
197
|
} else if (providerId === "piper") {
|
|
174
198
|
opt("bin", f.bin);
|
|
175
199
|
opt("model", f.model);
|
|
@@ -285,9 +309,46 @@ export function VoiceProviderModal({ open, providerId, config, onClose, onSave }
|
|
|
285
309
|
<Field label={t("voice_ui.api_key_label")} hint={existingKey ? t("voice_ui.api_key_keep_hint") : t("voice_ui.api_key_optional_hint")}>
|
|
286
310
|
<Input type="password" autoComplete="new-password" value={apiKey} onChange={(e) => setApiKey(e.target.value)} placeholder={keyPlaceholder} />
|
|
287
311
|
</Field>
|
|
288
|
-
<Field label={t("voice_ui.
|
|
312
|
+
<Field label={t("voice_ui.language_label")} hint={t("voice_ui.language_hint")}>
|
|
313
|
+
<UiSelect
|
|
314
|
+
value={f.language || ""}
|
|
315
|
+
onChange={(v) => up({ language: v })}
|
|
316
|
+
options={[
|
|
317
|
+
{ value: "", label: t("voice_ui.language_server_default") },
|
|
318
|
+
...QVOX_LANGUAGES.map((l) => ({ value: l, label: l })),
|
|
319
|
+
]}
|
|
320
|
+
/>
|
|
321
|
+
</Field>
|
|
322
|
+
|
|
323
|
+
{/* The timbre. Three mutually exclusive ways to set it, in the
|
|
324
|
+
order the server resolves them, with the winner named out loud:
|
|
325
|
+
a preset speaker keeps its own accent, so choosing one is also
|
|
326
|
+
choosing to ignore the accent described in the style. */}
|
|
327
|
+
<Field label={t("voice_ui.voice_label")} hint={t("voice_ui.qvox_voice_hint")}>
|
|
328
|
+
{serverVoices.length > 0 ? (
|
|
329
|
+
<UiSelect
|
|
330
|
+
value={f.voice || ""}
|
|
331
|
+
onChange={(v) => up({ voice: v })}
|
|
332
|
+
options={[
|
|
333
|
+
{ value: "", label: t("voice_ui.voice_none") },
|
|
334
|
+
...serverVoices.map((v) => ({ value: v, label: voiceLabel(v, voiceList) })),
|
|
335
|
+
]}
|
|
336
|
+
/>
|
|
337
|
+
) : (
|
|
338
|
+
<Input value={f.voice || ""} onChange={(e) => up({ voice: e.target.value })} placeholder={t("voice_ui.custom_optional_ph")} />
|
|
339
|
+
)}
|
|
340
|
+
</Field>
|
|
341
|
+
<Field label={t("voice_ui.style_label")} hint={(f.voice || "").trim() ? t("voice_ui.style_overridden_hint") : t("voice_ui.qvox_style_hint")}>
|
|
289
342
|
<Textarea rows={2} value={f.style || ""} onChange={(e) => up({ style: e.target.value })} placeholder={t("voice_ui.style_ph")} />
|
|
290
343
|
</Field>
|
|
344
|
+
<Field label={t("voice_ui.clone_label")} hint={t("voice_ui.clone_hint")}>
|
|
345
|
+
<Input value={f.clone || ""} onChange={(e) => up({ clone: e.target.value })} placeholder="/Users/me/.qvox/voices/mi-voz.wav" />
|
|
346
|
+
</Field>
|
|
347
|
+
{(f.clone || "").trim() && (
|
|
348
|
+
<Field label={t("voice_ui.ref_text_label")} hint={t("voice_ui.ref_text_hint")}>
|
|
349
|
+
<Textarea rows={2} value={f.ref_text || ""} onChange={(e) => up({ ref_text: e.target.value })} />
|
|
350
|
+
</Field>
|
|
351
|
+
)}
|
|
291
352
|
<Field label={t("voice_ui.temperature_label")} hint={t("voice_ui.temperature_hint")}>
|
|
292
353
|
<Input value={f.temperature} onChange={(e) => up({ temperature: e.target.value })} inputMode="decimal" placeholder="0.7" />
|
|
293
354
|
</Field>
|
|
@@ -305,9 +366,6 @@ export function VoiceProviderModal({ open, providerId, config, onClose, onSave }
|
|
|
305
366
|
<Field label={t("voice_ui.model_label")} hint={t("voice_ui.custom_model_hint")}>
|
|
306
367
|
<Input value={f.model} onChange={(e) => up({ model: e.target.value })} placeholder={t("voice_ui.custom_optional_ph")} />
|
|
307
368
|
</Field>
|
|
308
|
-
<Field label={t("voice_ui.voice_label")} hint={t("voice_ui.custom_voice_hint")}>
|
|
309
|
-
<Input value={f.voice} onChange={(e) => up({ voice: e.target.value })} placeholder={t("voice_ui.custom_optional_ph")} />
|
|
310
|
-
</Field>
|
|
311
369
|
</div>
|
|
312
370
|
)}
|
|
313
371
|
</div>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// The offer to set up a local voice, shown under the provider list because
|
|
2
|
+
// that is where the absence is felt: every other engine there bills per minute
|
|
3
|
+
// and sends the audio off the machine.
|
|
4
|
+
//
|
|
5
|
+
// Only rendered while QVox is missing. Telling a machine that already runs it
|
|
6
|
+
// to go and install it is the one thing this card must not do — the status
|
|
7
|
+
// card next to the tests covers that case instead.
|
|
8
|
+
import { Button } from "../ui";
|
|
9
|
+
import { t } from "../../i18n";
|
|
10
|
+
import { usePersonaName } from "../../hooks/usePersonaName";
|
|
11
|
+
import { QVOX_REPO } from "../../lib/qvox";
|
|
12
|
+
|
|
13
|
+
// English on purpose, like the Sessions tab's "ask the persona": this is a
|
|
14
|
+
// prompt for the super-agent, not UI copy, and the user appends their own
|
|
15
|
+
// instructions after the colon.
|
|
16
|
+
const ASK_PROMPT =
|
|
17
|
+
"Install QVox (local Qwen3-TTS on Apple Silicon) and wire it into APX as a voice provider. " +
|
|
18
|
+
"Steps: check that Node 18+ and `uv` are installed (`brew install uv` if missing — the npm package " +
|
|
19
|
+
"installs only the Node CLI, and the engine runs through `uv run`, so it will not start without it); " +
|
|
20
|
+
"`npm install -g qwen3-tts-api`; `qvox setup`, which creates the config and folders and checks the " +
|
|
21
|
+
"dependencies; `qvox models download` for the first model, a multi-gigabyte download; " +
|
|
22
|
+
"`qvox serve` and leave it running on 127.0.0.1:5111; " +
|
|
23
|
+
"then add it in APX as a custom OpenAI-compatible TTS provider with base_url http://127.0.0.1:5111/v1. " +
|
|
24
|
+
`Repo: ${QVOX_REPO}. ` +
|
|
25
|
+
"Tell me what you did and what is still missing. With these instructions: ";
|
|
26
|
+
|
|
27
|
+
export function VoiceQvoxInstallCard() {
|
|
28
|
+
const persona = usePersonaName();
|
|
29
|
+
|
|
30
|
+
// Opens the side sheet with the prompt loaded but UNSENT, so it can be read
|
|
31
|
+
// and added to first.
|
|
32
|
+
const ask = () =>
|
|
33
|
+
window.dispatchEvent(
|
|
34
|
+
new CustomEvent("apx:roby-prompt", { detail: { prompt: ASK_PROMPT } })
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div
|
|
39
|
+
className="rounded-xl border border-dashed border-border p-5"
|
|
40
|
+
data-testid="qvox-install"
|
|
41
|
+
>
|
|
42
|
+
<h3 className="text-sm font-semibold text-foreground">{t("voice_ui.qvox_install_title")}</h3>
|
|
43
|
+
<p className="mt-1.5 text-sm text-muted-fg">{t("voice_ui.qvox_body")}</p>
|
|
44
|
+
|
|
45
|
+
<pre className="mt-3 overflow-x-auto rounded-lg bg-muted/40 p-3 text-[11px] leading-relaxed text-muted-fg">
|
|
46
|
+
<code>{"brew install uv\nnpm install -g qwen3-tts-api\nqvox setup\nqvox serve"}</code>
|
|
47
|
+
</pre>
|
|
48
|
+
<p className="mt-2 text-xs text-muted-fg">{t("voice_ui.qvox_note")}</p>
|
|
49
|
+
|
|
50
|
+
<div className="mt-4 flex flex-wrap items-center gap-2">
|
|
51
|
+
<Button size="sm" onClick={ask}>{t("voice_ui.qvox_ask", { persona })}</Button>
|
|
52
|
+
<a
|
|
53
|
+
href={QVOX_REPO}
|
|
54
|
+
target="_blank"
|
|
55
|
+
rel="noreferrer"
|
|
56
|
+
className="text-xs text-muted-fg underline underline-offset-2 hover:text-foreground"
|
|
57
|
+
>
|
|
58
|
+
{t("voice_ui.qvox_repo")}
|
|
59
|
+
</a>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// "Local voice on this Mac" — the standing report on the self-hosted engine.
|
|
2
|
+
//
|
|
3
|
+
// Lives next to the test/STT cards rather than in the provider list because it
|
|
4
|
+
// answers a different question. The list says what is configured; this says
|
|
5
|
+
// whether the thing is actually up.
|
|
6
|
+
//
|
|
7
|
+
// Its badge comes from a live probe, not from the provider list's `available`
|
|
8
|
+
// flag: that flag is a config probe by design (a custom endpoint counts as
|
|
9
|
+
// available for having a base_url), so it reads green with the server stopped.
|
|
10
|
+
// A status card that cannot go red is worse than no status card.
|
|
11
|
+
import useSWR from "swr";
|
|
12
|
+
import { Badge } from "../ui";
|
|
13
|
+
import { t } from "../../i18n";
|
|
14
|
+
import { Voice } from "../../lib/api/voice";
|
|
15
|
+
import { QVOX_REPO } from "../../lib/qvox";
|
|
16
|
+
|
|
17
|
+
export function VoiceQvoxStatusCard() {
|
|
18
|
+
// Polled, because the interesting transition (the server dying) produces no
|
|
19
|
+
// event anywhere. 15s is often enough to notice and rare enough to ignore.
|
|
20
|
+
const { data } = useSWR("/api/tts/reachable", () => Voice.reachable(), {
|
|
21
|
+
refreshInterval: 15_000,
|
|
22
|
+
});
|
|
23
|
+
const running = !!data?.reachable;
|
|
24
|
+
// Until the first probe answers, say nothing rather than flash "Stopped" at
|
|
25
|
+
// a server that is perfectly fine.
|
|
26
|
+
const known = data !== undefined;
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div className="rounded-xl border border-dashed border-border p-5" data-testid="qvox-status">
|
|
30
|
+
<div className="flex items-center gap-2">
|
|
31
|
+
<h3 className="text-sm font-semibold text-foreground">{t("voice_ui.qvox_title")}</h3>
|
|
32
|
+
{known && (
|
|
33
|
+
<Badge tone={running ? "success" : "warning"}>
|
|
34
|
+
{running ? t("voice_ui.qvox_running") : t("voice_ui.qvox_stopped")}
|
|
35
|
+
</Badge>
|
|
36
|
+
)}
|
|
37
|
+
</div>
|
|
38
|
+
<p className="mt-1.5 text-sm text-muted-fg">
|
|
39
|
+
{known && !running ? t("voice_ui.qvox_stopped_hint") : t("voice_ui.qvox_body")}
|
|
40
|
+
</p>
|
|
41
|
+
<a
|
|
42
|
+
href={QVOX_REPO}
|
|
43
|
+
target="_blank"
|
|
44
|
+
rel="noreferrer"
|
|
45
|
+
className="mt-3 inline-block text-xs text-muted-fg underline underline-offset-2 hover:text-foreground"
|
|
46
|
+
>
|
|
47
|
+
{t("voice_ui.qvox_repo")}
|
|
48
|
+
</a>
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -4,14 +4,15 @@ import { UiSelect } from "../UiSelect";
|
|
|
4
4
|
import { Voice, WHISPER_MODELS, type TranscriptionConfig, type SttHardwareResponse, type SttModelEntry } from "../../lib/api/voice";
|
|
5
5
|
import { isSecretMarker, secretSuffix } from "../../lib/secrets";
|
|
6
6
|
import { t } from "../../i18n";
|
|
7
|
+
import { toneChip } from "../../lib/tone";
|
|
7
8
|
|
|
8
9
|
// Acceleration badge — each compute backend gets its own colour so the user can
|
|
9
10
|
// tell at a glance what the local engine runs on (Metal on Apple Silicon, CUDA
|
|
10
11
|
// on NVIDIA, Vulkan/ROCm on AMD, plain CPU otherwise).
|
|
11
12
|
const ACCEL: Record<string, { label: string; cls: string }> = {
|
|
12
|
-
metal: { label: "Metal", cls:
|
|
13
|
-
cuda: { label: "CUDA", cls:
|
|
14
|
-
rocm: { label: "Vulkan / ROCm", cls:
|
|
13
|
+
metal: { label: "Metal", cls: toneChip.emerald },
|
|
14
|
+
cuda: { label: "CUDA", cls: toneChip.lime },
|
|
15
|
+
rocm: { label: "Vulkan / ROCm", cls: toneChip.orange },
|
|
15
16
|
none: { label: "CPU", cls: "text-muted-fg border-border bg-muted" },
|
|
16
17
|
};
|
|
17
18
|
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import useSWR from "swr";
|
|
2
3
|
import { Play, Square, Volume2 } from "lucide-react";
|
|
3
4
|
import { Button, Field, Textarea } from "../ui";
|
|
4
5
|
import { UiSelect } from "../UiSelect";
|
|
5
6
|
import { useToast } from "../Toast";
|
|
6
7
|
import { useTtsPlayer } from "./useTtsPlayer";
|
|
7
|
-
import { Voice, TTS_PROVIDER_META, type TtsEngineInfo, type TtsMode, type TtsSayResult } from "../../lib/api/voice";
|
|
8
|
+
import { Voice, TTS_PROVIDER_META, voiceLabel, type TtsEngineInfo, type TtsMode, type TtsSayResult } from "../../lib/api/voice";
|
|
8
9
|
import { t } from "../../i18n";
|
|
9
10
|
|
|
10
11
|
// "Say this" tester. Lets you pick which engine to synthesize with (overriding
|
|
11
12
|
// the saved default), then plays the resulting audio in-browser via /tts/say.
|
|
12
|
-
//
|
|
13
|
-
//
|
|
13
|
+
//
|
|
14
|
+
// The voice is overridable here too, and only here: picking one in the engine's
|
|
15
|
+
// settings saves it for every channel, which is the wrong move while you are
|
|
16
|
+
// still deciding which voice you want. This one rides along with the single
|
|
17
|
+
// request and changes nothing.
|
|
14
18
|
|
|
15
19
|
interface Props {
|
|
16
20
|
engines: TtsEngineInfo[];
|
|
@@ -25,9 +29,25 @@ export function VoiceTestCard({ engines, defaultProvider, mode }: Props) {
|
|
|
25
29
|
const [text, setText] = useState(t("voice_ui.test_default_text"));
|
|
26
30
|
// "" = use the saved default; otherwise force a specific engine.
|
|
27
31
|
const [engine, setEngine] = useState("");
|
|
32
|
+
// "" = whatever the engine has saved. Anything else overrides for this request.
|
|
33
|
+
const [voice, setVoice] = useState("");
|
|
28
34
|
const [busy, setBusy] = useState(false);
|
|
29
35
|
const [last, setLast] = useState<TtsSayResult | null>(null);
|
|
30
36
|
|
|
37
|
+
// Which engine will actually speak, so the voice list belongs to it. In chain
|
|
38
|
+
// mode with no override there is no answer — the router decides at send time —
|
|
39
|
+
// and an empty id means no list rather than a list from the wrong engine.
|
|
40
|
+
const speaking =
|
|
41
|
+
engine || (mode === "single" && defaultProvider && defaultProvider !== "auto" ? defaultProvider : "");
|
|
42
|
+
const { data: voiceList } = useSWR(
|
|
43
|
+
speaking ? ["tts-voices", speaking] : null,
|
|
44
|
+
() => Voice.voices(speaking)
|
|
45
|
+
);
|
|
46
|
+
const serverVoices = voiceList?.voices ?? [];
|
|
47
|
+
|
|
48
|
+
// A voice from the previous engine would be meaningless to the next one.
|
|
49
|
+
useEffect(() => setVoice(""), [speaking]);
|
|
50
|
+
|
|
31
51
|
const defaultLabel =
|
|
32
52
|
mode === "single" && defaultProvider && defaultProvider !== "auto"
|
|
33
53
|
? t("voice_ui.test_default_engine", { name: TTS_PROVIDER_META[defaultProvider]?.name || defaultProvider })
|
|
@@ -57,6 +77,7 @@ export function VoiceTestCard({ engines, defaultProvider, mode }: Props) {
|
|
|
57
77
|
const res = await Voice.say({
|
|
58
78
|
text: txt,
|
|
59
79
|
provider: engine || undefined,
|
|
80
|
+
voice: voice || undefined,
|
|
60
81
|
});
|
|
61
82
|
setLast(res);
|
|
62
83
|
await play(res.audio_path);
|
|
@@ -72,6 +93,18 @@ export function VoiceTestCard({ engines, defaultProvider, mode }: Props) {
|
|
|
72
93
|
<Field label={t("voice_ui.test_engine_label")} hint={t("voice_ui.test_engine_hint")}>
|
|
73
94
|
<UiSelect value={engine} onChange={setEngine} options={options} />
|
|
74
95
|
</Field>
|
|
96
|
+
{serverVoices.length > 0 && (
|
|
97
|
+
<Field label={t("voice_ui.test_voice_label")} hint={t("voice_ui.test_voice_hint")}>
|
|
98
|
+
<UiSelect
|
|
99
|
+
value={voice}
|
|
100
|
+
onChange={setVoice}
|
|
101
|
+
options={[
|
|
102
|
+
{ value: "", label: t("voice_ui.test_voice_default") },
|
|
103
|
+
...serverVoices.map((v) => ({ value: v, label: voiceLabel(v, voiceList) })),
|
|
104
|
+
]}
|
|
105
|
+
/>
|
|
106
|
+
</Field>
|
|
107
|
+
)}
|
|
75
108
|
<Field label={t("voice_ui.test_text_label")}>
|
|
76
109
|
<Textarea
|
|
77
110
|
rows={2}
|
|
@@ -97,6 +130,7 @@ export function VoiceTestCard({ engines, defaultProvider, mode }: Props) {
|
|
|
97
130
|
{last && (
|
|
98
131
|
<span className="text-xs text-muted-fg">
|
|
99
132
|
{t("voice_ui.engine_result")}: <strong>{last.provider}</strong>
|
|
133
|
+
{voice ? ` · ${voice}` : ""}
|
|
100
134
|
{last.duration_s ? ` · ${last.duration_s.toFixed(1)}s` : ""}
|
|
101
135
|
</span>
|
|
102
136
|
)}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
channelEnabledIn,
|
|
4
|
+
channelPrefs,
|
|
5
|
+
setChannelEnabled,
|
|
6
|
+
setChannelsEnabled,
|
|
7
|
+
onChannelPrefsChange,
|
|
8
|
+
type ChannelAxis,
|
|
9
|
+
} from "../lib/channels";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* React binding for this device's per-channel choices (lib/channels.ts).
|
|
13
|
+
*
|
|
14
|
+
* The stored map holds only EXPLICIT choices, so `enabled()` falls through to
|
|
15
|
+
* the surface default for anything untouched — which is what lets the phone
|
|
16
|
+
* start with Telegram off without writing that opinion into storage as if the
|
|
17
|
+
* owner had chosen it.
|
|
18
|
+
*
|
|
19
|
+
* Kept in state rather than read from localStorage per render so a change in
|
|
20
|
+
* this tab (the chips) and one in another tab (the settings dialog) both
|
|
21
|
+
* repaint, and so React has something to re-render on.
|
|
22
|
+
*/
|
|
23
|
+
export function useChannelPrefs(axis: ChannelAxis) {
|
|
24
|
+
const [prefs, setPrefs] = useState<Record<string, boolean>>(() => channelPrefs(axis));
|
|
25
|
+
|
|
26
|
+
useEffect(() => onChannelPrefsChange(() => setPrefs(channelPrefs(axis))), [axis]);
|
|
27
|
+
|
|
28
|
+
const enabled = (channel: string | null | undefined): boolean =>
|
|
29
|
+
channelEnabledIn(prefs, axis, channel);
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
/** The stored map itself, so a caller can memoise against it. */
|
|
33
|
+
prefs,
|
|
34
|
+
enabled,
|
|
35
|
+
set: (channel: string, on: boolean) => setChannelEnabled(axis, channel, on),
|
|
36
|
+
toggle: (channel: string) => setChannelEnabled(axis, channel, !enabled(channel)),
|
|
37
|
+
setAll: (channels: string[], on: boolean) => setChannelsEnabled(axis, channels, on),
|
|
38
|
+
};
|
|
39
|
+
}
|