@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
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import fs from "node:fs";
|
|
17
17
|
import os from "node:os";
|
|
18
18
|
import path from "node:path";
|
|
19
|
+
import { execFileSync } from "node:child_process";
|
|
19
20
|
import { apcProjectFile } from "#core/apc/paths.js";
|
|
20
21
|
import { parseFrontmatterFields as parseFrontmatter } from "#core/apc/frontmatter.js";
|
|
21
22
|
|
|
@@ -323,6 +324,9 @@ const claudeEngine = {
|
|
|
323
324
|
resumeHint(id) {
|
|
324
325
|
return `claude -p --resume ${id} "your prompt"`;
|
|
325
326
|
},
|
|
327
|
+
resumeArgv(id) {
|
|
328
|
+
return ["claude", "--resume", id];
|
|
329
|
+
},
|
|
326
330
|
};
|
|
327
331
|
|
|
328
332
|
// ── codex engine ─────────────────────────────────────────────────────────────
|
|
@@ -487,6 +491,9 @@ const codexEngine = {
|
|
|
487
491
|
resumeHint(id) {
|
|
488
492
|
return `codex exec resume ${id} "your prompt" (interactive: codex resume ${id})`;
|
|
489
493
|
},
|
|
494
|
+
resumeArgv(id) {
|
|
495
|
+
return ["codex", "resume", id];
|
|
496
|
+
},
|
|
490
497
|
};
|
|
491
498
|
|
|
492
499
|
// ── apx engine (default) ─────────────────────────────────────────────────────
|
|
@@ -647,6 +654,144 @@ const apxEngine = {
|
|
|
647
654
|
resumeHint(id) {
|
|
648
655
|
return `apx session resume ${id}`;
|
|
649
656
|
},
|
|
657
|
+
resumeArgv(id) {
|
|
658
|
+
// An APX session is a record of a runtime run, not a conversation a CLI can
|
|
659
|
+
// re-enter. `resume` prints what it was — the honest equivalent.
|
|
660
|
+
return ["apx", "session", "resume", id];
|
|
661
|
+
},
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
// ── opencode engine ──────────────────────────────────────────────────────────
|
|
665
|
+
//
|
|
666
|
+
// The one engine with no files to read: OpenCode keeps its sessions in its own
|
|
667
|
+
// SQLite database, and APX stores nothing in SQL. So we ask OpenCode itself
|
|
668
|
+
// instead of reaching into its database — its CLI is the supported interface,
|
|
669
|
+
// and it survives schema changes we would otherwise have to chase.
|
|
670
|
+
//
|
|
671
|
+
// Two calls, deliberately split by cost. `opencode session list` prints every
|
|
672
|
+
// session newest-first in about half a second, so the listing is memoised for a
|
|
673
|
+
// few seconds — a Sessions search box would otherwise spawn a process per
|
|
674
|
+
// keystroke. The working directory only exists in `opencode export <id>`, one
|
|
675
|
+
// spawn per session, so it's paid only when a single session is opened.
|
|
676
|
+
//
|
|
677
|
+
// What we give up by not reading the database: sessions arrive without a cwd,
|
|
678
|
+
// so they show in the global list and not in a per-project one.
|
|
679
|
+
|
|
680
|
+
const OPENCODE_LIST_TTL_MS = 5000;
|
|
681
|
+
let opencodeListCache = { at: 0, rows: [] };
|
|
682
|
+
|
|
683
|
+
function opencodeCli(args, { timeoutMs = 15000 } = {}) {
|
|
684
|
+
try {
|
|
685
|
+
return execFileSync("opencode", args, {
|
|
686
|
+
encoding: "utf8",
|
|
687
|
+
timeout: timeoutMs,
|
|
688
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
689
|
+
});
|
|
690
|
+
} catch {
|
|
691
|
+
// Not installed, too slow, or a version without this subcommand. An engine
|
|
692
|
+
// that can't answer is an engine with no sessions — never a thrown listing.
|
|
693
|
+
return "";
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// "2:26 PM" (today) or "4:48 PM · 7/6/2026". Locale-shaped, so anything we
|
|
698
|
+
// don't recognise returns 0: the row still lists, it just sorts last rather
|
|
699
|
+
// than claiming a time it doesn't have.
|
|
700
|
+
export function parseOpencodeUpdated(text, now = Date.now()) {
|
|
701
|
+
const [clock, date] = String(text || "").split("·").map((s) => s.trim());
|
|
702
|
+
const t = /^(\d{1,2}):(\d{2})\s*(AM|PM)$/i.exec(clock || "");
|
|
703
|
+
if (!t) return 0;
|
|
704
|
+
let hour = Number(t[1]) % 12;
|
|
705
|
+
if (/PM/i.test(t[3])) hour += 12;
|
|
706
|
+
const when = new Date(now);
|
|
707
|
+
if (date) {
|
|
708
|
+
const d = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/.exec(date);
|
|
709
|
+
if (!d) return 0;
|
|
710
|
+
when.setFullYear(Number(d[3]), Number(d[1]) - 1, Number(d[2]));
|
|
711
|
+
}
|
|
712
|
+
when.setHours(hour, Number(t[2]), 0, 0);
|
|
713
|
+
return when.getTime();
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// Fixed-width table: id, title, then the timestamp. Only `ses_` lines are rows,
|
|
717
|
+
// which skips the header and its rule without having to count them.
|
|
718
|
+
export function parseOpencodeSessionList(stdout, now = Date.now()) {
|
|
719
|
+
const rows = [];
|
|
720
|
+
for (const line of String(stdout || "").split("\n")) {
|
|
721
|
+
const m = /^(ses_\S+)\s\s+(.*?)\s\s+(\S.*?)\s*$/.exec(line);
|
|
722
|
+
if (!m) continue;
|
|
723
|
+
rows.push({ id: m[1], title: m[2].trim(), mtime: parseOpencodeUpdated(m[3], now) });
|
|
724
|
+
}
|
|
725
|
+
return rows;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
const opencodeEngine = {
|
|
729
|
+
id: "opencode",
|
|
730
|
+
label: "OpenCode",
|
|
731
|
+
implemented: true,
|
|
732
|
+
detect(opts) {
|
|
733
|
+
const candidates = [
|
|
734
|
+
path.join(homeDir(opts), ".local", "share", "opencode"),
|
|
735
|
+
path.join(homeDir(opts), ".config", "opencode"),
|
|
736
|
+
];
|
|
737
|
+
return candidates.some((c) => fs.existsSync(c))
|
|
738
|
+
? { available: true }
|
|
739
|
+
: { available: false, reason: "OpenCode not installed" };
|
|
740
|
+
},
|
|
741
|
+
// No directory tree to walk: OpenCode is asked for all of its sessions at
|
|
742
|
+
// once. collectAllSessions calls this instead of listProjects/listSessions.
|
|
743
|
+
listAllSessions(opts = {}) {
|
|
744
|
+
const now = (opts.now || Date.now)();
|
|
745
|
+
if (opencodeListCache.rows.length && now - opencodeListCache.at < OPENCODE_LIST_TTL_MS) {
|
|
746
|
+
return opencodeListCache.rows;
|
|
747
|
+
}
|
|
748
|
+
const rows = parseOpencodeSessionList(opencodeCli(["session", "list"]), now);
|
|
749
|
+
opencodeListCache = { at: now, rows };
|
|
750
|
+
return rows;
|
|
751
|
+
},
|
|
752
|
+
findSessionById(id, opts = {}) {
|
|
753
|
+
// Guard the spawn: every cross-engine lookup would otherwise pay for an
|
|
754
|
+
// `opencode export` of a Claude uuid that can never match.
|
|
755
|
+
if (!/^ses_[A-Za-z0-9]+$/.test(String(id || ""))) return null;
|
|
756
|
+
let dump;
|
|
757
|
+
try {
|
|
758
|
+
dump = JSON.parse(opencodeCli(["export", id]));
|
|
759
|
+
} catch {
|
|
760
|
+
return null;
|
|
761
|
+
}
|
|
762
|
+
const info = dump?.info;
|
|
763
|
+
if (!info?.id) return null;
|
|
764
|
+
// The export already carries the conversation, so the last prompt costs
|
|
765
|
+
// nothing extra — and it's what the other engines contribute to a summary.
|
|
766
|
+
let lastPrompt = null;
|
|
767
|
+
for (const m of dump.messages || []) {
|
|
768
|
+
if (m?.info?.role !== "user") continue;
|
|
769
|
+
const text = (m.parts || [])
|
|
770
|
+
.filter((p) => p?.type === "text" && typeof p.text === "string")
|
|
771
|
+
.map((p) => p.text)
|
|
772
|
+
.join("\n")
|
|
773
|
+
.trim();
|
|
774
|
+
if (text) lastPrompt = text;
|
|
775
|
+
}
|
|
776
|
+
return {
|
|
777
|
+
engine: "opencode",
|
|
778
|
+
id: info.id,
|
|
779
|
+
path: null,
|
|
780
|
+
cwd: info.directory || null,
|
|
781
|
+
title: info.title || "",
|
|
782
|
+
lastPrompt,
|
|
783
|
+
mtime: Number(info.time?.updated) || (opts.now || Date.now)(),
|
|
784
|
+
};
|
|
785
|
+
},
|
|
786
|
+
continueHint() {
|
|
787
|
+
return `opencode --continue (run from the project directory)`;
|
|
788
|
+
},
|
|
789
|
+
resumeHint(id) {
|
|
790
|
+
return `opencode --session ${id}`;
|
|
791
|
+
},
|
|
792
|
+
resumeArgv(id) {
|
|
793
|
+
return ["opencode", "--session", id];
|
|
794
|
+
},
|
|
650
795
|
};
|
|
651
796
|
|
|
652
797
|
// ── antigravity engine (detected, listing not implemented) ───────────────────
|
|
@@ -676,9 +821,34 @@ export const ENGINES = {
|
|
|
676
821
|
apx: apxEngine,
|
|
677
822
|
claude: claudeEngine,
|
|
678
823
|
codex: codexEngine,
|
|
824
|
+
opencode: opencodeEngine,
|
|
679
825
|
antigravity: antigravityEngine,
|
|
680
826
|
};
|
|
681
827
|
|
|
828
|
+
// ── resuming a session in its own CLI ────────────────────────────────────────
|
|
829
|
+
//
|
|
830
|
+
// Every engine re-enters a conversation differently, and getting it wrong is
|
|
831
|
+
// silent: the CLI starts a NEW session and the user only notices once the
|
|
832
|
+
// history they expected isn't there. So the command lives with the engine that
|
|
833
|
+
// owns it, and both callers — the terminal the daemon spawns, and the line the
|
|
834
|
+
// user copies to run it elsewhere — read it from here. One definition, so the
|
|
835
|
+
// button and the terminal can never drift apart.
|
|
836
|
+
|
|
837
|
+
/** argv for re-entering `id` interactively, or null if the engine can't. */
|
|
838
|
+
export function resumeArgvFor(engineId, id) {
|
|
839
|
+
const engine = ENGINES[engineId];
|
|
840
|
+
if (!engine || typeof engine.resumeArgv !== "function" || !id) return null;
|
|
841
|
+
const argv = engine.resumeArgv(id);
|
|
842
|
+
return Array.isArray(argv) && argv.length ? argv : null;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/** The same command as one pasteable line. Quotes only what needs it. */
|
|
846
|
+
export function resumeCommandFor(engineId, id) {
|
|
847
|
+
const argv = resumeArgvFor(engineId, id);
|
|
848
|
+
if (!argv) return null;
|
|
849
|
+
return argv.map((a) => (/^[A-Za-z0-9_.:/=-]+$/.test(a) ? a : `'${a.replace(/'/g, `'\\''`)}'`)).join(" ");
|
|
850
|
+
}
|
|
851
|
+
|
|
682
852
|
// ── cross-engine helpers (used by `apx session resume <id>` etc.) ────────────
|
|
683
853
|
|
|
684
854
|
/**
|
|
@@ -725,9 +895,31 @@ export function collectAllSessions(opts = {}, { dir = null, engineId = null } =
|
|
|
725
895
|
const out = [];
|
|
726
896
|
for (const engine of Object.values(ENGINES)) {
|
|
727
897
|
if (engineId && engine.id !== engineId) continue;
|
|
728
|
-
if (!engine.implemented
|
|
898
|
+
if (!engine.implemented) continue;
|
|
729
899
|
if (!engine.detect(opts).available) continue;
|
|
730
900
|
|
|
901
|
+
// Engines that don't file their sessions under a working directory answer
|
|
902
|
+
// in one shot instead. They can't honour a `dir` scope — having no cwd to
|
|
903
|
+
// match, they'd answer every project's question with the same rows — so a
|
|
904
|
+
// scoped listing skips them rather than polluting it.
|
|
905
|
+
if (typeof engine.listAllSessions === "function") {
|
|
906
|
+
if (dir) continue;
|
|
907
|
+
let rows = [];
|
|
908
|
+
try { rows = engine.listAllSessions(opts) || []; } catch { rows = []; }
|
|
909
|
+
for (const s of rows) {
|
|
910
|
+
out.push({
|
|
911
|
+
engine: engine.id,
|
|
912
|
+
id: s.id,
|
|
913
|
+
title: s.title || "",
|
|
914
|
+
mtime: s.mtime || 0,
|
|
915
|
+
cwd: s.cwd || null,
|
|
916
|
+
path: s.path || null,
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
continue;
|
|
920
|
+
}
|
|
921
|
+
if (typeof engine.listSessions !== "function") continue;
|
|
922
|
+
|
|
731
923
|
const dirs = [];
|
|
732
924
|
if (dir) {
|
|
733
925
|
dirs.push(dir);
|
|
@@ -16,8 +16,27 @@
|
|
|
16
16
|
// resolution.
|
|
17
17
|
import { readAgents } from "../apc/parser.js";
|
|
18
18
|
import { listConversations } from "./conversations.js";
|
|
19
|
-
import {
|
|
19
|
+
import { CHANNELS } from "../constants/channels.js";
|
|
20
|
+
import { listGlobalThreads, readGlobalThread, previewText } from "./messages.js";
|
|
20
21
|
import { SUPERAGENT_ACTOR_ID } from "../constants/actors.js";
|
|
22
|
+
import { readConfig } from "../config/index.js";
|
|
23
|
+
import { resolveSuperAgentBlob } from "../apc/agent-identity.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* One entry per channel, keeping the FIRST seen — which is the most recent,
|
|
27
|
+
* because every list feeding this is already sorted newest-first.
|
|
28
|
+
*
|
|
29
|
+
* Written out rather than `new Map(items.map(…))`: that form keeps the LAST
|
|
30
|
+
* duplicate, so it silently picked each channel's OLDEST conversation and every
|
|
31
|
+
* row wore a months-stale date and preview.
|
|
32
|
+
*/
|
|
33
|
+
function latestPerChannel(items) {
|
|
34
|
+
const byChannel = new Map();
|
|
35
|
+
for (const item of items) {
|
|
36
|
+
if (!byChannel.has(item.channel)) byChannel.set(item.channel, item);
|
|
37
|
+
}
|
|
38
|
+
return [...byChannel.values()];
|
|
39
|
+
}
|
|
21
40
|
|
|
22
41
|
/** Most recent first; slug breaks ties so two identical calls agree. */
|
|
23
42
|
function byRecency(a, b) {
|
|
@@ -33,10 +52,19 @@ function byRecency(a, b) {
|
|
|
33
52
|
* @param {object} opts
|
|
34
53
|
* - limit cap applied AFTER the merge
|
|
35
54
|
* - includeEmpty also list agents that have never been talked to
|
|
55
|
+
* - channel scope each row to ONE channel (e.g. "web"): the row's
|
|
56
|
+
* headline conversation must be on that channel, and an agent
|
|
57
|
+
* with none drops out (unless includeEmpty). The inbox and the
|
|
58
|
+
* phone pass "web" so a Telegram thread never surfaces there;
|
|
59
|
+
* project-first navigation passes nothing and sees every channel.
|
|
60
|
+
* - perChannel emit one row per (agent, channel) instead of a single
|
|
61
|
+
* headline per agent, so a list can group by channel and a
|
|
62
|
+
* quiet channel is not hidden behind a louder one. Ignored
|
|
63
|
+
* when `channel` is set — that already scopes to one.
|
|
36
64
|
* @returns {{ rows: object[], skipped: {id:any, error:string}[] }}
|
|
37
65
|
*/
|
|
38
66
|
export function listAgentInbox(projects, opts = {}) {
|
|
39
|
-
const { limit, includeEmpty = false } = opts || {};
|
|
67
|
+
const { limit, includeEmpty = false, channel = null, perChannel = false } = opts || {};
|
|
40
68
|
const rows = [];
|
|
41
69
|
const skipped = [];
|
|
42
70
|
|
|
@@ -65,23 +93,50 @@ export function listAgentInbox(projects, opts = {}) {
|
|
|
65
93
|
// whole project from the inbox.
|
|
66
94
|
conversations = [];
|
|
67
95
|
}
|
|
68
|
-
|
|
69
|
-
|
|
96
|
+
// A routine conversation is not a chat: the routine runs on its own and
|
|
97
|
+
// its delivered output lands in the agent's web chat, which is the row we
|
|
98
|
+
// want to show. Chatting inside the routine thread happens, but it should
|
|
99
|
+
// not become the agent's inbox entry — pick the latest NON-routine
|
|
100
|
+
// conversation instead. An agent whose only activity is routine runs has
|
|
101
|
+
// no chat to show and drops out of the inbox (unless includeEmpty).
|
|
102
|
+
//
|
|
103
|
+
// When `channel` is set, the headline must be on THAT channel — the inbox
|
|
104
|
+
// and the phone are web-only, so an agent whose only chat is on Telegram
|
|
105
|
+
// has nothing to show there and drops out (unless includeEmpty).
|
|
106
|
+
const eligible = conversations.filter((c) =>
|
|
107
|
+
channel ? c.channel === channel : c.channel !== CHANNELS.ROUTINE,
|
|
108
|
+
);
|
|
109
|
+
// `perChannel`: one row per channel this agent was talked to on, instead
|
|
110
|
+
// of a single headline. An agent reached on WhatsApp AND on the web is
|
|
111
|
+
// two conversations, and collapsing them to whichever spoke last hid the
|
|
112
|
+
// other one entirely — which is the whole reason WhatsApp threads were
|
|
113
|
+
// invisible even once they were being written.
|
|
114
|
+
const headlines = perChannel ? latestPerChannel(eligible) : [eligible[0] || null];
|
|
115
|
+
if (!headlines[0] && !includeEmpty) continue;
|
|
70
116
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
117
|
+
for (const latest of headlines) {
|
|
118
|
+
rows.push({
|
|
119
|
+
...projectMeta,
|
|
120
|
+
agent_slug: agent.slug,
|
|
121
|
+
agent_name: agent.fields?.Name || agent.name || agent.slug,
|
|
122
|
+
agent_emoji: agent.fields?.Emoji || agent.emoji || null,
|
|
123
|
+
agent_icon: agent.fields?.Icon || agent.icon || null,
|
|
124
|
+
kind: "agent",
|
|
125
|
+
pinned: false,
|
|
126
|
+
conversation_id: latest?.id || null,
|
|
127
|
+
channel: latest?.channel || null,
|
|
128
|
+
messages: latest?.messages || 0,
|
|
129
|
+
// The agent's last REPLY, not the user's last prompt.
|
|
130
|
+
preview: latest?.preview || null,
|
|
131
|
+
// WHEN that reply was written — which is not when the thread last
|
|
132
|
+
// moved. A row moves for the owner's own send and for every tool the
|
|
133
|
+
// agent runs; only this moves when the agent actually SAYS something,
|
|
134
|
+
// which is the difference between one notification per answer and one
|
|
135
|
+
// per step of a 24-step turn. See lib/notify.ts.
|
|
136
|
+
preview_at: latest?.preview_at || null,
|
|
137
|
+
last_activity_at: latest?.last_turn_at || latest?.started_at || "",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
85
140
|
}
|
|
86
141
|
}
|
|
87
142
|
|
|
@@ -90,8 +145,8 @@ export function listAgentInbox(projects, opts = {}) {
|
|
|
90
145
|
// The super-agent is the single voice the owner talks to and the others
|
|
91
146
|
// report through it. It is pinned first and marked distinct so the hierarchy
|
|
92
147
|
// is visible, rather than sorted in among its own reports.
|
|
93
|
-
const
|
|
94
|
-
const out =
|
|
148
|
+
const superRows = buildSuperAgentRows({ channel, perChannel });
|
|
149
|
+
const out = [...superRows, ...rows];
|
|
95
150
|
|
|
96
151
|
return {
|
|
97
152
|
rows: Number.isFinite(limit) && limit > 0 ? out.slice(0, limit) : out,
|
|
@@ -107,7 +162,8 @@ export function listAgentInbox(projects, opts = {}) {
|
|
|
107
162
|
* (~/.apx/messages/<channel>/YYYY-MM-DD.jsonl). So recency and the preview come
|
|
108
163
|
* from there, not from agents/<slug>/conversations.
|
|
109
164
|
*/
|
|
110
|
-
function
|
|
165
|
+
function buildSuperAgentRows(opts = {}) {
|
|
166
|
+
const { channel = null, perChannel = false } = opts || {};
|
|
111
167
|
let threads = [];
|
|
112
168
|
try {
|
|
113
169
|
threads = listGlobalThreads();
|
|
@@ -115,23 +171,51 @@ function buildSuperAgentRow() {
|
|
|
115
171
|
threads = [];
|
|
116
172
|
}
|
|
117
173
|
|
|
174
|
+
const eligible = threads.filter((t) =>
|
|
175
|
+
channel ? t.channel === channel : t.channel !== CHANNELS.ROUTINE,
|
|
176
|
+
);
|
|
177
|
+
// The super-agent is the one the owner actually talks to, so it is where
|
|
178
|
+
// per-channel matters most: telegram, whatsapp, web and desktop are four
|
|
179
|
+
// conversations, not one row wearing whichever channel spoke last.
|
|
180
|
+
if (perChannel) {
|
|
181
|
+
const heads = latestPerChannel(eligible);
|
|
182
|
+
if (!heads.length) return [superAgentRow(null, threads)];
|
|
183
|
+
return heads.map((t) => superAgentRow(t, threads));
|
|
184
|
+
}
|
|
185
|
+
return [superAgentRow(eligible[0] || null, threads)];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** One super-agent row for one headline thread (or none yet). */
|
|
189
|
+
function superAgentRow(latest, threads) {
|
|
190
|
+
// `messages` counts every thread on purpose: it is the super-agent's total
|
|
191
|
+
// volume, not this row's. The headline is picked by the caller — a routine
|
|
192
|
+
// run is never one, and the row stays pinned even with no thread yet (it
|
|
193
|
+
// falls through to a live session).
|
|
118
194
|
const messages = threads.reduce((n, t) => n + (t.messages || 0), 0);
|
|
119
|
-
const latest = threads[0] || null; // listGlobalThreads sorts by last_ts desc
|
|
120
195
|
|
|
121
196
|
let preview = null;
|
|
197
|
+
// When that reply was written. The thread's own `last_ts` moves for the
|
|
198
|
+
// owner's send too, so it cannot answer "did the agent say something new" —
|
|
199
|
+
// which is the only question a notification should be asking.
|
|
200
|
+
let previewAt = null;
|
|
122
201
|
if (latest) {
|
|
123
202
|
try {
|
|
124
203
|
const thread = readGlobalThread({ channel: latest.channel, date: latest.id });
|
|
125
204
|
const lastReply = [...(thread?.messages || [])]
|
|
126
205
|
.reverse()
|
|
127
206
|
.find((m) => m.role === "assistant");
|
|
128
|
-
|
|
207
|
+
// A reply that was a FILE gets its file described, not the marker text
|
|
208
|
+
// that stands in for it on disk ("[photo]", "[image attached — saved to
|
|
209
|
+
// /Users/…]") — which is what the list used to print.
|
|
210
|
+
preview = previewText(lastReply?.content, lastReply?.media)
|
|
129
211
|
.replace(/```[\s\S]*?```/g, " ")
|
|
130
212
|
.replace(/\s+/g, " ")
|
|
131
213
|
.trim()
|
|
132
214
|
.slice(0, 160) || null;
|
|
215
|
+
previewAt = lastReply?.ts || null;
|
|
133
216
|
} catch {
|
|
134
217
|
preview = null;
|
|
218
|
+
previewAt = null;
|
|
135
219
|
}
|
|
136
220
|
}
|
|
137
221
|
|
|
@@ -142,12 +226,14 @@ function buildSuperAgentRow() {
|
|
|
142
226
|
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
143
227
|
agent_name: null, // resolved by the surface via resolveAgentName()
|
|
144
228
|
agent_emoji: null,
|
|
229
|
+
agent_icon: resolveSuperAgentBlob(readConfig()),
|
|
145
230
|
kind: "super_agent",
|
|
146
231
|
pinned: true,
|
|
147
232
|
conversation_id: latest?.id || null,
|
|
148
233
|
channel: latest?.channel || null,
|
|
149
234
|
messages,
|
|
150
235
|
preview,
|
|
236
|
+
preview_at: previewAt,
|
|
151
237
|
last_activity_at: latest?.last_ts || "",
|
|
152
238
|
};
|
|
153
239
|
}
|
|
@@ -61,6 +61,27 @@ export function listCodeSessions(storagePath) {
|
|
|
61
61
|
return rows;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Every project's sessions in one list, newest-updated first.
|
|
66
|
+
*
|
|
67
|
+
* `projects` is plain data — `[{ id, name, storagePath }]` — so core stays free
|
|
68
|
+
* of the daemon's ProjectManager. Each row carries the `pid` and `projectName`
|
|
69
|
+
* it came from, because a session id alone is not addressable: every read after
|
|
70
|
+
* this one needs the project to resolve a storage path. Without that pairing an
|
|
71
|
+
* "all projects" list is a list of things you cannot open.
|
|
72
|
+
*/
|
|
73
|
+
export function listCodeSessionsAcross(projects = []) {
|
|
74
|
+
const rows = [];
|
|
75
|
+
for (const p of projects) {
|
|
76
|
+
if (!p?.storagePath) continue;
|
|
77
|
+
for (const row of listCodeSessions(p.storagePath)) {
|
|
78
|
+
rows.push({ ...row, pid: String(p.id), projectName: p.name || null });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
rows.sort((a, b) => (b.updatedAt || "").localeCompare(a.updatedAt || ""));
|
|
82
|
+
return rows;
|
|
83
|
+
}
|
|
84
|
+
|
|
64
85
|
/** Full session (with messages) or null. */
|
|
65
86
|
export function getCodeSession(storagePath, id) {
|
|
66
87
|
if (!id || typeof id !== "string") return null;
|
|
@@ -23,15 +23,19 @@
|
|
|
23
23
|
// renegotiate — a NEW date, agreed with them. Distinct from missing:
|
|
24
24
|
// moving a date with someone is not the same as letting it
|
|
25
25
|
// slide, and the history keeps both.
|
|
26
|
+
// drop — filed by mistake. NOT the same as `missed`: nobody was
|
|
27
|
+
// ever waiting, so counting it as a broken promise would
|
|
28
|
+
// poison the only number that matters here. The events stay
|
|
29
|
+
// on disk; the row leaves the lists.
|
|
26
30
|
//
|
|
27
|
-
// State: "open" → "kept" | "missed" | "
|
|
28
|
-
//
|
|
31
|
+
// State: "open" → "kept" | "missed" | "dropped" → (renegotiate reopens as
|
|
32
|
+
// "open" with a new due, keeping the previous date in `history`).
|
|
29
33
|
import fs from "node:fs";
|
|
30
34
|
import path from "node:path";
|
|
31
35
|
import { nowIso } from "../util/time.js";
|
|
32
36
|
import { shortId as makeShortId } from "../util/ids.js";
|
|
33
37
|
|
|
34
|
-
export const COMMITMENT_STATES = Object.freeze(["open", "kept", "missed", "
|
|
38
|
+
export const COMMITMENT_STATES = Object.freeze(["open", "kept", "missed", "dropped"]);
|
|
35
39
|
|
|
36
40
|
function commitmentsDir(storagePath) {
|
|
37
41
|
return path.join(storagePath, "commitments");
|
|
@@ -125,6 +129,14 @@ function projectState(events) {
|
|
|
125
129
|
existing.updated_at = ev.ts;
|
|
126
130
|
break;
|
|
127
131
|
}
|
|
132
|
+
case "drop": {
|
|
133
|
+
if (!existing) break;
|
|
134
|
+
existing.state = "dropped";
|
|
135
|
+
existing.closed_at = ev.ts;
|
|
136
|
+
existing.note = ev.note || existing.note || null;
|
|
137
|
+
existing.updated_at = ev.ts;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
128
140
|
case "renegotiate": {
|
|
129
141
|
if (!existing) break;
|
|
130
142
|
existing.history.push({
|
|
@@ -296,6 +308,17 @@ export function missCommitment(storagePath, idOrPrefix, note = null) {
|
|
|
296
308
|
return close(storagePath, idOrPrefix, "missed", note);
|
|
297
309
|
}
|
|
298
310
|
|
|
311
|
+
/**
|
|
312
|
+
* Filed by mistake — take it off the board without calling it broken.
|
|
313
|
+
*
|
|
314
|
+
* Deliberately not `missed`: "you failed Ana" and "this was never a promise"
|
|
315
|
+
* are different facts, and the second one must not show up in the first one's
|
|
316
|
+
* count. The log keeps every event either way.
|
|
317
|
+
*/
|
|
318
|
+
export function dropCommitment(storagePath, idOrPrefix, note = null) {
|
|
319
|
+
return close(storagePath, idOrPrefix, "drop", note);
|
|
320
|
+
}
|
|
321
|
+
|
|
299
322
|
function close(storagePath, idOrPrefix, op, note) {
|
|
300
323
|
const existing = getCommitment(storagePath, idOrPrefix);
|
|
301
324
|
if (!existing) return null;
|
|
@@ -325,6 +348,7 @@ export function countCommitments(storagePath, now = nowIso()) {
|
|
|
325
348
|
open: open.length,
|
|
326
349
|
kept: rows.filter((c) => c.state === "kept").length,
|
|
327
350
|
missed: rows.filter((c) => c.state === "missed").length,
|
|
351
|
+
dropped: rows.filter((c) => c.state === "dropped").length,
|
|
328
352
|
overdue: open.filter((c) => c.due && c.due < now).length,
|
|
329
353
|
total: rows.length,
|
|
330
354
|
};
|