@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,121 @@
|
|
|
1
|
+
// A skill can carry images (a golf grip, a swing position, a diagram) so an
|
|
2
|
+
// agent can SEND you the right one when it teaches a concept, and — on demand —
|
|
3
|
+
// LOOK at one itself. The model never gets the pixels for free: what rides in
|
|
4
|
+
// the prompt is a cheap text manifest (id → caption). The agent picks an id and
|
|
5
|
+
// attaches it to its message (attach_media), or pulls it into its own context
|
|
6
|
+
// to reason about (view_media).
|
|
7
|
+
//
|
|
8
|
+
// Where the files live:
|
|
9
|
+
// • dir-style skill (~/.apx/skills/<slug>/SKILL.md) → alongside SKILL.md
|
|
10
|
+
// • flat-style skill (<proj>/.apc/skills/<slug>.md) → a sibling <slug>/ dir
|
|
11
|
+
// A `media.json` in that dir is the manifest; without one, image files in the
|
|
12
|
+
// dir are auto-listed (id = filename without extension, no caption).
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
|
|
16
|
+
const IMAGE_EXT = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".svg"]);
|
|
17
|
+
|
|
18
|
+
const MIME_BY_EXT = {
|
|
19
|
+
".jpg": "image/jpeg",
|
|
20
|
+
".jpeg": "image/jpeg",
|
|
21
|
+
".png": "image/png",
|
|
22
|
+
".gif": "image/gif",
|
|
23
|
+
".webp": "image/webp",
|
|
24
|
+
".bmp": "image/bmp",
|
|
25
|
+
".svg": "image/svg+xml",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** The asset directory for a resolved skill file (see file header). */
|
|
29
|
+
export function skillAssetsDir(skillFile) {
|
|
30
|
+
if (!skillFile) return "";
|
|
31
|
+
const base = path.basename(skillFile);
|
|
32
|
+
if (base.toLowerCase() === "skill.md") return path.dirname(skillFile);
|
|
33
|
+
// flat "<slug>.md" → sibling "<slug>/"
|
|
34
|
+
return skillFile.replace(/\.md$/i, "");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function mimeFor(file) {
|
|
38
|
+
return MIME_BY_EXT[path.extname(file).toLowerCase()] || "application/octet-stream";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function isImage(file) {
|
|
42
|
+
return IMAGE_EXT.has(path.extname(file).toLowerCase());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The media a skill declares (or that simply sit in its asset dir).
|
|
47
|
+
*
|
|
48
|
+
* @param {{slug:string, file:string}} skill a loadSkill() result (needs .file)
|
|
49
|
+
* @returns {Array<{id, file, path, caption, mime, exists}>}
|
|
50
|
+
*/
|
|
51
|
+
export function readSkillMedia(skill) {
|
|
52
|
+
const dir = skillAssetsDir(skill?.file);
|
|
53
|
+
if (!dir || !fs.existsSync(dir)) return [];
|
|
54
|
+
|
|
55
|
+
const items = [];
|
|
56
|
+
const seen = new Set(); // ids already taken
|
|
57
|
+
const seenFiles = new Set(); // basenames already claimed by the manifest
|
|
58
|
+
|
|
59
|
+
// 1) explicit manifest
|
|
60
|
+
const manifestPath = path.join(dir, "media.json");
|
|
61
|
+
if (fs.existsSync(manifestPath)) {
|
|
62
|
+
let manifest = [];
|
|
63
|
+
try { manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8")); } catch { manifest = []; }
|
|
64
|
+
const list = Array.isArray(manifest) ? manifest : Array.isArray(manifest?.media) ? manifest.media : [];
|
|
65
|
+
for (const raw of list) {
|
|
66
|
+
if (!raw || typeof raw !== "object") continue;
|
|
67
|
+
const file = String(raw.file || raw.path || "").trim();
|
|
68
|
+
if (!file) continue;
|
|
69
|
+
const id = String(raw.id || file.replace(/\.[^.]+$/, "")).trim();
|
|
70
|
+
if (seen.has(id)) continue;
|
|
71
|
+
seen.add(id);
|
|
72
|
+
seenFiles.add(path.basename(file));
|
|
73
|
+
const abs = path.isAbsolute(file) ? file : path.join(dir, file);
|
|
74
|
+
items.push({
|
|
75
|
+
id,
|
|
76
|
+
file: path.basename(file),
|
|
77
|
+
path: abs,
|
|
78
|
+
caption: String(raw.caption || raw.when || raw.description || "").trim(),
|
|
79
|
+
mime: raw.mime || mimeFor(file),
|
|
80
|
+
exists: fs.existsSync(abs),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 2) auto-discover any image files not already in the manifest
|
|
86
|
+
let entries = [];
|
|
87
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { entries = []; }
|
|
88
|
+
for (const e of entries) {
|
|
89
|
+
if (!e.isFile()) continue;
|
|
90
|
+
if (!isImage(e.name)) continue;
|
|
91
|
+
if (seenFiles.has(e.name)) continue; // already described by the manifest
|
|
92
|
+
const id = e.name.replace(/\.[^.]+$/, "");
|
|
93
|
+
if (seen.has(id)) continue;
|
|
94
|
+
seen.add(id);
|
|
95
|
+
const abs = path.join(dir, e.name);
|
|
96
|
+
items.push({
|
|
97
|
+
id,
|
|
98
|
+
file: e.name,
|
|
99
|
+
path: abs,
|
|
100
|
+
caption: "",
|
|
101
|
+
mime: mimeFor(e.name),
|
|
102
|
+
exists: true,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return items;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** A one-line-per-image manifest for the system prompt / read_skill result. */
|
|
110
|
+
export function renderMediaManifest(media) {
|
|
111
|
+
const usable = (media || []).filter((m) => m.exists);
|
|
112
|
+
if (!usable.length) return "";
|
|
113
|
+
const lines = usable.map((m) => `- ${m.id}${m.caption ? ` — ${m.caption}` : ""}`);
|
|
114
|
+
return ["Images available (attach with attach_media, inspect with view_media):", ...lines].join("\n");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Resolve one media item by id within a list. */
|
|
118
|
+
export function findMedia(media, id) {
|
|
119
|
+
const want = String(id || "").trim();
|
|
120
|
+
return (media || []).find((m) => m.id === want) || null;
|
|
121
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Where a skill's files actually live — APX may only hold a symlink.
|
|
2
|
+
//
|
|
3
|
+
// `source` is the APX layer (builtin / global / project). `origin` is the
|
|
4
|
+
// host that owns the bytes: claude, cursor, codex, agents, or APX itself.
|
|
5
|
+
// The UI badge uses origin so a linked-in Claude skill does not look like
|
|
6
|
+
// "you wrote this in ~/.apx/skills".
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import os from "node:os";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
|
|
11
|
+
export const SKILL_ORIGIN_HOSTS = Object.freeze([
|
|
12
|
+
["claude", [".claude", "skills"]],
|
|
13
|
+
["cursor", [".cursor", "skills"]],
|
|
14
|
+
["codex", [".codex", "skills"]],
|
|
15
|
+
["agents", [".agents", "skills"]],
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
function realOrResolve(p) {
|
|
19
|
+
try { return fs.realpathSync(p); } catch { return path.resolve(p); }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function homeRelLiteral(p, home) {
|
|
23
|
+
const abs = path.resolve(p);
|
|
24
|
+
const root = path.resolve(home);
|
|
25
|
+
if (abs === root) return "~";
|
|
26
|
+
if (abs.startsWith(root + path.sep)) return "~" + abs.slice(root.length);
|
|
27
|
+
return abs;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function homeRel(p, home = os.homedir()) {
|
|
31
|
+
const abs = realOrResolve(p);
|
|
32
|
+
const root = realOrResolve(home);
|
|
33
|
+
if (abs === root) return "~";
|
|
34
|
+
if (abs.startsWith(root + path.sep)) return "~" + abs.slice(root.length);
|
|
35
|
+
return abs;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {string} file path to SKILL.md (or a flat <slug>.md)
|
|
40
|
+
* @param {{ source?: string, home?: string }} [opts]
|
|
41
|
+
* @returns {{ origin: string, origin_path: string, file_path: string }}
|
|
42
|
+
*/
|
|
43
|
+
export function skillOrigin(file, { source, home = os.homedir() } = {}) {
|
|
44
|
+
const filePath = homeRelLiteral(file, home);
|
|
45
|
+
if (source === "builtin") return { origin: "apx", origin_path: filePath, file_path: filePath };
|
|
46
|
+
if (source === "project") return { origin: "project", origin_path: filePath, file_path: filePath };
|
|
47
|
+
|
|
48
|
+
let realFile = file;
|
|
49
|
+
try { realFile = fs.realpathSync(file); } catch { /* broken link — fall through */ }
|
|
50
|
+
const originPath = homeRel(realFile, home);
|
|
51
|
+
const realDir = path.dirname(realOrResolve(realFile));
|
|
52
|
+
|
|
53
|
+
for (const [origin, segs] of SKILL_ORIGIN_HOSTS) {
|
|
54
|
+
const host = path.resolve(home, ...segs);
|
|
55
|
+
const hostReal = fs.existsSync(host) ? realOrResolve(host) : host;
|
|
56
|
+
if (realDir === hostReal || realDir.startsWith(hostReal + path.sep)) {
|
|
57
|
+
return { origin, origin_path: originPath, file_path: filePath };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { origin: "global", origin_path: originPath, file_path: filePath };
|
|
61
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// Splitting a skill body into sections, so a large skill can be loaded one
|
|
2
|
+
// section at a time instead of whole (progressive disclosure). A project agent
|
|
3
|
+
// gets the skill's OUTLINE (its headings) in the system prompt for ~nothing,
|
|
4
|
+
// and pulls the one section it needs with the read_skill tool.
|
|
5
|
+
//
|
|
6
|
+
// Sectioning is by markdown headings. A heading owns everything under it until
|
|
7
|
+
// the next heading at the SAME or a HIGHER level — so a `##` section carries
|
|
8
|
+
// its `###` subsections with it, which is what a reader wants when they ask for
|
|
9
|
+
// "section 2".
|
|
10
|
+
|
|
11
|
+
const HEADING_RE = /^(#{1,6})\s+(.+?)\s*#*$/;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse a markdown body into a flat list of headings with their span.
|
|
15
|
+
* @returns {Array<{level:number, title:string, line:number}>}
|
|
16
|
+
*/
|
|
17
|
+
function headings(body) {
|
|
18
|
+
const lines = String(body || "").split("\n");
|
|
19
|
+
const out = [];
|
|
20
|
+
let inFence = false;
|
|
21
|
+
for (let i = 0; i < lines.length; i++) {
|
|
22
|
+
const line = lines[i];
|
|
23
|
+
// Don't mistake a `#` inside a ``` code fence for a heading.
|
|
24
|
+
if (/^\s*(```|~~~)/.test(line)) { inFence = !inFence; continue; }
|
|
25
|
+
if (inFence) continue;
|
|
26
|
+
const m = HEADING_RE.exec(line);
|
|
27
|
+
if (m) out.push({ level: m[1].length, title: m[2].trim(), line: i });
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Sections of a skill body: each heading plus the text it owns (down to the
|
|
34
|
+
* next heading at the same or higher level). Text BEFORE the first heading is
|
|
35
|
+
* returned as a leading section with an empty title (the skill's preamble).
|
|
36
|
+
*
|
|
37
|
+
* @returns {Array<{level:number, title:string, text:string}>}
|
|
38
|
+
*/
|
|
39
|
+
export function splitSkillSections(body) {
|
|
40
|
+
const text = String(body || "");
|
|
41
|
+
const lines = text.split("\n");
|
|
42
|
+
const heads = headings(text);
|
|
43
|
+
const sections = [];
|
|
44
|
+
|
|
45
|
+
if (!heads.length) {
|
|
46
|
+
const t = text.trim();
|
|
47
|
+
return t ? [{ level: 0, title: "", text: t }] : [];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Preamble before the first heading.
|
|
51
|
+
if (heads[0].line > 0) {
|
|
52
|
+
const pre = lines.slice(0, heads[0].line).join("\n").trim();
|
|
53
|
+
if (pre) sections.push({ level: 0, title: "", text: pre });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (let i = 0; i < heads.length; i++) {
|
|
57
|
+
const h = heads[i];
|
|
58
|
+
// The section ends at the next heading whose level is <= this one's.
|
|
59
|
+
let end = lines.length;
|
|
60
|
+
for (let j = i + 1; j < heads.length; j++) {
|
|
61
|
+
if (heads[j].level <= h.level) { end = heads[j].line; break; }
|
|
62
|
+
}
|
|
63
|
+
sections.push({
|
|
64
|
+
level: h.level,
|
|
65
|
+
title: h.title,
|
|
66
|
+
text: lines.slice(h.line, end).join("\n").trim(),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return sections;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A compact outline for the system prompt: the top-level headings (levels 1-2),
|
|
74
|
+
* numbered, so the model can name a section to read_skill without the bodies.
|
|
75
|
+
* @returns {string[]} e.g. ["1. Evaluaciones de Habilidad", "2. Técnica del Swing"]
|
|
76
|
+
*/
|
|
77
|
+
export function skillOutline(body, { maxLevel = 2 } = {}) {
|
|
78
|
+
return splitSkillSections(body)
|
|
79
|
+
.filter((s) => s.title && s.level >= 1 && s.level <= maxLevel)
|
|
80
|
+
.map((s) => s.title);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function norm(s) {
|
|
84
|
+
return String(s || "")
|
|
85
|
+
.toLowerCase()
|
|
86
|
+
.normalize("NFD")
|
|
87
|
+
.replace(/[̀-ͯ]/g, "")
|
|
88
|
+
.replace(/[^a-z0-9]+/g, " ")
|
|
89
|
+
.trim();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Find the section a `query` refers to. Accepts a title (fuzzy, accent- and
|
|
94
|
+
* case-insensitive), a leading section number ("2" or "2."), or a substring of
|
|
95
|
+
* a title. Returns the best section, or null.
|
|
96
|
+
*
|
|
97
|
+
* @returns {{title:string, text:string, level:number}|null}
|
|
98
|
+
*/
|
|
99
|
+
export function pickSkillSection(body, query) {
|
|
100
|
+
const sections = splitSkillSections(body).filter((s) => s.title);
|
|
101
|
+
if (!sections.length) return null;
|
|
102
|
+
const q = norm(query);
|
|
103
|
+
if (!q) return null;
|
|
104
|
+
|
|
105
|
+
// "2" / "2." → the section whose title starts with that number, else the Nth.
|
|
106
|
+
const numMatch = /^(\d+)\.?$/.exec(String(query).trim());
|
|
107
|
+
if (numMatch) {
|
|
108
|
+
const n = numMatch[1];
|
|
109
|
+
const byPrefix = sections.find((s) => new RegExp(`^${n}\\b`).test(s.title.trim()));
|
|
110
|
+
if (byPrefix) return byPrefix;
|
|
111
|
+
const idx = Number(n) - 1;
|
|
112
|
+
if (idx >= 0 && idx < sections.length) return sections[idx];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Exact normalized title.
|
|
116
|
+
const exact = sections.find((s) => norm(s.title) === q);
|
|
117
|
+
if (exact) return exact;
|
|
118
|
+
|
|
119
|
+
// Query contained in a title, or a title contained in the query.
|
|
120
|
+
const contains = sections.find((s) => {
|
|
121
|
+
const t = norm(s.title);
|
|
122
|
+
return t.includes(q) || q.includes(t);
|
|
123
|
+
});
|
|
124
|
+
if (contains) return contains;
|
|
125
|
+
|
|
126
|
+
// Token overlap — pick the title sharing the most words with the query.
|
|
127
|
+
const qTokens = new Set(q.split(" ").filter(Boolean));
|
|
128
|
+
let best = null;
|
|
129
|
+
let bestScore = 0;
|
|
130
|
+
for (const s of sections) {
|
|
131
|
+
const tTokens = s.title ? norm(s.title).split(" ").filter(Boolean) : [];
|
|
132
|
+
const score = tTokens.reduce((n, tok) => n + (qTokens.has(tok) ? 1 : 0), 0);
|
|
133
|
+
if (score > bestScore) { bestScore = score; best = s; }
|
|
134
|
+
}
|
|
135
|
+
return bestScore > 0 ? best : null;
|
|
136
|
+
}
|
|
@@ -13,7 +13,9 @@ import {
|
|
|
13
13
|
import { resolveAgentName } from "#core/identity/index.js";
|
|
14
14
|
import { memoryBlockFor, buildActiveThreadsBlock } from "#core/memory/index.js";
|
|
15
15
|
import { CHANNELS } from "#core/constants/channels.js";
|
|
16
|
-
import { judgeConfig, judgeCompletion, applyJudgeLoop } from "#core/agent/judge.js";
|
|
16
|
+
import { judgeConfig, judgeCompletion, applyJudgeLoop, continuableTurn } from "#core/agent/judge.js";
|
|
17
|
+
import { channelToolIters, MAX_TOOL_ITERS } from "#core/agent/constants.js";
|
|
18
|
+
import { mobilityContextBlock } from "#core/mobility/state.js";
|
|
17
19
|
|
|
18
20
|
export {
|
|
19
21
|
buildIdentityBlock,
|
|
@@ -39,6 +41,7 @@ export async function runSuperAgent({
|
|
|
39
41
|
onEvent = null,
|
|
40
42
|
signal,
|
|
41
43
|
onToken = null,
|
|
44
|
+
onReasoningToken = null,
|
|
42
45
|
suppressTools = null,
|
|
43
46
|
// Channel-specific addendum appended to the system prompt; used by
|
|
44
47
|
// voice.js to ask for trailing ```suggestions``` JSON on voice/deck
|
|
@@ -46,12 +49,19 @@ export async function runSuperAgent({
|
|
|
46
49
|
systemSuffix = "",
|
|
47
50
|
// Per-reply output cap; forwarded to runAgent. Summarize/ask raise it.
|
|
48
51
|
maxTokens,
|
|
49
|
-
// Max tool-loop iterations
|
|
50
|
-
//
|
|
52
|
+
// Max tool-loop iterations for the TURN — the first run plus any judge round
|
|
53
|
+
// that continues it, which share this number rather than each getting it in
|
|
54
|
+
// full. Forwarded to runAgent; the Code module raises it so coding tasks run
|
|
55
|
+
// to completion instead of stopping after a step. Left unset, the channel
|
|
56
|
+
// decides (channelToolIters): the web chat runs to completion, everything
|
|
57
|
+
// else keeps runAgent's conversational default.
|
|
51
58
|
maxIters,
|
|
52
59
|
// Structural "keep going until done" contract (finish tool + forced tool
|
|
53
60
|
// choice). Coding surfaces (web Code build mode, terminal Build) turn this on.
|
|
54
61
|
completionContract = false,
|
|
62
|
+
// The completion judge, injectable so a test can supply verdicts without an
|
|
63
|
+
// engine. Production always uses the real one.
|
|
64
|
+
judgeCompletionFn = judgeCompletion,
|
|
55
65
|
// Run tool-free: pure text generation, no tool registry. Used by the
|
|
56
66
|
// summarize/ask endpoint so a transcript that *mentions* a tool (e.g. the
|
|
57
67
|
// telegram plugin) can't make the model actually fire it.
|
|
@@ -115,11 +125,13 @@ export async function runSuperAgent({
|
|
|
115
125
|
const scopedListSkills = (opts = {}) =>
|
|
116
126
|
filterEnabledSkills(listSkills(opts), { config: globalConfig, projectPath });
|
|
117
127
|
|
|
128
|
+
const mobilityBlock = mobilityContextBlock();
|
|
129
|
+
const effectiveContextNote = [contextNote, mobilityBlock].filter(Boolean).join("\n\n");
|
|
118
130
|
const system = buildSuperAgentSystem({
|
|
119
131
|
globalConfig,
|
|
120
132
|
projects,
|
|
121
133
|
listSkills: scopedListSkills,
|
|
122
|
-
contextNote,
|
|
134
|
+
contextNote: effectiveContextNote,
|
|
123
135
|
channel,
|
|
124
136
|
channelMeta,
|
|
125
137
|
relationshipBlock,
|
|
@@ -142,7 +154,19 @@ export async function runSuperAgent({
|
|
|
142
154
|
? null
|
|
143
155
|
: selectModelByRules({ prompt, previousMessages, channel, channelMeta }, globalConfig);
|
|
144
156
|
|
|
145
|
-
|
|
157
|
+
// An explicit budget from the caller always wins; otherwise the surface's own
|
|
158
|
+
// default applies. This is where the web chat stops hitting a wall every 9
|
|
159
|
+
// actions and asking whether to keep going — see WEB_TOOL_ITERS.
|
|
160
|
+
//
|
|
161
|
+
// Resolved to a NUMBER here, falling through to runAgent's own default rather
|
|
162
|
+
// than leaving it unset, because this is the turn's total and the judge loop
|
|
163
|
+
// below has to subtract from it. "Whatever runAgent picks" is not a total you
|
|
164
|
+
// can share between rounds.
|
|
165
|
+
const turnMaxIters = maxIters || channelToolIters(globalConfig, channel) || MAX_TOOL_ITERS;
|
|
166
|
+
|
|
167
|
+
// `iters` is what THIS pass may spend, which is the whole budget for the
|
|
168
|
+
// first run and whatever is left for a judge round.
|
|
169
|
+
const runOnce = (turnPrompt, history, iters = turnMaxIters) =>
|
|
146
170
|
runAgent({
|
|
147
171
|
globalConfig,
|
|
148
172
|
system,
|
|
@@ -157,21 +181,34 @@ export async function runSuperAgent({
|
|
|
157
181
|
onEvent,
|
|
158
182
|
signal,
|
|
159
183
|
onToken,
|
|
184
|
+
onReasoningToken,
|
|
160
185
|
agentName: resolveAgentName(globalConfig),
|
|
161
186
|
suppressTools,
|
|
162
187
|
...(maxTokens ? { maxTokens } : {}),
|
|
163
|
-
|
|
188
|
+
maxIters: iters,
|
|
164
189
|
...(completionContract ? { completionContract: true } : {}),
|
|
165
190
|
});
|
|
166
191
|
|
|
167
192
|
const result = await runOnce(prompt, previousMessages);
|
|
168
193
|
|
|
169
|
-
// Goal-completion judge (OpenHands critic pattern)
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
194
|
+
// Goal-completion judge (OpenHands critic pattern). Two doors into it:
|
|
195
|
+
//
|
|
196
|
+
// - a completion-contract turn declared itself done, and `judge.enabled`
|
|
197
|
+
// asks for that claim to be checked;
|
|
198
|
+
// - a conversational turn stopped calling tools, which is also what the
|
|
199
|
+
// model does when it just announces its next step. That reads as a task
|
|
200
|
+
// that quit halfway, so the judge continues it instead of leaving the
|
|
201
|
+
// user to type "seguí". Skipped for chat and for a turn that ended asking
|
|
202
|
+
// something — see continuableTurn.
|
|
203
|
+
//
|
|
204
|
+
// Sub-agent runs are excluded (the parent judges the overall turn); tool-free
|
|
205
|
+
// callers (summarize/ask) have nothing to verify; and an aborted turn is the
|
|
206
|
+
// user saying stop, which is the one instruction a judge must not overrule.
|
|
173
207
|
const jCfg = judgeConfig(globalConfig);
|
|
174
|
-
|
|
208
|
+
const judging = completionContract
|
|
209
|
+
? jCfg.enabled
|
|
210
|
+
: jCfg.continue_unfinished && continuableTurn(result);
|
|
211
|
+
if (!judging || noTools || subagentDepth > 0 || signal?.aborted) {
|
|
175
212
|
return result;
|
|
176
213
|
}
|
|
177
214
|
// Rolling refinement history: each round sees the original goal, its own
|
|
@@ -181,10 +218,13 @@ export async function runSuperAgent({
|
|
|
181
218
|
initialResult: result,
|
|
182
219
|
cfg: jCfg,
|
|
183
220
|
onEvent,
|
|
184
|
-
|
|
185
|
-
|
|
221
|
+
// The turn's whole budget, shared with the run above rather than reissued
|
|
222
|
+
// per round. Without this the ceiling was (1 + max_iterations) × turnMaxIters.
|
|
223
|
+
maxIters: turnMaxIters,
|
|
224
|
+
judgeFn: (r) => judgeCompletionFn({ goal: prompt, result: r, globalConfig }),
|
|
225
|
+
runFollowup: async (followup, prior, { maxIters: roundIters } = {}) => {
|
|
186
226
|
history.push({ role: "assistant", content: prior.text || "" });
|
|
187
|
-
const next = await runOnce(followup, [...history]);
|
|
227
|
+
const next = await runOnce(followup, [...history], roundIters);
|
|
188
228
|
history.push({ role: "user", content: followup });
|
|
189
229
|
return next;
|
|
190
230
|
},
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Shared helpers for the calendar agent tools (calendar-*.js). Underscore file,
|
|
2
|
+
// like _asana.js, so it carries no tool `name:` of its own: each tool stays a
|
|
3
|
+
// thin adapter over the pure client in core/integrations/plugins/calendar.js.
|
|
4
|
+
import { resolveProject } from "../helpers.js";
|
|
5
|
+
import { resolveIntegration } from "#core/integrations/index.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The effective calendar config for a project, or an error the model can act
|
|
9
|
+
* on. `calendar_id` is resolved here rather than in each tool: which calendar
|
|
10
|
+
* is a connection detail the owner picked once, not a decision to re-take on
|
|
11
|
+
* every call.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveCalendar(projects, project, { needsWrite = false } = {}) {
|
|
14
|
+
const p = resolveProject(projects, project);
|
|
15
|
+
const resolved = resolveIntegration({ projectStorage: p.storagePath, slug: "calendar" });
|
|
16
|
+
if (!resolved) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
"No calendar is connected. Ask the user to connect one in the web panel → Integrations → Plugins → Google Calendar.",
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const config = resolved.record.config || {};
|
|
22
|
+
// Under user OAuth the calendar is always the account's own ("primary"); there
|
|
23
|
+
// is no calendar to pick. But we DO need an authorized connection.
|
|
24
|
+
if (!config.refresh_token) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
"The calendar isn't authorized yet. Ask the user to connect it with Google in the web panel → Integrations → Google Calendar.",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
const calendarId = config.calendar_id || "primary";
|
|
30
|
+
// Read-only is possible, and the agent finding out by way of a 403 from Google
|
|
31
|
+
// is a worse answer than being told here.
|
|
32
|
+
if (needsWrite && !config.write_access) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
"This calendar is connected read-only. The user has to enable write access in the web panel → Integrations → Google Calendar before anything can be scheduled.",
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return { config, calendarId, scope: resolved.scope };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** The optional `project` arg every calendar tool accepts. */
|
|
41
|
+
export const PROJECT_ARG = {
|
|
42
|
+
project: { type: "string", description: "APX project id/name (optional; defaults to current)" },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Default window: from now to the end of the day, in the machine's timezone. */
|
|
46
|
+
export function todayWindow(now = new Date()) {
|
|
47
|
+
const end = new Date(now);
|
|
48
|
+
end.setHours(23, 59, 59, 999);
|
|
49
|
+
return { timeMin: now.toISOString(), timeMax: end.toISOString() };
|
|
50
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readApfMcps, writeApfMcps,
|
|
3
|
+
readRuntimeMcps, writeRuntimeMcps,
|
|
4
|
+
readGlobalMcps, writeGlobalMcps,
|
|
5
|
+
} from "#core/mcp/sources.js";
|
|
6
|
+
import { projectMeta, resolveProject } from "../helpers.js";
|
|
7
|
+
|
|
8
|
+
// Register an MCP server. The super-agent could LIST mcps and CALL their tools
|
|
9
|
+
// but not add one — so wiring a new MCP meant shelling out to `apx mcp add`,
|
|
10
|
+
// the same gap that made building an agent painful. This closes it.
|
|
11
|
+
//
|
|
12
|
+
// Three scopes (see the apx-mcp skill), each a different file with different
|
|
13
|
+
// commit/secrecy semantics:
|
|
14
|
+
// shared → .apc/mcps.json (committed; NON-SECRET hints only)
|
|
15
|
+
// runtime → ~/.apx/projects/<id>/mcps.json (private; where SECRETS live)
|
|
16
|
+
// global → ~/.apx/mcps.json (private; every project)
|
|
17
|
+
function readScope(scope, p) {
|
|
18
|
+
if (scope === "runtime") return readRuntimeMcps(p.storagePath);
|
|
19
|
+
if (scope === "global") return readGlobalMcps();
|
|
20
|
+
return readApfMcps(p.path);
|
|
21
|
+
}
|
|
22
|
+
function writeScope(scope, p, json) {
|
|
23
|
+
if (scope === "runtime") {
|
|
24
|
+
if (!p.storagePath) throw new Error("runtime scope requires a project with a storage path");
|
|
25
|
+
return writeRuntimeMcps(p.storagePath, json);
|
|
26
|
+
}
|
|
27
|
+
if (scope === "global") return writeGlobalMcps(json);
|
|
28
|
+
return writeApfMcps(p.path, json);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default {
|
|
32
|
+
name: "add_mcp",
|
|
33
|
+
schema: {
|
|
34
|
+
type: "function",
|
|
35
|
+
function: {
|
|
36
|
+
name: "add_mcp",
|
|
37
|
+
description:
|
|
38
|
+
"Register (or update) an MCP server so its tools become callable via call_mcp. A stdio server needs `command` (+ optional `args`/`env`); a remote HTTP one needs `url` (+ optional `headers`). Scope decides WHERE it is stored and its secrecy: 'runtime' (default here — private, holds secrets), 'shared' (.apc/mcps.json, committed — NON-SECRET hints only, never a token), or 'global' (private, all projects). Put anything secret in runtime or global, never shared.",
|
|
39
|
+
parameters: {
|
|
40
|
+
type: "object",
|
|
41
|
+
required: ["name"],
|
|
42
|
+
properties: {
|
|
43
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
44
|
+
name: { type: "string", description: "Server name (how you'll reference it in call_mcp)." },
|
|
45
|
+
command: { type: "string", description: "stdio: the executable to spawn (e.g. 'npx')." },
|
|
46
|
+
args: { type: "array", items: { type: "string" }, description: "stdio: arguments for the command." },
|
|
47
|
+
env: { type: "object", description: "stdio: environment variables { KEY: value }." },
|
|
48
|
+
url: { type: "string", description: "http: the remote endpoint URL." },
|
|
49
|
+
headers: { type: "object", description: "http: request headers { Header: value }." },
|
|
50
|
+
scope: { type: "string", enum: ["runtime", "shared", "global"], description: "Where to store it. Default: runtime." },
|
|
51
|
+
enabled: { type: "boolean", description: "Enable it now (default true)." },
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
makeHandler: ({ projects, registries, requirePermission }) => async (args = {}) => {
|
|
57
|
+
const { project, name, command, args: cmdArgs, env, url, headers, enabled } = args;
|
|
58
|
+
await requirePermission("add_mcp", { dangerous: true, args: { name, scope: args.scope } });
|
|
59
|
+
if (!name) return { error: "name required" };
|
|
60
|
+
if (!command && !url) return { error: "either command (stdio) or url (http) required" };
|
|
61
|
+
if (command && url) return { error: "pass either command (stdio) or url (http), not both" };
|
|
62
|
+
|
|
63
|
+
const scope = ["runtime", "shared", "global"].includes(args.scope) ? args.scope
|
|
64
|
+
: args.scope === "apc" ? "shared"
|
|
65
|
+
: args.scope ? null : "runtime";
|
|
66
|
+
if (scope === null) return { error: `unknown scope "${args.scope}" (use runtime|shared|global)` };
|
|
67
|
+
|
|
68
|
+
let p;
|
|
69
|
+
try {
|
|
70
|
+
p = resolveProject(projects, project || "default");
|
|
71
|
+
} catch (e) {
|
|
72
|
+
return { error: e.message };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const json = readScope(scope, p);
|
|
77
|
+
json.mcpServers = json.mcpServers || {};
|
|
78
|
+
const existing = json.mcpServers[name] || {};
|
|
79
|
+
json.mcpServers[name] = {
|
|
80
|
+
...existing,
|
|
81
|
+
...(command !== undefined ? { command } : {}),
|
|
82
|
+
...(cmdArgs !== undefined ? { args: cmdArgs } : {}),
|
|
83
|
+
...(env !== undefined ? { env } : {}),
|
|
84
|
+
...(url !== undefined ? { url } : {}),
|
|
85
|
+
...(headers !== undefined ? { headers } : {}),
|
|
86
|
+
enabled: enabled === undefined ? true : !!enabled,
|
|
87
|
+
};
|
|
88
|
+
writeScope(scope, p, json);
|
|
89
|
+
registries?.evictName?.(name);
|
|
90
|
+
projects.rebuild(p.id);
|
|
91
|
+
return {
|
|
92
|
+
ok: true,
|
|
93
|
+
name,
|
|
94
|
+
scope,
|
|
95
|
+
transport: url ? "http" : "stdio",
|
|
96
|
+
project: projectMeta(projects, p),
|
|
97
|
+
hint: "Registered. Use list_mcp_tools to see what it exposes, then call_mcp to run a tool.",
|
|
98
|
+
};
|
|
99
|
+
} catch (e) {
|
|
100
|
+
return { error: e.message };
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
@@ -15,6 +15,7 @@ export default {
|
|
|
15
15
|
name: { type: "string", description: "Task title" },
|
|
16
16
|
notes: { type: "string", description: "Task description/notes" },
|
|
17
17
|
project_gid: { type: "string", description: "Optional Asana project gid to add the task to" },
|
|
18
|
+
section_gid: { type: "string", description: "Optional Asana section gid to place the task in (e.g. a backlog column). Only valid together with project_gid." },
|
|
18
19
|
assignee: { type: "string", description: "Optional assignee (user gid or 'me')" },
|
|
19
20
|
due_on: { type: "string", description: "Optional due date (YYYY-MM-DD)" },
|
|
20
21
|
...PROJECT_ARG,
|
|
@@ -23,13 +24,14 @@ export default {
|
|
|
23
24
|
},
|
|
24
25
|
},
|
|
25
26
|
},
|
|
26
|
-
makeHandler: ({ projects }) => async ({ project, name, notes, project_gid, assignee, due_on } = {}) => {
|
|
27
|
+
makeHandler: ({ projects }) => async ({ project, name, notes, project_gid, section_gid, assignee, due_on } = {}) => {
|
|
27
28
|
const { token, config } = resolveAsana(projects, project);
|
|
28
29
|
const task = await asana.createTask(token, {
|
|
29
30
|
workspaceGid: requireWorkspace(config),
|
|
30
31
|
name,
|
|
31
32
|
notes,
|
|
32
33
|
projectGid: project_gid,
|
|
34
|
+
sectionGid: section_gid,
|
|
33
35
|
assignee,
|
|
34
36
|
dueOn: due_on,
|
|
35
37
|
});
|