@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,48 +1,400 @@
|
|
|
1
|
-
// Agent-to-agent (A2A)
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
// Agent-to-agent (A2A) reply: given a sender and a recipient PEER, produce the
|
|
2
|
+
// recipient's answer. The recipient is an AGENTS.md agent (its model), the
|
|
3
|
+
// daemon super-agent (its full identity/memory/tool loop), or an external
|
|
4
|
+
// coding runtime — opencode, codex, claude-code — answered by spawning that
|
|
5
|
+
// CLI and reading stdout. The same shape comes back in every case.
|
|
6
|
+
//
|
|
7
|
+
// Pure orchestration over core/agent + core/engines + core/runtimes: no HTTP,
|
|
8
|
+
// no message-log writes (the caller decides whether and where to persist).
|
|
9
|
+
import { callEngineWithFallback } from "../engine-call.js";
|
|
10
|
+
import { readAgentMemory } from "../memory.js";
|
|
11
|
+
import { resolveAgentModel } from "../agent-model.js";
|
|
12
|
+
import { resolveAgentName } from "../../identity/self.js";
|
|
13
|
+
import { readProfileState } from "../../profiles/store.js";
|
|
14
|
+
import { getRuntime } from "../../runtimes/index.js";
|
|
15
|
+
import { runtimeLooksLikeFailure } from "../../runtimes/outcome.js";
|
|
16
|
+
import { runSuperAgent } from "../super-agent.js";
|
|
17
|
+
import { runAgentTurn } from "../run-turn.js";
|
|
18
|
+
import { CHANNELS } from "#core/constants/channels.js";
|
|
19
|
+
import { a2aSessionKey, peerAddress as canonicalPeerAddress } from "./peers.js";
|
|
20
|
+
|
|
21
|
+
// The super-agent's stable slug plus accepted technical aliases. The configured
|
|
22
|
+
// display name is checked separately, so no persona name is hardcoded here.
|
|
23
|
+
const ORCHESTRATOR_SLUGS = new Set(["default", "superagent", "super_agent", "super-agent", "apx"]);
|
|
24
|
+
|
|
25
|
+
// A shell word only needs quoting when it isn't one. A `:thread` address is
|
|
26
|
+
// safe unquoted in every shell we target, but the quotes cost nothing and cover
|
|
27
|
+
// whatever an agent slug turns out to allow.
|
|
28
|
+
const shellArg = (s) => (/^[A-Za-z0-9_-]+$/.test(String(s)) ? String(s) : `"${s}"`);
|
|
8
29
|
|
|
9
30
|
/**
|
|
10
|
-
*
|
|
31
|
+
* The return address, written as the exact command that reaches it.
|
|
32
|
+
*
|
|
33
|
+
* This is what makes an a2a message answerable rather than a broadcast: a peer
|
|
34
|
+
* that can open a terminal — every coding CLI, and any agent with run_shell —
|
|
35
|
+
* learns who asked and how to reach them back, without the sender having to
|
|
36
|
+
* explain the addressing scheme in prose every time.
|
|
37
|
+
*/
|
|
38
|
+
export function a2aReplyCommand({ selfAddress, peerAddress }) {
|
|
39
|
+
return `apx send ${shellArg(selfAddress)} ${shellArg(peerAddress)} "<your message>" --deliver`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** a2a etiquette every recipient must follow, agent or runtime alike. An a2a
|
|
43
|
+
* message is another AGENT talking, never the human owner — so a reply must
|
|
44
|
+
* not "answer the owner", and must not ping the owner directly. What reaches
|
|
45
|
+
* the owner, and when, is the orchestrator's (Roby's) call, through its own
|
|
46
|
+
* channel and quiet-hours. */
|
|
47
|
+
function a2aEtiquette({ selfAddress, peerAddress, config }) {
|
|
48
|
+
const selfName = String(selfAddress || "").toLowerCase().split("#")[0].split(":")[0];
|
|
49
|
+
const configuredName = (resolveAgentName(config) || "").toLowerCase();
|
|
50
|
+
const isOrchestrator = ORCHESTRATOR_SLUGS.has(selfName) || (configuredName && selfName === configuredName);
|
|
51
|
+
const secretaryActive = readProfileState(config).active === "secretary";
|
|
52
|
+
const superName = resolveAgentName(config) || "the orchestrator";
|
|
53
|
+
const lines = [
|
|
54
|
+
"## This is an agent-to-agent (a2a) message",
|
|
55
|
+
"It comes from another AGENT, not from the human owner.",
|
|
56
|
+
];
|
|
57
|
+
if (isOrchestrator) {
|
|
58
|
+
lines.push(
|
|
59
|
+
"You are the orchestrator: YOU decide whether, how and when the owner hears about this — using your own channel and tools, respecting quiet-hours. Don't relay noise; relay what the owner actually needs.",
|
|
60
|
+
);
|
|
61
|
+
} else {
|
|
62
|
+
lines.push(
|
|
63
|
+
"Do NOT notify the owner directly from this turn (no `apx telegram send`, no direct owner ping).",
|
|
64
|
+
`You are NOT the orchestrator: if this needs the owner's attention or a decision, relay it to ${superName} (\`apx send <you> default "…" --deliver\` or \`apx send <you> ${superName.toLowerCase()} "…" --deliver\`) and let ${superName} decide how and when to tell them. Tag urgency: \`--severity blocker\` for a critical alert (${superName} pings the owner in the act, crossing quiet-hours), \`--severity status\`/\`fyi\` for a normal notice that rides the digest. Otherwise just do your part and reply here.`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (secretaryActive) {
|
|
68
|
+
lines.push(
|
|
69
|
+
"A secretary profile is active: anything promised to, owed to, or that the owner must act on has to be CAPTURED (a commitment via `record_commitment` / `apx commitment`, with a due date) so it resurfaces at the right time — a single a2a message is not a reminder and quiet-hours can swallow it.",
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
// The anti-double-post rule. Both kinds of peer answer by PRODUCING their
|
|
73
|
+
// reply — a model returns text, a CLI writes stdout — and APX files that as
|
|
74
|
+
// the reply. A peer that also shells out `apx send` with the same answer
|
|
75
|
+
// files the exchange twice and starts a second, overlapping thread.
|
|
76
|
+
lines.push(
|
|
77
|
+
[
|
|
78
|
+
"## How to answer",
|
|
79
|
+
`Your output IS the reply: APX logs it and hands it straight back to ${peerAddress}. Just answer here.`,
|
|
80
|
+
"Do NOT also run `apx send` to deliver this same answer — that files it twice.",
|
|
81
|
+
"",
|
|
82
|
+
"Use `apx send` only to open a NEW exchange: a later follow-up once this turn is over, or a message to somebody else. This thread's address is:",
|
|
83
|
+
"",
|
|
84
|
+
` ${a2aReplyCommand({ selfAddress, peerAddress })}`,
|
|
85
|
+
].join("\n"),
|
|
86
|
+
);
|
|
87
|
+
return lines.join("\n\n");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Build the recipient AGENT's system prompt for an A2A reply.
|
|
11
92
|
* Includes Description, Role, Language, a persona line naming the sender,
|
|
12
|
-
*
|
|
93
|
+
* the a2a etiquette (routing, return address, secretary capture), and the
|
|
94
|
+
* recipient's memory.
|
|
13
95
|
*/
|
|
14
|
-
export function buildA2AReplySystem({
|
|
96
|
+
export function buildA2AReplySystem({
|
|
97
|
+
projectPath,
|
|
98
|
+
toAgent,
|
|
99
|
+
fromAgent,
|
|
100
|
+
config,
|
|
101
|
+
selfAddress = null,
|
|
102
|
+
peerAddress = null,
|
|
103
|
+
mode = "chat",
|
|
104
|
+
}) {
|
|
105
|
+
const self = selfAddress || toAgent.slug;
|
|
106
|
+
const peer = peerAddress || fromAgent.slug;
|
|
15
107
|
const tf = toAgent?.fields || {};
|
|
16
108
|
const parts = [];
|
|
17
109
|
if (tf.Description) parts.push(tf.Description);
|
|
18
110
|
if (tf.Role) parts.push(`Role: ${tf.Role}`);
|
|
19
111
|
if (tf.Language) parts.push(`Default language: ${tf.Language}`);
|
|
20
|
-
parts.push(
|
|
21
|
-
|
|
22
|
-
|
|
112
|
+
parts.push(`You are ${self}. You just received a message from ${peer}. Reply concisely.`);
|
|
113
|
+
if (mode === "code") {
|
|
114
|
+
// An agent peer has no sandbox to open — it answers through its model, with
|
|
115
|
+
// whatever its own turn allows. `--code` still changes what is being ASKED
|
|
116
|
+
// of it, so the framing has to say so rather than silently reading the same.
|
|
117
|
+
parts.push(
|
|
118
|
+
"This exchange was opened as a CODING session: answer at the level of the code — concrete files, " +
|
|
119
|
+
"concrete changes, concrete commands — not a summary of the area.",
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
parts.push(a2aEtiquette({ selfAddress: self, peerAddress: peer, config }));
|
|
23
123
|
if (projectPath && toAgent.slug) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
124
|
+
// Same file buildAgentSystem injects — an A2A turn must not read a
|
|
125
|
+
// different memory than a normal turn, or the agent contradicts itself
|
|
126
|
+
// depending on who asked.
|
|
127
|
+
const memory = readAgentMemory(projectPath, toAgent.slug);
|
|
128
|
+
if (memory) parts.push("## Memory\n" + memory);
|
|
28
129
|
}
|
|
29
130
|
return parts.join("\n\n");
|
|
30
131
|
}
|
|
31
132
|
|
|
133
|
+
/** What the peer is here to DO. The two halves of the split the `--code` flag
|
|
134
|
+
* names: an exchange is either people talking about the code, or a working
|
|
135
|
+
* session on it. The prompt says which, and the adapter backs it with the
|
|
136
|
+
* runtime's own read-only mode so the sentence is enforced, not just asked. */
|
|
137
|
+
function modeBrief(mode) {
|
|
138
|
+
if (mode === "code") {
|
|
139
|
+
return [
|
|
140
|
+
"This is a CODING session. You are expected to do the work, not describe it:",
|
|
141
|
+
"read what you need, make the changes, run what verifies them — then report what you actually",
|
|
142
|
+
"changed, briefly. Your write access is on for this exchange.",
|
|
143
|
+
].join(" ");
|
|
144
|
+
}
|
|
145
|
+
return [
|
|
146
|
+
"This is a conversation, not a task. Answer directly and concisely.",
|
|
147
|
+
"You are in READ-ONLY mode: you can look at anything, but you cannot change it.",
|
|
148
|
+
"If answering well would mean editing the codebase, say what you would change and why —",
|
|
149
|
+
"the sender can reopen the exchange as a coding session if they want it done.",
|
|
150
|
+
].join(" ");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Build the recipient RUNTIME's system prompt. There is no persona to load —
|
|
154
|
+
* the CLI is itself, with its own project context — so this says only who it
|
|
155
|
+
* is being addressed as, what kind of exchange this is, and the same etiquette
|
|
156
|
+
* every peer gets. */
|
|
157
|
+
export function buildA2APeerSystem({ projectName, peer, selfAddress, peerAddress, config, mode = "chat" }) {
|
|
158
|
+
return [
|
|
159
|
+
`You are "${selfAddress}" inside APX — the ${peer.runtime} CLI, reached as an agent-to-agent peer.`,
|
|
160
|
+
projectName ? `Project: ${projectName}.` : "",
|
|
161
|
+
`A message from ${peerAddress} follows. ${modeBrief(mode)}`,
|
|
162
|
+
a2aEtiquette({ selfAddress, peerAddress, config }),
|
|
163
|
+
]
|
|
164
|
+
.filter(Boolean)
|
|
165
|
+
.join("\n\n");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** The thread so far, as text, for a peer that cannot resume its own session. */
|
|
169
|
+
function flattenHistory(history) {
|
|
170
|
+
if (!history?.length) return "";
|
|
171
|
+
const lines = history.map((m) =>
|
|
172
|
+
m.role === "assistant" ? `You said:\n${m.content}` : m.content,
|
|
173
|
+
);
|
|
174
|
+
return ["## Earlier in this exchange (oldest first)", ...lines].join("\n\n");
|
|
175
|
+
}
|
|
176
|
+
|
|
32
177
|
/**
|
|
33
|
-
* Run one A2A turn: build system, call engine
|
|
34
|
-
*
|
|
178
|
+
* Run one A2A turn against an AGENT: build system, call engine.
|
|
179
|
+
* Returns { text, usage, model }. Throws on engine failure.
|
|
35
180
|
*/
|
|
36
|
-
export async function replyAsAgent({
|
|
37
|
-
|
|
38
|
-
|
|
181
|
+
export async function replyAsAgent({
|
|
182
|
+
project,
|
|
183
|
+
projectPath,
|
|
184
|
+
toAgent,
|
|
185
|
+
fromAgent,
|
|
186
|
+
body,
|
|
187
|
+
config,
|
|
188
|
+
history = [],
|
|
189
|
+
selfAddress = null,
|
|
190
|
+
peerAddress = null,
|
|
191
|
+
mode = "chat",
|
|
192
|
+
projects,
|
|
193
|
+
plugins,
|
|
194
|
+
registries,
|
|
195
|
+
projectId = null,
|
|
196
|
+
tools = true,
|
|
197
|
+
signal = null,
|
|
198
|
+
runAgentTurnFn = runAgentTurn,
|
|
199
|
+
}) {
|
|
200
|
+
const modelId = await resolveAgentModel({ agent: toAgent, config });
|
|
201
|
+
if (!modelId) {
|
|
202
|
+
throw new Error(
|
|
203
|
+
`no model for agent ${toAgent?.slug || "?"} (no override, no router default)`
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const peer = peerAddress || fromAgent?.slug || "peer";
|
|
207
|
+
const system = buildA2AReplySystem({
|
|
208
|
+
projectPath: projectPath || project?.path,
|
|
209
|
+
toAgent,
|
|
210
|
+
fromAgent,
|
|
211
|
+
config,
|
|
212
|
+
selfAddress,
|
|
213
|
+
peerAddress: peer,
|
|
214
|
+
mode,
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
const p = project || {
|
|
218
|
+
id: projectId || 0,
|
|
219
|
+
path: projectPath || "",
|
|
220
|
+
config,
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// If tools are explicitly disabled, or there is no real projectPath on disk,
|
|
224
|
+
// execute single turn with fallback without tool session.
|
|
225
|
+
if (!tools || !projectPath) {
|
|
226
|
+
const result = await callEngineWithFallback({
|
|
227
|
+
modelId,
|
|
228
|
+
system,
|
|
229
|
+
messages: [...history, { role: "user", content: `From ${peer}:\n\n${body}` }],
|
|
230
|
+
config,
|
|
231
|
+
signal,
|
|
232
|
+
});
|
|
233
|
+
return { text: result.text, usage: result.usage, model: result.model || modelId };
|
|
39
234
|
}
|
|
40
|
-
|
|
41
|
-
const result = await
|
|
42
|
-
|
|
235
|
+
|
|
236
|
+
const result = await runAgentTurnFn({
|
|
237
|
+
p,
|
|
238
|
+
agent: toAgent,
|
|
239
|
+
modelId,
|
|
43
240
|
system,
|
|
44
|
-
|
|
241
|
+
prompt: `From ${peer}:\n\n${body}`,
|
|
242
|
+
previousMessages: history,
|
|
243
|
+
channel: CHANNELS.A2A,
|
|
244
|
+
channelMeta: {
|
|
245
|
+
projectId: p.id,
|
|
246
|
+
projectPath: p.path,
|
|
247
|
+
from: peer,
|
|
248
|
+
to: selfAddress || toAgent.slug,
|
|
249
|
+
mode,
|
|
250
|
+
},
|
|
251
|
+
tools: true,
|
|
252
|
+
projects,
|
|
253
|
+
plugins,
|
|
254
|
+
registries,
|
|
45
255
|
config,
|
|
256
|
+
signal,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
text: result.text,
|
|
261
|
+
usage: result.usage,
|
|
262
|
+
model: result.model || modelId,
|
|
263
|
+
trace: result.trace,
|
|
264
|
+
media: result.media,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Run one A2A turn against the daemon super-agent mode. Unlike a synthetic
|
|
270
|
+
* project agent, this keeps the configured identity, memory, project context,
|
|
271
|
+
* permission guard and tool loop — including the ability to decide whether an
|
|
272
|
+
* agent's escalation belongs on Telegram.
|
|
273
|
+
*/
|
|
274
|
+
export async function replyAsSuperAgent({
|
|
275
|
+
peer,
|
|
276
|
+
fromAddress,
|
|
277
|
+
body,
|
|
278
|
+
config,
|
|
279
|
+
history = [],
|
|
280
|
+
projectPath,
|
|
281
|
+
projectId = null,
|
|
282
|
+
projectName = "",
|
|
283
|
+
projects,
|
|
284
|
+
plugins,
|
|
285
|
+
registries,
|
|
286
|
+
mode = "chat",
|
|
287
|
+
runSuperAgentFn = runSuperAgent,
|
|
288
|
+
}) {
|
|
289
|
+
const selfAddress = canonicalPeerAddress(peer);
|
|
290
|
+
const contextNote = [
|
|
291
|
+
a2aEtiquette({ selfAddress, peerAddress: fromAddress, config }),
|
|
292
|
+
mode === "code"
|
|
293
|
+
? "This exchange was explicitly opened as a CODING session. Do the requested work under the normal permission policy, verify it, then reply with the result."
|
|
294
|
+
: "This exchange is agent coordination. Use tools only when the message requires action; otherwise answer directly.",
|
|
295
|
+
].join("\n\n");
|
|
296
|
+
const result = await runSuperAgentFn({
|
|
297
|
+
globalConfig: config,
|
|
298
|
+
projects,
|
|
299
|
+
plugins,
|
|
300
|
+
registries,
|
|
301
|
+
prompt: `From ${fromAddress}:\n\n${body}`,
|
|
302
|
+
contextNote,
|
|
303
|
+
previousMessages: history,
|
|
304
|
+
channel: CHANNELS.A2A,
|
|
305
|
+
channelMeta: {
|
|
306
|
+
projectId,
|
|
307
|
+
projectName,
|
|
308
|
+
projectPath,
|
|
309
|
+
from: fromAddress,
|
|
310
|
+
to: selfAddress,
|
|
311
|
+
mode,
|
|
312
|
+
},
|
|
313
|
+
completionContract: mode === "code",
|
|
314
|
+
});
|
|
315
|
+
return { text: result.text, usage: result.usage, model: result.model || null };
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Run one A2A turn against a RUNTIME: spawn the CLI and read its answer.
|
|
320
|
+
*
|
|
321
|
+
* `resumeSessionId` is the whole point. A runtime that continues its own
|
|
322
|
+
* session already lived through the earlier turns, so nothing is replayed and
|
|
323
|
+
* nothing is re-read — the exchange costs one message, not one transcript.
|
|
324
|
+
* A thread with no session on record (a runtime that can't keep one, or a first
|
|
325
|
+
* turn) gets the history carried in the prompt instead, so it is never amnesic.
|
|
326
|
+
*/
|
|
327
|
+
export async function replyAsRuntime({
|
|
328
|
+
peer,
|
|
329
|
+
fromAddress,
|
|
330
|
+
body,
|
|
331
|
+
config,
|
|
332
|
+
history = [],
|
|
333
|
+
cwd,
|
|
334
|
+
projectName = "",
|
|
335
|
+
resumeSessionId = null,
|
|
336
|
+
timeoutMs = 5 * 60 * 1000,
|
|
337
|
+
mode = "chat",
|
|
338
|
+
}) {
|
|
339
|
+
const rt = getRuntime(peer.runtime);
|
|
340
|
+
const system = buildA2APeerSystem({
|
|
341
|
+
projectName,
|
|
342
|
+
peer,
|
|
343
|
+
selfAddress: peer.address,
|
|
344
|
+
peerAddress: fromAddress,
|
|
345
|
+
config,
|
|
346
|
+
mode,
|
|
347
|
+
});
|
|
348
|
+
const carried = resumeSessionId ? "" : flattenHistory(history);
|
|
349
|
+
const prompt = [carried, `From ${fromAddress}:\n\n${body}`].filter(Boolean).join("\n\n---\n\n");
|
|
350
|
+
|
|
351
|
+
const startedAt = Date.now();
|
|
352
|
+
const r = await rt.run({
|
|
353
|
+
system,
|
|
354
|
+
prompt,
|
|
355
|
+
cwd,
|
|
356
|
+
timeoutMs,
|
|
357
|
+
sessionKey: a2aSessionKey(fromAddress, peer.address),
|
|
358
|
+
resumeSessionId,
|
|
359
|
+
mode,
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// A killed process can outlive its own SIGTERM, so "did we reach the
|
|
363
|
+
// deadline", not "how long did we wait".
|
|
364
|
+
const timedOut = Date.now() - startedAt >= timeoutMs;
|
|
365
|
+
const failure = runtimeLooksLikeFailure(r, {
|
|
366
|
+
timedOut,
|
|
367
|
+
timeoutS: Math.round(timeoutMs / 1000),
|
|
368
|
+
});
|
|
369
|
+
if (failure.failed) {
|
|
370
|
+
throw new Error(`${peer.runtime} did not answer: ${failure.reason}`);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
text: r.output,
|
|
375
|
+
// attribution-exempt: an external CLI spends its own tokens on its own
|
|
376
|
+
// model; APX made no model call here and has nothing truthful to record.
|
|
377
|
+
usage: null,
|
|
378
|
+
model: null,
|
|
379
|
+
runtime: peer.runtime,
|
|
380
|
+
mode,
|
|
381
|
+
sessionId: r.sessionId || resumeSessionId || null,
|
|
382
|
+
// Why there is no session, when there is none — a null the caller can
|
|
383
|
+
// explain beats a null it can only report.
|
|
384
|
+
sessionNote: r.sessionId || resumeSessionId ? null : r.sessionNote || null,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/** One turn against whichever kind of peer this is. The caller logs the result
|
|
389
|
+
* the same way for all — that sameness is the point of the split living here
|
|
390
|
+
* rather than in the route. */
|
|
391
|
+
export async function replyToPeer({ peer, ...rest }) {
|
|
392
|
+
if (peer.kind === "runtime") return replyAsRuntime({ peer, ...rest });
|
|
393
|
+
if (peer.kind === "super_agent") return replyAsSuperAgent({ peer, ...rest });
|
|
394
|
+
return replyAsAgent({
|
|
395
|
+
...rest,
|
|
396
|
+
toAgent: peer.agent,
|
|
397
|
+
selfAddress: peer.address,
|
|
398
|
+
peerAddress: rest.fromAddress,
|
|
46
399
|
});
|
|
47
|
-
return { text: result.text, usage: result.usage };
|
|
48
400
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// "Was this throw the abort we asked for?" — the one home for that question.
|
|
2
|
+
//
|
|
3
|
+
// It lives in core because both sides of a stopped turn need it: the daemon
|
|
4
|
+
// routes that own the AbortController (host/daemon/api/*), and the group cascade
|
|
5
|
+
// (agent/group/run-group-turn.js), which has to tell "the owner pressed Stop"
|
|
6
|
+
// apart from "this speaker's model fell over" while deciding whether to persist
|
|
7
|
+
// the partial and end the room's turn quietly. core/ cannot import from host/,
|
|
8
|
+
// so a second copy was the alternative.
|
|
9
|
+
//
|
|
10
|
+
// Checked against OUR controller, not just the error: an engine that aborts its
|
|
11
|
+
// own fetch on a timeout also throws AbortError, and treating that as "the user
|
|
12
|
+
// stopped it" would swallow a genuine failure and show the user a turn they
|
|
13
|
+
// never interrupted.
|
|
14
|
+
//
|
|
15
|
+
// @param {unknown} e the thrown value
|
|
16
|
+
// @param {{signal?: AbortSignal}|AbortController|null} controller the turn's own controller
|
|
17
|
+
export function wasAborted(e, controller) {
|
|
18
|
+
if (!controller?.signal?.aborted) return false;
|
|
19
|
+
return e?.name === "AbortError" || /abort/i.test(String(e?.message || ""));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Same question, when all you were handed is the signal itself. */
|
|
23
|
+
export function wasAbortedBySignal(e, signal) {
|
|
24
|
+
return wasAborted(e, signal ? { signal } : null);
|
|
25
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Which model an APC agent runs on. Single home for the question "what does
|
|
2
|
+
// this agent's `Model:` field mean?" — every caller (daemon routes, routines,
|
|
3
|
+
// the call_agent tool, A2A, the Telegram routed agent) goes through here.
|
|
4
|
+
//
|
|
5
|
+
// The field has three states, not two:
|
|
6
|
+
//
|
|
7
|
+
// Model: groq:llama-3.3-70b-versatile → forced. This model, no router.
|
|
8
|
+
// Model: inherit → no override. APC's normalizer
|
|
9
|
+
// writes this marker, and it is the
|
|
10
|
+
// documented idiom in
|
|
11
|
+
// `.apc/agents/<slug>.md`.
|
|
12
|
+
// (absent / empty) → no override.
|
|
13
|
+
//
|
|
14
|
+
// `inherit` used to reach `callEngine` as a literal model id, which parses as a
|
|
15
|
+
// provider-less name and fails the run. It is a marker, never a model.
|
|
16
|
+
import { resolveActiveModel } from "./model-router.js";
|
|
17
|
+
|
|
18
|
+
const INHERIT = "inherit";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The model this agent forces, or `""` when it inherits.
|
|
22
|
+
* @param {{ fields?: Record<string, unknown> }} agent an entry from readAgents()
|
|
23
|
+
*/
|
|
24
|
+
export function agentForcedModel(agent) {
|
|
25
|
+
const raw = agent?.fields?.Model;
|
|
26
|
+
if (typeof raw !== "string") return "";
|
|
27
|
+
const model = raw.trim();
|
|
28
|
+
if (!model || model.toLowerCase() === INHERIT) return "";
|
|
29
|
+
return model;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Whether a raw `Model:` value means "inherit" (absent, empty or the marker). */
|
|
33
|
+
export function isInheritedModel(model) {
|
|
34
|
+
if (typeof model !== "string") return !model;
|
|
35
|
+
const v = model.trim();
|
|
36
|
+
return !v || v.toLowerCase() === INHERIT;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The model to actually call for this agent: an explicit per-call override
|
|
41
|
+
* first, then the agent's forced model, then whatever the router resolves for
|
|
42
|
+
* the super-agent (which walks the fallback chain and skips unhealthy
|
|
43
|
+
* providers). Returns `null` when nothing is configured anywhere.
|
|
44
|
+
*/
|
|
45
|
+
export async function resolveAgentModel({ agent, config, override } = {}) {
|
|
46
|
+
// Per-call override (the chat picker) wins only when it is a real model
|
|
47
|
+
// id. `inherit` / empty from the picker means "use the agent's card", not
|
|
48
|
+
// "call a provider named inherit". The agent's own `Model: inherit` then
|
|
49
|
+
// falls through to the router.
|
|
50
|
+
const forced = agentForcedModel({ fields: { Model: override ?? "" } }) || agentForcedModel(agent);
|
|
51
|
+
if (forced) return forced;
|
|
52
|
+
try {
|
|
53
|
+
const routing = await resolveActiveModel(config);
|
|
54
|
+
return routing?.modelId || null;
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Project-agent tool allowlist.
|
|
2
|
+
//
|
|
3
|
+
// Super-agent = the full registry. A project agent (Magui, Scout, …) is a
|
|
4
|
+
// specialist: its `.apc/agents/<slug>.md` `tools:` field is the allowlist, not
|
|
5
|
+
// a hint. The picker stores HTTP-catalog names (`glob`, `memory_get`,
|
|
6
|
+
// `agent_list`); the loop speaks native + bridged names (`search_files` is
|
|
7
|
+
// native, `glob` is bridged, `read_self_memory` is native). This module is the
|
|
8
|
+
// one map between those vocabularies.
|
|
9
|
+
import { listCallableToolNames } from "#core/agent/tools/registry.js";
|
|
10
|
+
import { TOOLS } from "#core/agent/tools/names.js";
|
|
11
|
+
|
|
12
|
+
export const AGENT_TOOL_ALIASES = Object.freeze({
|
|
13
|
+
memory_get: TOOLS.READ_SELF_MEMORY,
|
|
14
|
+
memory_set: TOOLS.REMEMBER,
|
|
15
|
+
memory_append: TOOLS.REMEMBER,
|
|
16
|
+
memory_list: TOOLS.READ_SELF_MEMORY,
|
|
17
|
+
agent_list: TOOLS.LIST_AGENTS,
|
|
18
|
+
agent_get: TOOLS.LIST_AGENTS,
|
|
19
|
+
project_info: TOOLS.LIST_PROJECTS,
|
|
20
|
+
run_command: TOOLS.RUN_SHELL,
|
|
21
|
+
mcp_list: TOOLS.LIST_MCPS,
|
|
22
|
+
mcp_run: TOOLS.CALL_MCP,
|
|
23
|
+
session_list: TOOLS.SEARCH_SESSIONS,
|
|
24
|
+
session_search: TOOLS.SEARCH_SESSIONS,
|
|
25
|
+
session_get: TOOLS.SEARCH_SESSIONS,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export function declaredAgentTools(agent) {
|
|
29
|
+
const raw = agent?.fields?.Tools ?? agent?.tools ?? [];
|
|
30
|
+
if (Array.isArray(raw)) return raw.map((s) => String(s).trim()).filter(Boolean);
|
|
31
|
+
if (typeof raw === "string") return raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// What an agent with no declared `tools:` may NOT call. Everything else it can.
|
|
36
|
+
//
|
|
37
|
+
// The default used to be a narrow read/search/memory set, and the result was
|
|
38
|
+
// agents that could not do their job: a social producer that could not reach the
|
|
39
|
+
// MCP holding its publishing tools, a routine that could not file the task it
|
|
40
|
+
// had just written. Every one of those was diagnosed as a bug, one card at a
|
|
41
|
+
// time, long after the run that needed it had already failed.
|
|
42
|
+
//
|
|
43
|
+
// So capability is the default and removal is the deliberate act: declare
|
|
44
|
+
// `tools:` on the card when an agent should be narrower than the registry. What
|
|
45
|
+
// stays out is only what belongs to the super-agent as the host, not work an
|
|
46
|
+
// agent might reasonably need.
|
|
47
|
+
//
|
|
48
|
+
// This is an ALLOWLIST gate, not a prompt budget — lightweight channels still
|
|
49
|
+
// send the small base set and expand through discover_tools, so a broad default
|
|
50
|
+
// costs nothing on a chat turn. It only stops the runtime from refusing.
|
|
51
|
+
const HOST_ONLY_TOOLS = Object.freeze([
|
|
52
|
+
// The super-agent's own persona and privilege level. An agent rewriting who
|
|
53
|
+
// APX is, or widening its own permissions, is never the task.
|
|
54
|
+
TOOLS.SET_IDENTITY,
|
|
55
|
+
TOOLS.SET_PERMISSION_MODE,
|
|
56
|
+
// Registry surgery: adding projects / importing agents reshapes the install
|
|
57
|
+
// the agent is running inside.
|
|
58
|
+
TOOLS.ADD_PROJECT,
|
|
59
|
+
TOOLS.IMPORT_AGENT,
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
/** Everything a project agent may call by default: the registry minus the host's own. */
|
|
63
|
+
export function defaultAgentToolNames() {
|
|
64
|
+
const deny = new Set(HOST_ONLY_TOOLS);
|
|
65
|
+
return listCallableToolNames().filter((n) => !deny.has(n));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Names this agent may call this turn.
|
|
70
|
+
*
|
|
71
|
+
* - `override` set (routine.allowed_tools) wins, including `[]` = no tools.
|
|
72
|
+
* - else the agent's declared `tools:` field, when it declares one.
|
|
73
|
+
* - no declaration → the broad default (see defaultAgentToolNames).
|
|
74
|
+
* Unknown names are dropped, catalog aliases are rewritten, duplicates collapse.
|
|
75
|
+
*
|
|
76
|
+
* @returns {string[]}
|
|
77
|
+
*/
|
|
78
|
+
export function resolveAgentAllowedTools(agent, { override } = {}) {
|
|
79
|
+
if (Array.isArray(override)) return resolveNames(override);
|
|
80
|
+
const declared = declaredAgentTools(agent);
|
|
81
|
+
if (!declared.length) return defaultAgentToolNames();
|
|
82
|
+
const resolved = resolveNames(declared);
|
|
83
|
+
// A card whose every name is stale would otherwise mean a silent no-tools
|
|
84
|
+
// turn that dumps markup as the "answer". Capability beats a broken card.
|
|
85
|
+
return resolved.length ? resolved : defaultAgentToolNames();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function resolveNames(names) {
|
|
89
|
+
const known = new Set(listCallableToolNames());
|
|
90
|
+
const out = [];
|
|
91
|
+
const seen = new Set();
|
|
92
|
+
for (const raw of names) {
|
|
93
|
+
const name = String(raw || "").trim();
|
|
94
|
+
if (!name) continue;
|
|
95
|
+
const candidate = known.has(name) ? name : (AGENT_TOOL_ALIASES[name] || name);
|
|
96
|
+
if (!known.has(candidate) || seen.has(candidate)) continue;
|
|
97
|
+
seen.add(candidate);
|
|
98
|
+
out.push(candidate);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|