@agentprojectcontext/apx 1.80.2 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +134 -0
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -2,8 +2,18 @@ import listProjects from "./handlers/list-projects.js";
|
|
|
2
2
|
import listAgents from "./handlers/list-agents.js";
|
|
3
3
|
import listVaultAgents from "./handlers/list-vault-agents.js";
|
|
4
4
|
import importAgent from "./handlers/import-agent.js";
|
|
5
|
+
import createAgent from "./handlers/create-agent.js";
|
|
6
|
+
import setAgentPrompt from "./handlers/set-agent-prompt.js";
|
|
7
|
+
import writeAgentMemory from "./handlers/write-agent-memory.js";
|
|
8
|
+
import configureAgent from "./handlers/configure-agent.js";
|
|
9
|
+
import removeAgent from "./handlers/remove-agent.js";
|
|
10
|
+
import addMcp from "./handlers/add-mcp.js";
|
|
11
|
+
import completeTask from "./handlers/complete-task.js";
|
|
12
|
+
import commentTask from "./handlers/comment-task.js";
|
|
13
|
+
import markCommitment from "./handlers/mark-commitment.js";
|
|
5
14
|
import addProject from "./handlers/add-project.js";
|
|
6
15
|
import listMcps from "./handlers/list-mcps.js";
|
|
16
|
+
import listMcpTools from "./handlers/list-mcp-tools.js";
|
|
7
17
|
import readAgentMemory from "./handlers/read-agent-memory.js";
|
|
8
18
|
import remember from "./handlers/remember.js";
|
|
9
19
|
import readSelfMemory from "./handlers/read-self-memory.js";
|
|
@@ -25,12 +35,17 @@ import setPermissionMode from "./handlers/set-permission-mode.js";
|
|
|
25
35
|
import searchFiles from "./handlers/search-files.js";
|
|
26
36
|
import listSkills from "./handlers/list-skills.js";
|
|
27
37
|
import loadSkill from "./handlers/load-skill.js";
|
|
38
|
+
import readSkill from "./handlers/read-skill.js";
|
|
39
|
+
import attachMedia from "./handlers/attach-media.js";
|
|
40
|
+
import viewMedia from "./handlers/view-media.js";
|
|
28
41
|
import transcribeAudio from "./handlers/transcribe-audio.js";
|
|
29
42
|
import askQuestions from "./handlers/ask-questions.js";
|
|
30
43
|
import createTask from "./handlers/create-task.js";
|
|
31
44
|
import recordCommitment from "./handlers/record-commitment.js";
|
|
32
45
|
import listCommitments from "./handlers/list-commitments.js";
|
|
33
46
|
import rememberRoutine from "./handlers/remember-routine.js";
|
|
47
|
+
import listRoutines from "./handlers/list-routines.js";
|
|
48
|
+
import runRoutine from "./handlers/run-routine.js";
|
|
34
49
|
import listTasks from "./handlers/list-tasks.js";
|
|
35
50
|
import discoverTools from "./handlers/discover-tools.js";
|
|
36
51
|
import gitStatus from "./handlers/git-status.js";
|
|
@@ -43,6 +58,10 @@ import asanaCreateTask from "./handlers/asana-create-task.js";
|
|
|
43
58
|
import asanaUpdateTask from "./handlers/asana-update-task.js";
|
|
44
59
|
import githubListRepos from "./handlers/github-list-repos.js";
|
|
45
60
|
import githubCreateIssue from "./handlers/github-create-issue.js";
|
|
61
|
+
import calendarListEvents from "./handlers/calendar-list-events.js";
|
|
62
|
+
import calendarFindSlot from "./handlers/calendar-find-slot.js";
|
|
63
|
+
import calendarCreateEvent from "./handlers/calendar-create-event.js";
|
|
64
|
+
import calendarUpdateEvent from "./handlers/calendar-update-event.js";
|
|
46
65
|
import obsidianSearchNotes from "./handlers/obsidian-search-notes.js";
|
|
47
66
|
import obsidianReadNote from "./handlers/obsidian-read-note.js";
|
|
48
67
|
import obsidianWriteNote from "./handlers/obsidian-write-note.js";
|
|
@@ -57,8 +76,17 @@ const NATIVE_TOOLS = [
|
|
|
57
76
|
listAgents,
|
|
58
77
|
listVaultAgents,
|
|
59
78
|
importAgent,
|
|
79
|
+
createAgent,
|
|
80
|
+
setAgentPrompt,
|
|
81
|
+
writeAgentMemory,
|
|
82
|
+
configureAgent,
|
|
83
|
+
removeAgent,
|
|
84
|
+
addMcp,
|
|
85
|
+
completeTask,
|
|
86
|
+
markCommitment,
|
|
60
87
|
addProject,
|
|
61
88
|
listMcps,
|
|
89
|
+
listMcpTools,
|
|
62
90
|
readAgentMemory,
|
|
63
91
|
remember,
|
|
64
92
|
readSelfMemory,
|
|
@@ -80,13 +108,19 @@ const NATIVE_TOOLS = [
|
|
|
80
108
|
searchFiles,
|
|
81
109
|
listSkills,
|
|
82
110
|
loadSkill,
|
|
111
|
+
readSkill,
|
|
112
|
+
attachMedia,
|
|
113
|
+
viewMedia,
|
|
83
114
|
transcribeAudio,
|
|
84
115
|
askQuestions,
|
|
85
116
|
createTask,
|
|
117
|
+
commentTask,
|
|
86
118
|
listTasks,
|
|
87
119
|
recordCommitment,
|
|
88
120
|
listCommitments,
|
|
89
121
|
rememberRoutine,
|
|
122
|
+
listRoutines,
|
|
123
|
+
runRoutine,
|
|
90
124
|
discoverTools,
|
|
91
125
|
gitStatus,
|
|
92
126
|
gitDiff,
|
|
@@ -105,6 +139,10 @@ const NATIVE_TOOLS = [
|
|
|
105
139
|
obsidianReadNote,
|
|
106
140
|
obsidianWriteNote,
|
|
107
141
|
obsidianListNotes,
|
|
142
|
+
calendarListEvents,
|
|
143
|
+
calendarFindSlot,
|
|
144
|
+
calendarCreateEvent,
|
|
145
|
+
calendarUpdateEvent,
|
|
108
146
|
];
|
|
109
147
|
|
|
110
148
|
// Registry-backed bridges. Categories can be overridden per-process via env
|
|
@@ -141,6 +179,10 @@ export const BASE_TOOL_NAMES = new Set([
|
|
|
141
179
|
TOOLS.LIST_MCPS,
|
|
142
180
|
TOOLS.LIST_SKILLS,
|
|
143
181
|
TOOLS.LOAD_SKILL,
|
|
182
|
+
// A skill shown "loaded on demand" is useless without the tool that pages it,
|
|
183
|
+
// so read_skill is hot everywhere load_skill is (project agents on chat
|
|
184
|
+
// channels rely on it to reach a lazy skill's sections).
|
|
185
|
+
TOOLS.READ_SKILL,
|
|
144
186
|
// Memory + identity.
|
|
145
187
|
TOOLS.READ_AGENT_MEMORY,
|
|
146
188
|
TOOLS.READ_SELF_MEMORY,
|
|
@@ -161,11 +203,28 @@ export const BASE_TOOL_NAMES = new Set([
|
|
|
161
203
|
// Tasks (very common ask via chat).
|
|
162
204
|
TOOLS.CREATE_TASK,
|
|
163
205
|
TOOLS.LIST_TASKS,
|
|
206
|
+
// The write-back half. It was left out and the asymmetry bit: on Telegram the
|
|
207
|
+
// model could open a task and list it but not close one, so — seeing the name
|
|
208
|
+
// in the lazy-tools block and no schema — it invented the call. It passed
|
|
209
|
+
// `id`, which is what list_tasks hands back, against a schema that says
|
|
210
|
+
// `task`, and spent three iterations on "task required" before giving up with
|
|
211
|
+
// the task still open. A pair where one half is hot and the other is cold is
|
|
212
|
+
// a pair the model will guess its way across.
|
|
213
|
+
TOOLS.COMPLETE_TASK,
|
|
214
|
+
// Same argument as the pair above, one step further: an agent that just did
|
|
215
|
+
// the work is the one with something to say about it, and a note it has to
|
|
216
|
+
// discover first is a note it will not write. Cheap schema, and it keeps the
|
|
217
|
+
// task verbs a single hot group instead of three hot and one cold.
|
|
218
|
+
TOOLS.COMMENT_TASK,
|
|
164
219
|
// Commitments. In the base set on purpose: a promise is caught in passing
|
|
165
220
|
// ("le dije a Ana que el viernes"), and a tool the model has to discover
|
|
166
221
|
// first is a tool it will not reach for mid-sentence.
|
|
167
222
|
TOOLS.RECORD_COMMITMENT,
|
|
168
223
|
TOOLS.LIST_COMMITMENTS,
|
|
224
|
+
// Same pairing, same reason: a promise you can record but never resolve rots
|
|
225
|
+
// in the watcher's signal list forever (secretary-watch has been reporting
|
|
226
|
+
// one dead commitment from July 2025 on every run since August).
|
|
227
|
+
TOOLS.MARK_COMMITMENT,
|
|
169
228
|
// Files + basic shell — frequent enough on chat to keep hot.
|
|
170
229
|
TOOLS.READ_FILE,
|
|
171
230
|
TOOLS.WRITE_FILE,
|
|
@@ -204,9 +263,21 @@ const NATIVE_CATEGORY = {
|
|
|
204
263
|
[TOOLS.LIST_AGENTS]: "inventory",
|
|
205
264
|
[TOOLS.LIST_VAULT_AGENTS]: "inventory",
|
|
206
265
|
[TOOLS.LIST_MCPS]: "inventory",
|
|
266
|
+
[TOOLS.LIST_MCP_TOOLS]: "mcp",
|
|
207
267
|
[TOOLS.LIST_SKILLS]: "inventory",
|
|
208
268
|
[TOOLS.LOAD_SKILL]: "skills",
|
|
269
|
+
[TOOLS.READ_SKILL]: "skills",
|
|
270
|
+
[TOOLS.ATTACH_MEDIA]: "skills",
|
|
271
|
+
[TOOLS.VIEW_MEDIA]: "skills",
|
|
209
272
|
[TOOLS.IMPORT_AGENT]: "agents",
|
|
273
|
+
[TOOLS.CREATE_AGENT]: "agents",
|
|
274
|
+
[TOOLS.SET_AGENT_PROMPT]: "agents",
|
|
275
|
+
[TOOLS.WRITE_AGENT_MEMORY]: "agents",
|
|
276
|
+
[TOOLS.CONFIGURE_AGENT]: "agents",
|
|
277
|
+
[TOOLS.REMOVE_AGENT]: "agents",
|
|
278
|
+
[TOOLS.ADD_MCP]: "mcp",
|
|
279
|
+
[TOOLS.COMPLETE_TASK]: "tasks",
|
|
280
|
+
[TOOLS.MARK_COMMITMENT]: "tasks",
|
|
210
281
|
[TOOLS.ADD_PROJECT]: "projects",
|
|
211
282
|
[TOOLS.CALL_AGENT]: "agents",
|
|
212
283
|
[TOOLS.RUN_SUBAGENT]: "agents",
|
|
@@ -223,6 +294,9 @@ const NATIVE_CATEGORY = {
|
|
|
223
294
|
[TOOLS.ASK_QUESTIONS]: "conversation",
|
|
224
295
|
[TOOLS.CREATE_TASK]: "tasks",
|
|
225
296
|
[TOOLS.LIST_TASKS]: "tasks",
|
|
297
|
+
[TOOLS.COMMENT_TASK]: "tasks",
|
|
298
|
+
[TOOLS.LIST_ROUTINES]: "routines",
|
|
299
|
+
[TOOLS.RUN_ROUTINE]: "routines",
|
|
226
300
|
[TOOLS.TRANSCRIBE_AUDIO]: "voice",
|
|
227
301
|
[TOOLS.READ_FILE]: "files",
|
|
228
302
|
[TOOLS.WRITE_FILE]: "files",
|
|
@@ -426,3 +500,8 @@ export function makeToolHandlers(ctx) {
|
|
|
426
500
|
export function listBridgedToolNames() {
|
|
427
501
|
return BRIDGED_TOOLS.map(t => t.name);
|
|
428
502
|
}
|
|
503
|
+
|
|
504
|
+
/** Every name the loop can actually call this process (native + bridged). */
|
|
505
|
+
export function listCallableToolNames() {
|
|
506
|
+
return ALL_TOOLS.map((t) => t.name);
|
|
507
|
+
}
|
|
@@ -64,13 +64,28 @@ export function extractPseudoToolCalls(text) {
|
|
|
64
64
|
// run-agent loop then treats them identically.
|
|
65
65
|
const llamaCalls = extractLlamaDottedFunctionCalls(text);
|
|
66
66
|
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
67
|
+
// DeepSeek (and some OpenAI-compatible gateways) dump native tool markup
|
|
68
|
+
// as prose instead of filling `tool_calls`. The wire shape looks like:
|
|
69
|
+
//
|
|
70
|
+
// <||DSML||tool_calls>
|
|
71
|
+
// <||DSML||invoke name="read_file">
|
|
72
|
+
// <||DSML||parameter name="path" string="true">notes.md</||DSML||parameter>
|
|
73
|
+
// </||DSML||invoke>
|
|
74
|
+
// </||DSML||tool_calls>
|
|
75
|
+
//
|
|
76
|
+
// Without this pass the loop treats the blob as the final answer, the
|
|
77
|
+
// files never get read, and the operator sees XML in the routine preview.
|
|
78
|
+
const dsmlCalls = extractDsmlToolCalls(text);
|
|
79
|
+
|
|
80
|
+
// `[tool call: NAME] {…json…}` and `[tool NAME] {…json…}` — APX's own
|
|
81
|
+
// internal transcriptions of a tool call. The first used to be written into
|
|
82
|
+
// Gemini history when a turn had no thought signature to replay; the second
|
|
83
|
+
// is how the message store rendered tool records between 2026-08-19 and
|
|
84
|
+
// 2026-08-26. Models copied the format out of their own history and started
|
|
85
|
+
// writing calls instead of making them, and the line was delivered to the
|
|
86
|
+
// user verbatim. Neither shape is in the history any more, but a model that
|
|
87
|
+
// already learned it (or any model that invents it) must have the call
|
|
88
|
+
// EXECUTED rather than printed.
|
|
74
89
|
const bracketCalls = extractBracketToolCalls(text);
|
|
75
90
|
|
|
76
91
|
// Second pass: balanced `{name, arguments}` JSON anywhere in the text.
|
|
@@ -99,6 +114,7 @@ export function extractPseudoToolCalls(text) {
|
|
|
99
114
|
// captured — otherwise we'd double-fire the tool.
|
|
100
115
|
const insideLlamaWrap =
|
|
101
116
|
llamaCalls.some((lc) => lc._rawStart <= i && balanced.end <= lc._rawEnd) ||
|
|
117
|
+
dsmlCalls.some((dc) => dc._rawStart <= i && balanced.end <= dc._rawEnd) ||
|
|
102
118
|
bracketCalls.some((bc) => bc._rawStart <= i && balanced.end <= bc._rawEnd);
|
|
103
119
|
if (insideLlamaWrap) {
|
|
104
120
|
i = balanced.end - 1;
|
|
@@ -117,17 +133,76 @@ export function extractPseudoToolCalls(text) {
|
|
|
117
133
|
// Strip internal markers used to dedupe against JSON pass.
|
|
118
134
|
return [
|
|
119
135
|
...llamaCalls.map(({ _rawStart, _rawEnd, ...rest }) => rest),
|
|
136
|
+
...dsmlCalls.map(({ _rawStart, _rawEnd, ...rest }) => rest),
|
|
120
137
|
...bracketCalls.map(({ _rawStart, _rawEnd, ...rest }) => rest),
|
|
121
138
|
...jsonCalls,
|
|
122
139
|
];
|
|
123
140
|
}
|
|
124
141
|
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
//
|
|
142
|
+
// DeepSeek DSML markup. Tags use one or two pipes (`|DSML|` / `||DSML||`).
|
|
143
|
+
// Each invoke becomes one pseudo-tool-call; parameter bodies stay strings
|
|
144
|
+
// unless they parse as JSON (so `{"a":1}` still arrives as an object).
|
|
145
|
+
export function extractDsmlToolCalls(text) {
|
|
146
|
+
if (!text || typeof text !== "string" || !/DSML/i.test(text)) return [];
|
|
147
|
+
const out = [];
|
|
148
|
+
const openRe = /<\|{1,2}DSML\|{1,2}invoke\s+name="([^"]+)"\s*>/gi;
|
|
149
|
+
let m;
|
|
150
|
+
while ((m = openRe.exec(text)) !== null) {
|
|
151
|
+
const name = m[1];
|
|
152
|
+
const start = m.index;
|
|
153
|
+
const afterOpen = start + m[0].length;
|
|
154
|
+
const closeRe = /<\/\|{1,2}DSML\|{1,2}invoke>/i;
|
|
155
|
+
const closeMatch = closeRe.exec(text.slice(afterOpen));
|
|
156
|
+
const innerEnd = closeMatch ? afterOpen + closeMatch.index : text.length;
|
|
157
|
+
const end = closeMatch ? innerEnd + closeMatch[0].length : innerEnd;
|
|
158
|
+
const inner = text.slice(afterOpen, innerEnd);
|
|
159
|
+
const args = {};
|
|
160
|
+
const paramRe =
|
|
161
|
+
/<\|{1,2}DSML\|{1,2}parameter\s+name="([^"]+)"[^>]*>([\s\S]*?)<\/\|{1,2}DSML\|{1,2}parameter>/gi;
|
|
162
|
+
let p;
|
|
163
|
+
while ((p = paramRe.exec(inner)) !== null) {
|
|
164
|
+
args[p[1]] = coerceDsmlValue(p[2].trim());
|
|
165
|
+
}
|
|
166
|
+
out.push({
|
|
167
|
+
id: nextId(),
|
|
168
|
+
type: "function",
|
|
169
|
+
function: { name, arguments: args },
|
|
170
|
+
_pseudo: true,
|
|
171
|
+
_raw: text.slice(start, end),
|
|
172
|
+
_rawStart: start,
|
|
173
|
+
_rawEnd: end,
|
|
174
|
+
});
|
|
175
|
+
openRe.lastIndex = end;
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function coerceDsmlValue(raw) {
|
|
181
|
+
if (raw === "") return "";
|
|
182
|
+
if (raw === "true") return true;
|
|
183
|
+
if (raw === "false") return false;
|
|
184
|
+
if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw);
|
|
185
|
+
if ((raw.startsWith("{") && raw.endsWith("}")) || (raw.startsWith("[") && raw.endsWith("]"))) {
|
|
186
|
+
try { return JSON.parse(raw); } catch { /* keep the string */ }
|
|
187
|
+
}
|
|
188
|
+
return raw;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Parse `[tool call: NAME] {…}` and the bare `[tool NAME] {…}` — see the note
|
|
192
|
+
// in extractPseudoToolCalls. `_raw` spans the bracket, its argument object AND
|
|
193
|
+
// any `→ …` result copied along with it, so the whole line is removed from the
|
|
194
|
+
// visible text, not just the JSON half.
|
|
128
195
|
function extractBracketToolCalls(text) {
|
|
129
196
|
const out = [];
|
|
130
|
-
|
|
197
|
+
// Two shapes. `[tool call: NAME]` (also `[tool_call:`, `[tool:`) is the one
|
|
198
|
+
// models invent. The bare `[tool NAME]` is APX's own — the message store
|
|
199
|
+
// rendered history that way for a week, and gemini-3.7-flash copied it
|
|
200
|
+
// fourteen times in a day. It counts as a call only when an argument object
|
|
201
|
+
// follows: `[tool run_shell] no anduvo` is prose about a tool, not a call.
|
|
202
|
+
// `[tool result: NAME]` matches NEITHER, deliberately — it annotates a past
|
|
203
|
+
// record, and re-running someone's old shell command is not a recovery.
|
|
204
|
+
const re =
|
|
205
|
+
/\[tool(?:[ _]call)?:\s*([a-zA-Z_][a-zA-Z0-9_]*)\]\s*|\[tool[ _]+([a-zA-Z_][a-zA-Z0-9_]*)\]\s*(?=\{)/g;
|
|
131
206
|
let m;
|
|
132
207
|
while ((m = re.exec(text)) !== null) {
|
|
133
208
|
const argsStart = m.index + m[0].length;
|
|
@@ -143,9 +218,14 @@ function extractBracketToolCalls(text) {
|
|
|
143
218
|
end = balanced.end;
|
|
144
219
|
}
|
|
145
220
|
}
|
|
221
|
+
// A model copying a record copies the whole thing, result included:
|
|
222
|
+
// `[tool run_shell] {…} → <output>`. That tail is a stale result being
|
|
223
|
+
// passed off as a fresh one; the real one arrives when the call runs.
|
|
224
|
+
const tail = text.slice(end).match(/^[ \t]*(?:→|->|=>)[^\n]*/);
|
|
225
|
+
if (tail) end += tail[0].length;
|
|
146
226
|
out.push({
|
|
147
227
|
id: nextId(),
|
|
148
|
-
function: { name: m[1], arguments: args },
|
|
228
|
+
function: { name: m[1] || m[2], arguments: args },
|
|
149
229
|
_pseudo: true,
|
|
150
230
|
_raw: text.slice(m.index, end),
|
|
151
231
|
_rawStart: m.index,
|
|
@@ -269,6 +349,32 @@ export function extractBareFunctionCalls(text, knownNames) {
|
|
|
269
349
|
}
|
|
270
350
|
return out;
|
|
271
351
|
}
|
|
352
|
+
// APX's own context annotation for a past tool result, in every spelling a
|
|
353
|
+
// model reaches for when it copies the shape instead of calling the tool:
|
|
354
|
+
// `[tool result: run_shell]`, `[result: shell]`, `[tool_result: shell]`. The
|
|
355
|
+
// name is bounded so an ordinary bracketed sentence is not swallowed.
|
|
356
|
+
const TOOL_LOG_NAME = String.raw`\[(?:tool[\s_-]*)?results?\s*[:\-]\s*[a-z0-9_.\- ]{1,40}\]`;
|
|
357
|
+
/** The whole line, when the line IS the annotation. */
|
|
358
|
+
const TOOL_LOG_LINE = new RegExp(String.raw`^[ \t]*${TOOL_LOG_NAME}[^\n]*$`, "gim");
|
|
359
|
+
/** Just the prefix, so a human sentence around it survives. */
|
|
360
|
+
const TOOL_LOG_PREFIX = new RegExp(String.raw`${TOOL_LOG_NAME}\s*`, "gi");
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Does this text CLAIM tool results that no tool produced?
|
|
364
|
+
*
|
|
365
|
+
* The loop calls this on a turn that emitted zero tool calls. Two or more
|
|
366
|
+
* annotation lines is not a model quoting its history in passing, it is a model
|
|
367
|
+
* writing the transcript it was supposed to generate — and the sentence after
|
|
368
|
+
* them ("Listo, ya te lo mandé") is a report on work that never happened. There
|
|
369
|
+
* is nothing to recover here: the lines carry no structured call, and guessing
|
|
370
|
+
* a shell command out of hallucinated prose and running it would be far worse
|
|
371
|
+
* than asking the model to do the work for real.
|
|
372
|
+
*/
|
|
373
|
+
export function looksLikeFabricatedToolLog(text) {
|
|
374
|
+
if (!text || typeof text !== "string") return false;
|
|
375
|
+
return (String(text).match(TOOL_LOG_PREFIX) || []).length >= 2;
|
|
376
|
+
}
|
|
377
|
+
|
|
272
378
|
export function cleanTextOfPseudoToolCalls(text, knownNames) {
|
|
273
379
|
if (!text || typeof text !== "string") return text;
|
|
274
380
|
|
|
@@ -291,7 +397,22 @@ export function cleanTextOfPseudoToolCalls(text, knownNames) {
|
|
|
291
397
|
for (const call of extractBareFunctionCalls(out, knownNames)) {
|
|
292
398
|
if (call._raw) out = out.replace(call._raw, "");
|
|
293
399
|
}
|
|
294
|
-
|
|
400
|
+
// APX's own history annotation: `[tool result: <name>] (<call>) → <result>`.
|
|
401
|
+
// A line that IS the annotation goes whole — the prefix used to be stripped
|
|
402
|
+
// on its own, which left `(command=…) → ==> …` standing there as the answer.
|
|
403
|
+
// Mid-sentence the prefix alone still goes, so the human half survives.
|
|
404
|
+
//
|
|
405
|
+
// Matched loosely, because a model copying the shape out of its history does
|
|
406
|
+
// not copy it exactly. The turn that shipped on 2026-08-29 wrote `[result:
|
|
407
|
+
// shell]` — no "tool", and the tool's real name is `run_shell` — five times,
|
|
408
|
+
// each followed by a made-up command and a made-up output, and the strict
|
|
409
|
+
// pattern let every line through. `[tool_result: x]`, `[results: x]` and
|
|
410
|
+
// `[result - x]` are the same copy with a different slip.
|
|
411
|
+
out = out.replace(TOOL_LOG_LINE, "");
|
|
412
|
+
out = out.replace(TOOL_LOG_PREFIX, "");
|
|
413
|
+
// The same for the bare `[tool <name>]` form once its call has been lifted
|
|
414
|
+
// out above: what is left is bookkeeping, never something to say.
|
|
415
|
+
out = out.replace(/^[ \t]*\[tool[ _]+[a-z_][a-z0-9_]*\][^\n]*$/gim, "");
|
|
295
416
|
// …and the history annotation the message store substitutes for a stale
|
|
296
417
|
// answer (`sanitizeAssistantForContext`). It describes a turn; it is never
|
|
297
418
|
// something to say to the user.
|
|
@@ -299,6 +420,8 @@ export function cleanTextOfPseudoToolCalls(text, knownNames) {
|
|
|
299
420
|
// Some models emit a stray `</function>` after the args without the
|
|
300
421
|
// opening tag — sweep those too.
|
|
301
422
|
out = out.replace(/<\/?function(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?>/gi, "");
|
|
423
|
+
// Leftover DSML wrappers after the invoke spans were removed.
|
|
424
|
+
out = out.replace(/<\/?\|{1,2}DSML\|{1,2}[^>]*>/gi, "");
|
|
302
425
|
|
|
303
426
|
// Tidy up whitespace & blank lines
|
|
304
427
|
out = out.replace(/\n{3,}/g, "\n\n").trim();
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Vision bridge: turn attached photos into a short text description for models
|
|
2
|
+
// that cannot see pixels (zen:big-pickle and most free Zen models, etc.).
|
|
3
|
+
//
|
|
4
|
+
// Gemini already renders `m.images` as inlineData. OpenAI/Anthropic wire them
|
|
5
|
+
// as multimodal parts. Zen free models advertise chat but not vision — sending
|
|
6
|
+
// raw image_url often 400s or is ignored, and the agent roleplays "I can't see
|
|
7
|
+
// the photo". Bridging once with a vision model and folding the description
|
|
8
|
+
// into the prompt is what makes Candela actually react to a gym selfie.
|
|
9
|
+
import { callEngine } from "#core/engines/index.js";
|
|
10
|
+
import { modelWiresVision } from "#core/agent/model-capabilities.js";
|
|
11
|
+
|
|
12
|
+
const DEFAULT_VISION_MODEL = "gemini:gemini-2.0-flash";
|
|
13
|
+
|
|
14
|
+
const BRIDGE_SYSTEM =
|
|
15
|
+
"You describe photos for another AI that cannot see them. Be concrete: who/what, " +
|
|
16
|
+
"clothing, pose, setting, expression. 3–6 sentences. No preamble, no 'the image shows'.";
|
|
17
|
+
|
|
18
|
+
/** Backward-compatible name used by the turn builder. */
|
|
19
|
+
export const providerWiresVision = modelWiresVision;
|
|
20
|
+
|
|
21
|
+
export function visionBridgeModel(globalConfig) {
|
|
22
|
+
const configured = globalConfig?.super_agent?.vision_bridge_model;
|
|
23
|
+
if (typeof configured === "string" && configured.includes(":")) return configured;
|
|
24
|
+
// Prefer an explicit has_image routing target if the operator already named one.
|
|
25
|
+
const rules = globalConfig?.super_agent?.routing?.rules;
|
|
26
|
+
if (Array.isArray(rules)) {
|
|
27
|
+
for (const r of rules) {
|
|
28
|
+
if (r?.when?.has_image === true && typeof r.model === "string" && r.model.includes(":")) {
|
|
29
|
+
return r.model;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return DEFAULT_VISION_MODEL;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Describe turn images with a vision model. Returns null on failure (no key,
|
|
38
|
+
* model down) so the caller can keep going with the path marker alone.
|
|
39
|
+
*/
|
|
40
|
+
export async function describeTurnImages(images, globalConfig, { signal } = {}) {
|
|
41
|
+
const usable = (images || []).filter((im) => im && im.data && im.mime);
|
|
42
|
+
if (!usable.length) return null;
|
|
43
|
+
const modelId = visionBridgeModel(globalConfig);
|
|
44
|
+
try {
|
|
45
|
+
const result = await callEngine({
|
|
46
|
+
modelId,
|
|
47
|
+
system: BRIDGE_SYSTEM,
|
|
48
|
+
messages: [{
|
|
49
|
+
role: "user",
|
|
50
|
+
content: usable.length === 1 ? "Describe this photo." : `Describe these ${usable.length} photos.`,
|
|
51
|
+
images: usable.map((im) => ({ data: im.data, mime: im.mime })),
|
|
52
|
+
}],
|
|
53
|
+
config: globalConfig,
|
|
54
|
+
maxTokens: 500,
|
|
55
|
+
signal,
|
|
56
|
+
});
|
|
57
|
+
const text = (result.text || "").trim();
|
|
58
|
+
return text || null;
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Fold a bridge description into the prompt the text model will read. */
|
|
65
|
+
export function withImageDescription(prompt, description) {
|
|
66
|
+
if (!description) return prompt;
|
|
67
|
+
const block = `[Attached photo — you cannot see pixels; this is what it shows:\n${description}\n]`;
|
|
68
|
+
return prompt ? `${prompt}\n\n${block}` : block;
|
|
69
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// An agent's visual and organisational identity: its avatar blob and its
|
|
2
|
+
// typology.
|
|
3
|
+
//
|
|
4
|
+
// WHY THESE LIVE IN CORE. Both used to be web-only knowledge — the blob keys in
|
|
5
|
+
// `blobPresets.ts` and the five typologies hardcoded in `AgentDetailScreen.tsx`.
|
|
6
|
+
// So an agent created from the web got a face and a type, and the same agent
|
|
7
|
+
// created from the CLI, the MCP server or the super-agent got neither: it
|
|
8
|
+
// rendered as a grey lettered disc and carried no typology at all. The surfaces
|
|
9
|
+
// that create agents are not all in the browser, so the vocabulary can't be.
|
|
10
|
+
|
|
11
|
+
// Blob keys come from ./blob-keys.js, which `scripts/export_web_assets.py`
|
|
12
|
+
// generates alongside the renderer's blobPresets.ts — one generator, two
|
|
13
|
+
// consumers. `tests/agent-blob-parity.test.js` fails if the two ever drift.
|
|
14
|
+
export { BLOB_KEYS } from "./blob-keys.js";
|
|
15
|
+
import { BLOB_KEYS } from "./blob-keys.js";
|
|
16
|
+
|
|
17
|
+
/** Default super-agent avatar. Users may override it with super_agent.icon. */
|
|
18
|
+
export const SUPER_AGENT_BLOB = "noche";
|
|
19
|
+
|
|
20
|
+
export function isBlobKey(v) {
|
|
21
|
+
return typeof v === "string" && BLOB_KEYS.includes(v);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Resolve a safe super-agent avatar from global config. */
|
|
25
|
+
export function resolveSuperAgentBlob(config) {
|
|
26
|
+
return isBlobKey(config?.super_agent?.icon) ? config.super_agent.icon : SUPER_AGENT_BLOB;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Choose an avatar for a new agent.
|
|
31
|
+
*
|
|
32
|
+
* Random, but not naively so: it draws from the blobs this project isn't
|
|
33
|
+
* already using, so a team of six has six distinguishable faces instead of the
|
|
34
|
+
* same one three times over — which is the whole point of having an avatar. Once
|
|
35
|
+
* every blob is taken it falls back to the full list, since a repeat beats no
|
|
36
|
+
* face at all.
|
|
37
|
+
*
|
|
38
|
+
* @param taken blob keys already in use in this project
|
|
39
|
+
* @param rng injectable [0,1) source, for deterministic tests
|
|
40
|
+
*/
|
|
41
|
+
export function pickBlob({ taken = [], rng = Math.random } = {}) {
|
|
42
|
+
const used = new Set([SUPER_AGENT_BLOB, ...taken.filter(isBlobKey)]);
|
|
43
|
+
const free = BLOB_KEYS.filter((k) => !used.has(k));
|
|
44
|
+
const pool = free.length > 0 ? free : BLOB_KEYS.filter((k) => k !== SUPER_AGENT_BLOB);
|
|
45
|
+
return pool[Math.floor(rng() * pool.length) % pool.length];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Agent typologies. The value is what lands in `Type:` frontmatter; the label
|
|
50
|
+
* and description are what the web shows in its picker.
|
|
51
|
+
*
|
|
52
|
+
* `orchestrator` also implies master: the web sets `is_master` when the type is
|
|
53
|
+
* orchestrator, and the daemon does the same on create, so the hierarchy view
|
|
54
|
+
* and the typology can't disagree.
|
|
55
|
+
*/
|
|
56
|
+
export const AGENT_TYPES = Object.freeze([
|
|
57
|
+
{ value: "orchestrator", label: "Orchestrator", description: "Coordinates the team and delegates." },
|
|
58
|
+
{ value: "specialist", label: "Specialist", description: "Domain expert; runs tasks." },
|
|
59
|
+
{ value: "assistant", label: "Assistant", description: "Conversational helper." },
|
|
60
|
+
{ value: "worker", label: "Worker", description: "Runs autonomous tasks." },
|
|
61
|
+
{ value: "monitor", label: "Monitor", description: "Watches state and reports." },
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
export const AGENT_TYPE_VALUES = Object.freeze(AGENT_TYPES.map((t) => t.value));
|
|
65
|
+
|
|
66
|
+
export function isAgentType(v) {
|
|
67
|
+
return typeof v === "string" && AGENT_TYPE_VALUES.includes(v);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Lowercase and validate. Returns null for empty/unknown input. */
|
|
71
|
+
export function normalizeAgentType(v) {
|
|
72
|
+
const s = String(v || "").trim().toLowerCase();
|
|
73
|
+
return isAgentType(s) ? s : null;
|
|
74
|
+
}
|