@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
|
@@ -6,20 +6,29 @@
|
|
|
6
6
|
// POST /projects/:pid/super-agent/chat/stream NDJSON event stream
|
|
7
7
|
// POST /projects/:pid/super-agent/chat blocking JSON response
|
|
8
8
|
import { runSuperAgent } from "#core/agent/super-agent.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
appendSuperAgentErrorTrace,
|
|
12
|
-
} from "./shared.js";
|
|
9
|
+
import { resolveSuperAgentContext,
|
|
10
|
+
appendSuperAgentErrorTrace, asyncRoute } from "./shared.js";
|
|
13
11
|
import { loggerFor } from "#core/logging.js";
|
|
14
12
|
import { appendGlobalMessage } from "#core/stores/messages.js";
|
|
13
|
+
import { summarizeToolTrace } from "#core/agent/tool-summary.js";
|
|
14
|
+
import { floorReplyText } from "#core/agent/closing-floor.js";
|
|
15
|
+
import { SUPERAGENT_ACTOR_ID } from "#core/identity/index.js";
|
|
15
16
|
import { createWebConfirmAdapter } from "#core/confirmation/adapters/web.js";
|
|
16
17
|
import { tryResolveSkillCommand } from "#core/agent/skills/trigger.js";
|
|
17
18
|
import { suggestSkillForPrompt } from "#core/agent/skills/rag.js";
|
|
18
19
|
import { inspectPromptForSkills, isInspectorEnabled, summarizeTrace } from "#core/agent/skills/inspector.js";
|
|
19
20
|
import { CHANNELS } from "#core/constants/channels.js";
|
|
21
|
+
import { readTurnAttachments } from "./media.js";
|
|
22
|
+
import { startActiveTurn, appendActiveTurn, recordActiveTurnEvent, endActiveTurn, superAgentTurnKey } from "../active-turns.js";
|
|
23
|
+
import { broadcastTurn } from "../events-ws.js";
|
|
24
|
+
import { wasAborted, abortedTurnEvent } from "./turn-abort.js";
|
|
20
25
|
|
|
21
26
|
const log = loggerFor("super-agent");
|
|
22
27
|
|
|
28
|
+
// How long a streamed turn may go silent before it writes a keepalive byte.
|
|
29
|
+
// Comfortably under undici's 300s body timeout and the usual proxy idle limits.
|
|
30
|
+
const KEEPALIVE_MS = 20_000;
|
|
31
|
+
|
|
23
32
|
// Emit a single, readable line so `apx log -f` shows exactly what the skill
|
|
24
33
|
// inspector decided this turn (which skills it loaded/hinted, the embedder, and
|
|
25
34
|
// the top similarity). Best-effort: logging must never break a reply.
|
|
@@ -39,38 +48,187 @@ function logInspectorDecision(trace, { trace_id, channel } = {}) {
|
|
|
39
48
|
}
|
|
40
49
|
}
|
|
41
50
|
|
|
51
|
+
// What of the inspector trace is worth keeping on disk: the decision, not the
|
|
52
|
+
// payload. `null` only when the inspector had nothing to say at all — no skill
|
|
53
|
+
// injected AND no candidate scored. When it scored candidates but none crossed
|
|
54
|
+
// the load/hint bar we STILL keep the row: a reopened thread should be able to
|
|
55
|
+
// show what was suggested each round (the "considered" near-misses), which is
|
|
56
|
+
// what makes the per-turn RAG legible instead of silently doing nothing.
|
|
57
|
+
export function inspectorRecord(trace) {
|
|
58
|
+
if (!trace?.enabled) return null;
|
|
59
|
+
const loaded = trace.loaded || [];
|
|
60
|
+
const hinted = trace.hinted || [];
|
|
61
|
+
const scored = trace.scored || [];
|
|
62
|
+
if (loaded.length === 0 && hinted.length === 0 && scored.length === 0) return null;
|
|
63
|
+
return {
|
|
64
|
+
...(trace.embedder ? { embedder: trace.embedder } : {}),
|
|
65
|
+
...(loaded.length ? { loaded } : {}),
|
|
66
|
+
...(hinted.length ? { hinted } : {}),
|
|
67
|
+
// Already capped at the top 5 upstream — the similarities the badge shows,
|
|
68
|
+
// and the source of the dim "considered" badges when nothing was injected.
|
|
69
|
+
...(scored.length ? { scored } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
42
73
|
// Persist human web turns to the cross-channel message store so they feed the
|
|
43
|
-
// RAG index, search_messages, and the "active threads" awareness block.
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
74
|
+
// RAG index, search_messages, and the "active threads" awareness block.
|
|
75
|
+
//
|
|
76
|
+
// This used to keep only web + web_sidebar, on the reasoning that everything
|
|
77
|
+
// else was "automation". That was wrong once real people started arriving over
|
|
78
|
+
// those channels: a WhatsApp contact writing to the bridge, or an agent relay,
|
|
79
|
+
// produced a turn that was answered and then vanished — no thread, no history,
|
|
80
|
+
// nothing in the inbox, and no way to tell a working bridge from a dead one.
|
|
81
|
+
//
|
|
82
|
+
// So the rule inverts: a conversation is written unless it is machine chatter.
|
|
83
|
+
// A routine's output already travels its own delivery path and lands in the
|
|
84
|
+
// agent's chat; writing it here too would double it and bury the inbox.
|
|
85
|
+
//
|
|
86
|
+
// Consequence worth naming: message text from third parties (WhatsApp) now
|
|
87
|
+
// enters the ledger, which is what feeds RAG and the awareness block. That is
|
|
88
|
+
// the price of the conversation being visible at all, and the owner chose it.
|
|
89
|
+
// Best-effort: a logging failure never breaks the reply.
|
|
90
|
+
const LEDGER_SKIP_CHANNELS = new Set([CHANNELS.ROUTINE]);
|
|
91
|
+
|
|
92
|
+
/** Which project the chat was opened from. The ledger is one file per
|
|
93
|
+
* channel+day for the whole daemon, so without this stamp a chat started
|
|
94
|
+
* inside a project could only be found in the Base workspace — from the
|
|
95
|
+
* project it was started in, it looked gone. */
|
|
96
|
+
const ledgerScope = (project) =>
|
|
97
|
+
project ? { project_id: String(project.id), project_name: project.name } : {};
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The INBOUND half, written the moment the request arrives.
|
|
101
|
+
*
|
|
102
|
+
* It used to be written with the reply, when the turn was over. A WhatsApp
|
|
103
|
+
* round drives a phone for three minutes, and for those three minutes nothing
|
|
104
|
+
* anywhere showed that a message had arrived at all — the panel open on that
|
|
105
|
+
* thread stayed blank until the whole turn landed, and a turn that crashed took
|
|
106
|
+
* the record of the message with it. What arrived is a fact as soon as it
|
|
107
|
+
* arrives; what the agent answers is a separate one.
|
|
108
|
+
*
|
|
109
|
+
* Best-effort: a logging failure never breaks the turn.
|
|
110
|
+
*/
|
|
111
|
+
function logInboundTurn(channel, { prompt, project, media }) {
|
|
112
|
+
if (!channel || LEDGER_SKIP_CHANNELS.has(channel)) return;
|
|
49
113
|
try {
|
|
50
|
-
appendGlobalMessage({
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
114
|
+
appendGlobalMessage({
|
|
115
|
+
channel, direction: "in", type: "user", author: "user", body: prompt,
|
|
116
|
+
// `media` records the file the turn was sent with (local_path, name, mime
|
|
117
|
+
// — see readTurnAttachments), which is what lets a reopened thread render
|
|
118
|
+
// the photo instead of the marker text the agent was handed.
|
|
119
|
+
meta: { ...ledgerScope(project), ...(media || {}) },
|
|
120
|
+
});
|
|
121
|
+
} catch { /* the ledger is a record, not a dependency */ }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function logWebTurn(channel, { replyText, name, model, usage, trace, project, inspector, reasoning, timeline = [] }) {
|
|
125
|
+
if (!channel || LEDGER_SKIP_CHANNELS.has(channel)) return;
|
|
126
|
+
const scope = ledgerScope(project);
|
|
127
|
+
try {
|
|
128
|
+
// Keep the stream's real order. Before this, live prose preceding a tool
|
|
129
|
+
// only existed in the browser; a refresh lost it, then the final-only ledger
|
|
130
|
+
// made the user think APX had erased part of the answer. Fall back to the
|
|
131
|
+
// old trace-first shape for blocking callers that have no event timeline.
|
|
132
|
+
const ordered = timeline.length
|
|
133
|
+
? [...timeline]
|
|
134
|
+
: (Array.isArray(trace) ? trace.filter((item) => item?.tool).map((item) => ({ kind: "tool", trace: item })) : []);
|
|
135
|
+
const exactFinal = String(replyText || "").trim();
|
|
136
|
+
let finalTextIndex = -1;
|
|
137
|
+
if (exactFinal) {
|
|
138
|
+
for (let i = ordered.length - 1; i >= 0; i--) {
|
|
139
|
+
if (ordered[i]?.kind === "text" && String(ordered[i].text || "").trim() === exactFinal) {
|
|
140
|
+
finalTextIndex = i;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (finalTextIndex < 0) {
|
|
145
|
+
ordered.push({ kind: "text", text: replyText });
|
|
146
|
+
finalTextIndex = ordered.length - 1;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const toolSummary = summarizeToolTrace(trace);
|
|
150
|
+
const skillInspector = inspectorRecord(inspector);
|
|
151
|
+
for (let index = 0; index < ordered.length; index++) {
|
|
152
|
+
const item = ordered[index];
|
|
153
|
+
if (item?.kind === "tool" && item.trace?.tool) {
|
|
154
|
+
const tool = item.trace;
|
|
155
|
+
appendGlobalMessage({
|
|
156
|
+
channel,
|
|
157
|
+
direction: "out",
|
|
158
|
+
type: "tool",
|
|
159
|
+
actor_id: tool.tool,
|
|
160
|
+
actor_kind: "tool",
|
|
161
|
+
author: name || undefined,
|
|
162
|
+
body: `${tool.tool}(${JSON.stringify(tool.args || {}).slice(0, 200)})`,
|
|
163
|
+
meta: { ...scope, tool: tool.tool, args: tool.args, result: tool.result },
|
|
164
|
+
});
|
|
165
|
+
} else if (item?.kind === "text" && item.text) {
|
|
166
|
+
const isFinal = index === finalTextIndex;
|
|
167
|
+
appendGlobalMessage({
|
|
168
|
+
channel,
|
|
169
|
+
direction: "out",
|
|
170
|
+
type: "agent",
|
|
171
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
172
|
+
actor_kind: "superagent",
|
|
173
|
+
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
174
|
+
author: name || undefined,
|
|
175
|
+
body: item.text,
|
|
176
|
+
meta: {
|
|
177
|
+
...scope,
|
|
178
|
+
// Intermediate prose stays visible after a reopen but never becomes
|
|
179
|
+
// prompt history for the next turn; it is progress, not the answer.
|
|
180
|
+
...(!isFinal ? { streamed: true } : {}),
|
|
181
|
+
...(isFinal && model ? { model } : {}),
|
|
182
|
+
...(isFinal && usage ? { usage } : {}),
|
|
183
|
+
...(isFinal && toolSummary ? { tool_summary: toolSummary } : {}),
|
|
184
|
+
...(isFinal && skillInspector ? { skill_inspector: skillInspector } : {}),
|
|
185
|
+
...(isFinal && reasoning?.length ? { reasoning } : {}),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
62
189
|
}
|
|
63
190
|
} catch {
|
|
64
191
|
/* best-effort */
|
|
65
192
|
}
|
|
66
193
|
}
|
|
67
194
|
|
|
195
|
+
/**
|
|
196
|
+
* One line when a turn had to be closed by the floor. Worth a log even when the
|
|
197
|
+
* model wrote the closing: the turn itself came back empty after runAgent's
|
|
198
|
+
* retries, which is a model-chain problem the owner should be able to see. When
|
|
199
|
+
* the canned line spoke too, TWO calls in a row returned nothing — that is
|
|
200
|
+
* almost always an engine that is down.
|
|
201
|
+
*/
|
|
202
|
+
function logFlooredTurn({ authored }, { trace_id, channel }) {
|
|
203
|
+
const how = authored ? "the model wrote the closing" : "the canned floor spoke — the model could not write it either";
|
|
204
|
+
log.warn(`empty turn closed by the floor: ${how}`, { trace_id, channel });
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// A turn's thinking goes on the record, but the ledger is a day-file the whole
|
|
208
|
+
// daemon shares: an agent that loops twenty times must not write a novel into
|
|
209
|
+
// it. One segment per model pass, both ends bounded.
|
|
210
|
+
const REASONING_SEGMENT_CAP = 4000;
|
|
211
|
+
const REASONING_MAX_SEGMENTS = 10;
|
|
212
|
+
|
|
68
213
|
// Wrap an onEvent emitter so that operationally interesting events also land
|
|
69
214
|
// in the unified daemon log. We don't log every "model_start" — too noisy —
|
|
70
215
|
// just the ones a user would want to see in `apx log -f` after a turn fails
|
|
71
216
|
// or rotates models.
|
|
72
|
-
function wrapOnEventForLog(send, { trace_id, channel }) {
|
|
217
|
+
function wrapOnEventForLog(send, { trace_id, channel, reasoning }) {
|
|
73
218
|
return (event) => {
|
|
219
|
+
// The thinking, kept for the record. It rides its own event and never the
|
|
220
|
+
// answer text, so this is the only place it can be picked up before it is
|
|
221
|
+
// gone — same problem the tool trace has, same fix.
|
|
222
|
+
if (event?.type === "assistant_reasoning" && Array.isArray(reasoning)) {
|
|
223
|
+
const piece = String(event.reasoning || "").trim();
|
|
224
|
+
if (piece && reasoning.length < REASONING_MAX_SEGMENTS) {
|
|
225
|
+
reasoning.push(
|
|
226
|
+
piece.length > REASONING_SEGMENT_CAP
|
|
227
|
+
? piece.slice(0, REASONING_SEGMENT_CAP) + "…"
|
|
228
|
+
: piece,
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
74
232
|
if (event?.type === "engine_failed") {
|
|
75
233
|
log.warn(
|
|
76
234
|
`engine ${event.model || "?"} failed → retrying with ${event.retry_with || "?"}`,
|
|
@@ -92,7 +250,7 @@ function wrapOnEventForLog(send, { trace_id, channel }) {
|
|
|
92
250
|
}
|
|
93
251
|
|
|
94
252
|
export function register(api, { projects, registries, plugins, project, config }) {
|
|
95
|
-
api.post("/projects/:pid/super-agent/chat/stream", async (req, res) => {
|
|
253
|
+
api.post("/projects/:pid/super-agent/chat/stream", asyncRoute(async (req, res) => {
|
|
96
254
|
const p = project(req, res);
|
|
97
255
|
if (!p) return;
|
|
98
256
|
// Optional coding-surface knobs: the terminal Code TUI (apx code, Build
|
|
@@ -100,14 +258,20 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
100
258
|
// module. Plain chat callers omit them and keep the lightweight defaults.
|
|
101
259
|
const { prompt: rawPrompt, previousMessages, model, maxIters, maxTokens, completionContract } =
|
|
102
260
|
req.body || {};
|
|
103
|
-
|
|
261
|
+
// Files the composer uploaded to ~/.apx/media and named on this turn. A
|
|
262
|
+
// photo with no caption IS a turn: the marker built below stands in for the
|
|
263
|
+
// text, exactly as it does when the same photo arrives over Telegram.
|
|
264
|
+
const turnFiles = readTurnAttachments(req.body?.attachments);
|
|
265
|
+
if (!rawPrompt && !turnFiles.markers.length) {
|
|
266
|
+
return res.status(400).json({ error: "prompt required" });
|
|
267
|
+
}
|
|
104
268
|
const ctx = resolveSuperAgentContext(req, p);
|
|
105
269
|
|
|
106
270
|
// `/slug ...` shortcut: load the matching skill body into contextNote and
|
|
107
271
|
// strip the prefix from the user prompt. Falls through unchanged when the
|
|
108
272
|
// slug is unknown.
|
|
109
|
-
const slashed = tryResolveSkillCommand(rawPrompt, { projectPath: p.path });
|
|
110
|
-
const prompt = slashed.handled ? slashed.prompt : rawPrompt;
|
|
273
|
+
const slashed = tryResolveSkillCommand(rawPrompt || "", { projectPath: p.path });
|
|
274
|
+
const prompt = slashed.handled ? slashed.prompt : rawPrompt || "";
|
|
111
275
|
const inspectorOn = isInspectorEnabled(config);
|
|
112
276
|
let inspectorTrace = null;
|
|
113
277
|
if (slashed.handled) {
|
|
@@ -126,24 +290,100 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
126
290
|
ctx.contextNote = [ctx.contextNote, out.contextNote].filter(Boolean).join("\n\n");
|
|
127
291
|
}
|
|
128
292
|
} else {
|
|
129
|
-
//
|
|
293
|
+
// Inspector off — fall back to the passive nudge.
|
|
130
294
|
const hint = await suggestSkillForPrompt(prompt, { projectPath: p.path });
|
|
131
295
|
if (hint) ctx.contextNote = [ctx.contextNote, hint].filter(Boolean).join("\n\n");
|
|
132
296
|
}
|
|
133
297
|
|
|
298
|
+
// What the model reads, and what the ledger stores: the attachment markers
|
|
299
|
+
// first, then whatever was typed. The markers are built on this side so the
|
|
300
|
+
// path they name is one the daemon resolved, not one a client claimed.
|
|
301
|
+
const turnPrompt = [...turnFiles.markers, prompt].filter(Boolean).join(" ");
|
|
302
|
+
|
|
303
|
+
// Before a single token: the message exists now, and the panel (and the
|
|
304
|
+
// inbox, and the live feed) should say so while the turn is still working.
|
|
305
|
+
logInboundTurn(ctx.channel, { prompt: turnPrompt, project: p, media: turnFiles.media });
|
|
306
|
+
|
|
134
307
|
res.setHeader("content-type", "application/x-ndjson; charset=utf-8");
|
|
135
308
|
res.setHeader("cache-control", "no-cache, no-transform");
|
|
136
309
|
res.setHeader("x-accel-buffering", "no");
|
|
137
310
|
res.flushHeaders?.();
|
|
138
311
|
|
|
139
312
|
const send = (event) => {
|
|
313
|
+
lastWriteAt = Date.now();
|
|
140
314
|
res.write(JSON.stringify(event) + "\n");
|
|
141
315
|
};
|
|
142
316
|
|
|
143
|
-
|
|
317
|
+
// Keepalive. A turn only writes when something happens, and one tool can own
|
|
318
|
+
// the turn for minutes on end — run_routine blocks until the routine ends,
|
|
319
|
+
// by design. To an HTTP client that is an idle response body, and undici
|
|
320
|
+
// (the CLI, the TUI) drops it at its body timeout with UND_ERR_BODY_TIMEOUT;
|
|
321
|
+
// proxies in front of the daemon do the same. A bare newline is a valid
|
|
322
|
+
// no-op in NDJSON — every reader here skips blank lines — so it holds the
|
|
323
|
+
// connection open without inventing an event type clients must know about.
|
|
324
|
+
let lastWriteAt = Date.now();
|
|
325
|
+
const keepalive = setInterval(() => {
|
|
326
|
+
if (Date.now() - lastWriteAt < KEEPALIVE_MS) return;
|
|
327
|
+
lastWriteAt = Date.now();
|
|
328
|
+
try { res.write("\n"); } catch { /* the socket is gone; the finally clears us */ }
|
|
329
|
+
}, KEEPALIVE_MS);
|
|
330
|
+
keepalive.unref?.();
|
|
331
|
+
res.on("close", () => clearInterval(keepalive));
|
|
332
|
+
|
|
333
|
+
const reasoning = [];
|
|
334
|
+
// The run's kill switch, plus the registry entry that lets any surface find
|
|
335
|
+
// it. Roby's web chat has no conversation id — its thread IS the channel —
|
|
336
|
+
// so one live turn per project+channel, exactly as Telegram keys one live
|
|
337
|
+
// turn per chat_id. POST .../turns/abort reaches `abort` through this.
|
|
338
|
+
const turnAbort = new AbortController();
|
|
339
|
+
const turnKey = superAgentTurnKey(p.id, ctx.channel);
|
|
340
|
+
const threadId = new Date().toISOString().slice(0, 10);
|
|
341
|
+
const active = startActiveTurn(turnKey, {
|
|
342
|
+
project_id: p.id, channel: ctx.channel, thread_id: threadId, model: model || null,
|
|
343
|
+
abort: () => turnAbort.abort(),
|
|
344
|
+
});
|
|
345
|
+
const turnFrame = (phase, extra = {}) => broadcastTurn({
|
|
346
|
+
phase,
|
|
347
|
+
project_id: p.id,
|
|
348
|
+
agent_slug: null,
|
|
349
|
+
conversation_id: null,
|
|
350
|
+
channel: ctx.channel,
|
|
351
|
+
thread_id: threadId,
|
|
352
|
+
turn_id: active.id,
|
|
353
|
+
...extra,
|
|
354
|
+
});
|
|
355
|
+
// The steps as they happen. runSuperAgent throws on abort and its trace goes
|
|
356
|
+
// with it, so an interrupted turn would otherwise land in the ledger as
|
|
357
|
+
// prose with the work erased — and the turn that continues it would not know
|
|
358
|
+
// which tools had already run for real.
|
|
359
|
+
const partialTrace = [];
|
|
360
|
+
const timeline = [];
|
|
361
|
+
const logged = wrapOnEventForLog(send, {
|
|
144
362
|
trace_id: req.apxTraceId,
|
|
145
363
|
channel: ctx.channel,
|
|
364
|
+
reasoning,
|
|
146
365
|
});
|
|
366
|
+
// The last thing the turn actually said. The result object does not carry
|
|
367
|
+
// it — `text` is the CLOSING — and it is the one piece of context a floored
|
|
368
|
+
// closing needs to not repeat itself. See core/agent/closing-floor.js.
|
|
369
|
+
let lastSaid = "";
|
|
370
|
+
const onEvent = (ev) => {
|
|
371
|
+
recordActiveTurnEvent(active.id, ev);
|
|
372
|
+
if (ev?.type === "assistant_text" && ev.text) {
|
|
373
|
+
timeline.push({ kind: "text", text: ev.text });
|
|
374
|
+
if (String(ev.text).trim()) lastSaid = String(ev.text).trim();
|
|
375
|
+
}
|
|
376
|
+
if (ev?.type === "tool_result" && ev.trace) {
|
|
377
|
+
partialTrace.push(ev.trace);
|
|
378
|
+
timeline.push({ kind: "tool", trace: ev.trace });
|
|
379
|
+
}
|
|
380
|
+
return logged(ev);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
// The turn's identity, up front, so a client can stop it (POST
|
|
384
|
+
// .../turns/abort takes the channel for Roby — its thread IS the channel).
|
|
385
|
+
turnFrame("start");
|
|
386
|
+
send({ type: "start", turn_id: active.id, channel: ctx.channel, thread_id: threadId });
|
|
147
387
|
|
|
148
388
|
// Surface the inspector decision to clients before model_start so the web
|
|
149
389
|
// debug panel / TUI can render "loaded: X" the moment the turn begins.
|
|
@@ -168,7 +408,10 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
168
408
|
projects,
|
|
169
409
|
plugins,
|
|
170
410
|
registries,
|
|
171
|
-
prompt,
|
|
411
|
+
prompt: turnPrompt,
|
|
412
|
+
// Images ride on this turn's user message; every other kind is already
|
|
413
|
+
// named, with its path, in the marker.
|
|
414
|
+
attachments: turnFiles.attachments,
|
|
172
415
|
channel: ctx.channel,
|
|
173
416
|
channelMeta: ctx.channelMeta,
|
|
174
417
|
contextNote: ctx.contextNote,
|
|
@@ -178,31 +421,87 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
178
421
|
...(Number.isFinite(Number(maxTokens)) ? { maxTokens: Number(maxTokens) } : {}),
|
|
179
422
|
...(completionContract ? { completionContract: true } : {}),
|
|
180
423
|
onEvent,
|
|
424
|
+
signal: turnAbort.signal,
|
|
425
|
+
// Token-by-token text. `assistant_text` still closes each segment with
|
|
426
|
+
// the cleaned version, so a client that ignores deltas (apx exec) reads
|
|
427
|
+
// exactly what it read before — it just reads it later.
|
|
428
|
+
onToken: (chunk) => {
|
|
429
|
+
send({ type: "assistant_delta", delta: chunk });
|
|
430
|
+
appendActiveTurn(active.id, chunk);
|
|
431
|
+
turnFrame("delta", { delta: chunk });
|
|
432
|
+
},
|
|
433
|
+
// The thinking, live and on its own channel. Clients that don't render
|
|
434
|
+
// it drop it; the answer never carries a word of it either way.
|
|
435
|
+
onReasoningToken: (chunk) => send({ type: "assistant_reasoning_delta", reasoning: chunk }),
|
|
181
436
|
requestConfirmation,
|
|
182
437
|
skipSkillsHint: inspectorOn,
|
|
183
438
|
});
|
|
184
439
|
projects.rebuild(p.id);
|
|
440
|
+
// Never-silent floor. runAgent already re-prompted a dud turn and gave
|
|
441
|
+
// up; without this the panel renders an empty bubble and the ledger keeps
|
|
442
|
+
// an empty assistant row — which is what the NEXT turn reads back as the
|
|
443
|
+
// answer it gave. A real reply passes through untouched and costs nothing.
|
|
444
|
+
const closing = await floorReplyText({
|
|
445
|
+
globalConfig: config,
|
|
446
|
+
text: saResult.text,
|
|
447
|
+
streamedText: lastSaid,
|
|
448
|
+
trace: saResult.trace,
|
|
449
|
+
});
|
|
450
|
+
if (closing.floored) logFlooredTurn(closing, { trace_id: req.apxTraceId, channel: ctx.channel });
|
|
185
451
|
logWebTurn(ctx.channel, {
|
|
186
|
-
|
|
187
|
-
replyText: saResult.text,
|
|
452
|
+
replyText: closing.text,
|
|
188
453
|
name: saResult.name,
|
|
189
454
|
model: saResult.model,
|
|
190
455
|
usage: saResult.usage,
|
|
456
|
+
trace: saResult.trace,
|
|
457
|
+
project: p,
|
|
458
|
+
inspector: inspectorTrace,
|
|
459
|
+
reasoning,
|
|
460
|
+
timeline,
|
|
191
461
|
});
|
|
462
|
+
const finalResult = {
|
|
463
|
+
text: closing.text,
|
|
464
|
+
usage: saResult.usage,
|
|
465
|
+
// `name` is the agent persona; `model` is the engine that answered
|
|
466
|
+
// (it can differ from the configured one after a routing fallback).
|
|
467
|
+
name: saResult.name,
|
|
468
|
+
model: saResult.model,
|
|
469
|
+
trace: saResult.trace,
|
|
470
|
+
};
|
|
471
|
+
turnFrame("final", { result: finalResult });
|
|
192
472
|
send({
|
|
193
473
|
type: "final",
|
|
194
|
-
result:
|
|
195
|
-
text: saResult.text,
|
|
196
|
-
usage: saResult.usage,
|
|
197
|
-
// `name` is the agent persona; `model` is the engine that answered
|
|
198
|
-
// (it can differ from the configured one after a routing fallback).
|
|
199
|
-
name: saResult.name,
|
|
200
|
-
model: saResult.model,
|
|
201
|
-
trace: saResult.trace,
|
|
202
|
-
},
|
|
474
|
+
result: finalResult,
|
|
203
475
|
});
|
|
476
|
+
clearInterval(keepalive);
|
|
204
477
|
res.end();
|
|
205
478
|
} catch (e) {
|
|
479
|
+
// Interrupted, not broken. Whatever streamed is real work the user saw, so
|
|
480
|
+
// it goes into the ledger the same way a finished turn does — the message
|
|
481
|
+
// that interrupted this one opens the next turn and reads this as its
|
|
482
|
+
// history. Same contract Telegram has: "whatever streamed so far is
|
|
483
|
+
// already sent + logged; the newer message's run continues the thread."
|
|
484
|
+
if (wasAborted(e, turnAbort)) {
|
|
485
|
+
const partial = (active.text || "").trim();
|
|
486
|
+
if (partial || partialTrace.length) {
|
|
487
|
+
logWebTurn(ctx.channel, {
|
|
488
|
+
replyText: partial,
|
|
489
|
+
model: model || null,
|
|
490
|
+
trace: partialTrace,
|
|
491
|
+
project: p,
|
|
492
|
+
inspector: inspectorTrace,
|
|
493
|
+
reasoning,
|
|
494
|
+
timeline,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
clearInterval(keepalive);
|
|
498
|
+
const ev = abortedTurnEvent({ text: partial, trace: partialTrace });
|
|
499
|
+
turnFrame("aborted", { result: ev.result });
|
|
500
|
+
send(ev);
|
|
501
|
+
res.end();
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
clearInterval(keepalive);
|
|
206
505
|
appendSuperAgentErrorTrace(req, e, {
|
|
207
506
|
prompt,
|
|
208
507
|
channel: ctx.channel,
|
|
@@ -210,20 +509,23 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
210
509
|
model,
|
|
211
510
|
stream: true,
|
|
212
511
|
});
|
|
512
|
+
turnFrame("error", { error: e.message });
|
|
213
513
|
send({
|
|
214
514
|
type: "error",
|
|
215
515
|
trace_id: req.apxTraceId,
|
|
216
516
|
error: `${e.message} (trace: ${req.apxTraceId})`,
|
|
217
517
|
});
|
|
218
518
|
res.end();
|
|
519
|
+
} finally {
|
|
520
|
+
endActiveTurn(active.id);
|
|
219
521
|
}
|
|
220
|
-
});
|
|
522
|
+
}));
|
|
221
523
|
|
|
222
524
|
// Project-agnostic one-shot summarize endpoint. Used by `apx session resume
|
|
223
525
|
// <id>` when the session lives outside any registered APX project (e.g. a
|
|
224
526
|
// raw Claude/Codex session). Returns { text } so callers can format the
|
|
225
527
|
// summary however they want.
|
|
226
|
-
api.post("/super-agent/summarize", async (req, res) => {
|
|
528
|
+
api.post("/super-agent/summarize", asyncRoute(async (req, res) => {
|
|
227
529
|
const { prompt, context_note: contextNote = "", model, max_tokens } = req.body || {};
|
|
228
530
|
if (!prompt) return res.status(400).json({ error: "prompt required" });
|
|
229
531
|
try {
|
|
@@ -252,9 +554,9 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
252
554
|
} catch (e) {
|
|
253
555
|
res.status(500).json({ error: e.message });
|
|
254
556
|
}
|
|
255
|
-
});
|
|
557
|
+
}));
|
|
256
558
|
|
|
257
|
-
api.post("/projects/:pid/super-agent/chat", async (req, res) => {
|
|
559
|
+
api.post("/projects/:pid/super-agent/chat", asyncRoute(async (req, res) => {
|
|
258
560
|
const p = project(req, res);
|
|
259
561
|
if (!p) return;
|
|
260
562
|
const { prompt, previousMessages, model, maxIters, maxTokens, completionContract } =
|
|
@@ -262,15 +564,30 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
262
564
|
if (!prompt) return res.status(400).json({ error: "prompt required" });
|
|
263
565
|
const ctx = resolveSuperAgentContext(req, p);
|
|
264
566
|
const inspectorOn = isInspectorEnabled(config);
|
|
567
|
+
let inspectorTrace = null;
|
|
568
|
+
const reasoning = [];
|
|
265
569
|
if (inspectorOn) {
|
|
266
570
|
try {
|
|
267
571
|
const out = await inspectPromptForSkills({ prompt, projectPath: p.path, globalConfig: config });
|
|
572
|
+
inspectorTrace = out.trace;
|
|
268
573
|
if (out.contextNote) {
|
|
269
574
|
ctx.contextNote = [ctx.contextNote, out.contextNote].filter(Boolean).join("\n\n");
|
|
270
575
|
}
|
|
271
576
|
logInspectorDecision(out.trace, { trace_id: req.apxTraceId, channel: ctx.channel });
|
|
272
577
|
} catch { /* inspector failure must not block the turn */ }
|
|
273
578
|
}
|
|
579
|
+
// The message is on the record before the turn starts. This is the endpoint
|
|
580
|
+
// the phone bridge posts to, and its turns are the long ones.
|
|
581
|
+
logInboundTurn(ctx.channel, { prompt, project: p });
|
|
582
|
+
// Nothing is streamed to this caller, but the turn can still produce prose
|
|
583
|
+
// before its closing comes back empty — which is what tells the floor
|
|
584
|
+
// whether the turn worked or did nothing at all.
|
|
585
|
+
let lastSaid = "";
|
|
586
|
+
const logged = wrapOnEventForLog(null, {
|
|
587
|
+
trace_id: req.apxTraceId,
|
|
588
|
+
channel: ctx.channel,
|
|
589
|
+
reasoning,
|
|
590
|
+
});
|
|
274
591
|
try {
|
|
275
592
|
const saResult = await runSuperAgent({
|
|
276
593
|
globalConfig: config,
|
|
@@ -286,22 +603,36 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
286
603
|
...(Number.isFinite(Number(maxIters)) ? { maxIters: Number(maxIters) } : {}),
|
|
287
604
|
...(Number.isFinite(Number(maxTokens)) ? { maxTokens: Number(maxTokens) } : {}),
|
|
288
605
|
...(completionContract ? { completionContract: true } : {}),
|
|
289
|
-
onEvent:
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
606
|
+
onEvent: (ev) => {
|
|
607
|
+
if (ev?.type === "assistant_text" && String(ev.text || "").trim()) {
|
|
608
|
+
lastSaid = String(ev.text).trim();
|
|
609
|
+
}
|
|
610
|
+
return logged(ev);
|
|
611
|
+
},
|
|
293
612
|
skipSkillsHint: inspectorOn,
|
|
294
613
|
});
|
|
295
614
|
projects.rebuild(p.id);
|
|
615
|
+
// Same floor as the streamed route: an empty answer is never what this
|
|
616
|
+
// endpoint returns. `apx exec` and the phone bridge both read `text`.
|
|
617
|
+
const closing = await floorReplyText({
|
|
618
|
+
globalConfig: config,
|
|
619
|
+
text: saResult.text,
|
|
620
|
+
streamedText: lastSaid,
|
|
621
|
+
trace: saResult.trace,
|
|
622
|
+
});
|
|
623
|
+
if (closing.floored) logFlooredTurn(closing, { trace_id: req.apxTraceId, channel: ctx.channel });
|
|
296
624
|
logWebTurn(ctx.channel, {
|
|
297
|
-
|
|
298
|
-
replyText: saResult.text,
|
|
625
|
+
replyText: closing.text,
|
|
299
626
|
name: saResult.name,
|
|
300
627
|
model: saResult.model,
|
|
301
628
|
usage: saResult.usage,
|
|
629
|
+
trace: saResult.trace,
|
|
630
|
+
project: p,
|
|
631
|
+
inspector: inspectorTrace,
|
|
632
|
+
reasoning,
|
|
302
633
|
});
|
|
303
634
|
res.json({
|
|
304
|
-
text:
|
|
635
|
+
text: closing.text,
|
|
305
636
|
usage: saResult.usage,
|
|
306
637
|
name: saResult.name,
|
|
307
638
|
model: saResult.model,
|
|
@@ -317,5 +648,5 @@ export function register(api, { projects, registries, plugins, project, config }
|
|
|
317
648
|
});
|
|
318
649
|
res.status(500).json({ error: e.message, trace_id: req.apxTraceId });
|
|
319
650
|
}
|
|
320
|
-
});
|
|
651
|
+
}));
|
|
321
652
|
}
|