@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,94 @@
|
|
|
1
|
+
import { listRoutines, getRoutine } from "#core/stores/routines.js";
|
|
2
|
+
import { summarizeToolTrace } from "#core/agent/tool-summary.js";
|
|
3
|
+
import { resolveProject } from "../helpers.js";
|
|
4
|
+
|
|
5
|
+
// Run a routine on demand and WAIT for its verdict.
|
|
6
|
+
//
|
|
7
|
+
// The alternative was `run_shell("apx routine run …")`, and that is how it was
|
|
8
|
+
// being done: through the CLI, through the daemon, with the routine's whole
|
|
9
|
+
// stdout landing in the turn — plus, for anything the CLI could not express,
|
|
10
|
+
// python heredocs that rewrote routines.json by hand. One tool call replaces
|
|
11
|
+
// all of it, and the model gets back a verdict instead of a transcript.
|
|
12
|
+
//
|
|
13
|
+
// Blocking is the point. A routine is a job with an end: the agent says "voy a
|
|
14
|
+
// correr la rutina", stops, and speaks again when there is something to report.
|
|
15
|
+
// Polling in a tool loop would spend an iteration and a slice of context per
|
|
16
|
+
// check and still be slower.
|
|
17
|
+
const REPLY_CAP = 1500;
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
name: "run_routine",
|
|
21
|
+
schema: {
|
|
22
|
+
type: "function",
|
|
23
|
+
function: {
|
|
24
|
+
name: "run_routine",
|
|
25
|
+
description:
|
|
26
|
+
"Run one of a project's routines NOW and wait until it finishes. Returns " +
|
|
27
|
+
"its verdict (ok / error), what it reported, and which tools it used. " +
|
|
28
|
+
"Blocking: nothing else happens in this turn until the routine ends, so " +
|
|
29
|
+
"tell the user you are launching it before you call this. Use it to test " +
|
|
30
|
+
"a routine you just created or to trigger a scheduled job early. Use " +
|
|
31
|
+
"list_routines first if you are unsure of the name.",
|
|
32
|
+
parameters: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
routine: { type: "string", description: "Routine name (exact, from list_routines)." },
|
|
36
|
+
project: { type: "string", description: "Project id, name or path. Omit for the default project." },
|
|
37
|
+
},
|
|
38
|
+
required: ["routine"],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
makeHandler: ({ projects, plugins, registries, globalConfig, requirePermission }) =>
|
|
43
|
+
async ({ routine: name, project } = {}) => {
|
|
44
|
+
if (!name) return { error: "run_routine: routine is required" };
|
|
45
|
+
// A routine runs with permission_mode "total" by design (a cron has
|
|
46
|
+
// nobody to ask), so triggering one from chat is a real side effect.
|
|
47
|
+
await requirePermission("run_routine", { dangerous: true, args: { routine: name, project } });
|
|
48
|
+
|
|
49
|
+
const p = resolveProject(projects, project);
|
|
50
|
+
if (!p) return { error: `project not found: ${project}` };
|
|
51
|
+
|
|
52
|
+
const r = getRoutine(p.storagePath, name);
|
|
53
|
+
if (!r) {
|
|
54
|
+
return {
|
|
55
|
+
error: `routine "${name}" not found in project ${p.name || p.path}`,
|
|
56
|
+
available: listRoutines(p.storagePath).map((x) => x.name),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Imported here, not at module scope: the runner imports the tool
|
|
61
|
+
// registry (a routine runs a tool loop) and the registry imports this
|
|
62
|
+
// handler, so a static import closes the cycle and one of the two ends
|
|
63
|
+
// up half-initialised. Deferring to call time breaks it.
|
|
64
|
+
const { runRoutineNow } = await import("#core/routines/runner.js");
|
|
65
|
+
|
|
66
|
+
let out;
|
|
67
|
+
try {
|
|
68
|
+
out = await runRoutineNow(
|
|
69
|
+
{ project: p, projects, plugins, registries, globalConfig, trigger: "agent" },
|
|
70
|
+
r
|
|
71
|
+
);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return { routine: name, status: "error", error: e.message };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const reply = String(out?.reply || out?.text || "");
|
|
77
|
+
return {
|
|
78
|
+
routine: name,
|
|
79
|
+
project: p.name || p.path,
|
|
80
|
+
status: out?.status === "error" ? "error" : "ok",
|
|
81
|
+
...(out?.skipped ? { skipped: true, note: out.note } : {}),
|
|
82
|
+
...(out?.error ? { error: String(out.error).slice(0, 600) } : {}),
|
|
83
|
+
...(out?.blocked_tools?.length ? { blocked_tools: out.blocked_tools } : {}),
|
|
84
|
+
// What it said, capped: the routine's own ledger and conversation hold
|
|
85
|
+
// the full text, and this is a status report, not a transcript.
|
|
86
|
+
reply: reply.length > REPLY_CAP ? reply.slice(0, REPLY_CAP) + "…(truncated)" : reply,
|
|
87
|
+
// Counts, not arguments — enough to tell "it worked" from "it narrated".
|
|
88
|
+
...(summarizeToolTrace(out?.trace) ? { tools_used: summarizeToolTrace(out.trace) } : {}),
|
|
89
|
+
...(out?.conversation_id ? { conversation_id: out.conversation_id } : {}),
|
|
90
|
+
last_run_at: out?.last_run_at,
|
|
91
|
+
next_run_at: out?.next_run_at,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { resolveProject, safePathJoin } from "../helpers.js";
|
|
3
3
|
|
|
4
|
-
function run(command, { cwd, timeoutMs }) {
|
|
4
|
+
function run(command, { cwd, timeoutMs, abortSignal }) {
|
|
5
5
|
return new Promise((resolve) => {
|
|
6
6
|
const child = spawn("sh", ["-lc", command], { cwd, env: process.env });
|
|
7
7
|
let stdout = "";
|
|
@@ -12,10 +12,19 @@ function run(command, { cwd, timeoutMs }) {
|
|
|
12
12
|
child.kill("SIGTERM");
|
|
13
13
|
}, timeoutMs);
|
|
14
14
|
|
|
15
|
+
const onAbort = () => {
|
|
16
|
+
child.kill("SIGTERM");
|
|
17
|
+
};
|
|
18
|
+
if (abortSignal) {
|
|
19
|
+
if (abortSignal.aborted) onAbort();
|
|
20
|
+
else abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
21
|
+
}
|
|
22
|
+
|
|
15
23
|
child.stdout.on("data", (d) => { stdout += d.toString(); });
|
|
16
24
|
child.stderr.on("data", (d) => { stderr += d.toString(); });
|
|
17
25
|
child.on("close", (code, signal) => {
|
|
18
26
|
clearTimeout(timer);
|
|
27
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
19
28
|
resolve({ code, signal, timedOut, stdout, stderr });
|
|
20
29
|
});
|
|
21
30
|
});
|
|
@@ -43,6 +52,25 @@ function isSafeShellCommand(command) {
|
|
|
43
52
|
});
|
|
44
53
|
}
|
|
45
54
|
|
|
55
|
+
// Commands that stop or restart the daemon this tool is running INSIDE.
|
|
56
|
+
// Killing your own host mid-turn is not a dangerous-but-valid action, it is a
|
|
57
|
+
// guaranteed loss: the process dies, every in-flight turn dies with it, the
|
|
58
|
+
// stream to the user is cut, and the work of the turn is gone with no report.
|
|
59
|
+
// Seen in production — an agent that had just edited a handler ran `apx restart`
|
|
60
|
+
// "to load the new code" and executed itself two steps from finishing.
|
|
61
|
+
//
|
|
62
|
+
// Checked per command SEGMENT, so `cd x && apx restart` and
|
|
63
|
+
// `sleep 1; apx daemon stop` are both caught, while a segment that merely
|
|
64
|
+
// mentions the command — `echo "run apx restart when I'm done"` — is not.
|
|
65
|
+
const SELF_KILL_RE =
|
|
66
|
+
/^(?:apx\s+(?:restart\b|daemon\s+(?:restart|stop|kill)\b)|(?:pkill|killall)\b.*\bapx[-\s]?daemon\b)/i;
|
|
67
|
+
|
|
68
|
+
export function killsOwnDaemon(command) {
|
|
69
|
+
return String(command || "")
|
|
70
|
+
.split(/\s*(?:;|\||&&|\|\|)\s*/)
|
|
71
|
+
.some((segment) => SELF_KILL_RE.test(segment.trim()));
|
|
72
|
+
}
|
|
73
|
+
|
|
46
74
|
export default {
|
|
47
75
|
name: "run_shell",
|
|
48
76
|
schema: {
|
|
@@ -62,15 +90,29 @@ export default {
|
|
|
62
90
|
},
|
|
63
91
|
},
|
|
64
92
|
},
|
|
65
|
-
makeHandler: (
|
|
93
|
+
makeHandler: (ctx) => async ({ project, cwd = ".", command, timeout_s = 60, confirmed = false }) => {
|
|
94
|
+
const { projects, requirePermission, abortSignal } = ctx;
|
|
66
95
|
await requirePermission("run_shell", { dangerous: !isSafeShellCommand(command), confirmed, args: { command } });
|
|
67
96
|
if (!command) throw new Error("run_shell: command required");
|
|
97
|
+
if (killsOwnDaemon(command)) {
|
|
98
|
+
// An error, not a confirmation prompt: there is no answer that makes this
|
|
99
|
+
// succeed. Say why, and say what to do instead — code the agent just wrote
|
|
100
|
+
// is loaded by a restart the USER runs, after the turn has reported back.
|
|
101
|
+
return {
|
|
102
|
+
error:
|
|
103
|
+
"refused: that command restarts or stops the APX daemon you are running inside. " +
|
|
104
|
+
"It would kill this turn before you could report anything. Finish the work and tell " +
|
|
105
|
+
"the user to run it — a daemon restart is theirs to make, not something to do mid-turn.",
|
|
106
|
+
command,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
68
109
|
|
|
69
110
|
const p = resolveProject(projects, project);
|
|
70
111
|
const workingDir = safePathJoin(p.path, cwd);
|
|
71
112
|
const result = await run(command, {
|
|
72
113
|
cwd: workingDir,
|
|
73
114
|
timeoutMs: Math.max(1, Math.min(timeout_s, 600)) * 1000,
|
|
115
|
+
abortSignal,
|
|
74
116
|
});
|
|
75
117
|
return {
|
|
76
118
|
exit_code: result.code,
|
|
@@ -2,26 +2,48 @@ import { canNudge, recordNudge, nudgeFeedbackKeyboard } from "#core/nudge/index.
|
|
|
2
2
|
import { CHANNELS } from "#core/constants/channels.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Is
|
|
6
|
-
*
|
|
5
|
+
* Is this message a REACTION to something that arrived, or the agent deciding
|
|
6
|
+
* on its own to speak?
|
|
7
7
|
*
|
|
8
|
-
* PUSH PATH 3 OF 4, and the only one whose solicited-ness is not fixed.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* PUSH PATH 3 OF 4, and the only one whose solicited-ness is not fixed. The
|
|
9
|
+
* budget exists to stop APX inventing reasons to interrupt; it was never meant
|
|
10
|
+
* to swallow an answer to a message somebody actually sent.
|
|
11
|
+
*
|
|
12
|
+
* A turn on a conversation channel EXISTS because something came in — a
|
|
13
|
+
* WhatsApp from a contact, a web prompt, an A2A relay. Reporting that to the
|
|
14
|
+
* owner is the point of the bridge, not an interruption the agent thought up,
|
|
15
|
+
* so it does not spend the allowance. Only a self-started turn does: a routine
|
|
16
|
+
* or a cron, which arrive on CHANNELS.ROUTINE and keep paying.
|
|
17
|
+
*
|
|
18
|
+
* Recipient still matters, or "someone messaged me" becomes a licence to push
|
|
19
|
+
* anywhere. Telegram keeps its stricter rule (back to the originating chat
|
|
20
|
+
* only); every other channel may reach the DEFAULT chat — the owner's — and
|
|
21
|
+
* naming an explicit chat_id makes it a push again.
|
|
22
|
+
*
|
|
23
|
+
* NOTE: reactive means unbounded by design. A third party who messages the
|
|
24
|
+
* WhatsApp line controls how often the owner is pinged. That is the trade the
|
|
25
|
+
* owner asked for; the ledger still records every send.
|
|
13
26
|
*/
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
function isReactiveReply(ctx, chatId) {
|
|
28
|
+
// No channel at all, or a routine/cron turn: the agent chose to speak.
|
|
29
|
+
if (!ctx?.channel) return false;
|
|
30
|
+
if (ctx.channel === CHANNELS.ROUTINE) return false;
|
|
31
|
+
|
|
32
|
+
if (ctx.channel === CHANNELS.TELEGRAM) {
|
|
33
|
+
// buildTelegramMeta (channels/telegram/helpers.js:59) spells it `chatId`.
|
|
34
|
+
// Reading `chat_id` here would have silently made every reply look
|
|
35
|
+
// unsolicited and started charging the user's budget for their own answers.
|
|
36
|
+
const origin = ctx?.channelMeta?.chatId ?? ctx?.channelMeta?.chat_id;
|
|
37
|
+
if (!origin) return false;
|
|
38
|
+
// No chat_id given means "the channel default", which for a Telegram turn
|
|
39
|
+
// is the chat it arrived on.
|
|
40
|
+
if (chatId == null || chatId === "") return true;
|
|
41
|
+
return String(chatId) === String(origin);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// WhatsApp, web, desktop, api, a2a…: no Telegram chat of their own, so the
|
|
45
|
+
// default chat is the owner's and that is the only one they get for free.
|
|
46
|
+
return chatId == null || chatId === "";
|
|
25
47
|
}
|
|
26
48
|
|
|
27
49
|
function decodeBase64(b64) {
|
|
@@ -126,7 +148,7 @@ export default {
|
|
|
126
148
|
);
|
|
127
149
|
}
|
|
128
150
|
|
|
129
|
-
const solicited =
|
|
151
|
+
const solicited = isReactiveReply(ctx, chat_id);
|
|
130
152
|
const gate = canNudge(
|
|
131
153
|
{
|
|
132
154
|
kind: ctx?.channelMeta?.routineName ? `routine:${ctx.channelMeta.routineName}` : "agent_message",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { setAgentPrompt } from "#core/apc/agent-write.js";
|
|
2
|
+
import { projectMeta, resolveProject } from "../helpers.js";
|
|
3
|
+
|
|
4
|
+
// Replace an existing agent's system prompt (the body of its `.md`), keeping
|
|
5
|
+
// every frontmatter field. The native counterpart of `apx agent set --prompt`
|
|
6
|
+
// and the MCP `agent_set_prompt`, so the super-agent can rewrite an agent's
|
|
7
|
+
// instructions without shelling out or hand-editing the file.
|
|
8
|
+
export default {
|
|
9
|
+
name: "set_agent_prompt",
|
|
10
|
+
schema: {
|
|
11
|
+
type: "function",
|
|
12
|
+
function: {
|
|
13
|
+
name: "set_agent_prompt",
|
|
14
|
+
description:
|
|
15
|
+
"Replace an existing project agent's system prompt (its instructions), keeping its name/role/skills/model. Use this to fix or rewrite what an agent does — not run_shell, not write_file on the .md. `system` is required and non-empty.",
|
|
16
|
+
parameters: {
|
|
17
|
+
type: "object",
|
|
18
|
+
required: ["agent", "system"],
|
|
19
|
+
properties: {
|
|
20
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
21
|
+
agent: { type: "string", description: "Slug of the existing agent (from list_agents)." },
|
|
22
|
+
system: { type: "string", description: "The new full system prompt. REQUIRED, non-empty." },
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
makeHandler: ({ projects, requirePermission }) => async ({ project, agent, system } = {}) => {
|
|
28
|
+
await requirePermission("set_agent_prompt", { dangerous: true, args: { agent, project } });
|
|
29
|
+
if (!agent) return { error: "agent required" };
|
|
30
|
+
let p;
|
|
31
|
+
try {
|
|
32
|
+
p = resolveProject(projects, project || "default");
|
|
33
|
+
} catch (e) {
|
|
34
|
+
return { error: e.message };
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
setAgentPrompt(p, agent, system);
|
|
38
|
+
projects.rebuild(p.id);
|
|
39
|
+
return { ok: true, agent, project: projectMeta(projects, p) };
|
|
40
|
+
} catch (e) {
|
|
41
|
+
return { error: e.message };
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// view_media — load one of a skill's images INTO the agent's own context so it
|
|
2
|
+
// can reason about it (a swing position, a grip, a course diagram). The image
|
|
3
|
+
// manifest (id → caption) rides in the prompt for ~nothing; the pixels are
|
|
4
|
+
// pulled only when the agent asks, on the turn it asks — the same
|
|
5
|
+
// pay-as-you-go rule as read_skill for text.
|
|
6
|
+
//
|
|
7
|
+
// The bytes come back as base64 in an `images` field. run-agent.js lifts that
|
|
8
|
+
// off the JSON result and onto the tool message so a vision engine (Gemini)
|
|
9
|
+
// renders it as an inlineData part; text engines simply ignore it and see the
|
|
10
|
+
// caption. Nothing base64 ever lands in the transcript text.
|
|
11
|
+
import fs from "node:fs";
|
|
12
|
+
|
|
13
|
+
// A guard so a huge asset can't blow the turn's token budget. ~5 MB of base64
|
|
14
|
+
// is already a lot for one image; above that, tell the model to pick another.
|
|
15
|
+
const MAX_BYTES = 5 * 1024 * 1024;
|
|
16
|
+
|
|
17
|
+
export default {
|
|
18
|
+
name: "view_media",
|
|
19
|
+
schema: {
|
|
20
|
+
type: "function",
|
|
21
|
+
function: {
|
|
22
|
+
name: "view_media",
|
|
23
|
+
description:
|
|
24
|
+
"Load one of your skill's images into your own context so you can see and reason about it (a position, a grip, a diagram). Pass the image id from the skill manifest. Only call this when you actually need to look — to attach an image to your reply, use attach_media instead.",
|
|
25
|
+
parameters: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
id: { type: "string", description: "image id from the skill manifest" },
|
|
29
|
+
skill: { type: "string", description: "optional skill slug to disambiguate a shared id" },
|
|
30
|
+
},
|
|
31
|
+
required: ["id"],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
makeHandler: (ctx = {}) => ({ id, skill } = {}) => {
|
|
36
|
+
if (!id) throw new Error("view_media: id required");
|
|
37
|
+
const pool = Array.isArray(ctx.attachableMedia) ? ctx.attachableMedia : [];
|
|
38
|
+
if (!pool.length) return { error: "no images available for this agent's skills." };
|
|
39
|
+
|
|
40
|
+
const want = String(id).trim();
|
|
41
|
+
const matches = pool.filter((m) => m.id === want && (!skill || m.skill === skill));
|
|
42
|
+
if (!matches.length) {
|
|
43
|
+
return {
|
|
44
|
+
error: `no image "${want}"${skill ? ` in skill ${skill}` : ""}.`,
|
|
45
|
+
available: pool.map((m) => ({ id: m.id, skill: m.skill, caption: m.caption })),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const item = matches[0];
|
|
49
|
+
let buf;
|
|
50
|
+
try {
|
|
51
|
+
buf = fs.readFileSync(item.path);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
return { error: `could not read image "${want}": ${e?.message || e}` };
|
|
54
|
+
}
|
|
55
|
+
if (buf.length > MAX_BYTES) {
|
|
56
|
+
return {
|
|
57
|
+
error: `image "${want}" is ${(buf.length / 1048576).toFixed(1)} MB, over the ${(MAX_BYTES / 1048576).toFixed(0)} MB view limit.`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
ok: true,
|
|
62
|
+
id: item.id,
|
|
63
|
+
skill: item.skill,
|
|
64
|
+
caption: item.caption || "",
|
|
65
|
+
note: `Loaded image "${item.id}" — described in the caption and shown to you now.`,
|
|
66
|
+
images: [{ data: buf.toString("base64"), mime: item.mime || "image/jpeg" }],
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { appendAgentMemory, writeAgentMemory } from "#core/agent/memory.js";
|
|
2
|
+
import { readAgents } from "#core/apc/parser.js";
|
|
3
|
+
import { projectMeta, resolveProject } from "../helpers.js";
|
|
4
|
+
|
|
5
|
+
// Write ANOTHER agent's memory (~/.apx/projects/<id>/agents/<slug>/memory.md).
|
|
6
|
+
// Distinct from `remember`, which writes the super-agent's OWN notebook: this
|
|
7
|
+
// seeds or updates a project agent's memory so it can track progress across
|
|
8
|
+
// runs (e.g. a coach recording which topics it has already taught). Append is
|
|
9
|
+
// the default; `mode: "replace"` overwrites the whole file.
|
|
10
|
+
export default {
|
|
11
|
+
name: "write_agent_memory",
|
|
12
|
+
schema: {
|
|
13
|
+
type: "function",
|
|
14
|
+
function: {
|
|
15
|
+
name: "write_agent_memory",
|
|
16
|
+
description:
|
|
17
|
+
"Write a note into a PROJECT AGENT's own memory.md (not your own notebook — that's `remember`). Use it to seed or update what another agent knows across runs. Default mode appends a dated line under '## Recent context'; mode 'replace' overwrites the whole file. Give the agent slug (from list_agents).",
|
|
18
|
+
parameters: {
|
|
19
|
+
type: "object",
|
|
20
|
+
required: ["agent", "content"],
|
|
21
|
+
properties: {
|
|
22
|
+
project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
|
|
23
|
+
agent: { type: "string", description: "Slug of the agent whose memory to write (from list_agents)." },
|
|
24
|
+
content: { type: "string", description: "The note (append mode) or the full memory body (replace mode)." },
|
|
25
|
+
mode: { type: "string", enum: ["append", "replace"], description: "append (default) adds a dated line under Recent context; replace overwrites." },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
makeHandler: ({ projects, requirePermission }) => async ({ project, agent, content, mode = "append" } = {}) => {
|
|
31
|
+
await requirePermission("write_agent_memory", { dangerous: true, args: { agent, project } });
|
|
32
|
+
if (!agent) return { error: "agent required" };
|
|
33
|
+
if (!content || !String(content).trim()) return { error: "content required" };
|
|
34
|
+
let p;
|
|
35
|
+
try {
|
|
36
|
+
p = resolveProject(projects, project || "default");
|
|
37
|
+
} catch (e) {
|
|
38
|
+
return { error: e.message };
|
|
39
|
+
}
|
|
40
|
+
if (!readAgents(p.path).some((a) => a.slug === agent)) {
|
|
41
|
+
return { error: `agent ${agent} not found in ${projectMeta(projects, p).name}` };
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const path = mode === "replace"
|
|
45
|
+
? writeAgentMemory(p, agent, String(content))
|
|
46
|
+
: appendAgentMemory(p, agent, String(content));
|
|
47
|
+
return { ok: true, agent, mode, project: projectMeta(projects, p), path };
|
|
48
|
+
} catch (e) {
|
|
49
|
+
return { error: e.message };
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -3,11 +3,39 @@
|
|
|
3
3
|
// core/apc/projects-helpers.js and is re-exported here for back-compat.
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { agentSkills, buildAgentSystem as buildCoreAgentSystem } from "#core/agent/build-agent-system.js";
|
|
6
|
+
import { agentForcedModel } from "#core/agent/agent-model.js";
|
|
6
7
|
import { buildConfirmDescription } from "#core/confirmation/index.js";
|
|
7
8
|
import { PERMISSION_MODES, DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
|
|
8
9
|
|
|
9
10
|
export { projectMeta, resolveProject } from "#core/apc/projects-helpers.js";
|
|
10
11
|
|
|
12
|
+
/**
|
|
13
|
+
* A missing-argument error that names what the tool actually takes.
|
|
14
|
+
*
|
|
15
|
+
* "task required" is true and useless. The model that triggered it had passed
|
|
16
|
+
* `id` — the key list_tasks hands back — so the error confirmed something was
|
|
17
|
+
* missing without saying what would satisfy it. It retried the identical call,
|
|
18
|
+
* gave up, and left the task open. Naming the accepted keys and echoing the
|
|
19
|
+
* ones that arrived ends that in one step instead of three.
|
|
20
|
+
*
|
|
21
|
+
* @param {string} tool tool name, for the message
|
|
22
|
+
* @param {string} missing the parameter that was not supplied
|
|
23
|
+
* @param {{required?: string[], optional?: string[]}} accepts
|
|
24
|
+
* @param {object} got the args the model actually sent
|
|
25
|
+
*/
|
|
26
|
+
export function missingArg(tool, missing, accepts = {}, got = {}) {
|
|
27
|
+
const required = accepts.required || [];
|
|
28
|
+
const optional = accepts.optional || [];
|
|
29
|
+
const sent = Object.keys(got || {});
|
|
30
|
+
return {
|
|
31
|
+
error:
|
|
32
|
+
`${missing} required. ${tool} takes ${required.join(", ") || "(none required)"}` +
|
|
33
|
+
`${optional.length ? ` (optional: ${optional.join(", ")})` : ""}` +
|
|
34
|
+
`${sent.length ? `; you sent ${sent.join(", ")}` : "; you sent nothing"}.`,
|
|
35
|
+
expects: { required, optional },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
11
39
|
export function safePathJoin(root, sub = ".") {
|
|
12
40
|
const target = path.resolve(root, sub || ".");
|
|
13
41
|
const rootResolved = path.resolve(root);
|
|
@@ -24,10 +52,14 @@ export function skillsFromFields(fields = {}) {
|
|
|
24
52
|
export function agentRow(agent) {
|
|
25
53
|
return {
|
|
26
54
|
slug: agent.slug,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
55
|
+
name: agent.name || agent.fields?.Name || agent.slug,
|
|
56
|
+
type: agent.fields?.Type || null,
|
|
57
|
+
role: agent.fields?.Role || null,
|
|
58
|
+
// Only a real override is worth telling the model about — `inherit` says
|
|
59
|
+
// nothing it can act on.
|
|
60
|
+
model: agentForcedModel(agent) || null,
|
|
61
|
+
language: agent.fields?.Language || null,
|
|
62
|
+
description: agent.fields?.Description || null,
|
|
31
63
|
skills: skillsFromFields(agent.fields),
|
|
32
64
|
};
|
|
33
65
|
}
|
|
@@ -13,7 +13,14 @@ export const TOOLS = Object.freeze({
|
|
|
13
13
|
LIST_AGENTS: "list_agents",
|
|
14
14
|
LIST_VAULT_AGENTS: "list_vault_agents",
|
|
15
15
|
IMPORT_AGENT: "import_agent",
|
|
16
|
+
CREATE_AGENT: "create_agent",
|
|
17
|
+
SET_AGENT_PROMPT: "set_agent_prompt",
|
|
18
|
+
WRITE_AGENT_MEMORY: "write_agent_memory",
|
|
19
|
+
CONFIGURE_AGENT: "configure_agent",
|
|
20
|
+
REMOVE_AGENT: "remove_agent",
|
|
16
21
|
LIST_MCPS: "list_mcps",
|
|
22
|
+
LIST_MCP_TOOLS: "list_mcp_tools",
|
|
23
|
+
ADD_MCP: "add_mcp",
|
|
17
24
|
|
|
18
25
|
// Memory
|
|
19
26
|
READ_AGENT_MEMORY: "read_agent_memory",
|
|
@@ -36,13 +43,23 @@ export const TOOLS = Object.freeze({
|
|
|
36
43
|
// Skills + dynamic tool surface
|
|
37
44
|
LIST_SKILLS: "list_skills",
|
|
38
45
|
LOAD_SKILL: "load_skill",
|
|
46
|
+
READ_SKILL: "read_skill",
|
|
47
|
+
ATTACH_MEDIA: "attach_media",
|
|
48
|
+
VIEW_MEDIA: "view_media",
|
|
39
49
|
DISCOVER_TOOLS: "discover_tools",
|
|
40
50
|
|
|
41
51
|
// Tasks
|
|
42
52
|
LIST_TASKS: "list_tasks",
|
|
43
53
|
CREATE_TASK: "create_task",
|
|
54
|
+
COMPLETE_TASK: "complete_task",
|
|
55
|
+
COMMENT_TASK: "comment_task",
|
|
44
56
|
RECORD_COMMITMENT: "record_commitment",
|
|
57
|
+
MARK_COMMITMENT: "mark_commitment",
|
|
45
58
|
REMEMBER_ROUTINE: "remember_routine",
|
|
59
|
+
|
|
60
|
+
// Routines
|
|
61
|
+
LIST_ROUTINES: "list_routines",
|
|
62
|
+
RUN_ROUTINE: "run_routine",
|
|
46
63
|
LIST_COMMITMENTS: "list_commitments",
|
|
47
64
|
|
|
48
65
|
// Interaction
|
|
@@ -68,6 +85,12 @@ export const TOOLS = Object.freeze({
|
|
|
68
85
|
GITHUB_LIST_REPOS: "github_list_repos",
|
|
69
86
|
GITHUB_CREATE_ISSUE: "github_create_issue",
|
|
70
87
|
|
|
88
|
+
// Integrations — Google Calendar plugin (see core/integrations/plugins/calendar.js)
|
|
89
|
+
CALENDAR_LIST_EVENTS: "calendar_list_events",
|
|
90
|
+
CALENDAR_FIND_SLOT: "calendar_find_slot",
|
|
91
|
+
CALENDAR_CREATE_EVENT: "calendar_create_event",
|
|
92
|
+
CALENDAR_UPDATE_EVENT: "calendar_update_event",
|
|
93
|
+
|
|
71
94
|
// Integrations — Obsidian plugin (see core/integrations/plugins/obsidian.js)
|
|
72
95
|
OBSIDIAN_SEARCH_NOTES: "obsidian_search_notes",
|
|
73
96
|
OBSIDIAN_READ_NOTE: "obsidian_read_note",
|
|
@@ -104,8 +127,18 @@ export const NATIVE_TOOL_NAMES = new Set([
|
|
|
104
127
|
TOOLS.LIST_AGENTS,
|
|
105
128
|
TOOLS.LIST_VAULT_AGENTS,
|
|
106
129
|
TOOLS.IMPORT_AGENT,
|
|
130
|
+
TOOLS.CREATE_AGENT,
|
|
131
|
+
TOOLS.SET_AGENT_PROMPT,
|
|
132
|
+
TOOLS.WRITE_AGENT_MEMORY,
|
|
133
|
+
TOOLS.CONFIGURE_AGENT,
|
|
134
|
+
TOOLS.REMOVE_AGENT,
|
|
135
|
+
TOOLS.ADD_MCP,
|
|
136
|
+
TOOLS.COMPLETE_TASK,
|
|
137
|
+
TOOLS.COMMENT_TASK,
|
|
138
|
+
TOOLS.MARK_COMMITMENT,
|
|
107
139
|
TOOLS.ADD_PROJECT,
|
|
108
140
|
TOOLS.LIST_MCPS,
|
|
141
|
+
TOOLS.LIST_MCP_TOOLS,
|
|
109
142
|
TOOLS.READ_AGENT_MEMORY,
|
|
110
143
|
TOOLS.LIST_FILES,
|
|
111
144
|
TOOLS.READ_FILE,
|
|
@@ -129,6 +162,10 @@ export const NATIVE_TOOL_NAMES = new Set([
|
|
|
129
162
|
TOOLS.OBSIDIAN_READ_NOTE,
|
|
130
163
|
TOOLS.OBSIDIAN_WRITE_NOTE,
|
|
131
164
|
TOOLS.OBSIDIAN_LIST_NOTES,
|
|
165
|
+
TOOLS.CALENDAR_LIST_EVENTS,
|
|
166
|
+
TOOLS.CALENDAR_FIND_SLOT,
|
|
167
|
+
TOOLS.CALENDAR_CREATE_EVENT,
|
|
168
|
+
TOOLS.CALENDAR_UPDATE_EVENT,
|
|
132
169
|
TOOLS.SEND_TELEGRAM,
|
|
133
170
|
TOOLS.SET_IDENTITY,
|
|
134
171
|
TOOLS.SET_PERMISSION_MODE,
|
|
@@ -136,11 +173,16 @@ export const NATIVE_TOOL_NAMES = new Set([
|
|
|
136
173
|
TOOLS.REMEMBER,
|
|
137
174
|
TOOLS.LIST_SKILLS,
|
|
138
175
|
TOOLS.LOAD_SKILL,
|
|
176
|
+
TOOLS.READ_SKILL,
|
|
177
|
+
TOOLS.ATTACH_MEDIA,
|
|
178
|
+
TOOLS.VIEW_MEDIA,
|
|
139
179
|
TOOLS.LIST_TASKS,
|
|
140
180
|
TOOLS.CREATE_TASK,
|
|
141
181
|
TOOLS.RECORD_COMMITMENT,
|
|
142
182
|
TOOLS.LIST_COMMITMENTS,
|
|
143
183
|
TOOLS.REMEMBER_ROUTINE,
|
|
184
|
+
TOOLS.LIST_ROUTINES,
|
|
185
|
+
TOOLS.RUN_ROUTINE,
|
|
144
186
|
TOOLS.ASK_QUESTIONS,
|
|
145
187
|
TOOLS.SEARCH_SESSIONS,
|
|
146
188
|
TOOLS.TRANSCRIBE_AUDIO,
|
|
@@ -187,6 +229,7 @@ export const CODE_PLAN_TOOLS = Object.freeze([
|
|
|
187
229
|
TOOLS.TAIL_MESSAGES,
|
|
188
230
|
TOOLS.LIST_SKILLS,
|
|
189
231
|
TOOLS.LOAD_SKILL,
|
|
232
|
+
TOOLS.READ_SKILL,
|
|
190
233
|
TOOLS.LIST_TASKS,
|
|
191
234
|
TOOLS.LIST_COMMITMENTS,
|
|
192
235
|
TOOLS.ASK_QUESTIONS,
|
|
@@ -236,6 +279,15 @@ export const SIDE_EFFECT_TOOLS = new Set([
|
|
|
236
279
|
TOOLS.RUN_SHELL,
|
|
237
280
|
TOOLS.CALL_RUNTIME,
|
|
238
281
|
TOOLS.ADD_PROJECT,
|
|
282
|
+
TOOLS.CREATE_AGENT,
|
|
283
|
+
TOOLS.SET_AGENT_PROMPT,
|
|
284
|
+
TOOLS.WRITE_AGENT_MEMORY,
|
|
285
|
+
TOOLS.CONFIGURE_AGENT,
|
|
286
|
+
TOOLS.REMOVE_AGENT,
|
|
287
|
+
TOOLS.ADD_MCP,
|
|
288
|
+
TOOLS.COMPLETE_TASK,
|
|
289
|
+
TOOLS.COMMENT_TASK,
|
|
290
|
+
TOOLS.MARK_COMMITMENT,
|
|
239
291
|
TOOLS.SET_IDENTITY,
|
|
240
292
|
]);
|
|
241
293
|
|
|
@@ -245,6 +297,18 @@ export const SIDE_EFFECT_TOOLS = new Set([
|
|
|
245
297
|
*/
|
|
246
298
|
export const ACK_ONLY_TOOLS = new Set([TOOLS.SEND_TELEGRAM]);
|
|
247
299
|
|
|
300
|
+
/**
|
|
301
|
+
* Tools that put words in front of a PERSON.
|
|
302
|
+
*
|
|
303
|
+
* Deduping these needs more than the exact (name + args) match every other
|
|
304
|
+
* side effect gets: a model asked to relay something re-words it each time it
|
|
305
|
+
* tries, so three sends with the same content and three different openers all
|
|
306
|
+
* looked distinct and all three arrived. Measured on 2026-08-30 — one WhatsApp
|
|
307
|
+
* from a contact produced three near-identical Telegram messages to the owner.
|
|
308
|
+
* See loop/side-effects.js for the comparison itself.
|
|
309
|
+
*/
|
|
310
|
+
export const MESSAGE_TOOLS = new Set([TOOLS.SEND_TELEGRAM]);
|
|
311
|
+
|
|
248
312
|
/**
|
|
249
313
|
* Tools whose semantics REQUIRE handing control back to a human. The loop
|
|
250
314
|
* breaks after these even under a completion contract, because the task
|
|
@@ -64,12 +64,35 @@ function buildSchema(entry) {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
/**
|
|
68
|
+
* A bridged tool runs in the DAEMON's process, which stands in the apx checkout
|
|
69
|
+
* — so a relative path it is handed resolves against that checkout instead of
|
|
70
|
+
* against the project whose agent asked. `grep {path: "work/marketing/…"}` from
|
|
71
|
+
* Magui in Appsi came back "path does not exist:
|
|
72
|
+
* /…/agentprojectcontext/apx/work/marketing/…". A native tool has the registry
|
|
73
|
+
* to ask (see scopeProjects); a bridged one crosses HTTP and arrives with no
|
|
74
|
+
* project at all, so the caller's directory has to travel WITH the request.
|
|
75
|
+
*
|
|
76
|
+
* Only for the file tools, and only when the caller did not name one: `cwd` is
|
|
77
|
+
* a default for relative paths, never an override of an absolute one.
|
|
78
|
+
*/
|
|
79
|
+
function bridgeCwd(entry, args, ctx) {
|
|
80
|
+
if (entry.category !== "file") return null;
|
|
81
|
+
if (args.cwd) return null;
|
|
82
|
+
const scoped = ctx?.projects?.current?.();
|
|
83
|
+
return scoped?.path || null;
|
|
84
|
+
}
|
|
85
|
+
|
|
67
86
|
function buildHandler(entry) {
|
|
68
|
-
return (
|
|
87
|
+
return (ctx = {}) => async (args = {}) => {
|
|
88
|
+
const { globalConfig } = ctx;
|
|
69
89
|
const port = globalConfig?.port || process.env.APX_PORT || 7430;
|
|
70
90
|
const method = String(entry.endpoint?.method || "POST").toUpperCase();
|
|
71
91
|
let url = `http://127.0.0.1:${port}${entry.endpoint?.path || ""}`;
|
|
72
92
|
|
|
93
|
+
const cwd = bridgeCwd(entry, args, ctx);
|
|
94
|
+
if (cwd) args = { ...args, cwd };
|
|
95
|
+
|
|
73
96
|
const token = daemonToken();
|
|
74
97
|
const opts = {
|
|
75
98
|
method,
|