@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
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Inbound Telegram FILES: document, video, video_note, animation.
|
|
2
2
|
//
|
|
3
3
|
// Same shape as ./photo.js and ./audio.js — take the poller (`self`) plus the
|
|
4
|
-
// parsed update, download
|
|
5
|
-
//
|
|
4
|
+
// parsed update, download the file, and return the (rewritten) `text` the rest
|
|
5
|
+
// of the pipeline runs with plus the metadata dispatch folds into the one
|
|
6
|
+
// record it writes for this update.
|
|
6
7
|
//
|
|
7
8
|
// Why this exists: dispatch only recognised photo and voice/audio. Every other
|
|
8
9
|
// attachment fell through to `text = msg.caption || ""`, and a file sent with
|
|
@@ -13,8 +14,6 @@
|
|
|
13
14
|
// The reply is model-authored, as everywhere else: the marker states what
|
|
14
15
|
// arrived and where it landed, and the agent puts that in its own words. No
|
|
15
16
|
// canned "file received" string.
|
|
16
|
-
import { appendGlobalMessage } from "#core/stores/messages.js";
|
|
17
|
-
import { CHANNELS } from "#core/constants/channels.js";
|
|
18
17
|
import { resolveBotToken, telegramMediaDir } from "../helpers.js";
|
|
19
18
|
import { downloadTelegramFile } from "../media.js";
|
|
20
19
|
|
|
@@ -49,10 +48,10 @@ function humanSize(bytes) {
|
|
|
49
48
|
|
|
50
49
|
/**
|
|
51
50
|
* @param {object} self poller instance (uses self.log, self.channel)
|
|
52
|
-
* @param {object} ctx {
|
|
53
|
-
* @returns {Promise<{ text: string }>}
|
|
51
|
+
* @param {object} ctx { text, incoming }
|
|
52
|
+
* @returns {Promise<{ text: string, media: object }>}
|
|
54
53
|
*/
|
|
55
|
-
export async function handleIncomingFile(self, {
|
|
54
|
+
export async function handleIncomingFile(self, { text, incoming }) {
|
|
56
55
|
const { file, label, type } = incoming;
|
|
57
56
|
const token = resolveBotToken(self.channel);
|
|
58
57
|
const mediaDir = telegramMediaDir();
|
|
@@ -72,30 +71,6 @@ export async function handleIncomingFile(self, { msg, u, author, chat_id, text,
|
|
|
72
71
|
self.log(`telegram[${self.channel.name}] ${label} download failed: ${e.message}`);
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
// Archive regardless of download outcome, so the history records the file
|
|
76
|
-
// even when the fetch failed.
|
|
77
|
-
appendGlobalMessage({
|
|
78
|
-
channel: CHANNELS.TELEGRAM,
|
|
79
|
-
direction: "in",
|
|
80
|
-
type,
|
|
81
|
-
actor_id: msg.from?.id ? String(msg.from.id) : author,
|
|
82
|
-
external_id: String(u.update_id),
|
|
83
|
-
author,
|
|
84
|
-
body: text || `[${label}]`,
|
|
85
|
-
meta: {
|
|
86
|
-
chat_id,
|
|
87
|
-
user_id: msg.from?.id || null,
|
|
88
|
-
message_id: msg.message_id,
|
|
89
|
-
tg_channel: self.channel.name,
|
|
90
|
-
local_path: localPath,
|
|
91
|
-
file_id: file.file_id,
|
|
92
|
-
file_name: declaredName || null,
|
|
93
|
-
mime_type: file.mime_type || null,
|
|
94
|
-
file_size: file.file_size || null,
|
|
95
|
-
duration: file.duration || null,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
|
|
99
74
|
const bits = [declaredName || label];
|
|
100
75
|
const size = humanSize(file.file_size);
|
|
101
76
|
if (size) bits.push(size);
|
|
@@ -104,5 +79,20 @@ export async function handleIncomingFile(self, { msg, u, author, chat_id, text,
|
|
|
104
79
|
? `[${label} received: ${bits.join(", ")} — saved to ${localPath}. You can open it with your file tools.]`
|
|
105
80
|
: `[${label} received: ${bits.join(", ")} — the download FAILED (${failure || "unknown error"}), so there is no local copy. Say so; files over 20 MB cannot be fetched by a bot.]`;
|
|
106
81
|
|
|
107
|
-
return {
|
|
82
|
+
return {
|
|
83
|
+
text: text ? `${marker} ${text}` : marker,
|
|
84
|
+
// Reported regardless of download outcome, so the stored turn records the
|
|
85
|
+
// file even when the fetch failed.
|
|
86
|
+
media: {
|
|
87
|
+
kind: type,
|
|
88
|
+
meta: {
|
|
89
|
+
local_path: localPath,
|
|
90
|
+
file_id: file.file_id,
|
|
91
|
+
file_name: declaredName || null,
|
|
92
|
+
mime_type: file.mime_type || null,
|
|
93
|
+
file_size: file.file_size || null,
|
|
94
|
+
duration: file.duration || null,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
108
98
|
}
|
|
@@ -10,19 +10,23 @@
|
|
|
10
10
|
// with its tools. The marker also guarantees a no-caption photo never produces
|
|
11
11
|
// an empty turn — the reply is always model-authored, never canned. Mirrors the
|
|
12
12
|
// `[audio]` marker convention.
|
|
13
|
+
//
|
|
14
|
+
// The record itself is written by dispatch, once per update: this handler used
|
|
15
|
+
// to append its own row while also rewriting `text`, so a photo turn was stored
|
|
16
|
+
// twice. It now hands the file metadata back instead.
|
|
13
17
|
import fs from "node:fs";
|
|
14
18
|
import path from "node:path";
|
|
15
|
-
import { appendGlobalMessage } from "#core/stores/messages.js";
|
|
16
|
-
import { CHANNELS } from "#core/constants/channels.js";
|
|
17
19
|
import { resolveBotToken, telegramMediaDir } from "../helpers.js";
|
|
18
20
|
import { downloadTelegramFile } from "../media.js";
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* @param {object} self poller instance (uses self.log, self.channel)
|
|
22
|
-
* @param {object} ctx { msg,
|
|
23
|
-
* @returns {Promise<{ text: string
|
|
24
|
+
* @param {object} ctx { msg, text }
|
|
25
|
+
* @returns {Promise<{ text: string, attachment: object|null, media: object }>}
|
|
26
|
+
* text to continue the pipeline with, the pixels for a multimodal engine, and
|
|
27
|
+
* what was archived for the inbound record
|
|
24
28
|
*/
|
|
25
|
-
export async function handleIncomingPhoto(self, { msg,
|
|
29
|
+
export async function handleIncomingPhoto(self, { msg, text }) {
|
|
26
30
|
// Telegram sends multiple sizes; pick the largest.
|
|
27
31
|
const bestPhoto = msg.photo.reduce((a, b) => (b.file_size > a.file_size ? b : a));
|
|
28
32
|
const token = resolveBotToken(self.channel);
|
|
@@ -36,28 +40,6 @@ export async function handleIncomingPhoto(self, { msg, u, author, chat_id, text
|
|
|
36
40
|
self.log(`telegram[${self.channel.name}] photo download failed: ${e.message}`);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
|
-
// Archive the inbound photo regardless of download outcome, so chat history
|
|
40
|
-
// records it even if the file fetch failed.
|
|
41
|
-
appendGlobalMessage({
|
|
42
|
-
channel: CHANNELS.TELEGRAM,
|
|
43
|
-
direction: "in",
|
|
44
|
-
type: "photo",
|
|
45
|
-
actor_id: msg.from?.id ? String(msg.from.id) : author,
|
|
46
|
-
external_id: String(u.update_id),
|
|
47
|
-
author,
|
|
48
|
-
body: text || "[photo]",
|
|
49
|
-
meta: {
|
|
50
|
-
chat_id,
|
|
51
|
-
user_id: msg.from?.id || null,
|
|
52
|
-
message_id: msg.message_id,
|
|
53
|
-
tg_channel: self.channel.name,
|
|
54
|
-
local_path: localPath,
|
|
55
|
-
file_id: bestPhoto.file_id,
|
|
56
|
-
width: bestPhoto.width,
|
|
57
|
-
height: bestPhoto.height,
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
|
|
61
43
|
// Hand the pixels to the turn. A multimodal engine (Gemini) renders them as
|
|
62
44
|
// an inlineData part; the others ignore the field and still have the marker
|
|
63
45
|
// and the path, so nothing regresses for them.
|
|
@@ -81,7 +63,21 @@ export async function handleIncomingPhoto(self, { msg, u, author, chat_id, text
|
|
|
81
63
|
const marker = localPath
|
|
82
64
|
? `[image attached — saved to ${localPath}]`
|
|
83
65
|
: "[image attached — the download failed, there is no local copy]";
|
|
84
|
-
return {
|
|
66
|
+
return {
|
|
67
|
+
text: text ? `${marker} ${text}` : marker,
|
|
68
|
+
attachment,
|
|
69
|
+
// Reported regardless of download outcome, so the stored turn records what
|
|
70
|
+
// arrived even when the fetch failed.
|
|
71
|
+
media: {
|
|
72
|
+
kind: "photo",
|
|
73
|
+
meta: {
|
|
74
|
+
local_path: localPath,
|
|
75
|
+
file_id: bestPhoto.file_id,
|
|
76
|
+
width: bestPhoto.width,
|
|
77
|
+
height: bestPhoto.height,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
85
81
|
}
|
|
86
82
|
|
|
87
83
|
function mimeFromPath(p) {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// One notice, then the work, then the answer — the message budget for a
|
|
2
|
+
// Telegram turn.
|
|
3
|
+
//
|
|
4
|
+
// Model prose is the ONLY thing Telegram ever receives mid-turn: tool names are
|
|
5
|
+
// not sent (see reply.js), so this gate is not trimming a second channel of
|
|
6
|
+
// activity — it is the whole of what the owner sees between "on it" and the
|
|
7
|
+
// answer. That is why it opens rather than staying shut: hold the first line too
|
|
8
|
+
// and a turn that takes four minutes of tool work looks like nothing happened.
|
|
9
|
+
//
|
|
10
|
+
// So this gate decides which stream events become chat messages:
|
|
11
|
+
//
|
|
12
|
+
// - The FIRST line the model writes goes out as the turn opener. A turn whose
|
|
13
|
+
// model skips prose entirely and dives straight into tools stays silent —
|
|
14
|
+
// the typing indicator carries it, and nothing is invented on the agent's
|
|
15
|
+
// behalf.
|
|
16
|
+
// - Everything after it is held. The turn goes quiet — the typing indicator
|
|
17
|
+
// keeps ticking (poller._startTyping re-pings every 4s) — until the closing
|
|
18
|
+
// message the caller always sends.
|
|
19
|
+
// - Except on a long job: after `everyMs` of silence ONE more note is let
|
|
20
|
+
// through, so a four-minute turn still shows a sign of life instead of
|
|
21
|
+
// looking hung. `everyMs: 0` turns that off — strictly notice, work, answer.
|
|
22
|
+
//
|
|
23
|
+
// What is NOT gated here: the final reply. sendFinalReply always speaks, and
|
|
24
|
+
// the never-silent floor still applies — a turn can lose its progress notes,
|
|
25
|
+
// never its conclusion.
|
|
26
|
+
//
|
|
27
|
+
// Pure and clock-injectable: no I/O, no globals. The caller sends and logs.
|
|
28
|
+
|
|
29
|
+
/** Seconds of silence before one more progress note is allowed through. */
|
|
30
|
+
export const DEFAULT_PROGRESS_EVERY_S = 90;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Read the knob: `super_agent.telegram_progress_every_s`.
|
|
34
|
+
* Unset → the built-in default. 0 (or anything unusable) → no mid-turn notes.
|
|
35
|
+
* @returns {number} milliseconds; 0 means "opening notice and closing only"
|
|
36
|
+
*/
|
|
37
|
+
export function progressEveryMs(globalConfig) {
|
|
38
|
+
const raw = globalConfig?.super_agent?.telegram_progress_every_s;
|
|
39
|
+
const secs = raw === undefined || raw === null || raw === "" ? DEFAULT_PROGRESS_EVERY_S : Number(raw);
|
|
40
|
+
if (!Number.isFinite(secs) || secs <= 0) return 0;
|
|
41
|
+
return Math.round(secs * 1000);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {{everyMs?: number, now?: () => number}} opts
|
|
46
|
+
* @returns {{ text: () => "send"|"hold", sinceLastMs: () => number }}
|
|
47
|
+
*/
|
|
48
|
+
export function createProgressGate({ everyMs = 0, now = Date.now } = {}) {
|
|
49
|
+
let opened = false;
|
|
50
|
+
let lastSentAt = 0;
|
|
51
|
+
const markSent = () => {
|
|
52
|
+
opened = true;
|
|
53
|
+
lastSentAt = now();
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
/**
|
|
57
|
+
* The model produced a text segment ahead of its tool calls.
|
|
58
|
+
* "send" → it's the opening notice, or the heartbeat is due.
|
|
59
|
+
*/
|
|
60
|
+
text() {
|
|
61
|
+
if (!opened) {
|
|
62
|
+
markSent();
|
|
63
|
+
return "send";
|
|
64
|
+
}
|
|
65
|
+
if (everyMs > 0 && now() - lastSentAt >= everyMs) {
|
|
66
|
+
markSent();
|
|
67
|
+
return "send";
|
|
68
|
+
}
|
|
69
|
+
return "hold";
|
|
70
|
+
},
|
|
71
|
+
/** Milliseconds since the last message we let through (for logging). */
|
|
72
|
+
sinceLastMs() {
|
|
73
|
+
return opened ? now() - lastSentAt : 0;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -11,57 +11,81 @@ import { stripThinking, stripReasoning } from "#core/util/thinking.js";
|
|
|
11
11
|
import { appendGlobalMessage, getRecentTelegramTurnsFromFs } from "#core/stores/messages.js";
|
|
12
12
|
import { CHANNELS } from "#core/constants/channels.js";
|
|
13
13
|
import { summarizeToolTrace } from "#core/agent/tool-summary.js";
|
|
14
|
+
import { authorLine } from "#core/agent/author-line.js";
|
|
15
|
+
import { closingFloorLine } from "#core/agent/closing-floor.js";
|
|
14
16
|
import { SUPERAGENT_ACTOR_ID } from "#core/identity/index.js";
|
|
15
17
|
import { createTelegramConfirmAdapter } from "#core/confirmation/adapters/telegram.js";
|
|
16
18
|
import { getConfirmationStore as getConfirmStore } from "#core/confirmation/pending-store.js";
|
|
17
19
|
import { t, resolveLang } from "#core/i18n/index.js";
|
|
18
20
|
import { buildTelegramMeta, resolveBotToken } from "./helpers.js";
|
|
21
|
+
import { createProgressGate, progressEveryMs } from "./progress-gate.js";
|
|
22
|
+
import { deliverVoiceReply, mobilityVoiceActive } from "./voice-note.js";
|
|
19
23
|
|
|
20
24
|
/**
|
|
21
|
-
* Build the streaming event handler for a Telegram super-agent turn.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
25
|
+
* Build the streaming event handler for a Telegram super-agent turn. ONE notice
|
|
26
|
+
* goes out when work starts — the model's own opening line, the one the
|
|
27
|
+
* two-segment discipline has it write before the first tool — and the rest of
|
|
28
|
+
* the turn stays quiet until the caller sends the closing message. Nothing is
|
|
29
|
+
* ever written on the agent's behalf: a turn that opens straight into a tool
|
|
30
|
+
* stays quiet until the model itself speaks. The progress notes it writes
|
|
31
|
+
* before each later step are held back (see ./progress-gate.js for why, and for
|
|
32
|
+
* the long-job heartbeat that lets one through every N seconds).
|
|
33
|
+
*
|
|
34
|
+
* TOOL NAMES NEVER GO TO TELEGRAM. For one turn they did — a `⚙️ run_shell`
|
|
35
|
+
* line per tool start — and it was wrong on three counts. Telegram is a
|
|
36
|
+
* conversation, and "⚙️ run_shell" is not something a person says; it is
|
|
37
|
+
* untranslated machine vocabulary in a channel whose whole contract is natural
|
|
38
|
+
* prose. It also pushed a phone notification per tool step, so one turn buzzed
|
|
39
|
+
* a pocket ten times. And it was recorded as an agent-voiced outbound message,
|
|
40
|
+
* which is the shape that teaches a weak fallback model to WRITE tool names
|
|
41
|
+
* instead of calling tools — the failure stores/messages.js keeps out of the
|
|
42
|
+
* rolling history, precisely because history in the agent's own voice is what
|
|
43
|
+
* gets imitated.
|
|
44
|
+
*
|
|
45
|
+
* What shows activity instead is the model's own opening line plus the typing
|
|
46
|
+
* indicator, which the caller holds open for the whole turn (_startTyping) and
|
|
47
|
+
* this handler refreshes at each tool start. Tool calls are still logged in
|
|
48
|
+
* full for the audit trail and the other channels — see the `tool_result`
|
|
49
|
+
* branch, which records tool, args and result for every call.
|
|
50
|
+
*
|
|
51
|
+
* Returns the handler plus a live `state` the caller reads AFTER the run to
|
|
52
|
+
* drive the final send.
|
|
26
53
|
*
|
|
27
54
|
* `state.model` tracks the model actually answering RIGHT NOW (it can rotate
|
|
28
55
|
* mid-turn on a fallback), so every record this handler writes is stamped with
|
|
29
56
|
* the model that produced it — not with the one the turn happened to end on.
|
|
30
57
|
*
|
|
31
|
-
* @returns {{ onEvent: Function, state: { streamedCount: number, lastStreamedText: string, model: string } }}
|
|
58
|
+
* @returns {{ onEvent: Function, state: { streamedCount: number, lastStreamedText: string, heldCount: number, model: string } }}
|
|
32
59
|
*/
|
|
33
60
|
export function buildStreamHandler(self, { chat_id, update_id, agentDisplay }) {
|
|
34
|
-
const state = { streamedCount: 0, lastStreamedText: "",
|
|
61
|
+
const state = { streamedCount: 0, lastStreamedText: "", heldCount: 0, model: "" };
|
|
62
|
+
const gate = createProgressGate({ everyMs: progressEveryMs(self.globalConfig) });
|
|
35
63
|
const onEvent = async (ev) => {
|
|
36
64
|
try {
|
|
37
65
|
if ((ev.type === "model_start" || ev.type === "model_routed" || ev.type === "final_wrapup") && ev.model) {
|
|
38
66
|
state.model = ev.model;
|
|
39
67
|
}
|
|
40
|
-
if (ev.type === "tool_start" && !state.sentHeadsUp && state.streamedCount === 0) {
|
|
41
|
-
state.sentHeadsUp = true;
|
|
42
|
-
const heads = t("telegram.heads_up", { lang: resolveLang(self.globalConfig) });
|
|
43
|
-
await self._send({ chat_id, text: heads });
|
|
44
|
-
appendGlobalMessage({
|
|
45
|
-
channel: CHANNELS.TELEGRAM,
|
|
46
|
-
direction: "out",
|
|
47
|
-
type: "agent",
|
|
48
|
-
actor_id: SUPERAGENT_ACTOR_ID,
|
|
49
|
-
actor_kind: "superagent",
|
|
50
|
-
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
51
|
-
author: agentDisplay,
|
|
52
|
-
body: heads,
|
|
53
|
-
meta: { chat_id, tg_channel: self.channel.name, in_reply_to: update_id, heads_up: true, ...(state.model ? { model: state.model } : {}) },
|
|
54
|
-
});
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
68
|
if (ev.type === "assistant_text" && ev.text) {
|
|
58
69
|
// Untagged planning is suppressed mid-stream too, or the user
|
|
59
70
|
// watches the model think in real time.
|
|
60
71
|
const piece = stripReasoning(ev.text).answer.trim();
|
|
61
72
|
if (!piece) return;
|
|
73
|
+
if (gate.text() === "hold") {
|
|
74
|
+
// Held, not lost: it was a pre-tool filler line, and the closing
|
|
75
|
+
// message carries the result. Logged by size only — the ledger
|
|
76
|
+
// records what the user actually received, and the daemon log is
|
|
77
|
+
// not the place to copy conversation text.
|
|
78
|
+
state.heldCount += 1;
|
|
79
|
+
self.log(
|
|
80
|
+
`telegram[${self.channel.name}] progress note held ` +
|
|
81
|
+
`(#${state.heldCount}, ${piece.length} chars, ${Math.round(gate.sinceLastMs() / 1000)}s of quiet)`
|
|
82
|
+
);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
62
85
|
await self._send({ chat_id, text: piece });
|
|
63
86
|
state.lastStreamedText = piece;
|
|
64
87
|
state.streamedCount += 1;
|
|
88
|
+
// attribution-exempt: mid-stream segment — token usage is only known at turn end; the final row carries model+usage.
|
|
65
89
|
appendGlobalMessage({
|
|
66
90
|
channel: CHANNELS.TELEGRAM,
|
|
67
91
|
direction: "out",
|
|
@@ -73,6 +97,17 @@ export function buildStreamHandler(self, { chat_id, update_id, agentDisplay }) {
|
|
|
73
97
|
body: piece,
|
|
74
98
|
meta: { chat_id, tg_channel: self.channel.name, in_reply_to: update_id, streamed: true, iteration: ev.iteration, ...(state.model ? { model: state.model } : {}) },
|
|
75
99
|
});
|
|
100
|
+
} else if (ev.type === "tool_start" && ev.trace) {
|
|
101
|
+
// Nothing is SENT here — see the note on this function about why a tool
|
|
102
|
+
// name is not something Telegram should ever receive. The call is
|
|
103
|
+
// recorded on `tool_result`, which has the result as well as the args.
|
|
104
|
+
//
|
|
105
|
+
// The typing indicator is what the owner sees instead, and every caller
|
|
106
|
+
// that runs a turn already holds it open on a 4s timer (_startTyping).
|
|
107
|
+
// This extra ping is belt-and-braces: it costs one best-effort
|
|
108
|
+
// sendChatAction and guarantees the indicator is fresh at the moment a
|
|
109
|
+
// slow tool begins, whatever the caller did.
|
|
110
|
+
await self._typing?.(chat_id);
|
|
76
111
|
} else if (ev.type === "tool_result" && ev.trace) {
|
|
77
112
|
// Logged for the audit trail / other channels — NOT sent to Telegram.
|
|
78
113
|
const tr = ev.trace;
|
|
@@ -86,6 +121,22 @@ export function buildStreamHandler(self, { chat_id, update_id, agentDisplay }) {
|
|
|
86
121
|
body: `${tr.tool}(${JSON.stringify(tr.args || {}).slice(0, 200)})`,
|
|
87
122
|
meta: { chat_id, tg_channel: self.channel.name, in_reply_to: update_id, tool: tr.tool, args: tr.args, result: tr.result, iteration: ev.iteration, ...(state.model ? { model: state.model } : {}) },
|
|
88
123
|
});
|
|
124
|
+
} else if (ev.type === "judge_verdict") {
|
|
125
|
+
// Why a turn kept going after it looked done. Logged, never sent: the
|
|
126
|
+
// continuation shows up as the work itself, not as a status report.
|
|
127
|
+
self.log(
|
|
128
|
+
`telegram[${self.channel.name}] judge round ${ev.iteration}: ` +
|
|
129
|
+
`${Math.round((ev.score ?? 0) * 100)}% ${ev.passed ? "→ done" : "→ continuing"}` +
|
|
130
|
+
`${ev.reasoning ? ` (${ev.reasoning})` : ""}`
|
|
131
|
+
);
|
|
132
|
+
} else if (ev.type === "judge_budget_exhausted") {
|
|
133
|
+
// The judge wanted another round and the turn had no budget left to
|
|
134
|
+
// give it. Logged because the alternative reading — "the judge passed
|
|
135
|
+
// it" — is wrong, and the trail alone doesn't distinguish the two.
|
|
136
|
+
self.log(
|
|
137
|
+
`telegram[${self.channel.name}] judge round ${ev.iteration} skipped: ` +
|
|
138
|
+
`tool budget spent (${ev.spent}/${ev.budget})`
|
|
139
|
+
);
|
|
89
140
|
} else if (ev.type === "engine_failed") {
|
|
90
141
|
// A model in the fallback chain errored; the loop is rotating to the
|
|
91
142
|
// next one. Log so a mid-turn provider failure is diagnosable.
|
|
@@ -132,13 +183,20 @@ export function runTelegramSuperAgent(self, {
|
|
|
132
183
|
relationshipBlock,
|
|
133
184
|
allowedTools,
|
|
134
185
|
contextNote: contextNote || undefined,
|
|
135
|
-
channelMeta:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
186
|
+
channelMeta: {
|
|
187
|
+
...buildTelegramMeta({
|
|
188
|
+
channelName: self.channel.name,
|
|
189
|
+
author,
|
|
190
|
+
chatId: chat_id,
|
|
191
|
+
target,
|
|
192
|
+
routeToAgent: self.channel.route_to_agent,
|
|
193
|
+
}),
|
|
194
|
+
// Driving flips this turn into voice mode, which is what actually makes
|
|
195
|
+
// the reply short (prompts/modes/voice.md + mobility.md). Doing it here
|
|
196
|
+
// rather than at send time is the whole point: you cannot shorten a
|
|
197
|
+
// paragraph after the model has written it, you can only truncate it.
|
|
198
|
+
...(mobilityVoiceActive(self.globalConfig) ? { voice: true, mobility: true } : {}),
|
|
199
|
+
},
|
|
142
200
|
signal,
|
|
143
201
|
onEvent,
|
|
144
202
|
requestConfirmation: confirmAdapter.requestConfirmation,
|
|
@@ -226,6 +284,7 @@ export async function runFollowupTurn(self, {
|
|
|
226
284
|
saTrace,
|
|
227
285
|
streamedCount: state.streamedCount,
|
|
228
286
|
lastStreamedText: state.lastStreamedText,
|
|
287
|
+
heldCount: state.heldCount,
|
|
229
288
|
agentDisplay,
|
|
230
289
|
extraMeta: { a2a_relay: true },
|
|
231
290
|
});
|
|
@@ -244,16 +303,21 @@ export function telegramErrorText(self, e) {
|
|
|
244
303
|
}
|
|
245
304
|
|
|
246
305
|
/**
|
|
247
|
-
* Send the final reply for a turn and log it. The
|
|
248
|
-
*
|
|
249
|
-
* the last
|
|
250
|
-
*
|
|
251
|
-
*
|
|
306
|
+
* Send the final reply for a turn and log it. The opening notice was already
|
|
307
|
+
* sent, so we only send `replyText` if it's non-empty AND not a duplicate of
|
|
308
|
+
* the last piece that went out. This is the message the whole turn is for: with
|
|
309
|
+
* mid-turn notes held back, it's the only place the result can arrive — hence
|
|
310
|
+
* the never-silent floor. When the closing comes back empty the model is asked
|
|
311
|
+
* to write it from what the turn did (closing-floor.js), and only if THAT is
|
|
312
|
+
* empty too — usually because the engine is down, which is why the turn is
|
|
313
|
+
* empty in the first place — does the canned line go out. Never silent beats
|
|
314
|
+
* never canned, in that order.
|
|
315
|
+
* Caller stops the typing indicator before calling.
|
|
252
316
|
*/
|
|
253
317
|
export async function sendFinalReply(self, {
|
|
254
318
|
chat_id, update_id, replyText, replyAuthor, replyActorId, replyKind,
|
|
255
319
|
saUsage = null, saModel = null, saTrace = null, streamedCount = 0, lastStreamedText = "",
|
|
256
|
-
agentDisplay, extraMeta = {},
|
|
320
|
+
heldCount = 0, agentDisplay, extraMeta = {}, authorLineFn = authorLine,
|
|
257
321
|
}) {
|
|
258
322
|
// A model that dumps raw planning must never have it forwarded. When that
|
|
259
323
|
// happens the answer comes back empty and the existing never-silent fallback
|
|
@@ -268,22 +332,62 @@ export async function sendFinalReply(self, {
|
|
|
268
332
|
`chain-of-thought is not usable on a user-facing channel.`
|
|
269
333
|
);
|
|
270
334
|
}
|
|
335
|
+
const toolSummary = summarizeToolTrace(saTrace);
|
|
271
336
|
let toSend = "";
|
|
272
337
|
if (finalClean && finalClean !== lastStreamedText) {
|
|
273
338
|
toSend = finalClean;
|
|
274
339
|
} else if (!finalClean) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
340
|
+
// The shared floor (core/agent/closing-floor.js): one cheap tool-free call
|
|
341
|
+
// for a closing the model words itself, and the canned line only if that
|
|
342
|
+
// comes back empty too. `worked` is either half: prose the owner already
|
|
343
|
+
// read (streamedCount), or tools that ran without a word going out with
|
|
344
|
+
// them (toolSummary) — a silent turn that did real work still closes by
|
|
345
|
+
// saying where it got to, not with a bare acknowledgement.
|
|
346
|
+
const { text, authored } = await closingFloorLine({
|
|
347
|
+
globalConfig: self.globalConfig,
|
|
348
|
+
worked: streamedCount > 0 || Boolean(toolSummary),
|
|
349
|
+
lastText: lastStreamedText,
|
|
350
|
+
toolSummary,
|
|
351
|
+
authorLineFn,
|
|
352
|
+
});
|
|
353
|
+
toSend = text;
|
|
354
|
+
if (!authored) self.log(`telegram[${self.channel.name}] closing floor: the model could not write it either`);
|
|
279
355
|
}
|
|
280
356
|
if (!toSend) return; // everything was already streamed — nothing left to send
|
|
281
357
|
|
|
282
358
|
const actorId = replyActorId || SUPERAGENT_ACTOR_ID;
|
|
283
359
|
const kind = replyKind || "superagent";
|
|
284
360
|
try {
|
|
285
|
-
|
|
361
|
+
// Driving: the answer goes out spoken first, then as its own transcript.
|
|
362
|
+
// A failed voice attempt falls through to the plain send below — the
|
|
363
|
+
// upgrade is allowed to fail, the message is not.
|
|
364
|
+
const spoken = mobilityVoiceActive(self.globalConfig)
|
|
365
|
+
? await deliverVoiceReply({
|
|
366
|
+
io: {
|
|
367
|
+
send: (args) => self._send(args),
|
|
368
|
+
sendVoice: (args) => self._sendVoice(args),
|
|
369
|
+
},
|
|
370
|
+
chat_id,
|
|
371
|
+
text: toSend,
|
|
372
|
+
globalConfig: self.globalConfig,
|
|
373
|
+
log: (line) => self.log(`telegram[${self.channel.name}] ${line}`),
|
|
374
|
+
})
|
|
375
|
+
: { voice: false, reason: "not-driving" };
|
|
376
|
+
if (!spoken.voice) {
|
|
377
|
+
if (spoken.reason !== "not-driving") {
|
|
378
|
+
self.log(`telegram[${self.channel.name}] voice reply unavailable (${spoken.reason}) — sending text`);
|
|
379
|
+
}
|
|
380
|
+
await self._send({ chat_id, text: toSend });
|
|
381
|
+
}
|
|
286
382
|
const meta = { chat_id, tg_channel: self.channel.name, in_reply_to: update_id, final: true, ...extraMeta };
|
|
383
|
+
if (spoken.voice) {
|
|
384
|
+
// The row keeps the WORDS as its body (that is what search and the next
|
|
385
|
+
// turn's history need) and names the audio in meta, so the thread can
|
|
386
|
+
// play back exactly what the owner heard.
|
|
387
|
+
meta.voice_note = true;
|
|
388
|
+
meta.tts_provider = spoken.provider;
|
|
389
|
+
Object.assign(meta, spoken.media || {});
|
|
390
|
+
}
|
|
287
391
|
if (replyText && stripThinking(replyText) !== replyText) meta.thinking_stripped = true;
|
|
288
392
|
if (stripped.leaked) meta.reasoning_leak_suppressed = true;
|
|
289
393
|
if (saUsage) meta.usage = saUsage;
|
|
@@ -292,8 +396,12 @@ export async function sendFinalReply(self, {
|
|
|
292
396
|
// and would bloat the day-file for a detail nobody reads back. What is
|
|
293
397
|
// worth recovering later is "it read three files and sent a message", and
|
|
294
398
|
// whether any of it failed.
|
|
295
|
-
const toolSummary = summarizeToolTrace(saTrace);
|
|
296
399
|
if (toolSummary) meta.tool_summary = toolSummary;
|
|
400
|
+
// How many progress notes the gate held back. The ledger stays a record of
|
|
401
|
+
// what the user RECEIVED; this number is how you tell, after the fact, that
|
|
402
|
+
// a quiet turn was quiet on purpose.
|
|
403
|
+
if (heldCount > 0) meta.progress_held = heldCount;
|
|
404
|
+
// attribution: model+usage were stamped on `meta` above (saModel/saUsage) — the final row the user received.
|
|
297
405
|
appendGlobalMessage({
|
|
298
406
|
channel: CHANNELS.TELEGRAM,
|
|
299
407
|
direction: "out",
|