@agentprojectcontext/apx 1.81.0 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import type { ChatKey } from "../../components/chat/ChatList";
|
|
2
|
+
import type { InboxRow } from "../../lib/api/inbox";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The phone surface in the URL.
|
|
6
|
+
*
|
|
7
|
+
* /m → /m/chat
|
|
8
|
+
* /m/chat the chat list
|
|
9
|
+
* /m/chat/:pid/:slug a chat, on whatever it last used
|
|
10
|
+
* /m/chat/:pid/:slug/:session a chat, on one specific session
|
|
11
|
+
* /m/tasks every project's tasks
|
|
12
|
+
* /m/commitments every project's promises
|
|
13
|
+
* /m/team/:pid one project's team
|
|
14
|
+
*
|
|
15
|
+
* `/m` and not `/mobile`, and each surface named after WHAT IT SHOWS rather
|
|
16
|
+
* than what device is holding it. The phone stopped being a single screen the
|
|
17
|
+
* day it grew a tab bar: "/mobile" could only ever mean the one thing, and the
|
|
18
|
+
* second thing had to be `/mobile/tasks` — a path that says the device twice
|
|
19
|
+
* and the subject once.
|
|
20
|
+
*
|
|
21
|
+
* Old links still land: `/mobile/*` redirects here (App.tsx). They are not
|
|
22
|
+
* historical — the Android shell hardcodes `/mobile`, QR codes are printed and
|
|
23
|
+
* scanned, and an installed PWA keeps whatever start_url it was installed with.
|
|
24
|
+
*
|
|
25
|
+
* Navigation used to be `useState`, which meant a reload — or the phone
|
|
26
|
+
* discarding the tab in the background, which it does constantly — dropped you
|
|
27
|
+
* back on the list and lost the thread you were reading. Anything you can be
|
|
28
|
+
* looking at has to be somewhere you can be sent back to.
|
|
29
|
+
*
|
|
30
|
+
* `~` separates a channel from a thread id because it is one of the handful of
|
|
31
|
+
* characters a URL never has to escape (RFC 3986 unreserved), so the path stays
|
|
32
|
+
* readable: /m/chat/0/roby/telegram~2026-08-19.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/** The phone surface's namespace. Every screen below hangs off it. */
|
|
36
|
+
export const MOBILE_ROOT = "/m";
|
|
37
|
+
|
|
38
|
+
/** The three tabs, in the order the bottom bar shows them. */
|
|
39
|
+
export const CHAT_ROOT = `${MOBILE_ROOT}/chat`;
|
|
40
|
+
export const TASKS_ROOT = `${MOBILE_ROOT}/tasks`;
|
|
41
|
+
export const COMMITMENTS_ROOT = `${MOBILE_ROOT}/commitments`;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The pre-`/m` spelling, kept alive by a redirect rather than by a second set
|
|
45
|
+
* of routes — one place to translate, and nothing downstream has to know two
|
|
46
|
+
* shapes. `/mobile` alone is the list, which is now `/m/chat`.
|
|
47
|
+
*/
|
|
48
|
+
export const LEGACY_MOBILE_ROOT = "/mobile";
|
|
49
|
+
|
|
50
|
+
export function fromLegacyMobilePath(pathname: string): string {
|
|
51
|
+
const rest = pathname.slice(LEGACY_MOBILE_ROOT.length).replace(/^\/+/, "");
|
|
52
|
+
return rest ? `${MOBILE_ROOT}/${rest}` : CHAT_ROOT;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The daemon-level super-agent belongs to no project: its inbox row carries
|
|
57
|
+
* `project_id: null`. Left as an empty string that becomes `/m/chat//roby`
|
|
58
|
+
* — a path with an empty segment, which matches no route at all, so opening
|
|
59
|
+
* Roby bounced straight back to the list.
|
|
60
|
+
*
|
|
61
|
+
* `-` and not `0`: zero is a REAL project id here, and a sentinel that collides
|
|
62
|
+
* with live data is a bug waiting for the one user who has that project.
|
|
63
|
+
*/
|
|
64
|
+
const NO_PROJECT = "-";
|
|
65
|
+
|
|
66
|
+
/** The `:pid` segment for a row. */
|
|
67
|
+
export function pidOf(row: Pick<InboxRow, "project_id">): string {
|
|
68
|
+
return row.project_id === null || row.project_id === undefined ? NO_PROJECT : String(row.project_id);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** The project id a `:pid` segment stands for — null for the super-agent. */
|
|
72
|
+
export function projectOf(pid: string): number | string | null {
|
|
73
|
+
return pid === NO_PROJECT ? null : pid;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The session segment for a selection, or null when it is just "the latest". */
|
|
77
|
+
export function sessionParam(key: ChatKey): string | null {
|
|
78
|
+
if (key.kind === "thread") return `${key.channel}~${key.threadId}`;
|
|
79
|
+
if (key.kind === "conv") return key.convId;
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Query string ChatTab writes for a selection (`/p/:pid/chat` and `/inbox`). */
|
|
84
|
+
export function queryForChat(key: ChatKey): URLSearchParams {
|
|
85
|
+
const next = new URLSearchParams();
|
|
86
|
+
if (key.kind === "conv") {
|
|
87
|
+
next.set("agent", key.agentSlug);
|
|
88
|
+
next.set("conv", key.convId);
|
|
89
|
+
} else if (key.kind === "thread") {
|
|
90
|
+
next.set("channel", key.channel);
|
|
91
|
+
next.set("thread", key.threadId);
|
|
92
|
+
} else {
|
|
93
|
+
next.set("agent", key.agentSlug);
|
|
94
|
+
}
|
|
95
|
+
return next;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function chatPath(pid: string, slug: string, key?: ChatKey): string {
|
|
99
|
+
const base = `${CHAT_ROOT}/${encodeURIComponent(pid)}/${encodeURIComponent(slug)}`;
|
|
100
|
+
const session = key ? sessionParam(key) : null;
|
|
101
|
+
return session ? `${base}/${encodeURIComponent(session)}` : base;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function teamPath(pid: string): string {
|
|
105
|
+
return `${MOBILE_ROOT}/team/${encodeURIComponent(pid)}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Where an agent's card / project view lives — the ficha (`AgentDetailScreen`)
|
|
110
|
+
* for a project agent, the workspace chat for the super-agent (it has no project
|
|
111
|
+
* ficha), and the pair thread for an a2a row. Shared so the inbox (self) and the
|
|
112
|
+
* phone (new tab) send you to the same place.
|
|
113
|
+
*/
|
|
114
|
+
export function agentCardUrl(row: InboxRow): string {
|
|
115
|
+
if (row.kind === "super_agent") return "/p/0/chat";
|
|
116
|
+
const pid = row.project_id ?? 0;
|
|
117
|
+
if (row.kind === "a2a" || row.kind === "group") {
|
|
118
|
+
return `/p/${pid}/chat?channel=${row.kind}&thread=${encodeURIComponent(row.conversation_id || "")}`;
|
|
119
|
+
}
|
|
120
|
+
return `/p/${pid}/agents/${encodeURIComponent(row.agent_slug)}`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Where a row opens by default: the super-agent has channel threads, a project
|
|
125
|
+
* agent has conversation files, and either can have neither yet.
|
|
126
|
+
*/
|
|
127
|
+
export function keyFor(row: InboxRow, sessionId?: string, channel?: string): ChatKey {
|
|
128
|
+
// An a2a row is a conversation BETWEEN two agents, addressed as a thread on the
|
|
129
|
+
// "a2a" channel — never one agent's conversation file (its agent_slug is the
|
|
130
|
+
// synthetic "a2a:<pair>", which owns no file). Missing this made the phone open
|
|
131
|
+
// a blank pane with the raw pair id in the header.
|
|
132
|
+
if (row.kind === "a2a" || row.kind === "group") {
|
|
133
|
+
const id = sessionId || row.conversation_id || "";
|
|
134
|
+
return id ? { kind: "thread", channel: row.kind, threadId: id } : { kind: "live", agentSlug: row.agent_slug };
|
|
135
|
+
}
|
|
136
|
+
if (row.kind === "super_agent") {
|
|
137
|
+
const ch = channel || row.channel || "web";
|
|
138
|
+
const id = sessionId || row.conversation_id || "";
|
|
139
|
+
return id ? { kind: "thread", channel: ch, threadId: id } : { kind: "live", agentSlug: row.agent_slug };
|
|
140
|
+
}
|
|
141
|
+
const id = sessionId || row.conversation_id || "";
|
|
142
|
+
return id ? { kind: "conv", agentSlug: row.agent_slug, convId: id } : { kind: "live", agentSlug: row.agent_slug };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Does this URL mean the person is already reading this inbox row?
|
|
147
|
+
*
|
|
148
|
+
* ChatTab addresses a session two ways: query (`?channel=&thread=` or
|
|
149
|
+
* `?agent=&conv=`) on `/p/:pid/chat` and `/inbox`, and a path on the phone
|
|
150
|
+
* (`/m/chat/:pid/:slug/:session`). Matching only `?agent=` missed groups
|
|
151
|
+
* and the inbox — both write `channel`+`thread` and have no agent param.
|
|
152
|
+
*/
|
|
153
|
+
export function urlLooksAt(href: string, row: InboxRow): boolean {
|
|
154
|
+
const url = new URL(href, "http://localhost");
|
|
155
|
+
const key = keyFor(row);
|
|
156
|
+
|
|
157
|
+
// Both spellings: a notification raised before this rename still carries
|
|
158
|
+
// `/mobile/chat/...`, and "am I already reading this?" must not answer no
|
|
159
|
+
// just because the tab has not been redirected yet.
|
|
160
|
+
const mobile = url.pathname.match(/^\/(?:m|mobile)\/chat\/[^/]+\/([^/]+)(?:\/([^/]+))?/);
|
|
161
|
+
if (mobile) {
|
|
162
|
+
if (decodeURIComponent(mobile[1]) !== row.agent_slug) return false;
|
|
163
|
+
if (!mobile[2]) return true;
|
|
164
|
+
return decodeURIComponent(mobile[2]) === (sessionParam(key) ?? "");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const want = queryForChat(key);
|
|
168
|
+
if (want.has("thread")) {
|
|
169
|
+
return url.searchParams.get("channel") === want.get("channel")
|
|
170
|
+
&& url.searchParams.get("thread") === want.get("thread");
|
|
171
|
+
}
|
|
172
|
+
if (want.has("conv")) {
|
|
173
|
+
return url.searchParams.get("agent") === want.get("agent")
|
|
174
|
+
&& url.searchParams.get("conv") === want.get("conv");
|
|
175
|
+
}
|
|
176
|
+
if (want.has("agent")) return url.searchParams.get("agent") === want.get("agent");
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The selection a URL asks for, falling back to the row's own default. */
|
|
181
|
+
export function selectionFromParam(param: string | undefined, row: InboxRow): ChatKey {
|
|
182
|
+
// An a2a row has exactly one thread; there are no alternate sessions to pick,
|
|
183
|
+
// so the pair thread is the selection regardless of any URL session segment.
|
|
184
|
+
if (row.kind === "a2a" || row.kind === "group") return keyFor(row);
|
|
185
|
+
if (!param) return keyFor(row);
|
|
186
|
+
const raw = decodeURIComponent(param);
|
|
187
|
+
if (row.kind === "super_agent") {
|
|
188
|
+
const cut = raw.indexOf("~");
|
|
189
|
+
// A thread with no channel in it is a URL from somewhere else (or hand
|
|
190
|
+
// typed); fall back rather than building a selection that loads nothing.
|
|
191
|
+
if (cut <= 0) return keyFor(row);
|
|
192
|
+
return { kind: "thread", channel: raw.slice(0, cut), threadId: raw.slice(cut + 1) };
|
|
193
|
+
}
|
|
194
|
+
return { kind: "conv", agentSlug: row.agent_slug, convId: raw };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* A row for an agent the inbox does not list.
|
|
199
|
+
*
|
|
200
|
+
* Deep links outlive the inbox: it only carries agents that have been talked
|
|
201
|
+
* to, and it is filtered and paged. Landing on a chat that is not in the list
|
|
202
|
+
* should open the chat with the slug as its name, not bounce to the list —
|
|
203
|
+
* being sent somewhere else is worse than a missing avatar.
|
|
204
|
+
*/
|
|
205
|
+
export function placeholderRow(pid: string, slug: string, known: InboxRow[]): InboxRow {
|
|
206
|
+
// Whether this is the super-agent is decided by the inbox's own answer for
|
|
207
|
+
// that slug when it has one, so this file never hardcodes its spelling.
|
|
208
|
+
const sameSlug = known.find((r) => r.agent_slug === slug);
|
|
209
|
+
const isGroup = slug.startsWith("group:");
|
|
210
|
+
const isA2a = slug.startsWith("a2a:");
|
|
211
|
+
const kind = sameSlug?.kind ?? (isGroup ? "group" : isA2a ? "a2a" : "agent");
|
|
212
|
+
const conversation_id = isGroup
|
|
213
|
+
? slug.slice("group:".length)
|
|
214
|
+
: isA2a
|
|
215
|
+
? slug.slice("a2a:".length)
|
|
216
|
+
: null;
|
|
217
|
+
return {
|
|
218
|
+
project_id: projectOf(pid),
|
|
219
|
+
project_name: null,
|
|
220
|
+
project_path: null,
|
|
221
|
+
agent_slug: slug,
|
|
222
|
+
agent_name: sameSlug?.agent_name ?? null,
|
|
223
|
+
agent_emoji: sameSlug?.agent_emoji ?? null,
|
|
224
|
+
agent_icon: sameSlug?.agent_icon ?? null,
|
|
225
|
+
kind,
|
|
226
|
+
pinned: false,
|
|
227
|
+
conversation_id: sameSlug?.conversation_id ?? conversation_id,
|
|
228
|
+
channel: kind === "group" || kind === "a2a" ? kind : null,
|
|
229
|
+
messages: 0,
|
|
230
|
+
preview: null,
|
|
231
|
+
last_activity_at: "",
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** The row a /m/chat/:pid/:slug URL points at. */
|
|
236
|
+
export function findRow(rows: InboxRow[], pid: string, slug: string): InboxRow {
|
|
237
|
+
const hit = rows.find((r) => pidOf(r) === pid && r.agent_slug === slug);
|
|
238
|
+
return hit || placeholderRow(pid, slug, rows);
|
|
239
|
+
}
|
|
@@ -5,30 +5,33 @@ import { Bot, FolderTree, MessageSquare, PanelLeft, PanelRight, Terminal, X } fr
|
|
|
5
5
|
import { Group as PanelGroup, Panel, Separator as PanelResizeHandle } from "react-resizable-panels";
|
|
6
6
|
import { Code, Projects, Agents } from "../../lib/api";
|
|
7
7
|
import { Artifacts } from "../../lib/api/artifacts";
|
|
8
|
-
import {
|
|
8
|
+
import { ProjectFiles } from "../../lib/api/projectFiles";
|
|
9
9
|
import { Empty, Loading } from "../../components/ui";
|
|
10
10
|
import { Tip } from "../../components/ui/tip";
|
|
11
|
-
import { UiSelect } from "../../components/UiSelect";
|
|
12
11
|
import { useSetPageLabel, useSetPageActions } from "../../hooks/useNavCollapseCtx";
|
|
13
12
|
import { MessageList } from "../../components/chat/MessageList";
|
|
14
|
-
import { CodeProjectPicker } from "../../components/code/CodeProjectPicker";
|
|
13
|
+
import { CodeProjectPicker, ALL_PROJECTS } from "../../components/code/CodeProjectPicker";
|
|
15
14
|
import { CodeSessionList } from "../../components/code/CodeSessionList";
|
|
15
|
+
import {
|
|
16
|
+
NewCodeSessionDialog,
|
|
17
|
+
SUPER_AGENT_VALUE,
|
|
18
|
+
type NewSessionValues,
|
|
19
|
+
} from "../../components/code/NewCodeSessionDialog";
|
|
16
20
|
import { CodeComposer } from "../../components/code/CodeComposer";
|
|
17
21
|
import { CodeSidePanel } from "../../components/code/CodeSidePanel";
|
|
18
22
|
import { CodeFileTree } from "../../components/code/CodeFileTree";
|
|
19
23
|
import { CodeFileViewer } from "../../components/code/CodeFileViewer";
|
|
20
24
|
import { CodeTerminal } from "../../components/code/CodeTerminal";
|
|
21
25
|
import { InlineAskPanel, pendingAskQuestions } from "../../components/chat/InlineAskPanel";
|
|
26
|
+
import { ConfirmDialog } from "../../components/common/ConfirmDialog";
|
|
22
27
|
import { useToast } from "../../components/Toast";
|
|
23
28
|
import { t } from "../../i18n";
|
|
24
29
|
import { applyStreamEvent, textOf, type ChatMsg } from "../../hooks/useChat";
|
|
25
|
-
import type { CodeMode, CodeStreamEvent, CodeTurn } from "../../lib/api/code";
|
|
30
|
+
import type { CodeMode, CodeSessionRow, CodeStreamEvent, CodeTurn } from "../../lib/api/code";
|
|
26
31
|
|
|
27
32
|
// Suppress unused import warning for textOf (kept for consumers)
|
|
28
33
|
void textOf;
|
|
29
34
|
|
|
30
|
-
const SUPER_AGENT_VALUE = "super-agent";
|
|
31
|
-
|
|
32
35
|
// Hit area is wider than the visible line so the handle is comfortable to
|
|
33
36
|
// grab — the inner ::before line is what the user sees.
|
|
34
37
|
function ResizeHandle() {
|
|
@@ -53,9 +56,16 @@ export function CodeScreen() {
|
|
|
53
56
|
const projects = useSWR("/api/projects", () => Projects.list());
|
|
54
57
|
const projectList = useMemo(() => projects.data || [], [projects.data]);
|
|
55
58
|
|
|
59
|
+
// Two different projects live here, and conflating them was the bug.
|
|
60
|
+
// filterPid — what the session LIST shows. "" = every project (the default).
|
|
61
|
+
// pid — the project the OPEN session belongs to. Everything else in
|
|
62
|
+
// the module (files, terminal, artifacts, diff, agents) is
|
|
63
|
+
// scoped to this one, and it follows the session, not the filter.
|
|
64
|
+
const [filterPid, setFilterPid] = useState<string>(ALL_PROJECTS);
|
|
56
65
|
const [pid, setPid] = useState<string>("");
|
|
57
66
|
const [sid, setSid] = useState<string | null>(null);
|
|
58
|
-
const [
|
|
67
|
+
const [newOpen, setNewOpen] = useState(false);
|
|
68
|
+
const [creating, setCreating] = useState(false);
|
|
59
69
|
const [msgs, setMsgs] = useState<ChatMsg[]>([]);
|
|
60
70
|
const [draft, setDraft] = useState("");
|
|
61
71
|
const [busy, setBusy] = useState(false);
|
|
@@ -64,6 +74,9 @@ export function CodeScreen() {
|
|
|
64
74
|
const [termOpen, setTermOpen] = useState(false);
|
|
65
75
|
const [termInitCmd, setTermInitCmd] = useState("");
|
|
66
76
|
const [worktreeOpen, setWorktreeOpen] = useState(false);
|
|
77
|
+
// Session pending delete confirmation — id AND project, since the list can
|
|
78
|
+
// span projects and an id alone does not address a session.
|
|
79
|
+
const [confirmDelete, setConfirmDelete] = useState<{ id: string; pid: string } | null>(null);
|
|
67
80
|
const abortRef = useRef<AbortController | null>(null);
|
|
68
81
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
69
82
|
const deepLinkDone = useRef(false);
|
|
@@ -85,14 +98,25 @@ export function CodeScreen() {
|
|
|
85
98
|
setTermInitCmd(cmd);
|
|
86
99
|
}, []);
|
|
87
100
|
|
|
88
|
-
// Default to the first registered project once the list loads
|
|
101
|
+
// Default to the first registered project once the list loads — only as the
|
|
102
|
+
// fallback scope for a screen with no session open yet.
|
|
89
103
|
useEffect(() => {
|
|
90
104
|
if (!pid && projectList.length) setPid(String(projectList[0].id));
|
|
91
105
|
}, [pid, projectList]);
|
|
92
106
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
107
|
+
// The session list. Unfiltered by default: a session started by
|
|
108
|
+
// `apx exec --code` belongs to whatever project that cwd resolved to, and
|
|
109
|
+
// scoping the list to the project in view made those invisible.
|
|
110
|
+
const sessions = useSWR(
|
|
111
|
+
filterPid ? ["code-sessions", filterPid] : ["code-sessions", "all"],
|
|
112
|
+
() => (filterPid ? Code.sessions.list(filterPid) : Code.sessions.listAll()),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// Rows carry their own pid only in the cross-project list; when the list is
|
|
116
|
+
// already scoped, the filter IS the pid.
|
|
117
|
+
const rowPid = useCallback(
|
|
118
|
+
(row: CodeSessionRow) => String(row.pid ?? filterPid ?? pid),
|
|
119
|
+
[filterPid, pid],
|
|
96
120
|
);
|
|
97
121
|
|
|
98
122
|
// Agents for the active project.
|
|
@@ -108,17 +132,16 @@ export function CodeScreen() {
|
|
|
108
132
|
Code.changes(pid, sid!),
|
|
109
133
|
);
|
|
110
134
|
|
|
111
|
-
// Auto-select the newest session when the list loads
|
|
135
|
+
// Auto-select the newest session when the list loads or the filter changes.
|
|
136
|
+
// Selecting also moves `pid`: the row's project is what makes it openable.
|
|
112
137
|
useEffect(() => {
|
|
113
138
|
const list = sessions.data || [];
|
|
114
|
-
if (!
|
|
115
|
-
if (sid && list.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
if (session.data) setAgentSlug(session.data.agentSlug || SUPER_AGENT_VALUE);
|
|
121
|
-
}, [session.data]);
|
|
139
|
+
if (!list.length) return;
|
|
140
|
+
if (sid && list.some((s) => s.id === sid)) return;
|
|
141
|
+
const next = list[0];
|
|
142
|
+
setSid(next.id);
|
|
143
|
+
setPid(rowPid(next));
|
|
144
|
+
}, [sessions.data, sid, rowPid]);
|
|
122
145
|
|
|
123
146
|
// Hydrate the message list whenever the active session's transcript loads.
|
|
124
147
|
// (Not while streaming — we own the array then.)
|
|
@@ -135,52 +158,71 @@ export function CodeScreen() {
|
|
|
135
158
|
const mode: CodeMode = active?.mode === "plan" ? "plan" : "build";
|
|
136
159
|
const model = active?.model || "";
|
|
137
160
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
161
|
+
// Narrowing the LIST. It deliberately does not touch the open session's
|
|
162
|
+
// project — the auto-select effect moves to whatever the new list holds.
|
|
163
|
+
const onFilterProject = (next: string) => {
|
|
164
|
+
if (next === filterPid || busy) return;
|
|
165
|
+
setFilterPid(next);
|
|
141
166
|
setSid(null);
|
|
142
167
|
setMsgs([]);
|
|
143
168
|
};
|
|
144
169
|
|
|
145
|
-
const onSelectSession = (
|
|
146
|
-
if (busy || id === sid) return;
|
|
147
|
-
|
|
170
|
+
const onSelectSession = (row: CodeSessionRow) => {
|
|
171
|
+
if (busy || row.id === sid) return;
|
|
172
|
+
setPid(rowPid(row));
|
|
173
|
+
setSid(row.id);
|
|
148
174
|
setMsgs([]);
|
|
149
175
|
};
|
|
150
176
|
|
|
151
|
-
const onCreateSession = async () => {
|
|
152
|
-
if (
|
|
177
|
+
const onCreateSession = async (values: NewSessionValues) => {
|
|
178
|
+
if (busy) return;
|
|
179
|
+
setCreating(true);
|
|
153
180
|
try {
|
|
154
|
-
const created = await Code.sessions.create(pid, {
|
|
155
|
-
title:
|
|
156
|
-
agentSlug: agentSlug
|
|
181
|
+
const created = await Code.sessions.create(values.pid, {
|
|
182
|
+
title: values.title,
|
|
183
|
+
agentSlug: values.agentSlug,
|
|
184
|
+
mode: values.mode,
|
|
157
185
|
});
|
|
158
|
-
|
|
186
|
+
// The new session may live outside the current filter — show it rather
|
|
187
|
+
// than creating something the list then hides.
|
|
188
|
+
if (filterPid && filterPid !== values.pid) setFilterPid(values.pid);
|
|
189
|
+
setPid(values.pid);
|
|
159
190
|
setSid(created.id);
|
|
160
191
|
setMsgs([]);
|
|
192
|
+
setNewOpen(false);
|
|
193
|
+
await sessions.mutate();
|
|
161
194
|
} catch (e) {
|
|
162
195
|
toast.error((e as Error).message);
|
|
196
|
+
} finally {
|
|
197
|
+
setCreating(false);
|
|
163
198
|
}
|
|
164
199
|
};
|
|
165
200
|
|
|
166
|
-
const onRenameSession = async (
|
|
201
|
+
const onRenameSession = async (row: CodeSessionRow, current: string) => {
|
|
167
202
|
const title = window.prompt(t("code_module.rename"), current);
|
|
168
203
|
if (!title || title === current) return;
|
|
169
204
|
try {
|
|
170
|
-
await Code.sessions.update(
|
|
205
|
+
await Code.sessions.update(rowPid(row), row.id, { title });
|
|
171
206
|
await sessions.mutate();
|
|
172
|
-
if (id === sid) await session.mutate();
|
|
207
|
+
if (row.id === sid) await session.mutate();
|
|
173
208
|
} catch (e) {
|
|
174
209
|
toast.error((e as Error).message);
|
|
175
210
|
}
|
|
176
211
|
};
|
|
177
212
|
|
|
178
|
-
const onDeleteSession =
|
|
213
|
+
const onDeleteSession = (row: CodeSessionRow) => {
|
|
179
214
|
if (busy) return;
|
|
180
|
-
|
|
215
|
+
// Keep the row's project: deleting by the project in view would 404 (or,
|
|
216
|
+
// worse, hit a same-id session elsewhere).
|
|
217
|
+
setConfirmDelete({ id: row.id, pid: rowPid(row) });
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const doDeleteSession = async () => {
|
|
221
|
+
const target = confirmDelete;
|
|
222
|
+
if (!target) return;
|
|
181
223
|
try {
|
|
182
|
-
await Code.sessions.remove(pid, id);
|
|
183
|
-
if (id === sid) {
|
|
224
|
+
await Code.sessions.remove(target.pid, target.id);
|
|
225
|
+
if (target.id === sid) {
|
|
184
226
|
setSid(null);
|
|
185
227
|
setMsgs([]);
|
|
186
228
|
}
|
|
@@ -190,9 +232,12 @@ export function CodeScreen() {
|
|
|
190
232
|
}
|
|
191
233
|
};
|
|
192
234
|
|
|
193
|
-
//
|
|
235
|
+
// Re-point THIS session at another agent. The choice is made when the session
|
|
236
|
+
// is created (see NewCodeSessionDialog); this is the correction, and it lives
|
|
237
|
+
// in the session's own properties panel so it cannot be mistaken for a global
|
|
238
|
+
// "who am I talking to" switch — which is exactly how the old rail dropdown
|
|
239
|
+
// read.
|
|
194
240
|
const onAgentChange = async (slug: string) => {
|
|
195
|
-
setAgentSlug(slug);
|
|
196
241
|
if (!sid) return;
|
|
197
242
|
try {
|
|
198
243
|
await Code.sessions.update(pid, sid, {
|
|
@@ -204,6 +249,7 @@ export function CodeScreen() {
|
|
|
204
249
|
}
|
|
205
250
|
};
|
|
206
251
|
|
|
252
|
+
// Persist mode / model changes to the session (PATCH) + keep SWR in sync.
|
|
207
253
|
const patchSession = useCallback(
|
|
208
254
|
async (patch: { mode?: CodeMode; model?: string | null }) => {
|
|
209
255
|
if (!sid) return;
|
|
@@ -292,14 +338,14 @@ export function CodeScreen() {
|
|
|
292
338
|
if (prev.some((f) => f.path === path)) return prev; // already open
|
|
293
339
|
return [...prev, { path, content: "", loading: true }];
|
|
294
340
|
});
|
|
295
|
-
// Fetch content
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
cmd: `cat "${path}"`,
|
|
299
|
-
project: pid,
|
|
300
|
-
})
|
|
341
|
+
// Fetch content through the sandboxed project-files API — the path is
|
|
342
|
+
// user-controlled, so it must never reach a shell.
|
|
343
|
+
ProjectFiles.read(pid, path)
|
|
301
344
|
.then((r) => {
|
|
302
|
-
const content =
|
|
345
|
+
const content =
|
|
346
|
+
r.encoding === "utf8" && typeof r.content === "string"
|
|
347
|
+
? r.content || t("modules_ui.code_file_empty")
|
|
348
|
+
: t(r.too_large ? "files.too_large" : "files.no_preview");
|
|
303
349
|
setOpenFiles((prev) =>
|
|
304
350
|
prev.map((f) => (f.path === path ? { ...f, content, loading: false } : f)),
|
|
305
351
|
);
|
|
@@ -349,7 +395,7 @@ export function CodeScreen() {
|
|
|
349
395
|
[pid],
|
|
350
396
|
);
|
|
351
397
|
|
|
352
|
-
// Deep-link from the project Artifacts tab (/
|
|
398
|
+
// Deep-link from the project Artifacts tab (/code?pid=..&cmd=.. or &edit=..).
|
|
353
399
|
// Select the requested project, then prefill the terminal with the artifact
|
|
354
400
|
// command (so args like a URL can be typed) or open the file for editing.
|
|
355
401
|
useEffect(() => {
|
|
@@ -389,13 +435,15 @@ export function CodeScreen() {
|
|
|
389
435
|
|
|
390
436
|
const hasProjects = !projects.isLoading && projectList.length > 0;
|
|
391
437
|
|
|
438
|
+
// Roster of the OPEN session's project — the Context panel edits this
|
|
439
|
+
// session, so a slug from another project would be dropped on save.
|
|
392
440
|
const agentOptions = useMemo(() => {
|
|
393
441
|
const base = [{ value: SUPER_AGENT_VALUE, label: t("modules_ui.code_super_agent"), icon: Bot, description: t("modules_ui.code_super_agent_desc") }];
|
|
394
442
|
const project = (agentsData.data || []).map((a) => ({
|
|
395
443
|
value: a.slug,
|
|
396
|
-
label: a.slug,
|
|
444
|
+
label: a.name || a.slug,
|
|
397
445
|
icon: Bot,
|
|
398
|
-
description: a.description || a.role ||
|
|
446
|
+
description: a.description || a.role || a.slug,
|
|
399
447
|
}));
|
|
400
448
|
return [...base, ...project];
|
|
401
449
|
}, [agentsData.data]);
|
|
@@ -408,6 +456,9 @@ export function CodeScreen() {
|
|
|
408
456
|
const activeProject = useMemo(() => projectList.find((p) => String(p.id) === pid), [projectList, pid]);
|
|
409
457
|
useSetPageLabel(activeTitle);
|
|
410
458
|
|
|
459
|
+
// The list spans projects unless narrowed, so rows must say which one.
|
|
460
|
+
const showProject = !filterPid;
|
|
461
|
+
|
|
411
462
|
// Detect unanswered ask_questions in the last assistant turn. Local "dismissed"
|
|
412
463
|
// ref keys off the turn id so the panel re-appears for a fresh batch.
|
|
413
464
|
const [dismissedKey, setDismissedKey] = useState<string | null>(null);
|
|
@@ -469,7 +520,12 @@ export function CodeScreen() {
|
|
|
469
520
|
{/* TOP: horizontal split across [left | tree | main | right] */}
|
|
470
521
|
<Panel id="top" defaultSize={termOpen ? "55%" : "100%"} minSize="20%">
|
|
471
522
|
<PanelGroup orientation="horizontal" id="code-layout" className="h-full">
|
|
472
|
-
{/* Left panel:
|
|
523
|
+
{/* Left panel: project FILTER over the session list.
|
|
524
|
+
The agent selector that used to sit at the bottom of this rail
|
|
525
|
+
is gone: it read as "who am I talking to" while silently
|
|
526
|
+
re-pointing whichever session was open. It now lives where the
|
|
527
|
+
choice is actually made (the New session dialog) and where it
|
|
528
|
+
is corrected (the session's Context panel). */}
|
|
473
529
|
{leftOpen && (
|
|
474
530
|
<>
|
|
475
531
|
<Panel id="left" defaultSize="14%" minSize="8%">
|
|
@@ -477,8 +533,8 @@ export function CodeScreen() {
|
|
|
477
533
|
<div className="shrink-0 border-b border-border p-2">
|
|
478
534
|
<CodeProjectPicker
|
|
479
535
|
projects={projectList}
|
|
480
|
-
value={
|
|
481
|
-
onChange={
|
|
536
|
+
value={filterPid}
|
|
537
|
+
onChange={onFilterProject}
|
|
482
538
|
disabled={busy}
|
|
483
539
|
/>
|
|
484
540
|
</div>
|
|
@@ -487,21 +543,14 @@ export function CodeScreen() {
|
|
|
487
543
|
sessions={sessions.data || []}
|
|
488
544
|
activeId={sid}
|
|
489
545
|
busy={busy}
|
|
546
|
+
showProject={showProject}
|
|
547
|
+
filtered={!!filterPid}
|
|
490
548
|
onSelect={onSelectSession}
|
|
491
|
-
onCreate={
|
|
549
|
+
onCreate={() => setNewOpen(true)}
|
|
492
550
|
onRename={onRenameSession}
|
|
493
551
|
onDelete={onDeleteSession}
|
|
494
552
|
/>
|
|
495
553
|
</div>
|
|
496
|
-
<div className="shrink-0 border-t border-border p-2">
|
|
497
|
-
<UiSelect
|
|
498
|
-
value={agentSlug}
|
|
499
|
-
onChange={onAgentChange}
|
|
500
|
-
options={agentOptions}
|
|
501
|
-
disabled={busy}
|
|
502
|
-
showIcon={true}
|
|
503
|
-
/>
|
|
504
|
-
</div>
|
|
505
554
|
</aside>
|
|
506
555
|
</Panel>
|
|
507
556
|
<ResizeHandle />
|
|
@@ -655,9 +704,13 @@ export function CodeScreen() {
|
|
|
655
704
|
createdAt: session.data.createdAt,
|
|
656
705
|
updatedAt: session.data.updatedAt,
|
|
657
706
|
agentSlug: session.data.agentSlug ?? null,
|
|
707
|
+
projectName: activeProject?.name ?? null,
|
|
658
708
|
}
|
|
659
709
|
: null
|
|
660
710
|
}
|
|
711
|
+
agentOptions={agentOptions}
|
|
712
|
+
onAgentChange={onAgentChange}
|
|
713
|
+
busy={busy}
|
|
661
714
|
onRunInTerminal={runInTerminal}
|
|
662
715
|
onEditArtifact={openArtifact}
|
|
663
716
|
/>
|
|
@@ -679,6 +732,24 @@ export function CodeScreen() {
|
|
|
679
732
|
)}
|
|
680
733
|
</PanelGroup>
|
|
681
734
|
)}
|
|
735
|
+
|
|
736
|
+
<NewCodeSessionDialog
|
|
737
|
+
open={newOpen}
|
|
738
|
+
projects={projectList}
|
|
739
|
+
defaultPid={pid || String(projectList[0]?.id ?? "")}
|
|
740
|
+
busy={creating}
|
|
741
|
+
onClose={() => setNewOpen(false)}
|
|
742
|
+
onCreate={(values) => void onCreateSession(values)}
|
|
743
|
+
/>
|
|
744
|
+
|
|
745
|
+
<ConfirmDialog
|
|
746
|
+
open={!!confirmDelete}
|
|
747
|
+
onClose={() => setConfirmDelete(null)}
|
|
748
|
+
onConfirm={doDeleteSession}
|
|
749
|
+
title={t("code_module.delete_confirm")}
|
|
750
|
+
confirmLabel={t("common.delete")}
|
|
751
|
+
testId="code-delete-session-confirm"
|
|
752
|
+
/>
|
|
682
753
|
</div>
|
|
683
754
|
);
|
|
684
755
|
}
|
|
@@ -31,7 +31,6 @@ export function DeckScreen() {
|
|
|
31
31
|
// release. The original implementation is kept intact, just unreachable.
|
|
32
32
|
const handleToggle = async (widgetId: string, enabled: boolean) => {
|
|
33
33
|
return; // no-op while Deck is pre-release — see note above.
|
|
34
|
-
// eslint-disable-next-line no-unreachable
|
|
35
34
|
try {
|
|
36
35
|
await Deck.setWidget(widgetId, { enabled });
|
|
37
36
|
// Optimistically update local data so the switch flips immediately.
|