@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
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import
|
|
3
|
-
import { findApfRoot, readAgents, readVaultAgents, readVaultAgent, VAULT_DIR, SLUG_RE } from "#core/apc/parser.js";
|
|
2
|
+
import { findApfRoot, readAgents, readVaultAgents, readVaultAgent, vaultAgentFile, VAULT_DIR, SLUG_RE } from "#core/apc/parser.js";
|
|
4
3
|
import { apcAgentFile } from "#core/apc/paths.js";
|
|
5
4
|
import { writeAgentFile, writeVaultAgentFile, removeVaultAgent, restoreVaultAgent, addImportedAgent, ensureAgentDir } from "#core/apc/scaffold.js";
|
|
6
5
|
import { ensureAgentRuntimeDir, agentMemoryPath } from "#core/agent/memory.js";
|
|
6
|
+
import {
|
|
7
|
+
AGENT_TYPE_VALUES, BLOB_KEYS, isBlobKey, normalizeAgentType, pickBlob,
|
|
8
|
+
} from "#core/apc/agent-identity.js";
|
|
9
|
+
import { readOrganization, resolveAreaSlug } from "#core/stores/organization.js";
|
|
7
10
|
import { http } from "../http.js";
|
|
8
|
-
import {
|
|
11
|
+
import { readStdinSync } from "../stdin.js";
|
|
12
|
+
import { resolveProjectId, resolveProjectRoot } from "./project.js";
|
|
9
13
|
|
|
10
14
|
// ── ANSI ──────────────────────────────────────────────────────────────────────
|
|
11
15
|
const c = { reset:"\x1b[0m", bold:"\x1b[1m", dim:"\x1b[2m", cyan:"\x1b[36m", green:"\x1b[32m", yellow:"\x1b[33m", gray:"\x1b[90m" };
|
|
@@ -15,10 +19,81 @@ const cyan = (s) => `${c.cyan}${s}${c.reset}`;
|
|
|
15
19
|
const gray = (s) => `${c.gray}${s}${c.reset}`;
|
|
16
20
|
const tag = (s) => `${c.yellow}${s}${c.reset}`;
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return
|
|
22
|
+
// The project these subcommands read and write: `--project <name|id|path>`
|
|
23
|
+
// when given, otherwise the one cwd sits inside.
|
|
24
|
+
function resolveRoot(args) {
|
|
25
|
+
return resolveProjectRoot(args?.flags?.project);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// For the two commands that only WANT a project if there is one (they fall back
|
|
29
|
+
// to the vault). Honours --project, returns null instead of throwing.
|
|
30
|
+
async function resolveRootOptional(args) {
|
|
31
|
+
if (args?.flags?.project) return resolveRoot(args);
|
|
32
|
+
return findApfRoot();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function flagValue(flags, ...names) {
|
|
36
|
+
for (const n of names) {
|
|
37
|
+
const v = flags?.[n];
|
|
38
|
+
if (v !== undefined && v !== true && v !== "") return String(v);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The agent's system prompt — everything after the frontmatter in
|
|
45
|
+
* `.apc/agents/<slug>.md`, injected by buildAgentSystem() as
|
|
46
|
+
* "# Custom instructions".
|
|
47
|
+
*
|
|
48
|
+
* WHY THIS EXISTS. `apx agent add` used to write frontmatter only: there was no
|
|
49
|
+
* flag for the body and `writeAgentFile`'s 4th argument was never passed. The
|
|
50
|
+
* command exited 0, so an agent created from the CLI (or by the super-agent,
|
|
51
|
+
* which follows the apx-agent skill) silently ran on three metadata fields with
|
|
52
|
+
* no instructions at all — while the daemon API and the web UI have always been
|
|
53
|
+
* able to write it via `system`. This closes that gap.
|
|
54
|
+
*
|
|
55
|
+
* Three ways in, because a system prompt is many lines and paragraphs:
|
|
56
|
+
* --prompt "text" inline, for one-liners
|
|
57
|
+
* --prompt-file <path> read from a file
|
|
58
|
+
* --prompt - read from stdin (heredoc / pipe) — the practical one
|
|
59
|
+
*/
|
|
60
|
+
function readPromptFlag(flags) {
|
|
61
|
+
const file = flagValue(flags, "prompt-file", "system-file");
|
|
62
|
+
if (file) {
|
|
63
|
+
if (!fs.existsSync(file)) throw new Error(`--prompt-file: no such file "${file}"`);
|
|
64
|
+
return fs.readFileSync(file, "utf8").trim();
|
|
65
|
+
}
|
|
66
|
+
const inline = flagValue(flags, "prompt", "system");
|
|
67
|
+
if (inline === "-") return readStdinSync().trim();
|
|
68
|
+
if (inline) return inline;
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function readTypeFlag(flags) {
|
|
73
|
+
const raw = flagValue(flags, "type");
|
|
74
|
+
if (!raw) return null;
|
|
75
|
+
const type = normalizeAgentType(raw);
|
|
76
|
+
if (!type) {
|
|
77
|
+
throw new Error(`invalid --type "${raw}" — one of: ${AGENT_TYPE_VALUES.join(", ")}`);
|
|
78
|
+
}
|
|
79
|
+
return type;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The agent's avatar: a blob preset key. `--icon <key>` pins one, otherwise one
|
|
84
|
+
* is drawn from the presets this project isn't using yet — an agent with no
|
|
85
|
+
* `Icon` renders as a grey lettered disc in every surface, which is what every
|
|
86
|
+
* CLI- and MCP-created agent used to get.
|
|
87
|
+
*/
|
|
88
|
+
function resolveIconFlag(flags, roster) {
|
|
89
|
+
const raw = flagValue(flags, "icon", "avatar", "blob");
|
|
90
|
+
if (raw) {
|
|
91
|
+
if (!isBlobKey(raw)) {
|
|
92
|
+
throw new Error(`invalid --icon "${raw}" — one of: ${BLOB_KEYS.join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
return raw;
|
|
95
|
+
}
|
|
96
|
+
return pickBlob({ taken: roster.map((a) => a.fields?.Icon).filter(Boolean) });
|
|
22
97
|
}
|
|
23
98
|
|
|
24
99
|
async function nudgeDaemon(root) {
|
|
@@ -35,7 +110,7 @@ export async function cmdAgentAdd(args) {
|
|
|
35
110
|
if (!slug) throw new Error("apx agent add: missing <slug>");
|
|
36
111
|
if (!SLUG_RE.test(slug)) throw new Error(`invalid slug "${slug}"`);
|
|
37
112
|
|
|
38
|
-
const root =
|
|
113
|
+
const root = await resolveRoot(args);
|
|
39
114
|
const existing = readAgents(root);
|
|
40
115
|
if (existing.some((a) => a.slug === slug)) {
|
|
41
116
|
throw new Error(`agent "${slug}" already exists`);
|
|
@@ -47,10 +122,34 @@ export async function cmdAgentAdd(args) {
|
|
|
47
122
|
if (f.model && f.model !== true) fields.Model = f.model;
|
|
48
123
|
if (f.language && f.language !== true) fields.Language = f.language;
|
|
49
124
|
if (f.description && f.description !== true) fields.Description = f.description;
|
|
125
|
+
if (f.area && f.area !== true) {
|
|
126
|
+
const area = resolveAreaSlug(String(f.area), readOrganization(root));
|
|
127
|
+
if (area) fields.Area = area;
|
|
128
|
+
}
|
|
129
|
+
if (f.parent && f.parent !== true) fields.Parent = String(f.parent);
|
|
50
130
|
if (f.skills && f.skills !== true) fields.Skills = String(f.skills).split(",").map((s) => s.trim()).filter(Boolean);
|
|
51
|
-
if (f.tools && f.tools !== true) fields.Tools = String(f.tools).split(",").map((s) => s.trim()).filter(Boolean);
|
|
52
131
|
|
|
53
|
-
|
|
132
|
+
const type = readTypeFlag(f);
|
|
133
|
+
if (type) {
|
|
134
|
+
fields.Type = type;
|
|
135
|
+
// An orchestrator is a master; the daemon and the web already tie the two
|
|
136
|
+
// together on create, so the CLI can't be the one that disagrees.
|
|
137
|
+
if (type === "orchestrator") fields.Master = true;
|
|
138
|
+
}
|
|
139
|
+
// Every agent gets a face, same as the daemon API does. Drawn from the blobs
|
|
140
|
+
// this project isn't using yet so the team stays distinguishable.
|
|
141
|
+
fields.Icon = resolveIconFlag(f, existing);
|
|
142
|
+
// Omitted tools ⇒ leave the field UNDECLARED, matching the daemon API. A
|
|
143
|
+
// declared list is a deliberate narrowing that wins forever; writing one on
|
|
144
|
+
// create froze the agent to a snapshot of the catalog instead of letting it
|
|
145
|
+
// inherit the broad default.
|
|
146
|
+
if (f.tools && f.tools !== true) {
|
|
147
|
+
fields.Tools = String(f.tools).split(",").map((s) => s.trim()).filter(Boolean);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const prompt = readPromptFlag(f);
|
|
151
|
+
|
|
152
|
+
writeAgentFile(root, slug, fields, prompt || "");
|
|
54
153
|
ensureAgentDir(root, slug);
|
|
55
154
|
ensureAgentRuntimeDir(root, slug);
|
|
56
155
|
await nudgeDaemon(root);
|
|
@@ -59,18 +158,117 @@ export async function cmdAgentAdd(args) {
|
|
|
59
158
|
for (const [k, v] of Object.entries(fields)) {
|
|
60
159
|
console.log(` ${k}: ${Array.isArray(v) ? v.join(", ") : v}`);
|
|
61
160
|
}
|
|
161
|
+
// Say it out loud either way. A prompt-less agent runs on its frontmatter
|
|
162
|
+
// alone, which is almost never what the author meant — and the old silence
|
|
163
|
+
// is exactly why that went unnoticed.
|
|
164
|
+
if (prompt) {
|
|
165
|
+
console.log(` Prompt: ${Buffer.byteLength(prompt)} bytes`);
|
|
166
|
+
} else {
|
|
167
|
+
console.log(
|
|
168
|
+
`\n ${tag("no system prompt")} — this agent has metadata but no instructions.` +
|
|
169
|
+
`\n Add one with: apx agent set ${slug} --prompt - <<'EOF' … EOF`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Edit an existing agent: merge frontmatter fields and/or replace the system
|
|
175
|
+
// prompt. The CLI had no edit path at all, so an agent created without a prompt
|
|
176
|
+
// could never get one without hand-editing the file (which the skill forbids,
|
|
177
|
+
// since AGENTS.md has to be regenerated).
|
|
178
|
+
export async function cmdAgentSet(args) {
|
|
179
|
+
const slug = args._[0];
|
|
180
|
+
if (!slug) throw new Error("apx agent set: missing <slug>");
|
|
181
|
+
|
|
182
|
+
const root = await resolveRoot(args);
|
|
183
|
+
const existing = readAgents(root).find((a) => a.slug === slug);
|
|
184
|
+
if (!existing) {
|
|
185
|
+
throw new Error(`agent "${slug}" not found — run \`apx agent list\` to see this project's agents`);
|
|
186
|
+
}
|
|
187
|
+
if (existing.source !== "local") {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`agent "${slug}" comes from the ${existing.source} layer — run \`apx agent import ${slug} --copy\` first to get a local copy to edit`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const fields = { ...(existing.fields || {}) };
|
|
194
|
+
const f = args.flags;
|
|
195
|
+
const set = (key, flag) => {
|
|
196
|
+
const v = flagValue(f, flag);
|
|
197
|
+
if (v === null) return false;
|
|
198
|
+
fields[key] = v;
|
|
199
|
+
return true;
|
|
200
|
+
};
|
|
201
|
+
let touched = false;
|
|
202
|
+
for (const [key, flag] of [
|
|
203
|
+
["Role", "role"], ["Model", "model"], ["Language", "language"],
|
|
204
|
+
["Description", "description"], ["Emoji", "emoji"],
|
|
205
|
+
["Parent", "parent"],
|
|
206
|
+
]) {
|
|
207
|
+
if (set(key, flag)) touched = true;
|
|
208
|
+
}
|
|
209
|
+
for (const [key, flag] of [["Skills", "skills"], ["Tools", "tools"]]) {
|
|
210
|
+
const v = flagValue(f, flag);
|
|
211
|
+
if (v === null) continue;
|
|
212
|
+
fields[key] = v.split(",").map((s) => s.trim()).filter(Boolean);
|
|
213
|
+
touched = true;
|
|
214
|
+
}
|
|
215
|
+
const type = readTypeFlag(f);
|
|
216
|
+
if (type) {
|
|
217
|
+
fields.Type = type;
|
|
218
|
+
if (type === "orchestrator") fields.Master = true;
|
|
219
|
+
touched = true;
|
|
220
|
+
}
|
|
221
|
+
const icon = flagValue(f, "icon", "avatar", "blob");
|
|
222
|
+
if (icon) {
|
|
223
|
+
if (!isBlobKey(icon)) throw new Error(`invalid --icon "${icon}" — one of: ${BLOB_KEYS.join(", ")}`);
|
|
224
|
+
fields.Icon = icon;
|
|
225
|
+
touched = true;
|
|
226
|
+
}
|
|
227
|
+
const areaRaw = flagValue(f, "area");
|
|
228
|
+
if (areaRaw !== null) {
|
|
229
|
+
const area = resolveAreaSlug(areaRaw, readOrganization(root));
|
|
230
|
+
if (area) fields.Area = area;
|
|
231
|
+
else delete fields.Area;
|
|
232
|
+
touched = true;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const prompt = readPromptFlag(f);
|
|
236
|
+
if (prompt === null && !touched) {
|
|
237
|
+
throw new Error(
|
|
238
|
+
"apx agent set: nothing to change — pass --prompt/--prompt-file or a field flag (--role, --model, --description, …)"
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// A field-only edit must not wipe the prompt the agent already had.
|
|
243
|
+
const body = prompt === null ? (existing.body || "") : prompt;
|
|
244
|
+
writeAgentFile(root, slug, fields, body);
|
|
245
|
+
ensureAgentDir(root, slug);
|
|
246
|
+
ensureAgentRuntimeDir(root, slug);
|
|
247
|
+
await nudgeDaemon(root);
|
|
248
|
+
|
|
249
|
+
console.log(`Updated agent ${slug}`);
|
|
250
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
251
|
+
console.log(` ${k}: ${Array.isArray(v) ? v.join(", ") : v}`);
|
|
252
|
+
}
|
|
253
|
+
if (prompt !== null) console.log(` Prompt: ${Buffer.byteLength(body)} bytes`);
|
|
62
254
|
}
|
|
63
255
|
|
|
64
|
-
export function cmdAgentList() {
|
|
65
|
-
|
|
256
|
+
export async function cmdAgentList(args) {
|
|
257
|
+
// --all: every agent across every registered project, with the project next to
|
|
258
|
+
// it. This is what makes cross-project addressing possible — when you want to
|
|
259
|
+
// message an agent (a2a) you need to know which project owns it, and two
|
|
260
|
+
// projects can each have a "rocky". Needs the daemon (project registry).
|
|
261
|
+
if (args?.flags?.all) return cmdAgentListAll();
|
|
262
|
+
|
|
263
|
+
const root = await resolveRoot(args);
|
|
66
264
|
const agents = readAgents(root);
|
|
67
265
|
if (agents.length === 0) {
|
|
68
|
-
console.log(dim("(no agents — try `apx agent add <slug>` or `apx agent import <slug
|
|
266
|
+
console.log(dim("(no agents — try `apx agent add <slug>` or `apx agent import <slug>`, or `apx agent list --all` across projects)"));
|
|
69
267
|
return;
|
|
70
268
|
}
|
|
71
269
|
console.log();
|
|
72
270
|
for (const a of agents) {
|
|
73
|
-
const src = a.source === "vault" ? tag(" ↑ vault") :
|
|
271
|
+
const src = a.source === "vault" ? tag(" ↑ vault") : "";
|
|
74
272
|
const role = a.fields.Role ? dim(a.fields.Role) : gray("—");
|
|
75
273
|
const model = a.fields.Model ? dim(a.fields.Model) : gray("—");
|
|
76
274
|
console.log(` ${bold(a.slug)}${src} ${role} ${cyan(model)}`);
|
|
@@ -78,10 +276,35 @@ export function cmdAgentList() {
|
|
|
78
276
|
console.log();
|
|
79
277
|
}
|
|
80
278
|
|
|
81
|
-
|
|
279
|
+
// `apx agent list --all` — one line per (agent, project) across the whole
|
|
280
|
+
// registry, plus the super-agent. The right-hand project column is the address
|
|
281
|
+
// you pass to `apx send … --project <name>`.
|
|
282
|
+
async function cmdAgentListAll() {
|
|
283
|
+
const projects = await http.get("/api/projects");
|
|
284
|
+
console.log();
|
|
285
|
+
console.log(` ${bold("super-agent")} ${gray("→")} ${dim("default")} ${gray("(reachable as the daemon fallback)")}`);
|
|
286
|
+
let total = 0;
|
|
287
|
+
for (const proj of projects) {
|
|
288
|
+
let agents = [];
|
|
289
|
+
try { agents = readAgents(proj.path); } catch { /* unreadable project */ }
|
|
290
|
+
if (agents.length === 0) continue;
|
|
291
|
+
console.log();
|
|
292
|
+
console.log(` ${cyan(proj.name)} ${gray(`#${proj.id}`)}`);
|
|
293
|
+
for (const a of agents) {
|
|
294
|
+
const role = a.fields.Role ? dim(a.fields.Role) : gray("—");
|
|
295
|
+
console.log(` ${bold(a.slug)} ${role}`);
|
|
296
|
+
total++;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
console.log();
|
|
300
|
+
console.log(dim(` ${total} agent(s) across ${projects.length} project(s). Address one with: apx send <from> <slug> --project <name>`));
|
|
301
|
+
console.log();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export async function cmdAgentGet(args) {
|
|
82
305
|
const slug = args._[0];
|
|
83
306
|
if (!slug) throw new Error("apx agent get: missing <slug>");
|
|
84
|
-
const root =
|
|
307
|
+
const root = await resolveRoot(args);
|
|
85
308
|
const a = readAgents(root).find((x) => x.slug === slug);
|
|
86
309
|
if (!a) {
|
|
87
310
|
// Check vault and suggest import
|
|
@@ -92,7 +315,7 @@ export function cmdAgentGet(args) {
|
|
|
92
315
|
}
|
|
93
316
|
throw new Error(`agent "${slug}" not found`);
|
|
94
317
|
}
|
|
95
|
-
const src = a.source === "vault" ? tag(" ↑ vault") :
|
|
318
|
+
const src = a.source === "vault" ? tag(" ↑ vault") : "";
|
|
96
319
|
console.log(`\n ${bold(a.slug)}${src}`);
|
|
97
320
|
for (const [k, v] of Object.entries(a.fields)) {
|
|
98
321
|
console.log(` ${gray(k.padEnd(12))} ${Array.isArray(v) ? v.join(", ") : v}`);
|
|
@@ -106,7 +329,7 @@ export async function cmdAgentRemove(args) {
|
|
|
106
329
|
if (!slug) throw new Error("apx agent remove: missing <slug> — usage: apx agent remove <slug>");
|
|
107
330
|
// Resolve locally first so we can give a clear message + suggestions instead
|
|
108
331
|
// of a bare 404 when the slug is wrong.
|
|
109
|
-
const root =
|
|
332
|
+
const root = await resolveRootOptional(args);
|
|
110
333
|
if (root) {
|
|
111
334
|
const local = readAgents(root).find((a) => a.slug === slug);
|
|
112
335
|
if (!local) {
|
|
@@ -150,7 +373,7 @@ export async function cmdAgentVaultAdd(args) {
|
|
|
150
373
|
if (!slug || !SLUG_RE.test(slug)) throw new Error("apx agent vault add: missing or invalid <slug>");
|
|
151
374
|
|
|
152
375
|
// If we're inside a project, offer to copy the local agent to vault
|
|
153
|
-
const root =
|
|
376
|
+
const root = await resolveRootOptional(args);
|
|
154
377
|
if (root) {
|
|
155
378
|
const local = readAgents(root).find((a) => a.slug === slug && a.source === "local");
|
|
156
379
|
if (local) {
|
|
@@ -206,10 +429,12 @@ export function cmdAgentVaultRestore(args) {
|
|
|
206
429
|
export async function cmdAgentImport(args) {
|
|
207
430
|
const slug = args._[0];
|
|
208
431
|
if (!slug) throw new Error("apx agent import: missing <slug>");
|
|
209
|
-
const root =
|
|
432
|
+
const root = await resolveRoot(args);
|
|
210
433
|
|
|
211
|
-
|
|
212
|
-
|
|
434
|
+
// Layered lookup (user file → bundled default) — see vaultAgentFile. Reading
|
|
435
|
+
// the user layer alone made every bundled agent unimportable.
|
|
436
|
+
const vaultPath = vaultAgentFile(slug);
|
|
437
|
+
if (!vaultPath) {
|
|
213
438
|
const vault = readVaultAgents();
|
|
214
439
|
const available = vault.map((a) => a.slug).join(", ") || "(none)";
|
|
215
440
|
throw new Error(`"${slug}" not found in vault. Available: ${available}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// `apx code` — launch the APX terminal coding assistant (Solid.js TUI).
|
|
2
2
|
// The TUI runs its TypeScript source directly under bun; there is no
|
|
3
|
-
//
|
|
3
|
+
// readline fallback anymore (it went with the old sys.js chat).
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { dirname, resolve } from "node:path";
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// apx commitment show <id> [--project X]
|
|
8
8
|
// apx commitment kept <id> [--project X] [--note "..."]
|
|
9
9
|
// apx commitment missed <id> [--project X] [--note "..."]
|
|
10
|
+
// apx commitment drop <id> [--project X] [--note "..."] filed by mistake
|
|
10
11
|
// apx commitment renegotiate <id> --due <ISO> [--project X] [--note "..."]
|
|
11
12
|
//
|
|
12
13
|
// A task is something to do; a commitment is something you promised a person.
|
|
@@ -20,6 +21,7 @@ export const COMMITMENT_USAGE = {
|
|
|
20
21
|
show: "apx commitment show <id> [--project X]",
|
|
21
22
|
kept: 'apx commitment kept <id> [--project X] [--note "..."]',
|
|
22
23
|
missed: 'apx commitment missed <id> [--project X] [--note "..."]',
|
|
24
|
+
drop: 'apx commitment drop <id> [--project X] [--note "..."]',
|
|
23
25
|
renegotiate: 'apx commitment renegotiate <id> --due <ISO> [--project X] [--note "..."]',
|
|
24
26
|
};
|
|
25
27
|
|
|
@@ -139,6 +141,9 @@ async function close(args, sub) {
|
|
|
139
141
|
|
|
140
142
|
export const cmdCommitmentKept = (args) => close(args, "kept");
|
|
141
143
|
export const cmdCommitmentMissed = (args) => close(args, "missed");
|
|
144
|
+
// Not an alias of `missed`: nobody was waiting on a promise filed by mistake,
|
|
145
|
+
// so it must not land in the broken-promise count.
|
|
146
|
+
export const cmdCommitmentDrop = (args) => close(args, "drop");
|
|
142
147
|
|
|
143
148
|
export async function cmdCommitmentRenegotiate(args) {
|
|
144
149
|
const id = args?._?.[0];
|
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
// `apx config` — read and edit configuration at either layer.
|
|
2
|
+
//
|
|
3
|
+
// APX has two config layers and this command reaches both:
|
|
4
|
+
// default the PROJECT layer, `.apc/config.json` (committed)
|
|
5
|
+
// --global the GLOBAL layer, `~/.apx/config.json` (machine-local)
|
|
6
|
+
//
|
|
7
|
+
// The global branch goes through the daemon's `/api/admin/config` route rather
|
|
8
|
+
// than calling writeConfig() here. That route writes the file AND hot-reloads
|
|
9
|
+
// the daemon's in-memory copy, re-registers log masking for any secret just
|
|
10
|
+
// stored, and refreshes the scheduler/plugin views. Writing the file directly
|
|
11
|
+
// would leave every one of those stale until the next restart.
|
|
12
|
+
//
|
|
13
|
+
// Scope vocabulary matches `apx obsidian` (project|global), not the MCP one
|
|
14
|
+
// (shared|runtime|global) — see the scope row in AGENTS.md's glossary.
|
|
1
15
|
import { http } from "../http.js";
|
|
2
16
|
import { resolveProjectId } from "./project.js";
|
|
3
|
-
import { readConfig, writeConfig } from "#core/config/index.js";
|
|
17
|
+
import { readConfig, writeConfig, CONFIG_PATH } from "#core/config/index.js";
|
|
18
|
+
import { isSecretKey } from "#core/config/redact.js";
|
|
4
19
|
import { DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
|
|
5
20
|
|
|
6
21
|
function parseValue(raw) {
|
|
@@ -13,7 +28,46 @@ function parseValue(raw) {
|
|
|
13
28
|
}
|
|
14
29
|
}
|
|
15
30
|
|
|
31
|
+
// `--global` (boolean) or `--scope global|project`. Anything else is a typo
|
|
32
|
+
// worth failing on rather than silently treating as project scope — writing a
|
|
33
|
+
// global key like engines.*.api_key into a committed .apc/config.json is the
|
|
34
|
+
// exact accident this flag exists to prevent.
|
|
35
|
+
export function isGlobalScope(flags = {}) {
|
|
36
|
+
if (flags.global) return true;
|
|
37
|
+
if (flags.scope === undefined || flags.scope === null || flags.scope === "") return false;
|
|
38
|
+
const s = String(flags.scope).toLowerCase();
|
|
39
|
+
if (s === "global" || s === "default") return true;
|
|
40
|
+
if (s === "project") return false;
|
|
41
|
+
throw new Error(`unknown --scope "${flags.scope}" (use project|global)`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// --effective and --only-overrides both name the project↔global merge, which
|
|
45
|
+
// does not exist when the global file *is* the whole story.
|
|
46
|
+
function rejectMergeFlags(flags, cmd) {
|
|
47
|
+
const bad = ["effective", "only-overrides"].filter((f) => flags[f]);
|
|
48
|
+
if (bad.length) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`apx ${cmd}: --${bad[0]} describes the project/global merge and does not apply to --global; ` +
|
|
51
|
+
`drop --global to inspect a project, or drop --${bad[0]} to print ${CONFIG_PATH}`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function showGlobal(args) {
|
|
57
|
+
rejectMergeFlags(args.flags, "config show");
|
|
58
|
+
const { config } = await http.get("/api/admin/config");
|
|
59
|
+
// Header goes to stderr so `apx config show --global | jq .` still gets clean
|
|
60
|
+
// JSON on stdout. Secrets arrive redacted from the route — rule 3 forbids
|
|
61
|
+
// captured output carrying a real key.
|
|
62
|
+
process.stderr.write(
|
|
63
|
+
`# ${CONFIG_PATH} (global — secrets redacted)\n` +
|
|
64
|
+
`# project overrides: apx config show (inside a project)\n\n`
|
|
65
|
+
);
|
|
66
|
+
process.stdout.write(JSON.stringify(config, null, 2) + "\n");
|
|
67
|
+
}
|
|
68
|
+
|
|
16
69
|
export async function cmdConfigShow(args) {
|
|
70
|
+
if (isGlobalScope(args.flags)) return showGlobal(args);
|
|
17
71
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
18
72
|
const data = await http.get(`/api/projects/${pid}/config`);
|
|
19
73
|
if (args.flags.effective) {
|
|
@@ -41,20 +95,45 @@ export async function cmdConfigSet(args) {
|
|
|
41
95
|
const key = args._[0];
|
|
42
96
|
const valueRaw = args._.slice(1).join(" ");
|
|
43
97
|
if (!key || !valueRaw) {
|
|
44
|
-
throw new Error('apx config set: usage: apx config set <key.path> <value>');
|
|
98
|
+
throw new Error('apx config set: usage: apx config set [--global] <key.path> <value>');
|
|
45
99
|
}
|
|
46
|
-
const pid = await resolveProjectId(args?.flags?.project);
|
|
47
100
|
const value = parseValue(valueRaw);
|
|
101
|
+
// Name the layer in the confirmation: the whole point of the flag is that
|
|
102
|
+
// "set" alone used to leave people guessing which file they just edited.
|
|
103
|
+
if (isGlobalScope(args.flags)) {
|
|
104
|
+
await http.patch("/api/admin/config", { set: { [key]: value } });
|
|
105
|
+
console.log(`set ${key} = ${JSON.stringify(value)} (global: ${CONFIG_PATH})`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Warn, don't block: a project may legitimately override a non-secret key
|
|
109
|
+
// that trips the heuristic, and refusing would strand that case. But
|
|
110
|
+
// .apc/config.json is COMMITTED (rule 3), so a credential landing there is a
|
|
111
|
+
// leak the user needs to hear about before it reaches git — not after.
|
|
112
|
+
// Never echo the value itself into the warning.
|
|
113
|
+
if (isSecretKey(key)) {
|
|
114
|
+
process.stderr.write(
|
|
115
|
+
`apx: warning: "${key}" looks like a secret, and this writes the project's ` +
|
|
116
|
+
`.apc/config.json — which is committed to git.\n` +
|
|
117
|
+
` Write it to ${CONFIG_PATH} instead:\n` +
|
|
118
|
+
` apx config set --global ${key} <value>\n`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const pid = await resolveProjectId(args?.flags?.project);
|
|
48
122
|
await http.patch(`/api/projects/${pid}/config`, { set: { [key]: value } });
|
|
49
|
-
console.log(`set ${key} = ${JSON.stringify(value)}`);
|
|
123
|
+
console.log(`set ${key} = ${JSON.stringify(value)} (project: .apc/config.json)`);
|
|
50
124
|
}
|
|
51
125
|
|
|
52
126
|
export async function cmdConfigUnset(args) {
|
|
53
127
|
const key = args._[0];
|
|
54
|
-
if (!key) throw new Error("apx config unset: usage: apx config unset <key.path>");
|
|
128
|
+
if (!key) throw new Error("apx config unset: usage: apx config unset [--global] <key.path>");
|
|
129
|
+
if (isGlobalScope(args.flags)) {
|
|
130
|
+
await http.patch("/api/admin/config", { unset: [key] });
|
|
131
|
+
console.log(`unset ${key} (global: ${CONFIG_PATH})`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
55
134
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
56
135
|
await http.patch(`/api/projects/${pid}/config`, { unset: [key] });
|
|
57
|
-
console.log(`unset ${key}`);
|
|
136
|
+
console.log(`unset ${key} (project: .apc/config.json)`);
|
|
58
137
|
}
|
|
59
138
|
|
|
60
139
|
export function cmdPermission(args = {}) {
|
|
@@ -121,6 +121,19 @@ function labelForEvent(event) {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
// A session title has to be readable in a list of twenty, so it is the prompt's
|
|
125
|
+
// opening words rather than "New session" — the panel's session list is the
|
|
126
|
+
// only place a `--code` turn can be found again, and twelve rows all reading
|
|
127
|
+
// "New session" is the same as not finding it.
|
|
128
|
+
const TITLE_MAX = 60;
|
|
129
|
+
export function codeSessionTitle(prompt) {
|
|
130
|
+
const flat = String(prompt || "").replace(/\s+/g, " ").trim();
|
|
131
|
+
if (!flat) return "Code";
|
|
132
|
+
const firstLine = flat.split(/(?<=[.?!])\s/)[0] || flat;
|
|
133
|
+
const base = firstLine.length <= TITLE_MAX ? firstLine : flat;
|
|
134
|
+
return base.length <= TITLE_MAX ? base : base.slice(0, TITLE_MAX - 1).trimEnd() + "…";
|
|
135
|
+
}
|
|
136
|
+
|
|
124
137
|
async function readPromptFromStdin() {
|
|
125
138
|
const fs = await import("node:fs");
|
|
126
139
|
if (process.stdin.isTTY) return "";
|
|
@@ -138,6 +151,72 @@ async function readPromptFromStdin() {
|
|
|
138
151
|
return chunks.join("").trim();
|
|
139
152
|
}
|
|
140
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Run one `--code` turn inside a persistent code session.
|
|
156
|
+
*
|
|
157
|
+
* `--session <id>` continues an existing one (the session carries the history,
|
|
158
|
+
* mode, model and agent); without it a fresh session is created and titled from
|
|
159
|
+
* the prompt. Either way the id is printed on stderr so the caller — a human or
|
|
160
|
+
* an agent shelling out — knows exactly which session to open in the panel.
|
|
161
|
+
*/
|
|
162
|
+
async function runCodeSessionTurn({ args, pid, prompt, model }) {
|
|
163
|
+
const flagged = args.flags.session;
|
|
164
|
+
let sid = typeof flagged === "string" && flagged.trim() ? flagged.trim() : null;
|
|
165
|
+
let created = false;
|
|
166
|
+
|
|
167
|
+
if (!sid) {
|
|
168
|
+
// No agentSlug here on purpose: `-a <slug>` never reaches this path — it
|
|
169
|
+
// sets useSuperAgent=false and routes to the agent's own exec endpoint.
|
|
170
|
+
const session = await http.post(`/api/projects/${pid}/code/sessions`, {
|
|
171
|
+
title: codeSessionTitle(prompt),
|
|
172
|
+
...(model ? { model } : {}),
|
|
173
|
+
});
|
|
174
|
+
sid = session.id;
|
|
175
|
+
created = true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const status = createExecStatus();
|
|
179
|
+
status.start();
|
|
180
|
+
let result;
|
|
181
|
+
try {
|
|
182
|
+
result = await http.streamPost(
|
|
183
|
+
`/api/projects/${pid}/code/sessions/${sid}/chat/stream`,
|
|
184
|
+
{ prompt, channel: CHANNELS.CODE, cwd: process.cwd(), confirm: false },
|
|
185
|
+
(event) => status.set(labelForEvent(event))
|
|
186
|
+
);
|
|
187
|
+
} catch (e) {
|
|
188
|
+
// Name the session even on failure: the user turn is already stored there,
|
|
189
|
+
// so that is where the half-finished run can be inspected and resumed.
|
|
190
|
+
process.stderr.write(
|
|
191
|
+
`\n— code session ${sid}${created ? " (new)" : ""} | project ${pid} | ${http.baseUrl()}/code\n`
|
|
192
|
+
);
|
|
193
|
+
throw e;
|
|
194
|
+
} finally {
|
|
195
|
+
status.clear();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// A turn that produced no text is a failed turn, not an empty answer. Saying
|
|
199
|
+
// so beats a blank line and exit 0, which reads as "it worked, silently".
|
|
200
|
+
if (!result?.text) {
|
|
201
|
+
throw new Error(
|
|
202
|
+
`apx exec --code: the turn ended without a reply. Session ${sid} (project ${pid}) has the transcript: ${http.baseUrl()}/code`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
process.stdout.write(result.text + "\n");
|
|
207
|
+
// Always tell the caller where the turn landed — a piped/scripted run needs
|
|
208
|
+
// the id to pass back as --session, and a human needs it to find the session
|
|
209
|
+
// in the panel. stderr keeps stdout clean for scripts.
|
|
210
|
+
process.stderr.write(
|
|
211
|
+
`\n— code session ${sid}${created ? " (new)" : ""} | project ${pid} | ${http.baseUrl()}/code\n`
|
|
212
|
+
);
|
|
213
|
+
if (process.stderr.isTTY || args.flags.verbose) {
|
|
214
|
+
process.stderr.write(
|
|
215
|
+
`— ${result.name || "super-agent"} | in=${result.usage?.input_tokens || "?"} out=${result.usage?.output_tokens || "?"}\n`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
141
220
|
export async function cmdExec(args) {
|
|
142
221
|
const { slug, useSuperAgent, promptParts } = resolveExecRequest(args);
|
|
143
222
|
let prompt = promptParts.join(" ").trim();
|
|
@@ -152,15 +231,25 @@ export async function cmdExec(args) {
|
|
|
152
231
|
}
|
|
153
232
|
|
|
154
233
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
234
|
+
const channel = resolveExecChannel(args);
|
|
155
235
|
const body = {
|
|
156
236
|
prompt,
|
|
157
|
-
channel
|
|
237
|
+
channel,
|
|
158
238
|
channelMeta: { cwd: process.cwd() },
|
|
159
239
|
};
|
|
160
240
|
if (args.flags.model && args.flags.model !== true) body.model = args.flags.model;
|
|
161
241
|
if (args.flags.temperature) body.temperature = parseFloat(args.flags.temperature);
|
|
162
242
|
if (args.flags["max-tokens"]) body.maxTokens = parseInt(args.flags["max-tokens"], 10);
|
|
163
243
|
|
|
244
|
+
// The code channel runs through a persistent code session instead of the
|
|
245
|
+
// stateless super-agent route. Same output on stdout; the difference is that
|
|
246
|
+
// the turn is now READABLE afterwards in the web panel (/code) and by the
|
|
247
|
+
// next `--code` turn that continues the session, instead of existing only in
|
|
248
|
+
// whatever terminal happened to run it.
|
|
249
|
+
if (useSuperAgent && channel === CHANNELS.CODE) {
|
|
250
|
+
return runCodeSessionTurn({ args, pid, prompt, model: body.model });
|
|
251
|
+
}
|
|
252
|
+
|
|
164
253
|
if (useSuperAgent) {
|
|
165
254
|
// Stream the turn so we can render a live progress indicator instead of a
|
|
166
255
|
// silent hang. `confirm: false` opts out of the interactive confirmation
|