@agentprojectcontext/apx 1.81.0 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// The live event feed: one WebSocket that tells every open surface "this
|
|
2
|
+
// conversation just moved".
|
|
3
|
+
//
|
|
4
|
+
// The problem it solves: APX is one agent reachable from several places at
|
|
5
|
+
// once — Telegram on the phone, the panel on the laptop, the deck on a tablet.
|
|
6
|
+
// Until now each surface only saw what it did itself. A turn that arrived on
|
|
7
|
+
// Telegram was invisible to a browser sitting on that very thread until someone
|
|
8
|
+
// reloaded, and two browsers open on the same inbox drifted apart within
|
|
9
|
+
// seconds. The daemon already knew — it wrote the row — it just never said so.
|
|
10
|
+
//
|
|
11
|
+
// SIGNAL, NOT DATA. A frame says which thread moved, never what was said. The
|
|
12
|
+
// client re-fetches through the routes it already uses. That is deliberate:
|
|
13
|
+
// - one rendering path, not two. The record→bubble mapping lives in the API
|
|
14
|
+
// and in useChat; a second copy on the wire is a second thing to keep true.
|
|
15
|
+
// - a re-fetch is idempotent. Appending a pushed row is not: the device that
|
|
16
|
+
// SENT the message already painted it, and would show it twice.
|
|
17
|
+
// - nothing sensitive rides the socket beyond "channel X moved".
|
|
18
|
+
//
|
|
19
|
+
// Fan-out is per PROCESS and that is enough: the daemon owns the HTTP API, the
|
|
20
|
+
// Telegram poller and the agent loop, so every write anyone makes happens here.
|
|
21
|
+
// See core/events/bus.js for the one case it does not cover.
|
|
22
|
+
import { onMessageEvent, onMobilityAlert, onRoutineEvent } from "#core/events/bus.js";
|
|
23
|
+
import { mascotNoticesFromEvents } from "#core/events/mascot-notify.js";
|
|
24
|
+
import { resolveSuperAgentBlob } from "#core/apc/agent-identity.js";
|
|
25
|
+
import { apiPath } from "./api/prefix.js";
|
|
26
|
+
|
|
27
|
+
const _clients = new Set(); // Set<WebSocket>
|
|
28
|
+
|
|
29
|
+
export const eventsClients = _clients;
|
|
30
|
+
|
|
31
|
+
/** The feed's upgrade path. Under /api like every other route (rule 9). */
|
|
32
|
+
export const EVENTS_WS_PATH = apiPath("/events/ws");
|
|
33
|
+
|
|
34
|
+
/** Path-gate: is this upgrade for the live event feed? */
|
|
35
|
+
export function isEventsUpgradePath(url) {
|
|
36
|
+
let pathname = url || "";
|
|
37
|
+
try { pathname = new URL(url, "http://localhost").pathname; } catch { /* keep raw */ }
|
|
38
|
+
return pathname === EVENTS_WS_PATH;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// A streamed Telegram answer writes one ledger row per chunk, so a chatty turn
|
|
42
|
+
// can emit a dozen events in a second. Collapsing them into one frame per
|
|
43
|
+
// window turns that into one re-fetch per window per device instead of a dozen.
|
|
44
|
+
// Short enough that it still reads as instant.
|
|
45
|
+
const FLUSH_MS = 250;
|
|
46
|
+
|
|
47
|
+
// Dead sockets do not always close: a phone that walks out of the tailnet
|
|
48
|
+
// leaves a half-open connection that accepts writes into nothing. Ping on an
|
|
49
|
+
// interval and drop whatever failed to answer the last one.
|
|
50
|
+
const PING_MS = 30_000;
|
|
51
|
+
|
|
52
|
+
/** Register a connected client. Sends a hello so the page can show it is live. */
|
|
53
|
+
export function registerEventsClient(ws, config = {}) {
|
|
54
|
+
_clients.add(ws);
|
|
55
|
+
ws.isAlive = true;
|
|
56
|
+
ws.on("pong", () => { ws.isAlive = true; });
|
|
57
|
+
ws.on("close", () => _clients.delete(ws));
|
|
58
|
+
ws.on("error", () => _clients.delete(ws));
|
|
59
|
+
// The feed is one-directional. A client has nothing to say here — it acts
|
|
60
|
+
// through the HTTP API — so anything it sends is ignored rather than parsed.
|
|
61
|
+
ws.on("message", () => {});
|
|
62
|
+
send(ws, {
|
|
63
|
+
type: "hello",
|
|
64
|
+
ts: new Date().toISOString(),
|
|
65
|
+
settings: { super_agent: { icon: resolveSuperAgentBlob(config) } },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Publish a hot-reloaded super-agent avatar to every connected surface. */
|
|
70
|
+
export function broadcastSuperAgentAvatar(config) {
|
|
71
|
+
broadcastEvents({
|
|
72
|
+
type: "settings",
|
|
73
|
+
settings: { super_agent: { icon: resolveSuperAgentBlob(config) } },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function send(ws, msg) {
|
|
78
|
+
try {
|
|
79
|
+
if (ws.readyState === 1) ws.send(JSON.stringify(msg)); // 1 = OPEN
|
|
80
|
+
} catch { /* the close handler will drop it */ }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Fan one frame out to every connected client. */
|
|
84
|
+
export function broadcastEvents(msg) {
|
|
85
|
+
for (const ws of _clients) send(ws, msg);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Push one live-turn frame (start / delta / final / error) to every surface —
|
|
89
|
+
* the token stream that used to belong only to the sending tab. Sent straight,
|
|
90
|
+
* NOT through the 250ms message batch: tokens must arrive as they are written.
|
|
91
|
+
* Unlike a "messages" frame this DOES carry data (the delta), on purpose — it
|
|
92
|
+
* is the one thing the signal-only feed cannot express, and losing it to a
|
|
93
|
+
* dropped connection is exactly the bug this fixes. */
|
|
94
|
+
export function broadcastTurn(frame) {
|
|
95
|
+
broadcastEvents({ type: "turn", ...frame });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Push one routine-run frame (start / progress / end). Like a turn frame and
|
|
99
|
+
* unlike a message frame this CARRIES the data — a run's steps are not in the
|
|
100
|
+
* ledger until it ends, so there is nothing for a client to re-fetch while it
|
|
101
|
+
* is still going. Sent straight, not through the 250ms batch: the whole point
|
|
102
|
+
* is watching a run move. */
|
|
103
|
+
/**
|
|
104
|
+
* A proximity alert, as its own frame.
|
|
105
|
+
*
|
|
106
|
+
* NOT collapsed into the 250 ms message window below: that window exists to
|
|
107
|
+
* turn a chatty streamed turn into one re-fetch, and an alert is neither
|
|
108
|
+
* chatty nor a re-fetch — it is one card, complete, that has to reach the
|
|
109
|
+
* phone while the car is still near the place. It also carries its payload
|
|
110
|
+
* rather than a "go look" signal, for the same reason.
|
|
111
|
+
*/
|
|
112
|
+
export function broadcastMobilityAlert(card) {
|
|
113
|
+
broadcastEvents({ type: "mobility_alert", ts: new Date().toISOString(), alert: card });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function broadcastRoutineRun(frame) {
|
|
117
|
+
broadcastEvents({ type: "routine", ...frame });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Which project a write belongs to, as an id the panel can match on.
|
|
121
|
+
* A global write already carries one in its meta; a project or conversation
|
|
122
|
+
* write carries the storage path, which only the daemon's registry resolves. */
|
|
123
|
+
function projectIdOf(event, projects) {
|
|
124
|
+
if (!event.project_root) return event.project_id ?? null;
|
|
125
|
+
if (!projects?.list) return null;
|
|
126
|
+
for (const entry of projects.list()) {
|
|
127
|
+
try {
|
|
128
|
+
if (projects.get(entry.id)?.storagePath === event.project_root) return entry.id;
|
|
129
|
+
} catch { /* an unreadable project is not a match */ }
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** The public shape of one event. `project_root` never leaves the daemon —
|
|
135
|
+
* it is a path on this machine and the panel has no use for it. */
|
|
136
|
+
function publicEvent(event, projects) {
|
|
137
|
+
return {
|
|
138
|
+
scope: event.scope,
|
|
139
|
+
channel: event.channel || null,
|
|
140
|
+
thread: event.thread || null,
|
|
141
|
+
project_id: projectIdOf(event, projects),
|
|
142
|
+
agent_slug: event.agent_slug || null,
|
|
143
|
+
// Only a conversation write has one; a channel thread is addressed by day.
|
|
144
|
+
conversation_id: event.conversation_id || null,
|
|
145
|
+
direction: event.direction || null,
|
|
146
|
+
type: event.type || null,
|
|
147
|
+
// A conversation write (a project agent's chat file) has no direction and
|
|
148
|
+
// no type — it carries the ROLE it was appended under. Without it every
|
|
149
|
+
// such write looks identical on the wire, and a surface that only wants to
|
|
150
|
+
// hear about the agent SPEAKING has to re-fetch on the owner's own send and
|
|
151
|
+
// on every tool row too. See lib/notify.ts.
|
|
152
|
+
role: event.role || null,
|
|
153
|
+
author: event.author || null,
|
|
154
|
+
// How the row was produced, when it matters to a subscriber — "routine_delivery"
|
|
155
|
+
// marks an agent reaching the owner, which the mascot surfaces on its own.
|
|
156
|
+
via: event.via || null,
|
|
157
|
+
// A ≤100-char headline for a delivery, so the mascot bubble can say what
|
|
158
|
+
// arrived. A notice, not the message body — "signal, not data" holds.
|
|
159
|
+
notify: event.notify || null,
|
|
160
|
+
// Closing vs mid-turn chunk. The pet only bubbles an agent's launched
|
|
161
|
+
// final on Telegram / group / A2A — never the owner's send.
|
|
162
|
+
final: event.final === true ? true : null,
|
|
163
|
+
streamed: event.streamed === true ? true : null,
|
|
164
|
+
// Who an a2a row was addressed to, so the bubble can name both ends
|
|
165
|
+
// ("de magui a roby") instead of just the channel. A name, not an address:
|
|
166
|
+
// see appendMessageToFs, which only lifts it for a2a. Null everywhere else.
|
|
167
|
+
to: event.to || null,
|
|
168
|
+
ts: event.ts || null,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Two events about the same thread in the same window are one re-fetch. */
|
|
173
|
+
function keyOf(e) {
|
|
174
|
+
return [e.scope, e.channel, e.thread, e.project_id, e.agent_slug, e.conversation_id].join("|");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Subscribe the hub to the core bus. Called once at daemon startup.
|
|
179
|
+
* Returns a stop() that unsubscribes and clears the timers.
|
|
180
|
+
*/
|
|
181
|
+
export function startEventsBridge({ projects } = {}) {
|
|
182
|
+
const pending = new Map();
|
|
183
|
+
let flushTimer = null;
|
|
184
|
+
|
|
185
|
+
const flush = () => {
|
|
186
|
+
flushTimer = null;
|
|
187
|
+
if (!pending.size) return;
|
|
188
|
+
const events = [...pending.values()];
|
|
189
|
+
pending.clear();
|
|
190
|
+
// Nobody listening is the normal case (no panel open). Skip the work.
|
|
191
|
+
if (_clients.size) {
|
|
192
|
+
// Computed once here so desktop and the phone cannot drift: both pets
|
|
193
|
+
// just render the lines. Empty means "this burst is not news" (the
|
|
194
|
+
// owner sending, a stream chunk, a tool row).
|
|
195
|
+
const notices = mascotNoticesFromEvents(events);
|
|
196
|
+
broadcastEvents({
|
|
197
|
+
type: "messages",
|
|
198
|
+
events,
|
|
199
|
+
notifications: notices.map((notice) => notice.text),
|
|
200
|
+
// The same lines with the channel each one is about, so a device can
|
|
201
|
+
// answer "which of these may ring me" — the phone mutes Telegram
|
|
202
|
+
// because Telegram is installed on it. Sent alongside rather than
|
|
203
|
+
// instead: an APK from before this shipped still reads `notifications`.
|
|
204
|
+
notices,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// A routine run moving is its own signal: it is not a ledger write, and the
|
|
210
|
+
// batch that collapses ledger writes would make a step list arrive in clumps.
|
|
211
|
+
const unsubscribeRoutines = onRoutineEvent((event) => {
|
|
212
|
+
if (!_clients.size) return;
|
|
213
|
+
let projectId = null;
|
|
214
|
+
try {
|
|
215
|
+
projectId = projectIdOf(event, projects);
|
|
216
|
+
} catch {
|
|
217
|
+
return; // an unresolvable project is not worth taking the daemon down for
|
|
218
|
+
}
|
|
219
|
+
broadcastRoutineRun({
|
|
220
|
+
phase: event.phase,
|
|
221
|
+
project_id: projectId,
|
|
222
|
+
routine: event.routine,
|
|
223
|
+
run: event.run,
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Proximity alerts. Straight out, no batching: see broadcastMobilityAlert.
|
|
228
|
+
const unsubscribeMobility = onMobilityAlert((card) => {
|
|
229
|
+
if (!_clients.size) return;
|
|
230
|
+
broadcastMobilityAlert(card);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const unsubscribe = onMessageEvent((event) => {
|
|
234
|
+
let pub;
|
|
235
|
+
try {
|
|
236
|
+
pub = publicEvent(event, projects);
|
|
237
|
+
} catch {
|
|
238
|
+
return; // a malformed event must not take the daemon down
|
|
239
|
+
}
|
|
240
|
+
pending.set(keyOf(pub), pub);
|
|
241
|
+
if (!flushTimer) {
|
|
242
|
+
flushTimer = setTimeout(flush, FLUSH_MS);
|
|
243
|
+
// A pending frame must never be the reason the process stays up.
|
|
244
|
+
flushTimer.unref?.();
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
const pinger = setInterval(() => {
|
|
249
|
+
for (const ws of _clients) {
|
|
250
|
+
if (ws.isAlive === false) {
|
|
251
|
+
_clients.delete(ws);
|
|
252
|
+
try { ws.terminate(); } catch { /* already gone */ }
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
ws.isAlive = false;
|
|
256
|
+
try { ws.ping(); } catch { _clients.delete(ws); }
|
|
257
|
+
}
|
|
258
|
+
}, PING_MS);
|
|
259
|
+
pinger.unref?.();
|
|
260
|
+
|
|
261
|
+
return function stop() {
|
|
262
|
+
unsubscribe();
|
|
263
|
+
unsubscribeRoutines();
|
|
264
|
+
unsubscribeMobility();
|
|
265
|
+
clearInterval(pinger);
|
|
266
|
+
if (flushTimer) clearTimeout(flushTimer);
|
|
267
|
+
pending.clear();
|
|
268
|
+
for (const ws of _clients) {
|
|
269
|
+
try { ws.close(); } catch { /* already gone */ }
|
|
270
|
+
}
|
|
271
|
+
_clients.clear();
|
|
272
|
+
};
|
|
273
|
+
}
|
package/src/host/daemon/index.js
CHANGED
|
@@ -29,11 +29,15 @@ import { ProjectManager } from "./db.js";
|
|
|
29
29
|
import { McpRegistry } from "#core/mcp/runner.js";
|
|
30
30
|
import { PluginManager } from "./plugins/index.js";
|
|
31
31
|
import { RoutineScheduler } from "./routines-scheduler.js";
|
|
32
|
+
import { startDeliverySweep } from "./delivery-sweep.js";
|
|
32
33
|
import { startCallbackReconciler } from "./callback-reconciler.js";
|
|
33
34
|
import { buildApi } from "./api.js";
|
|
34
35
|
import { createTokenStore } from "./token-store.js";
|
|
35
36
|
import { triggerWakeup } from "./wakeup.js";
|
|
36
|
-
import { registerDesktopClient, isDesktopUpgradePath
|
|
37
|
+
import { registerDesktopClient, isDesktopUpgradePath } from "./desktop-ws.js";
|
|
38
|
+
import { isTerminalUpgradePath, startTerminalSession } from "./terminal-ws.js";
|
|
39
|
+
import { isEventsUpgradePath, registerEventsClient, startEventsBridge } from "./events-ws.js";
|
|
40
|
+
import { isWsUpgradeAuthorized } from "./ws-auth.js";
|
|
37
41
|
import { log as logToUnified } from "#core/logging.js";
|
|
38
42
|
import { initMemory, stopMemory } from "#core/memory/index.js";
|
|
39
43
|
|
|
@@ -48,7 +52,7 @@ const PKG = JSON.parse(
|
|
|
48
52
|
// process.stdout.write reaches the file once. In foreground (npm start), it
|
|
49
53
|
// still prints to the console. No double-append.
|
|
50
54
|
//
|
|
51
|
-
// Beyond the
|
|
55
|
+
// Beyond the stdout sink we also fan out every line to the unified
|
|
52
56
|
// ~/.apx/logs/apx.log via core/logging.js so `apx log` and `apx log -f`
|
|
53
57
|
// see everything that any plugin/module writes through the daemon's log fn.
|
|
54
58
|
//
|
|
@@ -222,6 +226,7 @@ async function main() {
|
|
|
222
226
|
tokenStore,
|
|
223
227
|
version: PKG.version,
|
|
224
228
|
startedAt,
|
|
229
|
+
log,
|
|
225
230
|
addProjectGlobally: (absPath) => {
|
|
226
231
|
try {
|
|
227
232
|
const fresh = readConfig();
|
|
@@ -235,6 +240,7 @@ async function main() {
|
|
|
235
240
|
plugins.installRoutes(app);
|
|
236
241
|
|
|
237
242
|
let callbackReconciler = null;
|
|
243
|
+
let eventsBridge = null;
|
|
238
244
|
|
|
239
245
|
// Loopback is ALWAYS bound, whatever `host` says.
|
|
240
246
|
//
|
|
@@ -254,6 +260,7 @@ async function main() {
|
|
|
254
260
|
// one is already up and is the one everything depends on.
|
|
255
261
|
const s2 = http.createServer(app);
|
|
256
262
|
s2.on("error", (e) => log(`bind ${h}:${port} failed (${e.code || e.message}) — local access unaffected`));
|
|
263
|
+
s2.on("upgrade", handleUpgrade);
|
|
257
264
|
s2.listen(port, h, () => log(`apx-daemon also listening on http://${h}:${port}`));
|
|
258
265
|
secondary.push(s2);
|
|
259
266
|
}
|
|
@@ -265,6 +272,14 @@ async function main() {
|
|
|
265
272
|
// daemon died before it could (crash, pull, or a task that restarted the
|
|
266
273
|
// daemon). Runs once now to recover prior IOUs, then on an interval.
|
|
267
274
|
callbackReconciler = startCallbackReconciler({ plugins, log });
|
|
275
|
+
// Live event feed: turn every ledger write into a frame on /api/events/ws so
|
|
276
|
+
// an open panel — on any device — sees a conversation move the moment it
|
|
277
|
+
// moves, whichever channel produced the turn.
|
|
278
|
+
eventsBridge = startEventsBridge({ projects });
|
|
279
|
+
// Delivery grace sweep: notify ordinary deliveries that have sat unread past
|
|
280
|
+
// their grace window, so "notify unless he reads it first" actually fires.
|
|
281
|
+
// Priority deliveries are pinged immediately by the runner, not here.
|
|
282
|
+
startDeliverySweep({ projects, plugins, registries, config: cfg });
|
|
268
283
|
// Cross-channel memory: ensure ~/.apx/memory.md exists, open the vector
|
|
269
284
|
// store, and start the incremental RAG indexer. Best-effort — never blocks
|
|
270
285
|
// boot and never throws into the daemon.
|
|
@@ -290,20 +305,41 @@ async function main() {
|
|
|
290
305
|
setTimeout(() => triggerWakeup(cfg, log), 3000);
|
|
291
306
|
// Preload whisper-server in the background so first desktop transcription is fast.
|
|
292
307
|
// Adopts an existing one if already on the port; otherwise spawns fresh.
|
|
293
|
-
import("./whisper-server.js").then(({ preloadWhisperServer }) => {
|
|
294
|
-
preloadWhisperServer((m) => log(m));
|
|
308
|
+
import("./whisper-server.js").then(({ preloadWhisperServer, startWhisperKeepWarm }) => {
|
|
309
|
+
preloadWhisperServer((m) => log(m)).then(() => startWhisperKeepWarm((m) => log(m)));
|
|
310
|
+
}).catch(() => {});
|
|
311
|
+
// Same treatment for the voice engine. Warming it only when the microphone
|
|
312
|
+
// opens is too late: on a machine short on RAM the weights get compressed
|
|
313
|
+
// out while idle, and decompressing them takes far longer than anyone
|
|
314
|
+
// spends speaking — so the reply queues behind a warm-up still in flight.
|
|
315
|
+
// Only ever pings an engine running on this machine or the LAN.
|
|
316
|
+
import("./tts-keepwarm.js").then(({ startTtsKeepWarm }) => {
|
|
317
|
+
startTtsKeepWarm((m) => log(m));
|
|
295
318
|
}).catch(() => {});
|
|
296
319
|
});
|
|
297
320
|
|
|
298
|
-
// Attach WebSocket
|
|
299
|
-
|
|
300
|
-
|
|
321
|
+
// Attach WebSocket upgrades: the desktop channel on /api/desktop/ws, a
|
|
322
|
+
// terminal on /api/terminal/ws that reopens one session in its own CLI, and
|
|
323
|
+
// the live event feed on /api/events/ws that tells every open panel when a
|
|
324
|
+
// conversation moved.
|
|
325
|
+
//
|
|
326
|
+
// Attached to EVERY listener, not just the first. A specific `host` means the
|
|
327
|
+
// daemon runs two servers on one app (see the bind block above), and an
|
|
328
|
+
// upgrade handler on only one of them is how the phone on the tailnet gets a
|
|
329
|
+
// panel whose HTTP works and whose live feed silently never connects.
|
|
330
|
+
async function handleUpgrade(req, socket, head) {
|
|
331
|
+
const isTerminal = isTerminalUpgradePath(req.url);
|
|
332
|
+
const isEvents = isEventsUpgradePath(req.url);
|
|
333
|
+
if (!isTerminal && !isEvents && !isDesktopUpgradePath(req.url)) { socket.destroy(); return; }
|
|
301
334
|
// Auth: the WS upgrade must carry a valid token (master or paired client),
|
|
302
|
-
// matching the HTTP /api
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
|
|
335
|
+
// matching the HTTP /api/* routes. Without this, any client that can reach
|
|
336
|
+
// the daemon (host binds 0.0.0.0 → the LAN) could open the desktop channel
|
|
337
|
+
// and drive the super-agent (permission_mode "total"). The legitimate
|
|
338
|
+
// desktop window already sends the bearer token; a browser passes ?token=.
|
|
339
|
+
// See QA BUG-WS-AUTH. The terminal channel spawns a CLI on this machine and
|
|
340
|
+
// the event feed reports who is talking to whom, so all three are gated the
|
|
341
|
+
// same way — the check is about who may open a channel, not which one.
|
|
342
|
+
if (!isWsUpgradeAuthorized(req, tokenStore)) {
|
|
307
343
|
socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n");
|
|
308
344
|
socket.destroy();
|
|
309
345
|
return;
|
|
@@ -315,9 +351,12 @@ async function main() {
|
|
|
315
351
|
}
|
|
316
352
|
const wss = new WebSocketServer({ noServer: true });
|
|
317
353
|
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
318
|
-
|
|
354
|
+
if (isTerminal) startTerminalSession(ws, req);
|
|
355
|
+
else if (isEvents) registerEventsClient(ws, cfg);
|
|
356
|
+
else registerDesktopClient(ws);
|
|
319
357
|
});
|
|
320
|
-
}
|
|
358
|
+
}
|
|
359
|
+
server.on("upgrade", handleUpgrade);
|
|
321
360
|
|
|
322
361
|
server.on("error", (e) => {
|
|
323
362
|
log(`fatal: listen ${host}:${port} failed: ${e.message}`);
|
|
@@ -331,13 +370,18 @@ async function main() {
|
|
|
331
370
|
log(`received ${signal}, shutting down...`);
|
|
332
371
|
scheduler.stop();
|
|
333
372
|
callbackReconciler?.stop();
|
|
373
|
+
eventsBridge?.();
|
|
334
374
|
plugins.stopAll();
|
|
335
375
|
stopMemory();
|
|
336
376
|
registries.shutdown();
|
|
337
377
|
// Best-effort shutdown of whisper-server subprocess.
|
|
338
|
-
import("./whisper-server.js").then(({ shutdownWhisperServer }) => {
|
|
378
|
+
import("./whisper-server.js").then(({ shutdownWhisperServer, stopWhisperKeepWarm }) => {
|
|
379
|
+
stopWhisperKeepWarm();
|
|
339
380
|
shutdownWhisperServer().catch(() => {});
|
|
340
381
|
}).catch(() => {});
|
|
382
|
+
// The voice engine is a separate service with its own lifetime — nothing to
|
|
383
|
+
// shut down here, only our timer to stop pinging it.
|
|
384
|
+
import("./tts-keepwarm.js").then(({ stopTtsKeepWarm }) => stopTtsKeepWarm()).catch(() => {});
|
|
341
385
|
// Close the LAN listener(s) too, or the port stays held after SIGTERM and
|
|
342
386
|
// the next `apx restart` fails with "already running".
|
|
343
387
|
for (const s2 of secondary) {
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
// "model": "", // override model; leave empty = super-agent.model
|
|
16
16
|
// "max_history": 20 // turns to keep in context
|
|
17
17
|
// }
|
|
18
|
-
// (legacy "overlay" block is still read as a fallback)
|
|
19
18
|
|
|
20
19
|
import {
|
|
21
20
|
broadcastDesktop,
|
|
@@ -25,6 +24,7 @@ import {
|
|
|
25
24
|
import { runSuperAgent, isSuperAgentEnabled } from "#core/agent/super-agent.js";
|
|
26
25
|
import { appendGlobalMessage } from "#core/stores/messages.js";
|
|
27
26
|
import { stripEmotionTags } from "#core/voice/emotions.js";
|
|
27
|
+
import { stripEmoji } from "#core/voice/pronounceable.js";
|
|
28
28
|
import { stripReasoning } from "#core/util/thinking.js";
|
|
29
29
|
import { CHANNELS } from "#core/constants/channels.js";
|
|
30
30
|
import { tryResolveSkillCommand } from "#core/agent/skills/trigger.js";
|
|
@@ -35,7 +35,7 @@ export default {
|
|
|
35
35
|
id: "desktop",
|
|
36
36
|
|
|
37
37
|
init({ projects, config, log, plugins }) {
|
|
38
|
-
const cfg = config.desktop ||
|
|
38
|
+
const cfg = config.desktop || {};
|
|
39
39
|
const enabled = cfg.enabled !== false; // enabled by default
|
|
40
40
|
|
|
41
41
|
// In-memory conversation history per connected client.
|
|
@@ -127,7 +127,11 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
127
127
|
// Desktop is voice-first: an unstripped reasoning dump would be spoken
|
|
128
128
|
// aloud, at length, in the wrong language. Drop the segment entirely
|
|
129
129
|
// rather than narrate the model's notes.
|
|
130
|
-
|
|
130
|
+
// Desktop is a voice capsule, so emoji come out of both halves: the TTS
|
|
131
|
+
// hums for two seconds trying to pronounce one, and a bubble that keeps it
|
|
132
|
+
// would no longer match what was said. A segment that was *only* an emoji
|
|
133
|
+
// leaves nothing to say and is dropped, rather than spoken as a shrug.
|
|
134
|
+
const spoken = stripEmoji(stripReasoning(seg).answer);
|
|
131
135
|
if (!spoken.trim()) return;
|
|
132
136
|
_send(ws, { type: "segment", seq: ++segSeq, text: stripEmotionTags(spoken), speak: spoken });
|
|
133
137
|
};
|
|
@@ -157,7 +161,16 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
157
161
|
previousMessages: ws ? history.slice(0, -1) : history,
|
|
158
162
|
overrideModel: cfg.model || null,
|
|
159
163
|
signal: controller.signal,
|
|
160
|
-
onToken: (chunk) => {
|
|
164
|
+
onToken: (chunk) => {
|
|
165
|
+
liveBuf += chunk;
|
|
166
|
+
// Ship the token onward too. `liveBuf` alone meant the window sat on
|
|
167
|
+
// "Pensando…" for the whole turn and then painted the finished reply in
|
|
168
|
+
// one go, even though the tokens had been arriving all along. The
|
|
169
|
+
// renderer paints these into a provisional bubble that the matching
|
|
170
|
+
// `segment` then replaces — deltas are for reading, segments are what
|
|
171
|
+
// gets spoken and kept.
|
|
172
|
+
_send(ws, { type: "delta", text: chunk });
|
|
173
|
+
},
|
|
161
174
|
onEvent: async (event) => {
|
|
162
175
|
if (event.type === "tool_start") {
|
|
163
176
|
const t = event.trace;
|