@agentprojectcontext/apx 1.81.0 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +21 -11
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createAgent } from "#core/apc/agent-write.js";
|
|
2
|
+
import { readAgents } from "#core/apc/parser.js";
|
|
3
|
+
import { projectMeta, resolveProject } from "../helpers.js";
|
|
4
|
+
|
|
5
|
+
// Create a project agent — including its system prompt — in one call. This is
|
|
6
|
+
// what the super-agent should reach for instead of shelling out to
|
|
7
|
+
// `apx agent add` (which is awkward for a long, multi-line prompt) and then
|
|
8
|
+
// hand-writing the `.md` when the agent comes out body-less. `system` is
|
|
9
|
+
// required here on purpose: an agent without instructions cannot do anything.
|
|
10
|
+
export default {
|
|
11
|
+
name: "create_agent",
|
|
12
|
+
schema: {
|
|
13
|
+
type: "function",
|
|
14
|
+
function: {
|
|
15
|
+
name: "create_agent",
|
|
16
|
+
description:
|
|
17
|
+
"Create a project agent (a specialist persona) WITH its system prompt in one step. Use this — not run_shell/apx agent add, and never write_file on the .md — whenever the user asks you to make a new agent. `system` is the agent's full instructions (its reason to exist) and is required. Omit `tools` unless you deliberately want to narrow the agent (an undeclared tools field means the broad default). Project resolves by id/name/path; omit or use 'default' for the super-agent workspace. Call list_agents first if unsure what exists.",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
required: ["slug", "system"],
|
|
21
|
+
properties: {
|
|
22
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
23
|
+
slug: { type: "string", description: "Lowercase id: starts with a letter, then letters/digits/-/_ (e.g. golf-coach)." },
|
|
24
|
+
system: { type: "string", description: "The agent's full system prompt / instructions. REQUIRED — this is what the agent does, how, and what it never does." },
|
|
25
|
+
name: { type: "string", description: "Display name (optional; defaults to a title-cased slug)." },
|
|
26
|
+
role: { type: "string", description: "One-line role, e.g. 'Golf coach'." },
|
|
27
|
+
description: { type: "string", description: "One line of metadata shown in listings. NOT a substitute for system." },
|
|
28
|
+
model: { type: "string", description: "Optional per-agent model override (else follows the project/global default)." },
|
|
29
|
+
language: { type: "string", description: "Default language code, e.g. 'es'." },
|
|
30
|
+
skills: { type: "array", items: { type: "string" }, description: "Skill slugs to attach (e.g. ['golf-lvl-2'])." },
|
|
31
|
+
tools: { type: "array", items: { type: "string" }, description: "Optional allowlist that NARROWS the agent. Omit for the broad default." },
|
|
32
|
+
area: { type: "string", description: "Org area slug/name (optional; call list_agents/org first)." },
|
|
33
|
+
type: { type: "string", description: "Agent typology (e.g. specialist, orchestrator)." },
|
|
34
|
+
emoji: { type: "string", description: "Optional emoji badge." },
|
|
35
|
+
icon: { type: "string", description: "Optional avatar blob key; one is picked if omitted." },
|
|
36
|
+
is_master: { type: "boolean", description: "Mark as a master/primary agent of the project." },
|
|
37
|
+
parent: { type: "string", description: "Parent agent slug, for hierarchy." },
|
|
38
|
+
autonomy: { type: "string", description: "Per-agent autonomy: total | automatico | permiso." },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
makeHandler: ({ projects, requirePermission }) => async (args = {}) => {
|
|
44
|
+
const { project, slug } = args;
|
|
45
|
+
await requirePermission("create_agent", { dangerous: true, args: { agent: slug, project } });
|
|
46
|
+
let p;
|
|
47
|
+
try {
|
|
48
|
+
p = resolveProject(projects, project || "default");
|
|
49
|
+
} catch (e) {
|
|
50
|
+
return { error: e.message };
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
createAgent(p, args, { requireSystem: true });
|
|
54
|
+
projects.rebuild(p.id);
|
|
55
|
+
const created = readAgents(p.path).find((a) => a.slug === slug);
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
agent: created?.slug || slug,
|
|
59
|
+
project: projectMeta(projects, p),
|
|
60
|
+
role: created?.fields?.Role || args.role || null,
|
|
61
|
+
skills: created?.fields?.Skills || args.skills || [],
|
|
62
|
+
hint: "Agent created with its system prompt. Seed its memory with write_agent_memory if it should track progress across runs.",
|
|
63
|
+
};
|
|
64
|
+
} catch (e) {
|
|
65
|
+
return { error: e.message };
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
@@ -14,16 +14,46 @@ export default {
|
|
|
14
14
|
properties: {
|
|
15
15
|
project: { type: "string", description: "Project id, name, or path." },
|
|
16
16
|
title: { type: "string", description: "Short imperative title for the task." },
|
|
17
|
-
|
|
17
|
+
parent: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description:
|
|
20
|
+
"Optional id of a parent task, making this one a SUBTASK of it. Use it to split a task " +
|
|
21
|
+
"that is really several: create the parent (or reuse the existing one) and add a subtask " +
|
|
22
|
+
"per real unit of work, so each can be assigned, moved and closed on its own.",
|
|
23
|
+
},
|
|
24
|
+
description: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description:
|
|
27
|
+
"What the OWNER has to do, in their words. Write this for a person reading a to-do list, " +
|
|
28
|
+
"not for a model: no prompt scaffolding, no 'you are an agent that…'. Fill it for anything " +
|
|
29
|
+
"the owner will do themselves — which is most tasks.",
|
|
30
|
+
},
|
|
31
|
+
body: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description:
|
|
34
|
+
"The prompt an AGENT receives if it runs this task. Only fill it when the task is meant to " +
|
|
35
|
+
"be executed by an agent. Leave it empty for a normal to-do — a prompt in place of a " +
|
|
36
|
+
"description is what makes a task list unreadable to its owner.",
|
|
37
|
+
},
|
|
18
38
|
tags: { type: "array", items: { type: "string" }, description: "Optional tags." },
|
|
19
39
|
due: { type: "string", description: "Optional ISO date (YYYY-MM-DD) the task is due by." },
|
|
20
|
-
agent: { type: "string", description: "
|
|
40
|
+
agent: { type: "string", description: "Responsible actor: an agent slug, or owner/human for the human owner." },
|
|
41
|
+
priority: {
|
|
42
|
+
type: "string",
|
|
43
|
+
enum: ["low", "normal", "high", "urgent"],
|
|
44
|
+
description: "Task priority. Defaults to normal.",
|
|
45
|
+
},
|
|
46
|
+
reminder_frequency: {
|
|
47
|
+
type: "string",
|
|
48
|
+
enum: ["none", "once", "daily", "weekly"],
|
|
49
|
+
description: "How often the owner wants a reminder recorded for this task. Defaults to none.",
|
|
50
|
+
},
|
|
21
51
|
source: { type: "string", description: "Where the task came from (telegram, desktop, …). Defaults to the calling channel." },
|
|
22
52
|
},
|
|
23
53
|
},
|
|
24
54
|
},
|
|
25
55
|
},
|
|
26
|
-
makeHandler: ({ projects }) => async ({ project: ref, title, body, tags, due, agent, source }) => {
|
|
56
|
+
makeHandler: ({ projects }) => async ({ project: ref, title, description, body, tags, due, agent, priority, reminder_frequency, source, parent }) => {
|
|
27
57
|
if (!ref) return { error: "project required" };
|
|
28
58
|
if (!title) return { error: "title required" };
|
|
29
59
|
const all = projects.list();
|
|
@@ -36,10 +66,14 @@ export default {
|
|
|
36
66
|
if (!proj) return { error: `project storage not loaded: ${ref}` };
|
|
37
67
|
const task = createTask(proj.storagePath, {
|
|
38
68
|
title,
|
|
69
|
+
parent: parent || null,
|
|
70
|
+
description: description || null,
|
|
39
71
|
body: body || null,
|
|
40
72
|
tags: Array.isArray(tags) ? tags : [],
|
|
41
73
|
due: due || null,
|
|
42
74
|
agent: agent || null,
|
|
75
|
+
priority,
|
|
76
|
+
reminder_frequency,
|
|
43
77
|
source: source || "super-agent",
|
|
44
78
|
});
|
|
45
79
|
return {
|
|
@@ -47,6 +81,10 @@ export default {
|
|
|
47
81
|
project: { id: proj.id, name: proj.name },
|
|
48
82
|
title: task.title,
|
|
49
83
|
state: task.state,
|
|
84
|
+
...(task.parent ? { parent: task.parent } : {}),
|
|
85
|
+
agent: task.agent,
|
|
86
|
+
priority: task.priority,
|
|
87
|
+
reminder_frequency: task.reminder_frequency,
|
|
50
88
|
};
|
|
51
89
|
},
|
|
52
90
|
};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { readVaultAgents, VAULT_DIR } from "#core/apc/parser.js";
|
|
1
|
+
import { readVaultAgents, vaultAgentFile } from "#core/apc/parser.js";
|
|
4
2
|
import { addImportedAgent, ensureAgentDir } from "#core/apc/scaffold.js";
|
|
5
3
|
import { ensureAgentRuntimeDir } from "#core/agent/memory.js";
|
|
6
4
|
import { projectMeta, resolveProject } from "../helpers.js";
|
|
@@ -26,8 +24,10 @@ export default {
|
|
|
26
24
|
await requirePermission("import_agent", { dangerous: true, confirmed, args: { agent: slug } });
|
|
27
25
|
if (!slug) throw new Error("import_agent: agent required");
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
// Layered lookup (user file → bundled default). A raw path into the user
|
|
28
|
+
// vault would reject every bundled agent this same error message lists.
|
|
29
|
+
const vaultPath = vaultAgentFile(slug);
|
|
30
|
+
if (!vaultPath) {
|
|
31
31
|
const available = readVaultAgents().map((a) => a.slug).join(", ") || "(none)";
|
|
32
32
|
throw new Error(`agent "${slug}" not found in vault. Available: ${available}`);
|
|
33
33
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { resolveProject } from "../helpers.js";
|
|
2
|
+
|
|
3
|
+
// The catalog of ONE MCP server. `list_mcps` names the servers; without this
|
|
4
|
+
// the model knew a server called "postbean" existed and had no way to learn
|
|
5
|
+
// what it could ask it for. In practice it guessed tool names, got
|
|
6
|
+
// `Tool [tools] not found`, and then went reading the server's own source to
|
|
7
|
+
// reverse-engineer the contract — a dozen shell calls to recover something the
|
|
8
|
+
// protocol hands over in one request.
|
|
9
|
+
//
|
|
10
|
+
// Schemas are returned trimmed by default: names + one-line descriptions +
|
|
11
|
+
// required args are enough to pick a tool, and full JSON Schemas for a large
|
|
12
|
+
// server would swamp a chat turn. Ask for `detail: "full"` once the tool is
|
|
13
|
+
// chosen and the exact argument shape matters.
|
|
14
|
+
function oneLine(desc = "", cap = 200) {
|
|
15
|
+
const flat = String(desc).replace(/\s+/g, " ").trim();
|
|
16
|
+
return flat.length <= cap ? flat : flat.slice(0, cap - 1) + "…";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function briefTool(t) {
|
|
20
|
+
const schema = t.inputSchema || t.input_schema || {};
|
|
21
|
+
const props = schema.properties && typeof schema.properties === "object" ? schema.properties : {};
|
|
22
|
+
return {
|
|
23
|
+
name: t.name,
|
|
24
|
+
description: oneLine(t.description),
|
|
25
|
+
args: Object.keys(props),
|
|
26
|
+
required: Array.isArray(schema.required) ? schema.required : [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default {
|
|
31
|
+
name: "list_mcp_tools",
|
|
32
|
+
schema: {
|
|
33
|
+
type: "function",
|
|
34
|
+
function: {
|
|
35
|
+
name: "list_mcp_tools",
|
|
36
|
+
description:
|
|
37
|
+
"List the tools an MCP server exposes, with their arguments. Call this " +
|
|
38
|
+
"BEFORE call_mcp on a server you have not used this turn — it is how you " +
|
|
39
|
+
"learn the tool names and argument shapes. Never guess an MCP tool name " +
|
|
40
|
+
"and never read the server's source to find out; ask the server.",
|
|
41
|
+
parameters: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
mcp: { type: "string", description: "MCP server name (from list_mcps)." },
|
|
45
|
+
project: { type: "string", description: "Project id/name/path the MCP is registered in. Omit for default." },
|
|
46
|
+
detail: {
|
|
47
|
+
type: "string",
|
|
48
|
+
enum: ["brief", "full"],
|
|
49
|
+
description: "brief (default) = names, descriptions, arg names. full = complete JSON Schemas.",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ["mcp"],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
makeHandler: ({ projects, registries }) => async ({ mcp, project, detail } = {}) => {
|
|
57
|
+
if (!mcp) return { error: "list_mcp_tools: mcp is required" };
|
|
58
|
+
if (!registries) return { error: "MCP registry unavailable" };
|
|
59
|
+
const p = resolveProject(projects, project);
|
|
60
|
+
const registry = registries.for ? registries.for(p) : registries.ensure(p);
|
|
61
|
+
|
|
62
|
+
const known = registry.list?.() || [];
|
|
63
|
+
if (known.length && !known.some((m) => m.name === mcp)) {
|
|
64
|
+
return {
|
|
65
|
+
error: `MCP "${mcp}" is not registered here`,
|
|
66
|
+
available: known.map((m) => m.name),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let result;
|
|
71
|
+
try {
|
|
72
|
+
result = await registry.listTools(mcp);
|
|
73
|
+
} catch (e) {
|
|
74
|
+
return { error: `MCP "${mcp}" tools/list failed: ${e.message}` };
|
|
75
|
+
}
|
|
76
|
+
const tools = Array.isArray(result?.tools) ? result.tools : [];
|
|
77
|
+
return {
|
|
78
|
+
mcp,
|
|
79
|
+
count: tools.length,
|
|
80
|
+
tools: detail === "full" ? tools : tools.map(briefTool),
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { listRoutines } from "#core/stores/routines.js";
|
|
2
|
+
import { resolveProject } from "../helpers.js";
|
|
3
|
+
|
|
4
|
+
// The routines a project has, and how their last run went. Pairs with
|
|
5
|
+
// run_routine: this answers "what can I run / did the 08:00 one fire", which
|
|
6
|
+
// otherwise took a shell round-trip through the CLI.
|
|
7
|
+
export default {
|
|
8
|
+
name: "list_routines",
|
|
9
|
+
schema: {
|
|
10
|
+
type: "function",
|
|
11
|
+
function: {
|
|
12
|
+
name: "list_routines",
|
|
13
|
+
description:
|
|
14
|
+
"List a project's routines: name, kind, schedule, whether they are enabled, " +
|
|
15
|
+
"and how the last run went. Use before run_routine, or to answer 'did the " +
|
|
16
|
+
"cron run', 'qué rutinas tiene', 'por qué no corrió'.",
|
|
17
|
+
parameters: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: {
|
|
20
|
+
project: { type: "string", description: "Project id, name or path. Omit for the default project." },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
makeHandler: ({ projects }) => async ({ project } = {}) => {
|
|
26
|
+
const p = resolveProject(projects, project);
|
|
27
|
+
if (!p) return { error: `project not found: ${project}` };
|
|
28
|
+
return {
|
|
29
|
+
project: p.name || p.path,
|
|
30
|
+
routines: listRoutines(p.storagePath).map((r) => ({
|
|
31
|
+
name: r.name,
|
|
32
|
+
kind: r.kind,
|
|
33
|
+
schedule: r.schedule,
|
|
34
|
+
enabled: !!r.enabled,
|
|
35
|
+
agent: r.spec?.agent || undefined,
|
|
36
|
+
// An empty list means "no override — the agent's own tools"; say so
|
|
37
|
+
// rather than printing [] and inviting the old misreading.
|
|
38
|
+
tools: r.allowed_tools?.length ? r.allowed_tools.length : "agent default",
|
|
39
|
+
last_run_at: r.last_run_at,
|
|
40
|
+
last_status: r.last_status,
|
|
41
|
+
...(r.last_error ? { last_error: String(r.last_error).slice(0, 300) } : {}),
|
|
42
|
+
next_run_at: r.next_run_at,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -33,14 +33,16 @@ export default {
|
|
|
33
33
|
tag: { type: "string", description: "Filter by exact tag match." },
|
|
34
34
|
agent: { type: "string", description: "Filter by agent slug." },
|
|
35
35
|
due_before: { type: "string", description: "Return only tasks due on or before this ISO date." },
|
|
36
|
+
parent: { type: "string", description: "Return only the SUBTASKS of this task id. Pass an empty string for top-level tasks only." },
|
|
36
37
|
limit: { type: "number", description: "Cap on rows returned. Default 100." },
|
|
37
38
|
},
|
|
38
39
|
},
|
|
39
40
|
},
|
|
40
41
|
},
|
|
41
42
|
makeHandler: ({ projects }) => async (args = {}) => {
|
|
42
|
-
const { project: ref, state, status, tag, agent, due_before, limit } = args;
|
|
43
|
+
const { project: ref, state, status, tag, agent, due_before, limit, parent } = args;
|
|
43
44
|
const opts = {
|
|
45
|
+
...(parent !== undefined ? { parent } : {}),
|
|
44
46
|
state: state || undefined,
|
|
45
47
|
status: status || undefined,
|
|
46
48
|
tag: tag || undefined,
|
|
@@ -86,6 +88,11 @@ function compact(t) {
|
|
|
86
88
|
due: t.due,
|
|
87
89
|
agent: t.agent,
|
|
88
90
|
created_at: t.created_at,
|
|
91
|
+
// Only when they say something — a "0 subtasks, 0 comments" pair on every
|
|
92
|
+
// row is prompt tokens spent to communicate nothing.
|
|
93
|
+
...(t.subtask_count ? { subtasks: `${t.subtask_done}/${t.subtask_count}` } : {}),
|
|
94
|
+
...(t.comment_count ? { comments: t.comment_count } : {}),
|
|
95
|
+
...(t.parent ? { parent: t.parent } : {}),
|
|
89
96
|
...(t.project_name ? { project: t.project_name } : {}),
|
|
90
97
|
};
|
|
91
98
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
keepCommitment, missCommitment, dropCommitment, renegotiateCommitment,
|
|
3
|
+
} from "#core/stores/commitments.js";
|
|
4
|
+
import { missingArg, projectMeta, resolveProject } from "../helpers.js";
|
|
5
|
+
|
|
6
|
+
// Close out a commitment. The sibling of record_commitment: a promise you can
|
|
7
|
+
// record but never resolve is a promise that silently rots. kept/missed carry
|
|
8
|
+
// the relationship; drop retracts a mis-filed one; renegotiate needs a new date.
|
|
9
|
+
export default {
|
|
10
|
+
name: "mark_commitment",
|
|
11
|
+
schema: {
|
|
12
|
+
type: "function",
|
|
13
|
+
function: {
|
|
14
|
+
name: "mark_commitment",
|
|
15
|
+
description:
|
|
16
|
+
"Resolve a commitment recorded with record_commitment: kept (you delivered), missed (the date passed and it didn't happen), drop (it was filed by mistake — not the same as missed), or renegotiate (a new date agreed with them, which requires `due`). Use after list_commitments.",
|
|
17
|
+
parameters: {
|
|
18
|
+
type: "object",
|
|
19
|
+
required: ["commitment", "action"],
|
|
20
|
+
properties: {
|
|
21
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
22
|
+
commitment: { type: "string", description: "Commitment id or a ≥3-char unique prefix (from list_commitments)." },
|
|
23
|
+
action: { type: "string", enum: ["kept", "missed", "drop", "renegotiate"], description: "kept | missed | drop | renegotiate." },
|
|
24
|
+
due: { type: "string", description: "New due date (ISO). REQUIRED when action is 'renegotiate'." },
|
|
25
|
+
note: { type: "string", description: "Optional note recorded with the change." },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
makeHandler: ({ projects, requirePermission }) => async (args = {}) => {
|
|
31
|
+
const { project, commitment, action, due, note } = args;
|
|
32
|
+
await requirePermission("mark_commitment", { dangerous: true, args: { commitment, action } });
|
|
33
|
+
// Same trap as complete_task: list_commitments returns `id`, this takes
|
|
34
|
+
// `commitment`. Say which, rather than only that one is missing.
|
|
35
|
+
if (!commitment) return missingArg("mark_commitment", "commitment", { required: ["commitment", "action"], optional: ["project", "due", "note"] }, args);
|
|
36
|
+
let p;
|
|
37
|
+
try {
|
|
38
|
+
p = resolveProject(projects, project || "default");
|
|
39
|
+
} catch (e) {
|
|
40
|
+
return { error: e.message };
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
let result;
|
|
44
|
+
if (action === "kept") result = keepCommitment(p.storagePath, commitment, note || null);
|
|
45
|
+
else if (action === "missed") result = missCommitment(p.storagePath, commitment, note || null);
|
|
46
|
+
else if (action === "drop") result = dropCommitment(p.storagePath, commitment, note || null);
|
|
47
|
+
else if (action === "renegotiate") {
|
|
48
|
+
if (!due) return { error: "due required when action is 'renegotiate'" };
|
|
49
|
+
result = renegotiateCommitment(p.storagePath, commitment, due, note || null);
|
|
50
|
+
} else return { error: `unknown action "${action}" (use kept|missed|drop|renegotiate)` };
|
|
51
|
+
if (!result) return { error: `commitment not found: ${commitment}` };
|
|
52
|
+
return { ok: true, action, project: projectMeta(projects, p), commitment: result };
|
|
53
|
+
} catch (e) {
|
|
54
|
+
return { error: e.message };
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// read_skill — pull ONE section of a skill on demand, instead of carrying the
|
|
2
|
+
// whole skill in the prompt. The system prompt shows a lazy skill's outline
|
|
3
|
+
// (its section titles); this fetches the body of the section the agent names.
|
|
4
|
+
// Called with no section, it returns the outline + image manifest so the agent
|
|
5
|
+
// can see what it can ask for.
|
|
6
|
+
import { loadSkill } from "#core/agent/skills/loader.js";
|
|
7
|
+
import { splitSkillSections, skillOutline, pickSkillSection } from "#core/agent/skills/sections.js";
|
|
8
|
+
import { readSkillMedia } from "#core/agent/skills/media.js";
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
name: "read_skill",
|
|
12
|
+
schema: {
|
|
13
|
+
type: "function",
|
|
14
|
+
function: {
|
|
15
|
+
name: "read_skill",
|
|
16
|
+
description:
|
|
17
|
+
"Read one section of a skill loaded on demand (progressive disclosure). Pass the skill slug and a section title or number to get that section's text; omit the section to get the list of sections and images. Use this for a skill the system prompt showed as '(loaded on demand)'.",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
skill: { type: "string", description: "skill slug, e.g. \"golf-lvl-2\"" },
|
|
22
|
+
section: {
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "section title (fuzzy) or number, e.g. \"2\" or \"Técnica del Swing\". Omit to list sections.",
|
|
25
|
+
},
|
|
26
|
+
project_path: { type: "string", description: "optional project root for project-scoped skills" },
|
|
27
|
+
},
|
|
28
|
+
required: ["skill"],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
makeHandler: (ctx = {}) => ({ skill, section, project_path } = {}) => {
|
|
33
|
+
if (!skill) throw new Error("read_skill: skill required");
|
|
34
|
+
const projectPath = project_path || ctx?.channelMeta?.projectPath || undefined;
|
|
35
|
+
let loaded;
|
|
36
|
+
try {
|
|
37
|
+
loaded = loadSkill(skill, { projectPath });
|
|
38
|
+
} catch (e) {
|
|
39
|
+
return { error: e?.message || `skill "${skill}" not found` };
|
|
40
|
+
}
|
|
41
|
+
const body = String(loaded.body || "").trim();
|
|
42
|
+
const media = readSkillMedia(loaded).filter((m) => m.exists);
|
|
43
|
+
|
|
44
|
+
if (!section || !String(section).trim()) {
|
|
45
|
+
return {
|
|
46
|
+
skill: loaded.slug,
|
|
47
|
+
description: loaded.description || "",
|
|
48
|
+
sections: skillOutline(body),
|
|
49
|
+
all_headings: splitSkillSections(body).filter((s) => s.title).map((s) => s.title),
|
|
50
|
+
images: media.map((m) => ({ id: m.id, caption: m.caption })),
|
|
51
|
+
hint: "Call read_skill again with { section: \"<title or number>\" } to read one.",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const found = pickSkillSection(body, section);
|
|
56
|
+
if (!found) {
|
|
57
|
+
return {
|
|
58
|
+
error: `no section matching "${section}" in ${loaded.slug}`,
|
|
59
|
+
sections: skillOutline(body),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return { skill: loaded.slug, section: found.title, body: found.text };
|
|
63
|
+
},
|
|
64
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { appendRoutineMemory } from "#core/stores/routine-memory.js";
|
|
1
|
+
import { appendRoutineMemory, resolveRoutineStorage } from "#core/stores/routine-memory.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A routine writing to its OWN memory.
|
|
@@ -60,13 +60,7 @@ export default {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// The routine's project storage, never a model-supplied path.
|
|
63
|
-
const
|
|
64
|
-
let storagePath = "";
|
|
65
|
-
for (const entry of projects?.list?.() || []) {
|
|
66
|
-
if (projectPath && entry.path !== projectPath) continue;
|
|
67
|
-
storagePath = projects.get(entry.id)?.storagePath || "";
|
|
68
|
-
if (storagePath) break;
|
|
69
|
-
}
|
|
63
|
+
const storagePath = resolveRoutineStorage(projects, channelMeta?.projectPath || "");
|
|
70
64
|
if (!storagePath) return { error: "could not resolve this routine's storage" };
|
|
71
65
|
|
|
72
66
|
try {
|
|
@@ -1,7 +1,34 @@
|
|
|
1
1
|
import { appendSelfMemory } from "#core/agent/self-memory.js";
|
|
2
|
+
import { appendProjectLocalMemory } from "#core/stores/project-memory.js";
|
|
3
|
+
import { appendRoutineMemory, resolveRoutineStorage } from "#core/stores/routine-memory.js";
|
|
4
|
+
import { looksDurable } from "#core/memory/consolidate.js";
|
|
5
|
+
import { resolveProject, projectMeta } from "../helpers.js";
|
|
6
|
+
import { CHANNELS } from "#core/constants/channels.js";
|
|
2
7
|
|
|
3
|
-
// Write a durable note into YOUR OWN notebook (~/.apx/memory.md)
|
|
4
|
-
//
|
|
8
|
+
// Write a durable note into YOUR OWN notebook (~/.apx/memory.md) — or, with
|
|
9
|
+
// `project`, into that project's LOCAL memory (~/.apx/projects/<apxId>/memory.md).
|
|
10
|
+
// This is durable memory, not a project task and not an agent memory.
|
|
11
|
+
//
|
|
12
|
+
// The `project` scope exists because a fact about ONE repo does not belong in a
|
|
13
|
+
// notebook that ships in every prompt on every channel, and because without it
|
|
14
|
+
// the model had no way at all to write project memory: asked to record what a
|
|
15
|
+
// dozen projects were, it invented a `MEMORY.md` at each repo root, which the
|
|
16
|
+
// Memories screen does not read and the RAG indexer does not see.
|
|
17
|
+
//
|
|
18
|
+
// It writes the LOCAL file, never the repo's `.apc/memory.md`. An automatic
|
|
19
|
+
// writer pointed at a committed file is how a token pasted into a chat ends up
|
|
20
|
+
// in a public git history — APC keeps private runtime memory out of `.apc/` for
|
|
21
|
+
// exactly that reason, and reserves `.apc/memory.md` for facts a person read and
|
|
22
|
+
// judged team-safe. Promotion from local to committed is the owner's move, made
|
|
23
|
+
// in the Memories screen, which shows both files side by side.
|
|
24
|
+
//
|
|
25
|
+
// Routine runs get one extra judgement: the notebook ships in every prompt on
|
|
26
|
+
// every channel forever, and a scheduled routine calling `remember` each run
|
|
27
|
+
// ("today's weather is -8°C", "the routine ran and sent a message") turned it
|
|
28
|
+
// into a daily log — sixty days of weather is zero facts. So inside a routine,
|
|
29
|
+
// a note that does not read as a durable owner-level fact (looksDurable, the
|
|
30
|
+
// same judgement consolidation applies) is diverted to that routine's own
|
|
31
|
+
// memory instead of the global notebook. Durable facts still land globally.
|
|
5
32
|
export default {
|
|
6
33
|
name: "remember",
|
|
7
34
|
schema: {
|
|
@@ -9,7 +36,7 @@ export default {
|
|
|
9
36
|
function: {
|
|
10
37
|
name: "remember",
|
|
11
38
|
description:
|
|
12
|
-
"Save a durable fact to your cross-channel notebook (~/.apx/memory.md) so you still know it in future sessions AND on other channels (telegram, web, deck, voice). Use it at the END of any turn where something important happened: a decision taken, a task completed, a key datum agreed, or a relevant tool result
|
|
39
|
+
"Save a durable fact. Without `project` it goes to your cross-channel notebook (~/.apx/memory.md) so you still know it in future sessions AND on other channels (telegram, web, deck, voice); with `project` it goes to THAT project's local memory, which its Memories screen shows. Never create a memory file yourself — this tool is the only correct way to write one, and it deliberately writes the project's LOCAL file, not the repo's committed .apc/memory.md (the owner promotes a fact there once they have read it). Use it at the END of any turn where something important happened: a decision taken, a task completed, a key datum agreed, or a relevant tool result. NOT for one-off TODOs (use create_task), NOT for project-agent memory, and NOT for ephemeral data that ages out within a day (today's weather, a routine's run summary) — inside a routine those belong in `remember_routine`, and non-durable notes are diverted there automatically. Keep each note to one self-contained sentence.",
|
|
13
40
|
parameters: {
|
|
14
41
|
type: "object",
|
|
15
42
|
required: ["note"],
|
|
@@ -17,21 +44,70 @@ export default {
|
|
|
17
44
|
note: {
|
|
18
45
|
type: "string",
|
|
19
46
|
description:
|
|
20
|
-
"One durable, self-contained fact to remember, in the owner's language. e.g. '
|
|
47
|
+
"One durable, self-contained fact to remember, in the owner's language. e.g. 'the owner prefers terse replies with no trailing summaries'.",
|
|
21
48
|
},
|
|
22
49
|
channel: {
|
|
23
50
|
type: "string",
|
|
24
51
|
description:
|
|
25
52
|
"Optional: the channel this happened on (telegram, web, deck, voice…). Usually leave it empty — the current channel is tagged automatically.",
|
|
26
53
|
},
|
|
54
|
+
project: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description:
|
|
57
|
+
"Optional: project id, name or path. Give it when the fact is about ONE project (what it is, its stack, who owns it, a decision taken in it) — the note lands in that project's local memory instead of your notebook. Leave it empty for facts that matter on every channel.",
|
|
58
|
+
},
|
|
27
59
|
},
|
|
28
60
|
},
|
|
29
61
|
},
|
|
30
62
|
},
|
|
31
|
-
makeHandler: (ctx = {}) => ({ note, channel } = {}) => {
|
|
63
|
+
makeHandler: (ctx = {}) => ({ note, channel, project } = {}) => {
|
|
32
64
|
if (!note || !String(note).trim()) return { error: "note required" };
|
|
65
|
+
const text = String(note).trim();
|
|
33
66
|
try {
|
|
34
|
-
|
|
67
|
+
// An explicit project wins over the routine divert below: the model has
|
|
68
|
+
// said where this belongs, and a project fact is durable by definition.
|
|
69
|
+
if (project !== undefined && project !== null && String(project).trim()) {
|
|
70
|
+
let p;
|
|
71
|
+
try {
|
|
72
|
+
p = resolveProject(ctx.projects, String(project).trim());
|
|
73
|
+
} catch (e) {
|
|
74
|
+
return { error: e.message };
|
|
75
|
+
}
|
|
76
|
+
const meta = projectMeta(ctx.projects, p);
|
|
77
|
+
const r = appendProjectLocalMemory(p, text, {
|
|
78
|
+
channel: channel || ctx.channel || "",
|
|
79
|
+
projectName: meta.name,
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
saved: true,
|
|
83
|
+
scope: "project",
|
|
84
|
+
project: meta.name,
|
|
85
|
+
note: text,
|
|
86
|
+
path: r.path,
|
|
87
|
+
hint:
|
|
88
|
+
"saved to this project's LOCAL memory (not committed). If the owner wants it in the repo, they promote it to .apc/memory.md from the Memories screen.",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const routineId = ctx.channelMeta?.routineId;
|
|
93
|
+
if (ctx.channel === CHANNELS.ROUTINE && routineId && !looksDurable(text)) {
|
|
94
|
+
// Divert, don't drop — and if storage can't be resolved, fall through
|
|
95
|
+
// to the global save: a misplaced note beats a lost one.
|
|
96
|
+
const storagePath = resolveRoutineStorage(ctx.projects, ctx.channelMeta?.projectPath || "");
|
|
97
|
+
if (storagePath) {
|
|
98
|
+
const routineName = ctx.channelMeta?.routineName || "";
|
|
99
|
+
appendRoutineMemory(storagePath, routineId, text, { routineName });
|
|
100
|
+
return {
|
|
101
|
+
saved: true,
|
|
102
|
+
scope: "routine",
|
|
103
|
+
routine: routineName || routineId,
|
|
104
|
+
note: text,
|
|
105
|
+
hint:
|
|
106
|
+
"not a durable owner-level fact — saved to this routine's own memory, not the global notebook. Use `remember` only for facts worth knowing on every channel.",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const r = appendSelfMemory(text, { channel: channel || ctx.channel || "" });
|
|
35
111
|
return { saved: true, note: r.note };
|
|
36
112
|
} catch (e) {
|
|
37
113
|
return { error: e?.message || String(e) };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { removeAgent } from "#core/apc/agent-write.js";
|
|
2
|
+
import { projectMeta, resolveProject } from "../helpers.js";
|
|
3
|
+
|
|
4
|
+
// Delete a project agent — its definition and its runtime dir (memory,
|
|
5
|
+
// conversations, sessions). Completes the agent CRUD next to create_agent /
|
|
6
|
+
// set_agent_prompt / configure_agent so the super-agent never shells out.
|
|
7
|
+
export default {
|
|
8
|
+
name: "remove_agent",
|
|
9
|
+
schema: {
|
|
10
|
+
type: "function",
|
|
11
|
+
function: {
|
|
12
|
+
name: "remove_agent",
|
|
13
|
+
description:
|
|
14
|
+
"Delete a project agent: removes its .apc/agents/<slug>.md definition AND its runtime data (memory, conversations, sessions). Irreversible. Confirm with the user first unless they clearly asked to delete it.",
|
|
15
|
+
parameters: {
|
|
16
|
+
type: "object",
|
|
17
|
+
required: ["agent"],
|
|
18
|
+
properties: {
|
|
19
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
20
|
+
agent: { type: "string", description: "Slug of the agent to delete (from list_agents)." },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
makeHandler: ({ projects, requirePermission }) => async ({ project, agent } = {}) => {
|
|
26
|
+
await requirePermission("remove_agent", { dangerous: true, args: { agent, project } });
|
|
27
|
+
if (!agent) return { error: "agent required" };
|
|
28
|
+
let p;
|
|
29
|
+
try {
|
|
30
|
+
p = resolveProject(projects, project || "default");
|
|
31
|
+
} catch (e) {
|
|
32
|
+
return { error: e.message };
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
removeAgent(p, agent);
|
|
36
|
+
projects.rebuild(p.id);
|
|
37
|
+
return { ok: true, removed: agent, project: projectMeta(projects, p) };
|
|
38
|
+
} catch (e) {
|
|
39
|
+
return { error: e.message };
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|