@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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Repointing every LIVE reference to an agent's slug, in one place.
|
|
2
|
+
//
|
|
3
|
+
// The slug is the agent's physical key: it names the definition file and the
|
|
4
|
+
// runtime dir (agent-write.js moves those), but it is ALSO written into stores
|
|
5
|
+
// that live nowhere near the agent — a group roster, a Telegram route, a task's
|
|
6
|
+
// assignee, a delivery waiting to be crossed off. Moving the files and stopping
|
|
7
|
+
// there is what made a rename look successful and quietly break half the
|
|
8
|
+
// install: the agent kept its chats and lost its rooms, its telegram channel,
|
|
9
|
+
// its queue and its open tasks.
|
|
10
|
+
//
|
|
11
|
+
// The line this module draws: a POINTER is repointed, a RECORD is not.
|
|
12
|
+
// pointer — something that has to resolve to a live agent for the system to
|
|
13
|
+
// work (roster, route, assignee, queue key, RAG scope). Repointed.
|
|
14
|
+
// record — something that says what happened at a moment (`agent_slug` on a
|
|
15
|
+
// ledger row, the attribution on a past turn, a2a thread keys).
|
|
16
|
+
// Left alone: rewriting it would falsify history, and nothing
|
|
17
|
+
// resolves it to act.
|
|
18
|
+
//
|
|
19
|
+
// Everything here is best-effort per store: a project with no routines, no
|
|
20
|
+
// queue or no telegram config is the normal case, and one unreadable store must
|
|
21
|
+
// never abort a rename that already moved files.
|
|
22
|
+
import fs from "node:fs";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
|
|
25
|
+
import { renameRoutineAgent } from "#core/stores/routines.js";
|
|
26
|
+
import { renameGroupParticipant } from "#core/stores/messages.js";
|
|
27
|
+
import { listTasks, patchTask } from "#core/stores/tasks.js";
|
|
28
|
+
import { renameDeliveryAgent } from "#core/stores/deliveries.js";
|
|
29
|
+
import { listCodeSessions, updateCodeSession } from "#core/stores/code-sessions.js";
|
|
30
|
+
import { readConfig, writeConfig } from "#core/config/index.js";
|
|
31
|
+
import { readJson, writeJson } from "#core/util/json-file.js";
|
|
32
|
+
import { apcProjectConfigFile } from "./paths.js";
|
|
33
|
+
|
|
34
|
+
/** Registry entries reach us either as daemon entries (`storagePath`) or as the
|
|
35
|
+
* `projects.list()` shape (`storage_path`). Accept both, drop the useless. */
|
|
36
|
+
function normalizeProjects(list) {
|
|
37
|
+
return (Array.isArray(list) ? list : [])
|
|
38
|
+
.map((e) => ({
|
|
39
|
+
id: e?.id,
|
|
40
|
+
path: e?.path || null,
|
|
41
|
+
storagePath: e?.storagePath || e?.storage_path || null,
|
|
42
|
+
}))
|
|
43
|
+
.filter((e) => e.storagePath || e.path);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const samePath = (a, b) => {
|
|
47
|
+
if (!a || !b) return false;
|
|
48
|
+
try { return path.resolve(a) === path.resolve(b); } catch { return false; }
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Repoint every live pointer that names `oldSlug` in this project.
|
|
53
|
+
*
|
|
54
|
+
* @param {{id?:any, path:string, storagePath?:string, apxId?:string}} project
|
|
55
|
+
* @param {string} oldSlug
|
|
56
|
+
* @param {string} newSlug
|
|
57
|
+
* @param {{projects?:object[]}} [opts] the daemon's registry, when the caller
|
|
58
|
+
* has one. It buys two things nothing else can: rooms hosted by ANOTHER
|
|
59
|
+
* project that include this agent, and knowing which project a Telegram
|
|
60
|
+
* channel without an explicit `project` would fall back to.
|
|
61
|
+
* @returns {Promise<Record<string, number>>} what moved, per store — the route
|
|
62
|
+
* logs it and the tests assert on it.
|
|
63
|
+
*/
|
|
64
|
+
export async function repointAgentReferences(project, oldSlug, newSlug, { projects = null } = {}) {
|
|
65
|
+
const storage = project?.storagePath || project?.path;
|
|
66
|
+
const registry = normalizeProjects(projects);
|
|
67
|
+
const moved = {
|
|
68
|
+
routines: 0, groups: 0, tasks: 0, deliveries: 0,
|
|
69
|
+
code_sessions: 0, telegram: 0, project_config: 0, memory_index: 0,
|
|
70
|
+
};
|
|
71
|
+
if (!storage || !oldSlug || !newSlug || oldSlug === newSlug) return moved;
|
|
72
|
+
|
|
73
|
+
// 1) Routines — `spec.agent` is what the scheduler executes.
|
|
74
|
+
try { moved.routines = renameRoutineAgent(storage, oldSlug, newSlug); } catch { /* no store */ }
|
|
75
|
+
|
|
76
|
+
// 2) Group rooms. The roster is the latest control row; here, plus any room
|
|
77
|
+
// hosted by another project whose `homes` map says this agent lives here.
|
|
78
|
+
try {
|
|
79
|
+
moved.groups += renameGroupParticipant(storage, oldSlug, newSlug, {
|
|
80
|
+
homeId: project?.id ?? null, hostId: project?.id ?? null,
|
|
81
|
+
});
|
|
82
|
+
} catch { /* no ledger */ }
|
|
83
|
+
for (const entry of registry) {
|
|
84
|
+
if (project?.id == null || String(entry.id) === String(project.id)) continue;
|
|
85
|
+
const otherStore = entry.storagePath || entry.path;
|
|
86
|
+
if (!otherStore || samePath(otherStore, storage)) continue;
|
|
87
|
+
try {
|
|
88
|
+
moved.groups += renameGroupParticipant(otherStore, oldSlug, newSlug, {
|
|
89
|
+
homeId: project.id, hostId: entry.id,
|
|
90
|
+
});
|
|
91
|
+
} catch { /* skip a project we cannot read */ }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 3) Tasks — the assignee, in every state. A done task assigned to this agent
|
|
95
|
+
// is still assigned to this agent; only its slug changed.
|
|
96
|
+
try {
|
|
97
|
+
for (const t of listTasks(storage, { state: "all", agent: oldSlug })) {
|
|
98
|
+
patchTask(storage, t.id, { agent: newSlug });
|
|
99
|
+
moved.tasks += 1;
|
|
100
|
+
}
|
|
101
|
+
} catch { /* no task log */ }
|
|
102
|
+
|
|
103
|
+
// 4) The delivery queue.
|
|
104
|
+
try { moved.deliveries = renameDeliveryAgent(storage, oldSlug, newSlug); } catch { /* no queue */ }
|
|
105
|
+
|
|
106
|
+
// 5) Code sessions owned by this agent.
|
|
107
|
+
try {
|
|
108
|
+
for (const s of listCodeSessions(storage)) {
|
|
109
|
+
if (s.agentSlug !== oldSlug) continue;
|
|
110
|
+
updateCodeSession(storage, s.id, { agentSlug: newSlug });
|
|
111
|
+
moved.code_sessions += 1;
|
|
112
|
+
}
|
|
113
|
+
} catch { /* no code sessions */ }
|
|
114
|
+
|
|
115
|
+
// 6) Telegram routing in the global config. A channel names its project by
|
|
116
|
+
// path, so only a channel pointing HERE is repointed — two projects may
|
|
117
|
+
// each own an agent with this slug. The bare `telegram.route_to_agent` is
|
|
118
|
+
// only live in env-only mode (resolveChannels falls back to it when no
|
|
119
|
+
// channels are configured), and it targets the first registered project.
|
|
120
|
+
try {
|
|
121
|
+
const cfg = readConfig();
|
|
122
|
+
const tg = cfg.telegram || {};
|
|
123
|
+
let touched = 0;
|
|
124
|
+
const channels = Array.isArray(tg.channels) ? tg.channels : [];
|
|
125
|
+
for (const c of channels) {
|
|
126
|
+
if (c?.route_to_agent === oldSlug && samePath(c.project, project?.path)) {
|
|
127
|
+
c.route_to_agent = newSlug;
|
|
128
|
+
touched += 1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (
|
|
132
|
+
!channels.length && tg.route_to_agent === oldSlug &&
|
|
133
|
+
registry.length && samePath(registry[0].path, project?.path)
|
|
134
|
+
) {
|
|
135
|
+
tg.route_to_agent = newSlug;
|
|
136
|
+
touched += 1;
|
|
137
|
+
}
|
|
138
|
+
if (touched) {
|
|
139
|
+
cfg.telegram = tg;
|
|
140
|
+
writeConfig(cfg);
|
|
141
|
+
moved.telegram = touched;
|
|
142
|
+
}
|
|
143
|
+
} catch { /* config unreadable — leave it alone */ }
|
|
144
|
+
|
|
145
|
+
// 7) The project's own `.apc/config.json`: its telegram override and any
|
|
146
|
+
// declarative routine. Project-scoped by definition, so no path matching.
|
|
147
|
+
try {
|
|
148
|
+
const file = apcProjectConfigFile(project.path);
|
|
149
|
+
if (fs.existsSync(file)) {
|
|
150
|
+
const cfg = readJson(file, null);
|
|
151
|
+
let touched = 0;
|
|
152
|
+
if (cfg && typeof cfg === "object") {
|
|
153
|
+
if (cfg.telegram?.route_to_agent === oldSlug) {
|
|
154
|
+
cfg.telegram.route_to_agent = newSlug;
|
|
155
|
+
touched += 1;
|
|
156
|
+
}
|
|
157
|
+
for (const r of Array.isArray(cfg.routines) ? cfg.routines : []) {
|
|
158
|
+
if (r?.agent === oldSlug) {
|
|
159
|
+
r.agent = newSlug;
|
|
160
|
+
touched += 1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (touched) {
|
|
164
|
+
writeJson(file, cfg);
|
|
165
|
+
moved.project_config = touched;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
} catch { /* not a valid project config */ }
|
|
170
|
+
|
|
171
|
+
// 8) The RAG index. Agent memory is indexed under `agent:<projdir>:<slug>`;
|
|
172
|
+
// the next pass re-indexes memory.md under the new key on its own, so what
|
|
173
|
+
// is left to do is DROP the old rows — otherwise they linger unreachable
|
|
174
|
+
// and, worse, get inherited by whoever takes that slug next.
|
|
175
|
+
// Imported lazily: agent-write is on the CLI's load path and the memory
|
|
176
|
+
// subsystem (sqlite, embedders) has no business being pulled in with it.
|
|
177
|
+
const apxId = project?.apxId || project?.apx_id || null;
|
|
178
|
+
if (apxId) {
|
|
179
|
+
try {
|
|
180
|
+
const { getMemoryStore } = await import("#core/memory/index.js");
|
|
181
|
+
const store = await getMemoryStore();
|
|
182
|
+
moved.memory_index = store?.dropChannel?.(`agent:${apxId}:${oldSlug}`) || 0;
|
|
183
|
+
} catch { /* memory disabled or unavailable */ }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return moved;
|
|
187
|
+
}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// Creating and re-prompting a project agent — the write side of the agent
|
|
2
|
+
// lifecycle, in ONE place (rule 8). The daemon route (host/daemon/api/agents.js)
|
|
3
|
+
// and the super-agent's `create_agent` / `set_agent_prompt` tools both call
|
|
4
|
+
// here, so slug validation, avatar assignment and field normalization can never
|
|
5
|
+
// drift between the surfaces.
|
|
6
|
+
//
|
|
7
|
+
// The super-agent used to have NO native way to build an agent: asked to create
|
|
8
|
+
// one, it shelled out to `apx agent add` (awkward for a long, multi-line system
|
|
9
|
+
// prompt) and, when that produced a body-less agent, patched over it by hand-
|
|
10
|
+
// writing the `.md` — the exact anti-pattern the apx-agent skill warns against.
|
|
11
|
+
// These functions are what the native tools stand on so that never has to happen.
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import { readAgents } from "#core/apc/parser.js";
|
|
15
|
+
import { apcAgentFile } from "#core/apc/paths.js";
|
|
16
|
+
import { writeAgentFile, ensureAgentDir, removeImportedAgent } from "#core/apc/scaffold.js";
|
|
17
|
+
import { ensureAgentRuntimeDir, agentMemoryPath, agentRuntimeDir, readAgentMemory, writeAgentMemory } from "#core/agent/memory.js";
|
|
18
|
+
import { isBlobKey, normalizeAgentType, pickBlob } from "#core/apc/agent-identity.js";
|
|
19
|
+
import { readOrganization, resolveAreaSlug } from "#core/stores/organization.js";
|
|
20
|
+
import { repointAgentReferences } from "./agent-rename-refs.js";
|
|
21
|
+
import { PERMISSION_MODES } from "#core/constants/permissions.js";
|
|
22
|
+
|
|
23
|
+
export const AGENT_SLUG_RE = /^[a-z][a-z0-9_-]*$/;
|
|
24
|
+
|
|
25
|
+
// Autonomy mirrors the super-agent permission modes (total/automatico/permiso).
|
|
26
|
+
// An invalid value is dropped rather than persisted so a typo can't silently
|
|
27
|
+
// widen an agent's autonomy.
|
|
28
|
+
const AUTONOMY_VALUES = new Set(Object.values(PERMISSION_MODES));
|
|
29
|
+
export function normalizeAutonomy(v) {
|
|
30
|
+
if (v === undefined) return undefined;
|
|
31
|
+
if (v === null || v === "") return null;
|
|
32
|
+
return AUTONOMY_VALUES.has(v) ? v : undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Build the frontmatter fields for a NEW agent from a loose spec. Throws on an
|
|
36
|
+
// invalid `type`. `roster` is the existing agent list, used to pick an avatar
|
|
37
|
+
// blob this project isn't already using so a team stays distinguishable.
|
|
38
|
+
export function buildNewAgentFields(projectPath, spec = {}, roster = []) {
|
|
39
|
+
const {
|
|
40
|
+
name, role, model, language, description, skills, tools,
|
|
41
|
+
is_master, parent, type, area, emoji, icon, autonomy,
|
|
42
|
+
} = spec;
|
|
43
|
+
const typeVal = normalizeAgentType(type);
|
|
44
|
+
if (type && !typeVal) throw new Error(`invalid type "${type}"`);
|
|
45
|
+
// Every agent gets a face. A caller that doesn't care (CLI, MCP, super-agent)
|
|
46
|
+
// leaves icon empty and one is picked from the blobs this project isn't using.
|
|
47
|
+
const iconVal = isBlobKey(icon)
|
|
48
|
+
? icon
|
|
49
|
+
: pickBlob({ taken: roster.map((a) => a.fields?.Icon).filter(Boolean) });
|
|
50
|
+
return {
|
|
51
|
+
Name: name || null,
|
|
52
|
+
Role: role || null,
|
|
53
|
+
Model: model || null,
|
|
54
|
+
Language: language || null,
|
|
55
|
+
Description: description || null,
|
|
56
|
+
Skills: skills || [],
|
|
57
|
+
// Omitted tools ⇒ leave the field UNDECLARED. A declared list is a
|
|
58
|
+
// deliberate narrowing that wins forever, so stamping a snapshot of "the
|
|
59
|
+
// defaults" at creation quietly freezes the agent. Undeclared means the
|
|
60
|
+
// broad default (see resolveAgentAllowedTools).
|
|
61
|
+
Tools: Array.isArray(tools) ? tools : null,
|
|
62
|
+
Master: is_master || typeVal === "orchestrator" ? true : null,
|
|
63
|
+
Parent: parent || null,
|
|
64
|
+
Type: typeVal,
|
|
65
|
+
Area: resolveAreaSlug(area, readOrganization(projectPath)),
|
|
66
|
+
Emoji: emoji || null,
|
|
67
|
+
Icon: iconVal,
|
|
68
|
+
Autonomy: normalizeAutonomy(autonomy) || null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create a project agent, writing its `.apc/agents/<slug>.md` (frontmatter +
|
|
74
|
+
* system prompt) and provisioning its runtime dir. Does NOT rebuild the daemon
|
|
75
|
+
* projects registry — that is the caller's job (route/tool), since the registry
|
|
76
|
+
* is a runtime object, not core.
|
|
77
|
+
*
|
|
78
|
+
* @param {{path:string}} project project descriptor (needs .path; passed
|
|
79
|
+
* through to ensureAgentRuntimeDir for the runtime/memory dir)
|
|
80
|
+
* @param {object} spec { slug, system, name?, role?, ... }
|
|
81
|
+
* @param {{requireSystem?:boolean}} opts when true, a missing/empty `system`
|
|
82
|
+
* throws instead of writing a body-less agent (the super-agent tool sets this)
|
|
83
|
+
* @returns {string} the created slug
|
|
84
|
+
*/
|
|
85
|
+
export function createAgent(project, spec = {}, { requireSystem = false } = {}) {
|
|
86
|
+
const { slug, system } = spec;
|
|
87
|
+
if (!slug) throw new Error("slug required");
|
|
88
|
+
if (!AGENT_SLUG_RE.test(slug)) throw new Error(`invalid slug "${slug}"`);
|
|
89
|
+
if (requireSystem && (typeof system !== "string" || !system.trim())) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
"an agent needs a system prompt: pass `system` with the agent's instructions. " +
|
|
92
|
+
"Creating one without a body leaves it unable to do anything.",
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
const roster = readAgents(project.path);
|
|
96
|
+
if (roster.find((a) => a.slug === slug)) throw new Error(`agent ${slug} already exists`);
|
|
97
|
+
const fields = buildNewAgentFields(project.path, spec, roster);
|
|
98
|
+
writeAgentFile(project.path, slug, fields, typeof system === "string" ? system : "");
|
|
99
|
+
ensureAgentDir(project.path, slug);
|
|
100
|
+
ensureAgentRuntimeDir(project, slug);
|
|
101
|
+
return slug;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Strip a trailing " (2)" / "-2" style copy marker so cloning a clone doesn't
|
|
105
|
+
// stack them ("candela (2) (3)"): it re-derives the base and picks the next free
|
|
106
|
+
// index instead.
|
|
107
|
+
const stripNameCopy = (name) => name.replace(/\s*\(\d+\)\s*$/, "").trim();
|
|
108
|
+
const stripSlugCopy = (slug) => slug.replace(/-\d+$/, "");
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Duplicate an existing agent into a fresh slug. Copies every frontmatter field
|
|
112
|
+
* and the system prompt verbatim, appending " (n)" to the display Name and "-n"
|
|
113
|
+
* to the slug — n being the lowest index that keeps both unique — and carries
|
|
114
|
+
* the agent's memory across so the clone starts where the original was. Throws
|
|
115
|
+
* if the source doesn't exist. Caller rebuilds the registry.
|
|
116
|
+
*
|
|
117
|
+
* @param {{path:string}} project
|
|
118
|
+
* @param {string} slug source agent slug
|
|
119
|
+
* @returns {string} the new (cloned) slug
|
|
120
|
+
*/
|
|
121
|
+
export function cloneAgent(project, slug) {
|
|
122
|
+
if (!slug) throw new Error("slug required");
|
|
123
|
+
const roster = readAgents(project.path);
|
|
124
|
+
const source = roster.find((a) => a.slug === slug);
|
|
125
|
+
if (!source) throw new Error(`agent ${slug} not found`);
|
|
126
|
+
|
|
127
|
+
const taken = new Set(roster.map((a) => a.slug));
|
|
128
|
+
const baseSlug = stripSlugCopy(source.slug) || source.slug;
|
|
129
|
+
let n = 2;
|
|
130
|
+
while (taken.has(`${baseSlug}-${n}`)) n += 1;
|
|
131
|
+
const newSlug = `${baseSlug}-${n}`;
|
|
132
|
+
if (!AGENT_SLUG_RE.test(newSlug)) throw new Error(`cannot derive a valid slug from "${slug}"`);
|
|
133
|
+
|
|
134
|
+
const fields = { ...(source.fields || {}) };
|
|
135
|
+
const baseName = stripNameCopy(fields.Name || source.name || source.slug);
|
|
136
|
+
fields.Name = `${baseName} (${n})`;
|
|
137
|
+
|
|
138
|
+
writeAgentFile(project.path, newSlug, fields, source.body || "");
|
|
139
|
+
ensureAgentDir(project.path, newSlug);
|
|
140
|
+
ensureAgentRuntimeDir(project, newSlug);
|
|
141
|
+
const memory = readAgentMemory(project, source.slug);
|
|
142
|
+
if (memory && memory.trim()) writeAgentMemory(project, newSlug, memory);
|
|
143
|
+
return newSlug;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Replace an existing agent's system prompt (its `.md` body), keeping every
|
|
148
|
+
* frontmatter field. Throws if the agent doesn't exist. Caller rebuilds.
|
|
149
|
+
*
|
|
150
|
+
* @param {{path:string}} project
|
|
151
|
+
* @param {string} slug
|
|
152
|
+
* @param {string} system the new system prompt (required, non-empty)
|
|
153
|
+
* @returns {string} the slug
|
|
154
|
+
*/
|
|
155
|
+
export function setAgentPrompt(project, slug, system) {
|
|
156
|
+
if (!slug) throw new Error("slug required");
|
|
157
|
+
if (typeof system !== "string" || !system.trim()) {
|
|
158
|
+
throw new Error("system prompt required: pass `system` with the agent's new instructions.");
|
|
159
|
+
}
|
|
160
|
+
const existing = readAgents(project.path).find((a) => a.slug === slug);
|
|
161
|
+
if (!existing) throw new Error(`agent ${slug} not found`);
|
|
162
|
+
writeAgentFile(project.path, slug, existing.fields || {}, system);
|
|
163
|
+
ensureAgentDir(project.path, slug);
|
|
164
|
+
ensureAgentRuntimeDir(project, slug);
|
|
165
|
+
return slug;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Merge frontmatter fields into an existing agent (model, type, area, skills,
|
|
170
|
+
* role, …), keeping its body unless `patch.system` is given. Mirrors the PATCH
|
|
171
|
+
* route so the route and the configure_agent tool share one normalization.
|
|
172
|
+
* A field set to null/"" is removed; `undefined` leaves it untouched.
|
|
173
|
+
*
|
|
174
|
+
* @param {{path:string}} project
|
|
175
|
+
* @param {string} slug
|
|
176
|
+
* @param {object} patch
|
|
177
|
+
* @returns {string} the slug
|
|
178
|
+
*/
|
|
179
|
+
export function setAgentConfig(project, slug, patch = {}) {
|
|
180
|
+
const existing = readAgents(project.path).find((a) => a.slug === slug);
|
|
181
|
+
if (!existing) throw new Error(`agent ${slug} not found`);
|
|
182
|
+
const fields = { ...(existing.fields || {}) };
|
|
183
|
+
const setStr = (key, val) => {
|
|
184
|
+
if (val === undefined) return;
|
|
185
|
+
if (val === null || val === "") delete fields[key];
|
|
186
|
+
else fields[key] = val;
|
|
187
|
+
};
|
|
188
|
+
setStr("Name", patch.name);
|
|
189
|
+
setStr("Role", patch.role);
|
|
190
|
+
setStr("Model", patch.model);
|
|
191
|
+
setStr("Language", patch.language);
|
|
192
|
+
setStr("Description", patch.description);
|
|
193
|
+
setStr("Parent", patch.parent);
|
|
194
|
+
if (patch.type !== undefined && patch.type !== null && patch.type !== "") {
|
|
195
|
+
const t = normalizeAgentType(patch.type);
|
|
196
|
+
if (!t) throw new Error(`invalid type "${patch.type}"`);
|
|
197
|
+
fields.Type = t;
|
|
198
|
+
} else {
|
|
199
|
+
setStr("Type", patch.type);
|
|
200
|
+
}
|
|
201
|
+
if (patch.area !== undefined) {
|
|
202
|
+
const resolved = patch.area === null || patch.area === ""
|
|
203
|
+
? null
|
|
204
|
+
: resolveAreaSlug(patch.area, readOrganization(project.path));
|
|
205
|
+
setStr("Area", resolved);
|
|
206
|
+
}
|
|
207
|
+
setStr("Emoji", patch.emoji);
|
|
208
|
+
setStr("Icon", patch.icon);
|
|
209
|
+
const auto = normalizeAutonomy(patch.autonomy);
|
|
210
|
+
if (auto !== undefined) setStr("Autonomy", auto);
|
|
211
|
+
if (patch.skills !== undefined) fields.Skills = Array.isArray(patch.skills) ? patch.skills : [];
|
|
212
|
+
if (patch.tools !== undefined) fields.Tools = Array.isArray(patch.tools) ? patch.tools : [];
|
|
213
|
+
if (patch.is_master !== undefined) {
|
|
214
|
+
if (patch.is_master) fields.Master = true;
|
|
215
|
+
else { delete fields.Master; delete fields.Primary; }
|
|
216
|
+
}
|
|
217
|
+
const body = patch.system !== undefined ? patch.system : (existing.body || "");
|
|
218
|
+
writeAgentFile(project.path, slug, fields, body);
|
|
219
|
+
ensureAgentDir(project.path, slug);
|
|
220
|
+
ensureAgentRuntimeDir(project, slug);
|
|
221
|
+
return slug;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Rename an agent's slug — the agent's physical key. The slug names the
|
|
226
|
+
* definition file (`.apc/agents/<slug>.md`) and the runtime dir (memory,
|
|
227
|
+
* conversations, sessions under `agents/<slug>/`); it is ALSO written into
|
|
228
|
+
* other agents' `Parent` field and into stores that live nowhere near the agent
|
|
229
|
+
* (group rosters, telegram routes, tasks, deliveries, code sessions, the RAG
|
|
230
|
+
* scope). This moves the files and repoints every one of those, in ONE place so
|
|
231
|
+
* the route and any tool share the same behavior — see agent-rename-refs.js for
|
|
232
|
+
* which references are pointers (repointed) and which are records (left alone:
|
|
233
|
+
* a ledger row's `agent_slug` says who spoke, it does not resolve to anyone).
|
|
234
|
+
*
|
|
235
|
+
* Caller rebuilds the daemon registry afterwards.
|
|
236
|
+
*
|
|
237
|
+
* @param {{id?:any, path:string, storagePath?:string, apxId?:string}} project
|
|
238
|
+
* @param {string} oldSlug current slug
|
|
239
|
+
* @param {string} newSlug desired slug (already slugified/validated by caller,
|
|
240
|
+
* re-validated here against AGENT_SLUG_RE)
|
|
241
|
+
* @param {{projects?:object[]}} [opts] the daemon registry when the caller has
|
|
242
|
+
* one — reaches rooms hosted by other projects and telegram fallbacks.
|
|
243
|
+
* @returns {Promise<string>} the final slug (equal to oldSlug when it's a no-op)
|
|
244
|
+
*/
|
|
245
|
+
export async function renameAgent(project, oldSlug, newSlug, opts = {}) {
|
|
246
|
+
if (!oldSlug) throw new Error("current slug required");
|
|
247
|
+
if (!newSlug) throw new Error("new slug required");
|
|
248
|
+
if (!AGENT_SLUG_RE.test(newSlug)) throw new Error(`invalid slug "${newSlug}"`);
|
|
249
|
+
if (newSlug === oldSlug) return oldSlug; // nothing to do
|
|
250
|
+
|
|
251
|
+
const roster = readAgents(project.path);
|
|
252
|
+
const source = roster.find((a) => a.slug === oldSlug);
|
|
253
|
+
if (!source) throw new Error(`agent ${oldSlug} not found`);
|
|
254
|
+
if (roster.find((a) => a.slug === newSlug)) throw new Error(`agent ${newSlug} already exists`);
|
|
255
|
+
|
|
256
|
+
// 1) Move the definition file. If it's missing — the agent lived only in the
|
|
257
|
+
// runtime, or only in the VAULT (imported: no local file at all, resolved
|
|
258
|
+
// through `.apc/project.json`'s `agents.imported`) — re-materialize it
|
|
259
|
+
// under the new slug from what we parsed. Either way the old slug must
|
|
260
|
+
// stop resolving, so the import entry goes with it: left behind, the vault
|
|
261
|
+
// template kept answering to the old slug and the rename read as a
|
|
262
|
+
// DUPLICATE — one card with the chats, one with the history.
|
|
263
|
+
const oldFile = apcAgentFile(project.path, oldSlug);
|
|
264
|
+
ensureAgentDir(project.path, newSlug);
|
|
265
|
+
if (fs.existsSync(oldFile)) fs.renameSync(oldFile, apcAgentFile(project.path, newSlug));
|
|
266
|
+
else writeAgentFile(project.path, newSlug, source.fields || {}, source.body || "");
|
|
267
|
+
removeImportedAgent(project.path, oldSlug);
|
|
268
|
+
|
|
269
|
+
// 2) Move the runtime dir (memory, conversations, sessions) wholesale.
|
|
270
|
+
const oldDir = agentRuntimeDir(project, oldSlug);
|
|
271
|
+
const newDir = agentRuntimeDir(project, newSlug);
|
|
272
|
+
if (fs.existsSync(oldDir)) {
|
|
273
|
+
if (fs.existsSync(newDir)) throw new Error(`runtime data for ${newSlug} already exists`);
|
|
274
|
+
fs.renameSync(oldDir, newDir);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// 3) Repoint child agents whose Parent pointed at the old slug.
|
|
278
|
+
for (const child of roster) {
|
|
279
|
+
if (child.slug === oldSlug) continue;
|
|
280
|
+
if (child.fields?.Parent === oldSlug) {
|
|
281
|
+
writeAgentFile(project.path, child.slug, { ...child.fields, Parent: newSlug }, child.body || "");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// 4) Repoint every other live reference — routines, group rosters, tasks,
|
|
286
|
+
// deliveries, code sessions, telegram routes, the project's own
|
|
287
|
+
// `.apc/config.json` and the RAG scope. Best-effort per store: the files
|
|
288
|
+
// have already moved, so one unreadable store must not fail the rename.
|
|
289
|
+
try { await repointAgentReferences(project, oldSlug, newSlug, opts); } catch { /* best-effort */ }
|
|
290
|
+
|
|
291
|
+
return newSlug;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Delete an agent: its `.apc/agents/<slug>.md` definition and its runtime dir
|
|
296
|
+
* (memory, conversations, sessions). Throws if neither exists. Caller rebuilds.
|
|
297
|
+
*
|
|
298
|
+
* @param {{path:string}} project
|
|
299
|
+
* @param {string} slug
|
|
300
|
+
* @returns {string} the slug
|
|
301
|
+
*/
|
|
302
|
+
export function removeAgent(project, slug) {
|
|
303
|
+
if (!slug) throw new Error("slug required");
|
|
304
|
+
const file = apcAgentFile(project.path, slug);
|
|
305
|
+
const runtimeDir = path.dirname(agentMemoryPath(project, slug));
|
|
306
|
+
if (!fs.existsSync(file) && !fs.existsSync(runtimeDir)) {
|
|
307
|
+
throw new Error(`agent ${slug} not found`);
|
|
308
|
+
}
|
|
309
|
+
if (fs.existsSync(file)) fs.rmSync(file);
|
|
310
|
+
if (fs.existsSync(runtimeDir)) fs.rmSync(runtimeDir, { recursive: true, force: true });
|
|
311
|
+
return slug;
|
|
312
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// pure transform layer so HTTP routes, CLI commands, and the super-agent
|
|
10
10
|
// `import_agent` tool all agree on what fields exist.
|
|
11
11
|
|
|
12
|
-
export const VAULT_PATCH_FIELDS = ["role", "model", "language", "description", "skills", "tools", "is_master"];
|
|
12
|
+
export const VAULT_PATCH_FIELDS = ["role", "model", "language", "description", "skills", "tools", "is_master", "emoji", "icon"];
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Normalize a user-provided vault patch:
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// AUTO-GENERATED by scripts/export_web_assets.py — do not edit by hand.
|
|
2
|
+
// Blob avatar preset keys, for the non-browser surfaces that create agents
|
|
3
|
+
// (CLI, MCP server, daemon API). The renderer's copy — with eye rects and
|
|
4
|
+
// image sources — is src/interfaces/web/src/components/agents/blobPresets.ts.
|
|
5
|
+
|
|
6
|
+
export const BLOB_KEYS = Object.freeze([
|
|
7
|
+
"menta",
|
|
8
|
+
"parche",
|
|
9
|
+
"trino",
|
|
10
|
+
"cubi",
|
|
11
|
+
"nimbo",
|
|
12
|
+
"papa",
|
|
13
|
+
"noche",
|
|
14
|
+
"kiwi",
|
|
15
|
+
"gajo",
|
|
16
|
+
"campana",
|
|
17
|
+
"cobalto",
|
|
18
|
+
"rubi",
|
|
19
|
+
"trebol",
|
|
20
|
+
"saturno",
|
|
21
|
+
"onyx",
|
|
22
|
+
"perla",
|
|
23
|
+
"faro",
|
|
24
|
+
"brasa",
|
|
25
|
+
"aqua",
|
|
26
|
+
"coral",
|
|
27
|
+
"zafiro",
|
|
28
|
+
"pino",
|
|
29
|
+
"eclipse",
|
|
30
|
+
"peon",
|
|
31
|
+
"ovni",
|
|
32
|
+
"amatista",
|
|
33
|
+
"volcan",
|
|
34
|
+
"quad",
|
|
35
|
+
"cometa",
|
|
36
|
+
"lila",
|
|
37
|
+
"orbita",
|
|
38
|
+
"caracol",
|
|
39
|
+
"iris",
|
|
40
|
+
"laguna",
|
|
41
|
+
"carbon",
|
|
42
|
+
]);
|