@agentprojectcontext/apx 1.80.2 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +134 -0
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
|
+
import { parseFrontmatter } from "#core/apc/frontmatter.js";
|
|
7
|
+
import { emitMessageEvent } from "#core/events/bus.js";
|
|
8
|
+
import { mediaFromMeta } from "#core/stores/messages.js";
|
|
6
9
|
|
|
7
10
|
const nowIso = () => new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
8
11
|
|
|
@@ -27,10 +30,28 @@ export function conversationPath(storagePath, agentSlug, idOrFilename) {
|
|
|
27
30
|
return path.join(storagePath, "agents", agentSlug, "conversations", filename);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
|
|
33
|
+
/** Read a conversation file path back into what it addresses. The inverse of
|
|
34
|
+
* `conversationPath`, and it lives next to it so the two cannot drift: the
|
|
35
|
+
* live event feed has a file path and needs the project/agent/conversation it
|
|
36
|
+
* belongs to. Returns null for anything that is not a conversation file. */
|
|
37
|
+
export function parseConversationPath(filePath) {
|
|
38
|
+
const parts = String(filePath || "").split(path.sep);
|
|
39
|
+
const i = parts.lastIndexOf("conversations");
|
|
40
|
+
if (i < 2 || parts[i - 2] !== "agents") return null;
|
|
41
|
+
return {
|
|
42
|
+
project_root: parts.slice(0, i - 2).join(path.sep),
|
|
43
|
+
agent_slug: parts[i - 1],
|
|
44
|
+
conversation_id: (parts[i + 1] || "").replace(/\.md$/, ""),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function startConversation({ storagePath, agentSlug, engine, system, channel, title, id: idArg }) {
|
|
31
49
|
const dir = path.join(storagePath, "agents", agentSlug, "conversations");
|
|
32
50
|
fs.mkdirSync(dir, { recursive: true });
|
|
33
|
-
|
|
51
|
+
// A caller may pin a STABLE id (e.g. an agent's one persistent "web-main"
|
|
52
|
+
// coaching chat, reused across routine runs) instead of the auto-incrementing
|
|
53
|
+
// date-NN. Auto-increment stays the default so nothing else changes.
|
|
54
|
+
const id = idArg || generateConversationId(storagePath, agentSlug);
|
|
34
55
|
const file = path.join(dir, `${id}.md`);
|
|
35
56
|
const started = nowIso();
|
|
36
57
|
const fm =
|
|
@@ -39,6 +60,7 @@ export function startConversation({ storagePath, agentSlug, engine, system, chan
|
|
|
39
60
|
`agent: ${agentSlug}\n` +
|
|
40
61
|
`engine: ${engine}\n` +
|
|
41
62
|
(channel ? `channel: ${channel}\n` : "") +
|
|
63
|
+
(title ? `title: ${JSON.stringify(String(title))}\n` : "") +
|
|
42
64
|
`started: ${started}\n` +
|
|
43
65
|
`last_turn: \n` +
|
|
44
66
|
`status: open\n` +
|
|
@@ -48,30 +70,41 @@ export function startConversation({ storagePath, agentSlug, engine, system, chan
|
|
|
48
70
|
return { id, filename: `${id}.md`, path: file, started };
|
|
49
71
|
}
|
|
50
72
|
|
|
51
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Append one turn.
|
|
75
|
+
*
|
|
76
|
+
* `meta` is the turn's ATTRIBUTION — which agent answered, on which model, what
|
|
77
|
+
* it cost, what its tools did — and it is written as a JSON object on the turn
|
|
78
|
+
* header, after the timestamp. The ledger has carried this since
|
|
79
|
+
* `readGlobalThread`; the conversation file did not, so anything reopened from
|
|
80
|
+
* a file rendered "0 tok" and no model even when the run had recorded both. A
|
|
81
|
+
* routine is the case where that is ALL you get: nobody watched it stream.
|
|
82
|
+
*
|
|
83
|
+
* The content itself is untouched — meta lives on the header, so a body that
|
|
84
|
+
* happens to start with a brace is still a body. Files written before this
|
|
85
|
+
* simply have no meta, and parse exactly as they did.
|
|
86
|
+
*/
|
|
87
|
+
export function appendTurn({ filePath, role, content, meta }) {
|
|
52
88
|
const ts = nowIso();
|
|
53
|
-
const
|
|
89
|
+
const head = meta && Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : "";
|
|
90
|
+
const block = `## ${role} — ${ts}${head}\n${content}\n\n`;
|
|
54
91
|
fs.appendFileSync(filePath, block);
|
|
55
92
|
// Update last_turn in frontmatter (in-place)
|
|
56
93
|
let text = fs.readFileSync(filePath, "utf8");
|
|
57
94
|
text = text.replace(/^last_turn:.*$/m, `last_turn: ${ts}`);
|
|
58
95
|
fs.writeFileSync(filePath, text);
|
|
96
|
+
// Announce it, the same way a ledger write does: a routine or an `apx exec`
|
|
97
|
+
// appending here is a conversation moving, and an open panel should see it
|
|
98
|
+
// without being reloaded. See core/events/bus.js.
|
|
99
|
+
const where = parseConversationPath(filePath);
|
|
100
|
+
if (where) emitMessageEvent({ scope: "conversation", ...where, role, ts });
|
|
59
101
|
return { ts };
|
|
60
102
|
}
|
|
61
103
|
|
|
62
104
|
// Parse a conversation file into structured turns. Tolerant — anything that
|
|
63
105
|
// doesn't look like a turn header is ignored.
|
|
64
106
|
export function parseConversation(text) {
|
|
65
|
-
const
|
|
66
|
-
const fm = {};
|
|
67
|
-
let body = text;
|
|
68
|
-
if (text.startsWith("---\n") && fmEnd !== -1) {
|
|
69
|
-
for (const line of text.slice(4, fmEnd).split("\n")) {
|
|
70
|
-
const m = line.match(/^([a-zA-Z_]+):\s*(.*)$/);
|
|
71
|
-
if (m) fm[m[1]] = m[2].trim();
|
|
72
|
-
}
|
|
73
|
-
body = text.slice(fmEnd + 4);
|
|
74
|
-
}
|
|
107
|
+
const { fm, body } = parseFrontmatter(text);
|
|
75
108
|
const turns = [];
|
|
76
109
|
// The terminator is "the next turn header, or the true end of input".
|
|
77
110
|
//
|
|
@@ -79,13 +112,23 @@ export function parseConversation(text) {
|
|
|
79
112
|
// — so the lazy body stopped at the first newline and every multi-line turn
|
|
80
113
|
// was silently truncated to its first line. `(?![\s\S])` is end-of-input and
|
|
81
114
|
// nothing else. /m is still needed for the `^` on the header.
|
|
82
|
-
|
|
115
|
+
//
|
|
116
|
+
// The optional `{…}` after the timestamp is the turn's attribution (see
|
|
117
|
+
// `appendTurn`). It is single-line by construction — JSON.stringify escapes
|
|
118
|
+
// newlines — so `.*` cannot run into the body.
|
|
119
|
+
const re = /^##\s+(user|assistant|system|tool|compact)\s+—\s+(\S+)[ \t]*(\{.*\})?[ \t]*\n([\s\S]*?)(?=\n##\s+(?:user|assistant|system|tool|compact)\s+—\s|\s*(?![\s\S]))/gm;
|
|
83
120
|
let m;
|
|
84
121
|
while ((m = re.exec(body)) !== null) {
|
|
122
|
+
let meta = null;
|
|
123
|
+
if (m[3]) {
|
|
124
|
+
// A header we cannot parse costs the turn its attribution, never its text.
|
|
125
|
+
try { meta = JSON.parse(m[3]); } catch { meta = null; }
|
|
126
|
+
}
|
|
85
127
|
turns.push({
|
|
86
128
|
role: m[1],
|
|
87
129
|
ts: m[2],
|
|
88
|
-
content: m[
|
|
130
|
+
content: m[4].trim(),
|
|
131
|
+
...(meta && typeof meta === "object" ? { meta } : {}),
|
|
89
132
|
});
|
|
90
133
|
}
|
|
91
134
|
return { fm, turns };
|
|
@@ -97,6 +140,118 @@ export function readConversation(storagePath, agentSlug, idOrFilename) {
|
|
|
97
140
|
return { ...parseConversation(fs.readFileSync(p, "utf8")), path: p };
|
|
98
141
|
}
|
|
99
142
|
|
|
143
|
+
/** Shape a parsed turn for the web chat viewer (tool rows carry structured args).
|
|
144
|
+
*
|
|
145
|
+
* Assistant rows hand out the attribution stored on their header under the
|
|
146
|
+
* SAME field names `readGlobalThread` uses — agent / agent_name / model /
|
|
147
|
+
* usage / tool_summary — because the web client shapes both through one
|
|
148
|
+
* `threadToChatMsgs`. A conversation opened from a file and the same turn read
|
|
149
|
+
* back from the ledger must not be two different things to the viewer. */
|
|
150
|
+
export function shapeConversationMessage(t) {
|
|
151
|
+
const base = { role: t.role, content: t.content, ts: t.ts };
|
|
152
|
+
// The file this turn carried, in EITHER direction and under the same field
|
|
153
|
+
// names `readGlobalThread` hands out — one viewer shapes both. A conversation
|
|
154
|
+
// file used to surface no media at all: a photo dropped in the composer of a
|
|
155
|
+
// project agent's chat was sent to the model and then read back as the raw
|
|
156
|
+
// "[image attached — saved to /Users/…]" marker, and an image the agent
|
|
157
|
+
// attached had nowhere to be recorded at all.
|
|
158
|
+
const media = mediaFromMeta(t.meta);
|
|
159
|
+
const mediaFields = {
|
|
160
|
+
...(media ? { media } : {}),
|
|
161
|
+
...(Array.isArray(t.meta?.media) && t.meta.media.length ? { media_list: t.meta.media } : {}),
|
|
162
|
+
};
|
|
163
|
+
if (t.role === "user") return { ...base, ...mediaFields };
|
|
164
|
+
if (t.role === "assistant") {
|
|
165
|
+
const meta = t.meta || {};
|
|
166
|
+
const usage = meta.usage;
|
|
167
|
+
return {
|
|
168
|
+
...base,
|
|
169
|
+
...mediaFields,
|
|
170
|
+
...(meta.agent ? { agent: meta.agent } : {}),
|
|
171
|
+
...(meta.agent_name ? { agent_name: meta.agent_name } : {}),
|
|
172
|
+
...(meta.actor_kind ? { actor_kind: meta.actor_kind } : {}),
|
|
173
|
+
...(meta.model ? { model: meta.model } : {}),
|
|
174
|
+
...(usage && typeof usage === "object" ? { usage } : {}),
|
|
175
|
+
...(meta.tool_summary ? { tool_summary: meta.tool_summary } : {}),
|
|
176
|
+
// Legacy exec rows wrote `{ tools: N }` before tool rows existed — surface
|
|
177
|
+
// a compact count so reopened threads don't look tool-less.
|
|
178
|
+
...(!meta.tool_summary && Number(meta.tools) > 0
|
|
179
|
+
? { tool_summary: { total: Number(meta.tools), failed: 0, tools: [{ name: "tool", count: Number(meta.tools), failed: 0 }] } }
|
|
180
|
+
: {}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (t.role !== "tool") return base;
|
|
184
|
+
let parsed = null;
|
|
185
|
+
try { parsed = JSON.parse(t.content); } catch { parsed = null; }
|
|
186
|
+
if (parsed && typeof parsed === "object" && parsed.tool) {
|
|
187
|
+
return {
|
|
188
|
+
...base,
|
|
189
|
+
tool: parsed.tool,
|
|
190
|
+
args: parsed.args,
|
|
191
|
+
result: parsed.result,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return { ...base, tool: "tool" };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Rewind a conversation, dropping turns. This is what "regenerate" and "edit &
|
|
198
|
+
// resend" stand on: the pane rewinds to a turn and the FILE has to rewind with
|
|
199
|
+
// it, or the daemon (which rebuilds a project agent's history from this file)
|
|
200
|
+
// would answer with the stale turns still appended.
|
|
201
|
+
//
|
|
202
|
+
// Cutoff is by a COUNT OF VISIBLE turns, not a timestamp: a just-sent turn's
|
|
203
|
+
// on-screen ts (stamped in the browser) differs from the ts appendTurn writes
|
|
204
|
+
// on disk, so a ts cutoff could misalign. `keepVisible: K` keeps turns through
|
|
205
|
+
// the K-th user/assistant turn, carrying any interleaved system/compact context
|
|
206
|
+
// with them, and drops everything after — which lines up exactly with the
|
|
207
|
+
// viewer, where the pane's messages ARE the user/assistant turns in order (the
|
|
208
|
+
// viewer hides system/compact; project agents have no tool turns). Returns false
|
|
209
|
+
// when the file is missing.
|
|
210
|
+
//
|
|
211
|
+
// The frontmatter block is preserved verbatim except last_turn, and each kept
|
|
212
|
+
// turn is re-emitted in appendTurn's exact format so a round-trip is stable.
|
|
213
|
+
export function truncateConversation(storagePath, agentSlug, idOrFilename, opts = {}) {
|
|
214
|
+
const { keepVisible = null } = typeof opts === "number" ? { keepVisible: opts } : opts || {};
|
|
215
|
+
const p = conversationPath(storagePath, agentSlug, idOrFilename);
|
|
216
|
+
if (!fs.existsSync(p)) return false;
|
|
217
|
+
const text = fs.readFileSync(p, "utf8");
|
|
218
|
+
const { turns } = parseConversation(text);
|
|
219
|
+
|
|
220
|
+
// Keep turns up to and including the K-th visible (user/assistant) turn — any
|
|
221
|
+
// system/compact turns before it ride along as context. If K reaches or
|
|
222
|
+
// exceeds the visible turns present, nothing is dropped (a no-op rewind).
|
|
223
|
+
const isVisible = (t) => t.role === "user" || t.role === "assistant";
|
|
224
|
+
const k = Math.max(0, Number(keepVisible) || 0);
|
|
225
|
+
let kept = [];
|
|
226
|
+
if (k > 0) {
|
|
227
|
+
let seen = 0;
|
|
228
|
+
let lastIdx = -1;
|
|
229
|
+
for (let i = 0; i < turns.length; i++) {
|
|
230
|
+
if (isVisible(turns[i]) && ++seen === k) { lastIdx = i; break; }
|
|
231
|
+
}
|
|
232
|
+
kept = lastIdx >= 0 ? turns.slice(0, lastIdx + 1) : turns.slice();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Preserve the frontmatter block (`---\n…\n---\n`) exactly, only rewriting
|
|
236
|
+
// last_turn — re-serialising parsed fm would reorder keys and drop unknowns.
|
|
237
|
+
const fmEnd = text.startsWith("---\n") ? text.indexOf("\n---\n", 4) : -1;
|
|
238
|
+
const header = fmEnd !== -1 ? text.slice(0, fmEnd + 5) : "";
|
|
239
|
+
|
|
240
|
+
const body = kept
|
|
241
|
+
.map((t) => {
|
|
242
|
+
const head = t.meta && Object.keys(t.meta).length ? ` ${JSON.stringify(t.meta)}` : "";
|
|
243
|
+
return `## ${t.role} — ${t.ts}${head}\n${t.content}\n\n`;
|
|
244
|
+
})
|
|
245
|
+
.join("");
|
|
246
|
+
const lastTs = kept.length ? kept[kept.length - 1].ts : "";
|
|
247
|
+
const head = header.replace(/^last_turn:.*$/m, `last_turn: ${lastTs}`);
|
|
248
|
+
fs.writeFileSync(p, `${head}\n${body}`);
|
|
249
|
+
|
|
250
|
+
const where = parseConversationPath(p);
|
|
251
|
+
if (where) emitMessageEvent({ scope: "conversation", ...where, role: "system", ts: nowIso() });
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
|
|
100
255
|
// Delete a conversation file. Filesystem is source of truth, so unlinking the
|
|
101
256
|
// markdown removes it from the sidebar list on the next fetch. Returns false
|
|
102
257
|
// when there is nothing to delete (already gone / bad id).
|
|
@@ -107,7 +262,10 @@ export function deleteConversation(storagePath, agentSlug, idOrFilename) {
|
|
|
107
262
|
return true;
|
|
108
263
|
}
|
|
109
264
|
|
|
110
|
-
|
|
265
|
+
/** Newest first. Archived ones are left out unless asked for — that is what
|
|
266
|
+
* archiving is FOR — but they are never dropped from disk, so the session
|
|
267
|
+
* picker can offer them back under their own heading. */
|
|
268
|
+
export function listConversations(storagePath, agentSlug, { includeArchived = false } = {}) {
|
|
111
269
|
const dir = path.join(storagePath, "agents", agentSlug, "conversations");
|
|
112
270
|
if (!fs.existsSync(dir)) return [];
|
|
113
271
|
return fs
|
|
@@ -116,7 +274,8 @@ export function listConversations(storagePath, agentSlug) {
|
|
|
116
274
|
.sort()
|
|
117
275
|
.reverse()
|
|
118
276
|
.map((f) => summarizeConversation(path.join(dir, f), agentSlug, f))
|
|
119
|
-
.filter(Boolean)
|
|
277
|
+
.filter(Boolean)
|
|
278
|
+
.filter((c) => includeArchived || !c.archived);
|
|
120
279
|
}
|
|
121
280
|
|
|
122
281
|
// Lightweight summary used by the chat list sidebar — reads frontmatter and
|
|
@@ -127,9 +286,12 @@ function summarizeConversation(filePath, agentSlug, filename) {
|
|
|
127
286
|
let text;
|
|
128
287
|
try { text = fs.readFileSync(filePath, "utf8"); } catch { return null; }
|
|
129
288
|
const { fm, turns } = parseConversation(text);
|
|
130
|
-
const messages = turns.filter((t) => t.role
|
|
289
|
+
const messages = turns.filter((t) => t.role === "user" || t.role === "assistant").length;
|
|
131
290
|
const firstUser = turns.find((t) => t.role === "user");
|
|
132
|
-
const title =
|
|
291
|
+
const title =
|
|
292
|
+
(typeof fm.title === "string" && fm.title.trim()) ||
|
|
293
|
+
(firstUser?.content || "").split("\n")[0].slice(0, 80).trim() ||
|
|
294
|
+
undefined;
|
|
133
295
|
|
|
134
296
|
// What the AGENT last said, not what the user last asked. An inbox row that
|
|
135
297
|
// echoes your own prompt back tells you nothing; the reply is the thing you
|
|
@@ -149,6 +311,7 @@ function summarizeConversation(filePath, agentSlug, filename) {
|
|
|
149
311
|
last_turn_at: fm.last_turn || fm.started || "",
|
|
150
312
|
ended_at: fm.status === "closed" ? (fm.last_turn || undefined) : undefined,
|
|
151
313
|
channel: fm.channel || undefined,
|
|
314
|
+
archived: String(fm.archived) === "true" || undefined,
|
|
152
315
|
messages,
|
|
153
316
|
title,
|
|
154
317
|
preview,
|
|
@@ -156,6 +319,43 @@ function summarizeConversation(filePath, agentSlug, filename) {
|
|
|
156
319
|
};
|
|
157
320
|
}
|
|
158
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Patch a conversation's frontmatter in place: what it is called, and whether
|
|
324
|
+
* it has been put away.
|
|
325
|
+
*
|
|
326
|
+
* Only the keys present in `patch` are touched, and a key already in the file
|
|
327
|
+
* is rewritten rather than duplicated — a second `title:` line would win or
|
|
328
|
+
* lose depending on which parser read it. New keys are inserted just before the
|
|
329
|
+
* closing fence so the block keeps its shape.
|
|
330
|
+
*
|
|
331
|
+
* Archiving is deliberately a FIELD and not a move to another directory: the
|
|
332
|
+
* file stays exactly where every id, link and reader already expects it, and
|
|
333
|
+
* putting a conversation away stays a decision you can take back.
|
|
334
|
+
*/
|
|
335
|
+
export function setConversationMeta(storagePath, agentSlug, idOrFilename, patch = {}) {
|
|
336
|
+
const p = conversationPath(storagePath, agentSlug, idOrFilename);
|
|
337
|
+
if (!fs.existsSync(p)) return false;
|
|
338
|
+
let text = fs.readFileSync(p, "utf8");
|
|
339
|
+
const fence = text.indexOf("\n---", 4);
|
|
340
|
+
if (!text.startsWith("---\n") || fence < 0) return false;
|
|
341
|
+
|
|
342
|
+
const write = (key, value) => {
|
|
343
|
+
const line = value === undefined ? null : `${key}: ${JSON.stringify(String(value))}`;
|
|
344
|
+
const re = new RegExp(`^${key}:.*$`, "m");
|
|
345
|
+
const head = text.slice(0, fence);
|
|
346
|
+
if (re.test(head)) {
|
|
347
|
+
text = head.replace(re, line ?? "").replace(/\n\n+/g, "\n") + text.slice(fence);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (line) text = head + `\n${line}` + text.slice(fence);
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
if ("title" in patch) write("title", patch.title || undefined);
|
|
354
|
+
if ("archived" in patch) write("archived", patch.archived ? "true" : undefined);
|
|
355
|
+
fs.writeFileSync(p, text);
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
|
|
159
359
|
export function setStatus(filePath, status) {
|
|
160
360
|
let text = fs.readFileSync(filePath, "utf8");
|
|
161
361
|
text = text.replace(/^status:.*$/m, `status: ${status}`);
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// The delivery queue — the "famoso delivery" made visible.
|
|
2
|
+
//
|
|
3
|
+
// When a routine run by a non-Roby agent leaves a message in the agent's own web
|
|
4
|
+
// chat, it also drops a DELIVERY here: a lightweight record that Manu has
|
|
5
|
+
// something waiting. This replaced the old a2a-message hack (an agent "chatting"
|
|
6
|
+
// with Roby cluttered the inbox and leaked the `super_agent` slug into the UI).
|
|
7
|
+
//
|
|
8
|
+
// A delivery is not a chat. It is a small, foldable event log you can look at to
|
|
9
|
+
// see what is piling up and what has been crossed off:
|
|
10
|
+
//
|
|
11
|
+
// pending — the agent left something; nobody has told Manu yet.
|
|
12
|
+
// notified — Roby reached Manu about it (immediately for a priority/anchor
|
|
13
|
+
// delivery, or later from the sweep for an ordinary one).
|
|
14
|
+
// answered — Manu replied in the agent's chat (the delivery is done).
|
|
15
|
+
// held — the interruption budget deliberately withheld the notify.
|
|
16
|
+
//
|
|
17
|
+
// Append-only JSONL, one event per line; `listDeliveries` folds it to the
|
|
18
|
+
// current state per id. Appending never rewrites, so two writers (a routine run
|
|
19
|
+
// and the sweep) cannot race a file rewrite.
|
|
20
|
+
import fs from "node:fs";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import { nowIso } from "#core/util/time.js";
|
|
23
|
+
|
|
24
|
+
const DELIVERIES_FILE = "deliveries.jsonl";
|
|
25
|
+
|
|
26
|
+
/** The one status a fold keeps per id, newest event wins. */
|
|
27
|
+
export const DELIVERY_STATUS = Object.freeze({
|
|
28
|
+
PENDING: "pending",
|
|
29
|
+
NOTIFIED: "notified",
|
|
30
|
+
ANSWERED: "answered",
|
|
31
|
+
HELD: "held",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function deliveriesPath(storagePath) {
|
|
35
|
+
return path.join(storagePath, DELIVERIES_FILE);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function shortId(ts) {
|
|
39
|
+
// Stable-ish, human-legible, and unique enough for a per-project queue: the
|
|
40
|
+
// second-precision timestamp plus a short random suffix. crypto is a runtime
|
|
41
|
+
// global; a failure just falls back to the timestamp alone.
|
|
42
|
+
let suffix = "";
|
|
43
|
+
try { suffix = crypto.randomUUID().slice(0, 6); } catch { suffix = String(Math.floor((Date.parse(ts) || 0) % 1e6)); }
|
|
44
|
+
return `d_${suffix}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function appendEvent(storagePath, event) {
|
|
48
|
+
if (!storagePath) return null;
|
|
49
|
+
try {
|
|
50
|
+
const file = deliveriesPath(storagePath);
|
|
51
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
52
|
+
fs.appendFileSync(file, JSON.stringify(event) + "\n");
|
|
53
|
+
return event;
|
|
54
|
+
} catch {
|
|
55
|
+
return null; // the queue is best-effort — losing a row must not fail the run
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Record a new pending delivery. Returns its id (or null if it could not be
|
|
61
|
+
* written) so the caller can mark it `notified`/`held` in the same run.
|
|
62
|
+
*/
|
|
63
|
+
export function recordDelivery(storagePath, { agent, agentName, routine, routineId, notify, priority = false, project_id = null }) {
|
|
64
|
+
const ts = nowIso();
|
|
65
|
+
const id = shortId(ts);
|
|
66
|
+
const ok = appendEvent(storagePath, {
|
|
67
|
+
id,
|
|
68
|
+
ev: DELIVERY_STATUS.PENDING,
|
|
69
|
+
ts,
|
|
70
|
+
agent,
|
|
71
|
+
agent_name: agentName || agent,
|
|
72
|
+
routine: routine || "",
|
|
73
|
+
routine_id: routineId || "",
|
|
74
|
+
notify: notify || "",
|
|
75
|
+
priority: !!priority,
|
|
76
|
+
project_id,
|
|
77
|
+
});
|
|
78
|
+
return ok ? id : null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Cross a delivery off (or move it along): notified / answered / held. */
|
|
82
|
+
export function markDelivery(storagePath, id, status, extra = {}) {
|
|
83
|
+
if (!id) return false;
|
|
84
|
+
return !!appendEvent(storagePath, { id, ev: status, ts: nowIso(), ...extra });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Manu engaged with an agent (replied in its chat) → close that agent's open
|
|
89
|
+
* deliveries. A `pending` one being answered CANCELS its grace-window notify
|
|
90
|
+
* before it fires; a `notified` one just gets crossed off. Returns how many were
|
|
91
|
+
* closed, so a caller can skip the notify when it already had one in flight.
|
|
92
|
+
*/
|
|
93
|
+
export function answerDeliveries(storagePath, agentSlug) {
|
|
94
|
+
if (!storagePath || !agentSlug) return 0;
|
|
95
|
+
const open = listDeliveries(storagePath).filter(
|
|
96
|
+
(d) => d.agent === agentSlug &&
|
|
97
|
+
(d.status === DELIVERY_STATUS.PENDING || d.status === DELIVERY_STATUS.NOTIFIED),
|
|
98
|
+
);
|
|
99
|
+
for (const d of open) markDelivery(storagePath, d.id, DELIVERY_STATUS.ANSWERED);
|
|
100
|
+
return open.length;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The current queue, newest first. Folds the event log so each id appears once
|
|
105
|
+
* with its latest status and the fields from its `pending` event. `status`
|
|
106
|
+
* filters to one state; `limit` caps the result.
|
|
107
|
+
*/
|
|
108
|
+
export function listDeliveries(storagePath, { status, limit = 100 } = {}) {
|
|
109
|
+
if (!storagePath) return [];
|
|
110
|
+
let lines = [];
|
|
111
|
+
try {
|
|
112
|
+
lines = fs.readFileSync(deliveriesPath(storagePath), "utf8").split("\n").filter(Boolean);
|
|
113
|
+
} catch {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// Fold events per id. The `pending` event carries the descriptive fields;
|
|
117
|
+
// every later event only moves the status. Events can arrive in any order, so
|
|
118
|
+
// merge onto whatever is already there rather than overwrite.
|
|
119
|
+
const byId = new Map();
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
let e;
|
|
122
|
+
try { e = JSON.parse(line); } catch { continue; }
|
|
123
|
+
if (!e?.id) continue;
|
|
124
|
+
const prev = byId.get(e.id);
|
|
125
|
+
if (e.ev === DELIVERY_STATUS.PENDING) {
|
|
126
|
+
byId.set(e.id, {
|
|
127
|
+
...e,
|
|
128
|
+
created_at: e.ts,
|
|
129
|
+
status: prev?.status || DELIVERY_STATUS.PENDING,
|
|
130
|
+
...(prev?.updated_at ? { updated_at: prev.updated_at } : {}),
|
|
131
|
+
...(prev?.channel ? { channel: prev.channel } : {}),
|
|
132
|
+
});
|
|
133
|
+
} else {
|
|
134
|
+
byId.set(e.id, {
|
|
135
|
+
...(prev || { id: e.id }),
|
|
136
|
+
id: e.id,
|
|
137
|
+
status: e.ev,
|
|
138
|
+
updated_at: e.ts,
|
|
139
|
+
...(e.channel ? { channel: e.channel } : {}),
|
|
140
|
+
...(e.reason ? { reason: e.reason } : {}),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
let out = [...byId.values()];
|
|
145
|
+
if (status) out = out.filter((d) => d.status === status);
|
|
146
|
+
out.sort((a, b) => String(b.created_at || b.ts || "").localeCompare(String(a.created_at || a.ts || "")));
|
|
147
|
+
return out.slice(0, limit);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Repoint a queue after an agent's slug changed. The queue keys work by slug —
|
|
152
|
+
* `answerDeliveries` closes by slug, and the sweep's notify links into that
|
|
153
|
+
* agent's chat — so a rename that skipped this would leave an open delivery
|
|
154
|
+
* nobody can ever cross off, still pointing at an agent that no longer exists.
|
|
155
|
+
*
|
|
156
|
+
* Append-only like every other write here: a re-stated `pending` event carries
|
|
157
|
+
* the new slug, and the fold keeps whatever status the delivery had reached
|
|
158
|
+
* (`status: prev?.status`), so a notified one stays notified and a later
|
|
159
|
+
* `answered` event still lands on it. `ts` repeats the original `created_at` so
|
|
160
|
+
* the queue's ordering and age do not jump.
|
|
161
|
+
*
|
|
162
|
+
* @returns {number} deliveries repointed
|
|
163
|
+
*/
|
|
164
|
+
export function renameDeliveryAgent(storagePath, oldSlug, newSlug) {
|
|
165
|
+
if (!storagePath || !oldSlug || !newSlug || oldSlug === newSlug) return 0;
|
|
166
|
+
const mine = listDeliveries(storagePath, { limit: Infinity }).filter((d) => d.agent === oldSlug);
|
|
167
|
+
for (const d of mine) {
|
|
168
|
+
appendEvent(storagePath, {
|
|
169
|
+
...d,
|
|
170
|
+
ev: DELIVERY_STATUS.PENDING,
|
|
171
|
+
ts: d.created_at || d.ts || nowIso(),
|
|
172
|
+
agent: newSlug,
|
|
173
|
+
agent_name: d.agent_name || newSlug,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return mine.length;
|
|
177
|
+
}
|