@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
|
@@ -67,6 +67,35 @@ export async function cmdProjectRebuild(args) {
|
|
|
67
67
|
console.log(`Rebuilt project #${id}: ${result.agents} agents`);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* The filesystem root of a project, from the same selectors resolveProjectId
|
|
72
|
+
* accepts (numeric id, path, exact name, fuzzy name/path).
|
|
73
|
+
*
|
|
74
|
+
* WHY THIS EXISTS. Commands that edit files under `.apc/` need the path, not the
|
|
75
|
+
* id, and they all resolved it by walking up from cwd. So `apx agent set magui
|
|
76
|
+
* --tools …` run from anywhere but that one checkout failed with "not inside an
|
|
77
|
+
* APC project (run `apx init` first)" — advice that would have scaffolded a
|
|
78
|
+
* second project on top of the shell's cwd instead of editing the agent the
|
|
79
|
+
* user named. `--project` already works everywhere else; now it works here.
|
|
80
|
+
*/
|
|
81
|
+
export async function resolveProjectRoot(target) {
|
|
82
|
+
if (target === true) {
|
|
83
|
+
throw new Error("--project needs a value: a project name, id, or path (`apx project list` shows them)");
|
|
84
|
+
}
|
|
85
|
+
if (target === undefined || target === null || target === "") {
|
|
86
|
+
const root = findApfRoot();
|
|
87
|
+
if (root) return root;
|
|
88
|
+
throw new Error(
|
|
89
|
+
"not inside an APC project — cd into one, run `apx init` here, or name the project with --project <name|id|path>"
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const id = await resolveProjectId(target);
|
|
93
|
+
const projects = await http.get("/api/projects");
|
|
94
|
+
const found = projects.find((p) => Number(p.id) === Number(id));
|
|
95
|
+
if (!found) throw new Error(`--project "${target}" is not registered — run \`apx project list\``);
|
|
96
|
+
return found.path;
|
|
97
|
+
}
|
|
98
|
+
|
|
70
99
|
// Resolve a project id from one of:
|
|
71
100
|
// numeric id ("2")
|
|
72
101
|
// absolute path ("/abs/path/to/project")
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { http } from "../http.js";
|
|
2
2
|
import { resolveProjectId } from "./project.js";
|
|
3
3
|
import { listRoutines } from "#core/stores/routines.js";
|
|
4
|
+
import {
|
|
5
|
+
deliveryChannelIds,
|
|
6
|
+
normalizeDeliverTo,
|
|
7
|
+
PROFILE_DELIVERY,
|
|
8
|
+
NO_DELIVERY,
|
|
9
|
+
} from "#core/routines/index.js";
|
|
4
10
|
import { projectStorageRoot } from "#core/config/index.js";
|
|
5
11
|
import {
|
|
6
12
|
routineMemoryPath,
|
|
@@ -9,6 +15,13 @@ import {
|
|
|
9
15
|
ensureRoutineMemory,
|
|
10
16
|
} from "#core/stores/routine-memory.js";
|
|
11
17
|
|
|
18
|
+
// Flags that belong to the routine record itself, not to its `spec`.
|
|
19
|
+
const ROUTINE_FLAGS = [
|
|
20
|
+
"name", "kind", "schedule", "spec", "verbose", "project",
|
|
21
|
+
"permission-mode", "allowed-tools",
|
|
22
|
+
"pre-commands", "post-commands", "skip-prompt-on", "deliver-to",
|
|
23
|
+
];
|
|
24
|
+
|
|
12
25
|
function parseSpec(args) {
|
|
13
26
|
// Build spec from --spec '<json>' or from --K=V pairs
|
|
14
27
|
if (args.flags.spec && args.flags.spec !== true) {
|
|
@@ -20,7 +33,11 @@ function parseSpec(args) {
|
|
|
20
33
|
}
|
|
21
34
|
const spec = {};
|
|
22
35
|
for (const [k, v] of Object.entries(args.flags)) {
|
|
23
|
-
|
|
36
|
+
// Every flag `cmdRoutineAdd` reads for itself. A name missing from this
|
|
37
|
+
// list does not just get ignored — it lands in `spec` as a stray key the
|
|
38
|
+
// handler never reads, which is how `--post-commands` used to end up
|
|
39
|
+
// stored twice, once parsed and once as raw text.
|
|
40
|
+
if (ROUTINE_FLAGS.includes(k)) continue;
|
|
24
41
|
if (v === true) continue;
|
|
25
42
|
// try to JSON-parse the value (numbers, bools), else keep as string
|
|
26
43
|
let val = v;
|
|
@@ -86,12 +103,26 @@ export async function cmdRoutineAdd(args) {
|
|
|
86
103
|
const skip_prompt_on = args.flags["skip-prompt-on"] && args.flags["skip-prompt-on"] !== true
|
|
87
104
|
? args.flags["skip-prompt-on"]
|
|
88
105
|
: undefined;
|
|
106
|
+
// Where the output goes: `--deliver-to telegram,web`, `--deliver-to profile`
|
|
107
|
+
// to take it from the active agent profile, `--deliver-to none` to say out
|
|
108
|
+
// loud that this one delivers nowhere. Omitted leaves the field unset, which
|
|
109
|
+
// is not the same as empty — see deliver_to in core/stores/routines.js.
|
|
110
|
+
const deliver_to = args.flags["deliver-to"] && args.flags["deliver-to"] !== true
|
|
111
|
+
? normalizeDeliverTo(String(args.flags["deliver-to"]))
|
|
112
|
+
: undefined;
|
|
113
|
+
if (deliver_to) {
|
|
114
|
+
const known = [...deliveryChannelIds(), PROFILE_DELIVERY, NO_DELIVERY];
|
|
115
|
+
const bad = deliver_to.filter((c) => !known.includes(c));
|
|
116
|
+
if (bad.length)
|
|
117
|
+
throw new Error(`apx routine add: unknown --deliver-to channel: ${bad.join(", ")} (known: ${known.join(", ")})`);
|
|
118
|
+
}
|
|
89
119
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
90
|
-
const r = await http.post(`/api/projects/${pid}/routines`, { name, kind, schedule, spec, permission_mode, allowed_tools, pre_commands, post_commands, skip_prompt_on });
|
|
120
|
+
const r = await http.post(`/api/projects/${pid}/routines`, { name, kind, schedule, spec, permission_mode, allowed_tools, pre_commands, post_commands, skip_prompt_on, deliver_to });
|
|
91
121
|
console.log(`added routine "${r.name}" (${r.kind}, ${r.schedule}) → next ${r.next_run_at}`);
|
|
92
122
|
if (r.pre_commands?.length) console.log(` pre: ${r.pre_commands.join(", ")}`);
|
|
93
123
|
if (r.post_commands?.length) console.log(` post: ${r.post_commands.join(", ")}`);
|
|
94
124
|
if (r.skip_prompt_on && r.skip_prompt_on !== "signal") console.log(` skip_prompt_on: ${r.skip_prompt_on}`);
|
|
125
|
+
if (r.deliver_to) console.log(` deliver_to: ${r.deliver_to.length ? r.deliver_to.join(", ") : "(nowhere)"}`);
|
|
95
126
|
}
|
|
96
127
|
|
|
97
128
|
export async function cmdRoutineRemove(args) {
|
|
@@ -182,16 +213,20 @@ export async function cmdRoutineHistory(args) {
|
|
|
182
213
|
if (!name) throw new Error("apx routine history: missing <name>");
|
|
183
214
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
184
215
|
const limit = args.flags.n || args.flags.last || "50";
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
216
|
+
// The daemon decides what counts as a run (core/routines/run-log.js). This
|
|
217
|
+
// used to read the raw routine channel and keep every row carrying
|
|
218
|
+
// `meta.routine`, which is one row per TOOL CALL plus the "routine created /
|
|
219
|
+
// updated" rows — so `history` printed a run's internals interleaved with
|
|
220
|
+
// edits and called all of it history. Same bug the panel had; same fix.
|
|
221
|
+
const runs = await http.get(
|
|
222
|
+
`/api/projects/${pid}/routines/${encodeURIComponent(name)}/runs?limit=${encodeURIComponent(limit)}`
|
|
223
|
+
);
|
|
224
|
+
if (runs.length === 0) {
|
|
190
225
|
console.log("(no routine history)");
|
|
191
226
|
return;
|
|
192
227
|
}
|
|
193
|
-
for (const r of
|
|
194
|
-
const
|
|
195
|
-
console.log(`${r.ts}
|
|
228
|
+
for (const r of [...runs].reverse()) {
|
|
229
|
+
const chat = r.conversation_id ? ` [chat ${r.agent_slug}/${r.conversation_id}]` : "";
|
|
230
|
+
console.log(`${r.ts} ${r.status} ${r.body}${chat}`);
|
|
196
231
|
}
|
|
197
232
|
}
|
|
@@ -1,13 +1,36 @@
|
|
|
1
1
|
import { http } from "../http.js";
|
|
2
2
|
import { resolveProjectId } from "./project.js";
|
|
3
3
|
|
|
4
|
+
const SLUG_RE = /^[a-z][a-z0-9_-]*$/;
|
|
5
|
+
|
|
6
|
+
// Resolve the OPTIONAL agent and the prompt positionals for `apx run`. The APX
|
|
7
|
+
// agent only shapes the system prompt handed to the external CLI — the CLI has
|
|
8
|
+
// its own agency — so no agent means a pass-through:
|
|
9
|
+
// apx run --runtime claude-code "<prompt>" → { slug: null } (pass-through)
|
|
10
|
+
// apx run -a reviewer --runtime claude-code "<prompt>" → { slug: "reviewer" }
|
|
11
|
+
// apx run reviewer --runtime claude-code "<prompt>" → legacy positional (still works)
|
|
12
|
+
// A SINGLE positional is always the prompt, so a quoted pass-through prompt is
|
|
13
|
+
// never mistaken for an agent.
|
|
14
|
+
export function resolveRunAgent(flags = {}, positionals = []) {
|
|
15
|
+
const flagVal =
|
|
16
|
+
(flags.agent && flags.agent !== true) ? String(flags.agent) :
|
|
17
|
+
(flags.a && flags.a !== true) ? String(flags.a) : null;
|
|
18
|
+
let slug = flagVal;
|
|
19
|
+
let rest = positionals.slice();
|
|
20
|
+
if (!slug && rest.length >= 2 && SLUG_RE.test(rest[0])) {
|
|
21
|
+
slug = rest[0];
|
|
22
|
+
rest = rest.slice(1);
|
|
23
|
+
}
|
|
24
|
+
return { slug: slug || null, positionals: rest };
|
|
25
|
+
}
|
|
26
|
+
|
|
4
27
|
export async function cmdRun(args) {
|
|
5
|
-
const slug = args._[0];
|
|
6
|
-
if (!slug) throw new Error("apx run: usage: apx run <agent> --runtime <id> \"<prompt>\"");
|
|
7
28
|
const runtime = args.flags.runtime === true ? null : args.flags.runtime;
|
|
8
29
|
if (!runtime) throw new Error("apx run: --runtime required (claude-code | codex | opencode | aider | cursor-agent | gemini-cli | qwen-code | antigravity)");
|
|
9
30
|
|
|
10
|
-
|
|
31
|
+
const { slug, positionals } = resolveRunAgent(args.flags, args._);
|
|
32
|
+
|
|
33
|
+
let prompt = positionals.join(" ").trim();
|
|
11
34
|
if (!prompt || prompt === "-") {
|
|
12
35
|
const fs = await import("node:fs");
|
|
13
36
|
if (!process.stdin.isTTY) {
|
|
@@ -30,10 +53,10 @@ export async function cmdRun(args) {
|
|
|
30
53
|
? parseInt(args.flags.timeout, 10) * 1000
|
|
31
54
|
: undefined;
|
|
32
55
|
|
|
33
|
-
const
|
|
34
|
-
`/api/projects/${pid}/agents/${slug}/runtime
|
|
35
|
-
{
|
|
36
|
-
);
|
|
56
|
+
const endpoint = slug
|
|
57
|
+
? `/api/projects/${pid}/agents/${slug}/runtime`
|
|
58
|
+
: `/api/projects/${pid}/runtime`;
|
|
59
|
+
const result = await http.post(endpoint, { runtime, prompt, timeoutMs });
|
|
37
60
|
|
|
38
61
|
if (result.output) process.stdout.write(result.output + "\n");
|
|
39
62
|
if (process.stderr.isTTY || args.flags.verbose) {
|
|
@@ -6,6 +6,7 @@ import { getOrCreateApxId } from "#core/apc/scaffold.js";
|
|
|
6
6
|
import { generateSessionId } from "#core/stores/sessions.js";
|
|
7
7
|
import { projectStorageRoot } from "#core/config/index.js";
|
|
8
8
|
import { http } from "../http.js";
|
|
9
|
+
import { readStdinSync } from "../stdin.js";
|
|
9
10
|
import { resolveProjectId } from "./project.js";
|
|
10
11
|
import {
|
|
11
12
|
ENGINES,
|
|
@@ -30,20 +31,6 @@ function requireStorageRoot(root) {
|
|
|
30
31
|
|
|
31
32
|
const nowIso = () => new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
32
33
|
|
|
33
|
-
function readStdinSync() {
|
|
34
|
-
const chunks = [];
|
|
35
|
-
const buf = Buffer.alloc(65536);
|
|
36
|
-
try {
|
|
37
|
-
while (true) {
|
|
38
|
-
const bytes = fs.readSync(0, buf, 0, buf.length);
|
|
39
|
-
if (!bytes) break;
|
|
40
|
-
chunks.push(buf.slice(0, bytes).toString("utf8"));
|
|
41
|
-
}
|
|
42
|
-
} catch {}
|
|
43
|
-
return chunks.join("");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
34
|
|
|
48
35
|
function listAllSessions(root) {
|
|
49
36
|
const agentsDir = path.join(requireStorageRoot(root), "agents");
|
|
@@ -173,8 +160,8 @@ export function cmdSessionList(args) {
|
|
|
173
160
|
/**
|
|
174
161
|
* `apx session get <id>` — single-record fetch.
|
|
175
162
|
*
|
|
176
|
-
* - Default: search the current APC project's local sessions (
|
|
177
|
-
*
|
|
163
|
+
* - Default: search the current APC project's local sessions (fast, no
|
|
164
|
+
* daemon, no engine scan).
|
|
178
165
|
* - --engine <id> : look only inside that engine's storage (apx, claude,
|
|
179
166
|
* codex). Useful when you want the raw transcript of a
|
|
180
167
|
* Claude/Codex session by id.
|
|
@@ -214,7 +201,7 @@ export function cmdSessionGet(args) {
|
|
|
214
201
|
return printEngineSession(hits[0], args);
|
|
215
202
|
}
|
|
216
203
|
|
|
217
|
-
//
|
|
204
|
+
// Default — local APC project session lookup.
|
|
218
205
|
const root = requireRoot();
|
|
219
206
|
const s = findSessionById(root, id);
|
|
220
207
|
if (!s) {
|
|
@@ -489,30 +476,76 @@ export async function cmdSessionResume(args) {
|
|
|
489
476
|
}
|
|
490
477
|
}
|
|
491
478
|
|
|
492
|
-
// ── 4.
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
479
|
+
// ── 4. Continue the session ──────────────────────────────────────────────
|
|
480
|
+
// Two shapes share one flag family:
|
|
481
|
+
// --continue → interactive: hand the terminal to the native
|
|
482
|
+
// CLI (claude --resume / codex resume) so a
|
|
483
|
+
// HUMAN keeps typing. (stdio inherited)
|
|
484
|
+
// --continue --msg "<text>" → headless: inject one message into the
|
|
485
|
+
// existing transcript (full context) and
|
|
486
|
+
// capture the reply. This is how an APX agent
|
|
487
|
+
// answers a coding session it doesn't share a
|
|
488
|
+
// live process with — the return leg of a
|
|
489
|
+
// CLI ⇄ agent hand-off. `--msg` implies continue.
|
|
490
|
+
const relayMsgFlag = args.flags.msg ?? args.flags.text ?? args.flags.m;
|
|
491
|
+
const wantsRelay = relayMsgFlag !== undefined && relayMsgFlag !== false;
|
|
492
|
+
if (args.flags.continue || wantsRelay) {
|
|
493
|
+
if (wantsRelay) {
|
|
494
|
+
const message = relayMsgFlag === true || relayMsgFlag === "-" ? readStdinSync().trim() : String(relayMsgFlag);
|
|
495
|
+
if (!message) throw new Error('apx session resume --msg: message is empty (pass "<text>" or pipe it on stdin)');
|
|
496
|
+
const spec = spawnHeadlessMsgSpec(meta, message);
|
|
497
|
+
if (!spec) {
|
|
498
|
+
console.log("");
|
|
499
|
+
console.log(`(--msg headless delivery not supported for engine "${meta.engine}" yet — claude only; use --continue without --msg for interactive)`);
|
|
500
|
+
process.exitCode = 2;
|
|
501
|
+
} else {
|
|
502
|
+
console.error(`→ delivering to ${meta.engine}:${meta.id}${spec.cwd ? ` (cwd: ${spec.cwd})` : ""}`);
|
|
503
|
+
const child = spawn(spec.bin, spec.args, {
|
|
504
|
+
cwd: spec.cwd || process.cwd(),
|
|
505
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
506
|
+
});
|
|
507
|
+
let out = "";
|
|
508
|
+
let err = "";
|
|
509
|
+
child.stdout.on("data", (d) => (out += d));
|
|
510
|
+
child.stderr.on("data", (d) => (err += d));
|
|
511
|
+
const code = await new Promise((resolve) => {
|
|
512
|
+
child.on("exit", (c) => resolve(c));
|
|
513
|
+
child.on("error", (e) => {
|
|
514
|
+
err += `\n(failed to launch ${spec.bin}: ${e.message})`;
|
|
515
|
+
resolve(-1);
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
const text = out.trim();
|
|
519
|
+
if (text) console.log(text);
|
|
520
|
+
if (code !== 0) {
|
|
521
|
+
if (err.trim()) console.error(err.trim().slice(0, 800));
|
|
522
|
+
process.exitCode = code === -1 ? 1 : code;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
498
525
|
} else {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
child.
|
|
508
|
-
|
|
509
|
-
|
|
526
|
+
const spec = spawnContinueSpec(meta);
|
|
527
|
+
if (!spec) {
|
|
528
|
+
console.log("");
|
|
529
|
+
console.log(`(--continue not supported for engine "${meta.engine}")`);
|
|
530
|
+
} else {
|
|
531
|
+
console.log("");
|
|
532
|
+
console.log(`→ launching: ${spec.bin} ${spec.args.join(" ")}`);
|
|
533
|
+
if (spec.cwd) console.log(` cwd: ${spec.cwd}`);
|
|
534
|
+
const child = spawn(spec.bin, spec.args, {
|
|
535
|
+
cwd: spec.cwd || process.cwd(),
|
|
536
|
+
stdio: "inherit",
|
|
510
537
|
});
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
538
|
+
await new Promise((resolve) => {
|
|
539
|
+
child.on("exit", (code) => {
|
|
540
|
+
if (code !== 0) console.log(`(native CLI exited with code ${code})`);
|
|
541
|
+
resolve();
|
|
542
|
+
});
|
|
543
|
+
child.on("error", (e) => {
|
|
544
|
+
console.log(`(failed to launch ${spec.bin}: ${e.message})`);
|
|
545
|
+
resolve();
|
|
546
|
+
});
|
|
514
547
|
});
|
|
515
|
-
}
|
|
548
|
+
}
|
|
516
549
|
}
|
|
517
550
|
}
|
|
518
551
|
|
|
@@ -752,6 +785,25 @@ function spawnContinueSpec(meta) {
|
|
|
752
785
|
return null;
|
|
753
786
|
}
|
|
754
787
|
|
|
788
|
+
// Map (engine, id, cwd, message) → how to spawn the native CLI HEADLESS with a
|
|
789
|
+
// new message injected into the existing transcript. This is the async-relay
|
|
790
|
+
// counterpart to spawnContinueSpec: `--continue` opens the session for a human
|
|
791
|
+
// to keep typing (stdio inherited); `--continue --msg` hands one message into an
|
|
792
|
+
// idle session non-interactively and captures what it does, so any APX agent can
|
|
793
|
+
// relay a user's reply back into a coding-CLI session it doesn't share a live
|
|
794
|
+
// process with. Claude only for now (`claude -p "<msg>" --resume <id>`); other
|
|
795
|
+
// engines fall through to an explicit "not supported yet".
|
|
796
|
+
function spawnHeadlessMsgSpec(meta, message) {
|
|
797
|
+
if (meta.engine === "claude") {
|
|
798
|
+
return {
|
|
799
|
+
bin: "claude",
|
|
800
|
+
args: ["-p", message, "--resume", meta.id, "--output-format", "text"],
|
|
801
|
+
cwd: meta.cwd && fs.existsSync(meta.cwd) ? meta.cwd : null,
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
return null;
|
|
805
|
+
}
|
|
806
|
+
|
|
755
807
|
// Create a new APX session whose body is the summary of an existing session.
|
|
756
808
|
// Used by `apx session resume <id> --into apx[:slug]`. Picks a sensible
|
|
757
809
|
// default agent slug when none is given.
|
|
@@ -116,6 +116,31 @@ function printSessions(engine, dir, result, limit) {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
// OpenCode keeps no project tree — it answers with every session at once, so
|
|
120
|
+
// there is nothing to group by. Same table as printSessions, minus the
|
|
121
|
+
// directory it doesn't have.
|
|
122
|
+
function printAllSessions(engine, rows, limit) {
|
|
123
|
+
if (!rows.length) {
|
|
124
|
+
console.log(" (sin nada)");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const sessions = limit && limit > 0 ? rows.slice(0, limit) : rows;
|
|
128
|
+
console.log(`${engine.label} sessions:`);
|
|
129
|
+
console.log("");
|
|
130
|
+
console.log(`${"DATE".padEnd(12)} ${"SESSION ID".padEnd(38)} TITLE`);
|
|
131
|
+
console.log(`${"─".repeat(12)} ${"─".repeat(38)} ${"─".repeat(40)}`);
|
|
132
|
+
for (const s of sessions) {
|
|
133
|
+
console.log(
|
|
134
|
+
`${fmtDate(s.mtime).padEnd(12)} ${String(s.id).padEnd(38)} ${String(s.title).slice(0, 70)}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
if (engine.resumeHint && sessions[0]) {
|
|
138
|
+
console.log("");
|
|
139
|
+
console.log("Resume:");
|
|
140
|
+
console.log(` specific: ${engine.resumeHint(sessions[0].id)}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
119
144
|
function printProjects(engine, projects) {
|
|
120
145
|
if (projects.length === 0) {
|
|
121
146
|
console.log(`(no ${engine.label} projects found)`);
|
|
@@ -158,8 +183,10 @@ function listSingleEngine(engine, args, opts, { headerPrefix = "" } = {}) {
|
|
|
158
183
|
|
|
159
184
|
if (dir) {
|
|
160
185
|
printSessions(engine, dir, engine.listSessions(dir, opts), limit);
|
|
161
|
-
} else {
|
|
186
|
+
} else if (typeof engine.listProjects === "function") {
|
|
162
187
|
printProjects(engine, engine.listProjects(opts));
|
|
188
|
+
} else {
|
|
189
|
+
printAllSessions(engine, engine.listAllSessions(opts), limit);
|
|
163
190
|
}
|
|
164
191
|
return true;
|
|
165
192
|
}
|
|
@@ -211,13 +238,19 @@ export function cmdSessionsList(args, opts = {}) {
|
|
|
211
238
|
} else {
|
|
212
239
|
printSessions(engine, dir, result, limit);
|
|
213
240
|
}
|
|
214
|
-
} else {
|
|
241
|
+
} else if (typeof engine.listProjects === "function") {
|
|
215
242
|
const list = engine.listProjects(opts);
|
|
216
243
|
if (list.length === 0) {
|
|
217
244
|
console.log(" (sin nada)");
|
|
218
245
|
} else {
|
|
219
246
|
printProjects(engine, list);
|
|
220
247
|
}
|
|
248
|
+
} else {
|
|
249
|
+
// Engines that list flat (OpenCode). `implemented` is true for them —
|
|
250
|
+
// they list fine, just not by project — so the check above lets them
|
|
251
|
+
// through and this is where they land. Calling listProjects here is what
|
|
252
|
+
// made `apx sessions list` exit 1 for everyone with OpenCode installed.
|
|
253
|
+
printAllSessions(engine, engine.listAllSessions(opts), limit);
|
|
221
254
|
}
|
|
222
255
|
}
|
|
223
256
|
if (!anyDetected) {
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
installGlobalSkills,
|
|
13
13
|
listBundledSkills,
|
|
14
14
|
listEngineSkills,
|
|
15
|
-
|
|
15
|
+
listRetiredSkillSlugs,
|
|
16
16
|
} from "#core/apc/scaffold.js";
|
|
17
17
|
import {
|
|
18
18
|
ensureIndex,
|
|
@@ -174,7 +174,7 @@ export async function cmdSkillsSync(args) {
|
|
|
174
174
|
for (const k of ["created", "updated", "unchanged", "pruned"]) {
|
|
175
175
|
if (counts[k]) parts.push(`${counts[k]} ${k}`);
|
|
176
176
|
}
|
|
177
|
-
const tag = entries[0]?.scope === "
|
|
177
|
+
const tag = entries[0]?.scope === "retired" ? " [retired]" : "";
|
|
178
178
|
console.log(` ${slug.padEnd(sw)}${tag.padEnd(10)} ${parts.join(", ")}`);
|
|
179
179
|
}
|
|
180
180
|
console.log("");
|
|
@@ -214,11 +214,17 @@ export async function cmdSkillsList(args = {}) {
|
|
|
214
214
|
console.log("(no skills available)");
|
|
215
215
|
return;
|
|
216
216
|
}
|
|
217
|
-
console.log(`SLUG`.padEnd(28) + "SOURCE".padEnd(10) + "STATE".padEnd(10) + "DESCRIPTION");
|
|
217
|
+
console.log(`SLUG`.padEnd(28) + "SOURCE".padEnd(10) + "ORIGIN".padEnd(10) + "STATE".padEnd(10) + "DESCRIPTION");
|
|
218
218
|
for (const s of out.skills) {
|
|
219
219
|
const desc = (s.description || "").slice(0, 70);
|
|
220
220
|
const state = s.private ? "private" : s.enabled === false ? "off" : "on";
|
|
221
|
-
console.log(
|
|
221
|
+
console.log(
|
|
222
|
+
s.slug.padEnd(28)
|
|
223
|
+
+ (s.source || "?").padEnd(10)
|
|
224
|
+
+ (s.origin || "—").padEnd(10)
|
|
225
|
+
+ state.padEnd(10)
|
|
226
|
+
+ desc,
|
|
227
|
+
);
|
|
222
228
|
}
|
|
223
229
|
return;
|
|
224
230
|
}
|
|
@@ -245,7 +251,7 @@ export async function cmdSkillsStatus() {
|
|
|
245
251
|
|
|
246
252
|
const engineSet = listEngineSkills(); // what we publish to engines
|
|
247
253
|
const bundled = listBundledSkills(); // what stays in-repo for the super-agent
|
|
248
|
-
const
|
|
254
|
+
const retired = listRetiredSkillSlugs(); // slugs APX shipped historically — pruned on sync
|
|
249
255
|
|
|
250
256
|
console.log(
|
|
251
257
|
`Engine skill set (replicated to global dirs): ${engineSet.length} ` +
|
|
@@ -260,7 +266,7 @@ export async function cmdSkillsStatus() {
|
|
|
260
266
|
{ label: "Codex", dir: path.join(os.homedir(), ".codex", "skills") },
|
|
261
267
|
{ label: "Antigravity / others", dir: path.join(os.homedir(), ".agents", "skills") },
|
|
262
268
|
];
|
|
263
|
-
const allSlugs = [...engineSet.map((s) => s.slug), ...
|
|
269
|
+
const allSlugs = [...engineSet.map((s) => s.slug), ...retired];
|
|
264
270
|
const sw = Math.max(...allSlugs.map((s) => s.length), 8);
|
|
265
271
|
for (const { label, dir } of GLOBAL_DIRS) {
|
|
266
272
|
console.log(`\n ${label} — ${dir.replace(os.homedir(), "~")}`);
|
|
@@ -270,12 +276,12 @@ export async function cmdSkillsStatus() {
|
|
|
270
276
|
const state = present ? "✓ installed" : "✗ MISSING (run `apx skills sync`)";
|
|
271
277
|
console.log(` ${slug.padEnd(sw)} ${state}`);
|
|
272
278
|
}
|
|
273
|
-
const stale =
|
|
279
|
+
const stale = retired.filter((slug) =>
|
|
274
280
|
fs.existsSync(path.join(dir, slug, "SKILL.md"))
|
|
275
281
|
);
|
|
276
282
|
if (stale.length) {
|
|
277
283
|
for (const slug of stale) {
|
|
278
|
-
console.log(` ${slug.padEnd(sw)} [
|
|
284
|
+
console.log(` ${slug.padEnd(sw)} [retired] ⚠ stale (run \`apx skills sync\` to prune)`);
|
|
279
285
|
}
|
|
280
286
|
}
|
|
281
287
|
}
|
|
@@ -475,7 +481,7 @@ export async function cmdSkillsInspector(args) {
|
|
|
475
481
|
if (sub === "disable" || sub === "off") {
|
|
476
482
|
ensureInspectorBlock(cfg).skills.inspector.enabled = false;
|
|
477
483
|
writeConfig(cfg);
|
|
478
|
-
console.log("Skill Inspector disabled. Falling back to the
|
|
484
|
+
console.log("Skill Inspector disabled. Falling back to the static slug hint + passive RAG nudge.");
|
|
479
485
|
return;
|
|
480
486
|
}
|
|
481
487
|
if (sub === "set") {
|
|
@@ -88,8 +88,7 @@ export async function cmdStatus() {
|
|
|
88
88
|
|
|
89
89
|
// ── Telegram ───────────────────────────────────────────────────────────────
|
|
90
90
|
// Prefer the daemon's live view (real polling state). Fall back to the
|
|
91
|
-
// config file only when the daemon is unreachable.
|
|
92
|
-
// honour BOTH the legacy top-level bot_token AND per-channel tokens.
|
|
91
|
+
// config file only when the daemon is unreachable.
|
|
93
92
|
console.log(sec("Telegram"));
|
|
94
93
|
const tg = cfg.telegram || {};
|
|
95
94
|
let tgLive = null;
|
|
@@ -117,7 +116,7 @@ export async function cmdStatus() {
|
|
|
117
116
|
}
|
|
118
117
|
} else {
|
|
119
118
|
// Daemon down — best-effort from config. Token may be top-level or per-channel.
|
|
120
|
-
const hasToken =
|
|
119
|
+
const hasToken = (tg.channels || []).some((c) => c.bot_token);
|
|
121
120
|
if (tg.enabled && hasToken) {
|
|
122
121
|
console.log(` ${off("configured")} ${DI}daemon down — start it to see live status${R}`);
|
|
123
122
|
console.log(`${key("channels")}${val((tg.channels?.length || 1) + " configured")}`);
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
// apx task — per-project TODO list. Backed by /projects/:pid/tasks.
|
|
2
2
|
//
|
|
3
|
-
// apx task add "<title>" [--project X] [--
|
|
3
|
+
// apx task add "<title>" [--project X] [--description D] [--body Y] [--tag t]
|
|
4
|
+
// [--due 2026-05-30] [--agent A]
|
|
5
|
+
// [--category trip] [--place "Farmacia X"] [--at "-41.13,-71.31"] [--radius 1500]
|
|
4
6
|
// apx task list [--all | --project X] [--state ...] [--status ...] [--tag X] [--agent Y]
|
|
5
7
|
// [--due-before ISO] [--due-after ISO] [--updated-since ISO] [--limit N]
|
|
6
8
|
// apx task show <id> [--project X]
|
|
7
9
|
// apx task done <id> [--project X] [--by name]
|
|
8
10
|
// apx task drop <id> [--project X] [--by name]
|
|
9
11
|
// apx task reopen <id> [--project X]
|
|
10
|
-
// apx task patch <id> [--project X] [--title T] [--
|
|
12
|
+
// apx task patch <id> [--project X] [--title T] [--description D] [--body B] [--due D]
|
|
13
|
+
// [--agent A] [--tag t]
|
|
14
|
+
//
|
|
15
|
+
// --description is what YOU have to do; --body is the prompt an agent receives
|
|
16
|
+
// when it runs the task. Keeping them apart is what makes `apx task list`
|
|
17
|
+
// readable as a to-do rather than as a dispatch queue.
|
|
11
18
|
//
|
|
12
19
|
// Each subcommand exports a usage string + a usageX() helper. The top-level
|
|
13
20
|
// help (apx task --help / apx task <sub> --help) is wired through HELP_TOPICS
|
|
@@ -18,13 +25,13 @@ import { resolveProjectId } from "./project.js";
|
|
|
18
25
|
|
|
19
26
|
// ── Usage strings (also used by index.js help topics) ────────────────────────
|
|
20
27
|
export const TASK_USAGE = {
|
|
21
|
-
add: 'apx task add "<title>" [--project X] [--body Y] [--tag t]... [--due 2026-05-30] [--agent A]',
|
|
28
|
+
add: 'apx task add "<title>" [--project X] [--description D] [--body Y] [--tag t]... [--due 2026-05-30] [--agent A] [--category trip] [--place "Farmacia X"] [--at "lat,lon"] [--radius 1500]',
|
|
22
29
|
list: "apx task list [--all | --project X] [--state open|done|dropped|all] [--status pending|running|in_review|blocked] [--tag X] [--agent Y] [--due-before ISO] [--due-after ISO] [--updated-since ISO] [--limit N]",
|
|
23
30
|
show: "apx task show <id> [--project X]",
|
|
24
31
|
done: "apx task done <id> [--project X] [--by name]",
|
|
25
32
|
drop: "apx task drop <id> [--project X] [--by name]",
|
|
26
33
|
reopen: "apx task reopen <id> [--project X]",
|
|
27
|
-
patch: "apx task patch <id> [--project X] [--title T] [--body B] [--due D] [--agent A] [--tag t]",
|
|
34
|
+
patch: "apx task patch <id> [--project X] [--title T] [--description D] [--body B] [--due D] [--agent A] [--tag t]",
|
|
28
35
|
};
|
|
29
36
|
|
|
30
37
|
// Print "<msg>\nUsage: <usage>" to stderr and exit 1. Each cmd has a tiny
|
|
@@ -83,8 +90,13 @@ function renderDetail(t) {
|
|
|
83
90
|
id: t.id,
|
|
84
91
|
state: t.state,
|
|
85
92
|
title: t.title,
|
|
93
|
+
description: t.description || undefined,
|
|
86
94
|
body: t.body,
|
|
87
95
|
tags: t.tags,
|
|
96
|
+
// Only when it says something: a "general" category on every row is noise,
|
|
97
|
+
// and an absent location should read as absent rather than as null.
|
|
98
|
+
category: t.category && t.category !== "general" ? t.category : undefined,
|
|
99
|
+
location: t.location || undefined,
|
|
88
100
|
due: t.due,
|
|
89
101
|
agent: t.agent,
|
|
90
102
|
source: t.source,
|
|
@@ -95,6 +107,36 @@ function renderDetail(t) {
|
|
|
95
107
|
}, null, 2));
|
|
96
108
|
}
|
|
97
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Build the `location` field from the place flags, or return {} when none were
|
|
112
|
+
* given so a patch that touches nothing else stays a no-op.
|
|
113
|
+
*
|
|
114
|
+
* `--at` takes "lat,lon" as one argument because that is how coordinates are
|
|
115
|
+
* copied out of Maps — asking for two separate flags guarantees one of them is
|
|
116
|
+
* eventually forgotten, and half a coordinate is worse than none.
|
|
117
|
+
*/
|
|
118
|
+
function locationFrom(flags = {}) {
|
|
119
|
+
const place = flags.place;
|
|
120
|
+
const address = flags.address;
|
|
121
|
+
const at = flags.at;
|
|
122
|
+
const radius = flags.radius;
|
|
123
|
+
if (place === undefined && address === undefined && at === undefined && radius === undefined) return {};
|
|
124
|
+
// An explicitly empty --place clears the location.
|
|
125
|
+
if (place === "" && at === undefined && address === undefined) return { location: null };
|
|
126
|
+
const location = {};
|
|
127
|
+
if (place) location.place = place;
|
|
128
|
+
if (address) location.address = address;
|
|
129
|
+
if (at) {
|
|
130
|
+
const [lat, lon] = String(at).split(",").map((part) => Number(part.trim()));
|
|
131
|
+
if (Number.isFinite(lat) && Number.isFinite(lon)) {
|
|
132
|
+
location.latitude = lat;
|
|
133
|
+
location.longitude = lon;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (radius) location.radius_m = Number(radius);
|
|
137
|
+
return { location };
|
|
138
|
+
}
|
|
139
|
+
|
|
98
140
|
// ── add ───────────────────────────────────────────────────────────────────────
|
|
99
141
|
export async function cmdTaskAdd(args) {
|
|
100
142
|
const title = (args._ || []).join(" ").trim();
|
|
@@ -102,11 +144,14 @@ export async function cmdTaskAdd(args) {
|
|
|
102
144
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
103
145
|
const body = {
|
|
104
146
|
title,
|
|
147
|
+
description: args.flags?.description || null,
|
|
105
148
|
body: args.flags?.body || null,
|
|
106
149
|
due: args.flags?.due || null,
|
|
107
150
|
agent: args.flags?.agent || null,
|
|
108
151
|
source: args.flags?.source || "cli",
|
|
109
152
|
tags: asArray(args.flags?.tag).filter(Boolean),
|
|
153
|
+
...(args.flags?.category ? { category: args.flags.category } : {}),
|
|
154
|
+
...locationFrom(args.flags),
|
|
110
155
|
};
|
|
111
156
|
const task = await http.post(`/api/projects/${pid}/tasks`, body);
|
|
112
157
|
console.log(`added task ${task.id}: ${task.title}`);
|
|
@@ -198,12 +243,16 @@ export async function cmdTaskPatch(args) {
|
|
|
198
243
|
const pid = await resolveProjectId(args?.flags?.project);
|
|
199
244
|
const patch = {};
|
|
200
245
|
if (args.flags?.title !== undefined) patch.title = args.flags.title;
|
|
246
|
+
if (args.flags?.description !== undefined) patch.description = args.flags.description || null;
|
|
201
247
|
if (args.flags?.body !== undefined) patch.body = args.flags.body;
|
|
202
248
|
if (args.flags?.due !== undefined) patch.due = args.flags.due || null;
|
|
203
249
|
if (args.flags?.agent !== undefined) patch.agent = args.flags.agent || null;
|
|
204
250
|
if (args.flags?.tag !== undefined) patch.tags = asArray(args.flags.tag).filter(Boolean);
|
|
251
|
+
if (args.flags?.category !== undefined) patch.category = args.flags.category;
|
|
252
|
+
const located = locationFrom(args.flags);
|
|
253
|
+
if ("location" in located) patch.location = located.location;
|
|
205
254
|
if (Object.keys(patch).length === 0) {
|
|
206
|
-
return fail("patch", "at least one --title|--body|--due|--agent|--tag required");
|
|
255
|
+
return fail("patch", "at least one --title|--description|--body|--due|--agent|--tag|--category|--place|--at required");
|
|
207
256
|
}
|
|
208
257
|
const t = await http.patch(`/api/projects/${pid}/tasks/${encodeURIComponent(id)}`, { patch });
|
|
209
258
|
renderDetail(t);
|