@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
package/src/core/stores/tasks.js
CHANGED
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
// Each line is a `{ id, ts, op, ... }` event. The current state of a task is
|
|
7
7
|
// the result of folding every event with that id in chronological order:
|
|
8
8
|
//
|
|
9
|
-
// create
|
|
9
|
+
// create — sets initial fields (title, description, body, tags, due, agent,
|
|
10
|
+
// source, meta, parent)
|
|
11
|
+
// comment — appends one comment to the task's thread (by, text)
|
|
10
12
|
// update — shallow-merge patch (`patch` field)
|
|
11
13
|
// done — closes the task (`by` field optional)
|
|
12
14
|
// drop — archives without "completed" semantics (`by` field optional)
|
|
@@ -18,6 +20,12 @@ import fs from "node:fs";
|
|
|
18
20
|
import path from "node:path";
|
|
19
21
|
import { nowIso } from "../util/time.js";
|
|
20
22
|
import { shortId as makeShortId } from "../util/ids.js";
|
|
23
|
+
import { normalizeTaskCategory, normalizeTaskLocation } from "#core/constants/task-categories.js";
|
|
24
|
+
import {
|
|
25
|
+
normalizeTaskAssignee,
|
|
26
|
+
normalizeTaskPriority,
|
|
27
|
+
normalizeTaskReminderFrequency,
|
|
28
|
+
} from "#core/constants/task-fields.js";
|
|
21
29
|
|
|
22
30
|
// Workflow sub-status for an *open* task. Orthogonal to `state`
|
|
23
31
|
// (open/done/dropped): `state` is the storage lifecycle, `status` is how an
|
|
@@ -25,8 +33,23 @@ import { shortId as makeShortId } from "../util/ids.js";
|
|
|
25
33
|
export const TASK_STATUSES = Object.freeze(["pending", "running", "in_review", "blocked"]);
|
|
26
34
|
export const DEFAULT_TASK_STATUS = "pending";
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Write-side validation. `allowed` is the caller's vocabulary — the four above
|
|
38
|
+
* by default, or whatever columns the install has configured (core/tasks/
|
|
39
|
+
* columns.js). The store stays config-free: whoever knows the catalog passes it.
|
|
40
|
+
*/
|
|
41
|
+
function normalizeStatus(v, allowed = TASK_STATUSES) {
|
|
42
|
+
const list = Array.isArray(allowed) && allowed.length ? allowed : TASK_STATUSES;
|
|
43
|
+
return list.includes(v) ? v : DEFAULT_TASK_STATUS;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Read-side. Deliberately NOT re-validated against today's vocabulary: the value
|
|
48
|
+
* was checked when it was written, and a column removed from the catalog later
|
|
49
|
+
* must not silently rewrite the history of every task that sat in it. Shape only.
|
|
50
|
+
*/
|
|
51
|
+
function readStatus(v) {
|
|
52
|
+
return typeof v === "string" && /^[a-z0-9][a-z0-9_-]{0,31}$/.test(v) ? v : DEFAULT_TASK_STATUS;
|
|
30
53
|
}
|
|
31
54
|
|
|
32
55
|
function tasksDir(storagePath) {
|
|
@@ -46,12 +69,38 @@ function appendEvent(storagePath, event) {
|
|
|
46
69
|
const file = monthlyFile(storagePath);
|
|
47
70
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
48
71
|
fs.appendFileSync(file, JSON.stringify(event) + "\n");
|
|
72
|
+
_events.delete(storagePath);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Parsed events, keyed by storage path and validated against the directory's
|
|
76
|
+
// shape (names + sizes + mtimes). Only the READ and the JSON.parse are cached;
|
|
77
|
+
// the fold is redone every call, so nobody can poison the cache by mutating a
|
|
78
|
+
// task object we handed out.
|
|
79
|
+
//
|
|
80
|
+
// It earns its place now that comments live on this log: a task detail is one
|
|
81
|
+
// getTask, a thread of twenty comments is twenty more events, and both the
|
|
82
|
+
// panel and the phone poll. Before this, every list, get, patch and comment
|
|
83
|
+
// re-read and re-parsed every monthly file on disk — four times per write.
|
|
84
|
+
const _events = new Map();
|
|
85
|
+
|
|
86
|
+
function dirSignature(dir, files) {
|
|
87
|
+
let sig = "";
|
|
88
|
+
for (const f of files) {
|
|
89
|
+
const st = fs.statSync(path.join(dir, f));
|
|
90
|
+
sig += `${f}:${st.size}:${st.mtimeMs};`;
|
|
91
|
+
}
|
|
92
|
+
return sig;
|
|
49
93
|
}
|
|
50
94
|
|
|
51
95
|
function readAllEvents(storagePath) {
|
|
52
96
|
const dir = tasksDir(storagePath);
|
|
53
97
|
if (!fs.existsSync(dir)) return [];
|
|
54
98
|
const files = fs.readdirSync(dir).filter((f) => f.endsWith(".jsonl")).sort();
|
|
99
|
+
|
|
100
|
+
const sig = dirSignature(dir, files);
|
|
101
|
+
const hit = _events.get(storagePath);
|
|
102
|
+
if (hit && hit.sig === sig) return hit.events;
|
|
103
|
+
|
|
55
104
|
const events = [];
|
|
56
105
|
for (const f of files) {
|
|
57
106
|
const text = fs.readFileSync(path.join(dir, f), "utf8");
|
|
@@ -67,9 +116,15 @@ function readAllEvents(storagePath) {
|
|
|
67
116
|
}
|
|
68
117
|
}
|
|
69
118
|
events.sort((a, b) => (a.ts || "").localeCompare(b.ts || ""));
|
|
119
|
+
_events.set(storagePath, { sig, events });
|
|
70
120
|
return events;
|
|
71
121
|
}
|
|
72
122
|
|
|
123
|
+
/** Drop every cached parse. For tests, and for anything that edits logs by hand. */
|
|
124
|
+
export function resetTasksCache() {
|
|
125
|
+
_events.clear();
|
|
126
|
+
}
|
|
127
|
+
|
|
73
128
|
function projectState(events) {
|
|
74
129
|
const tasks = new Map();
|
|
75
130
|
for (const ev of events) {
|
|
@@ -82,15 +137,34 @@ function projectState(events) {
|
|
|
82
137
|
created_at: ev.ts,
|
|
83
138
|
updated_at: ev.ts,
|
|
84
139
|
state: "open",
|
|
85
|
-
status:
|
|
140
|
+
status: readStatus(ev.status),
|
|
86
141
|
title: ev.title || "",
|
|
142
|
+
parent: ev.parent || null,
|
|
143
|
+
// Every comment on this task, oldest first. Lives on the same event
|
|
144
|
+
// log as the task itself so a comment is never orphaned from what it
|
|
145
|
+
// is about, and so an agent's reply is as durable as the task row.
|
|
146
|
+
comments: [],
|
|
147
|
+
// What the OWNER has to do, in their words. `body` next to it is the
|
|
148
|
+
// agent's prompt. They were one field for a while and it made the
|
|
149
|
+
// task unreadable as a to-do: the panel labelled it "Prompt" and
|
|
150
|
+
// hinted "what the agent receives", so a list of things to do read
|
|
151
|
+
// like a queue of jobs to dispatch. Splitting them is what lets the
|
|
152
|
+
// same row be legible to a person and useful to an agent.
|
|
153
|
+
description: ev.description || null,
|
|
87
154
|
body: ev.body || null,
|
|
88
155
|
tags: Array.isArray(ev.tags) ? [...ev.tags] : [],
|
|
89
156
|
due: ev.due || null,
|
|
90
|
-
agent: ev.agent
|
|
157
|
+
agent: normalizeTaskAssignee(ev.agent),
|
|
158
|
+
priority: normalizeTaskPriority(ev.priority),
|
|
159
|
+
reminder_frequency: normalizeTaskReminderFrequency(ev.reminder_frequency),
|
|
91
160
|
source: ev.source || null,
|
|
92
161
|
created_by: ev.created_by || null,
|
|
93
162
|
thread: ev.thread || null,
|
|
163
|
+
// What KIND of task, and where. Both are first-class rather than
|
|
164
|
+
// conventions inside `meta` or `tags`, because the daemon routes on
|
|
165
|
+
// them — see core/constants/task-categories.js.
|
|
166
|
+
category: normalizeTaskCategory(ev.category),
|
|
167
|
+
location: normalizeTaskLocation(ev.location),
|
|
94
168
|
meta: ev.meta && typeof ev.meta === "object" ? { ...ev.meta } : {},
|
|
95
169
|
});
|
|
96
170
|
break;
|
|
@@ -100,7 +174,15 @@ function projectState(events) {
|
|
|
100
174
|
const patch = ev.patch && typeof ev.patch === "object" ? ev.patch : {};
|
|
101
175
|
for (const k of Object.keys(patch)) {
|
|
102
176
|
if (k === "id" || k === "state" || k === "created_at") continue;
|
|
103
|
-
|
|
177
|
+
if (k === "status") existing[k] = readStatus(patch[k]);
|
|
178
|
+
else if (k === "category") existing[k] = normalizeTaskCategory(patch[k]);
|
|
179
|
+
// A patch that clears the location must be able to say so, so null
|
|
180
|
+
// survives here where an unknown key would just be copied.
|
|
181
|
+
else if (k === "location") existing[k] = normalizeTaskLocation(patch[k]);
|
|
182
|
+
else if (k === "agent") existing[k] = normalizeTaskAssignee(patch[k]);
|
|
183
|
+
else if (k === "priority") existing[k] = normalizeTaskPriority(patch[k]);
|
|
184
|
+
else if (k === "reminder_frequency") existing[k] = normalizeTaskReminderFrequency(patch[k]);
|
|
185
|
+
else existing[k] = patch[k];
|
|
104
186
|
}
|
|
105
187
|
existing.updated_at = ev.ts;
|
|
106
188
|
break;
|
|
@@ -128,6 +210,25 @@ function projectState(events) {
|
|
|
128
210
|
existing.updated_at = ev.ts;
|
|
129
211
|
break;
|
|
130
212
|
}
|
|
213
|
+
case "comment": {
|
|
214
|
+
if (!existing) break;
|
|
215
|
+
existing.comments.push({
|
|
216
|
+
id: ev.comment_id || ev.ts,
|
|
217
|
+
ts: ev.ts,
|
|
218
|
+
// Who said it: an actor id ("owner") or an agent slug. Free-form on
|
|
219
|
+
// purpose — the surfaces label it, the store just records it.
|
|
220
|
+
by: ev.by || null,
|
|
221
|
+
text: typeof ev.text === "string" ? ev.text : "",
|
|
222
|
+
// Agent slugs this comment addressed. Resolved at WRITE time by the
|
|
223
|
+
// caller, because the roster it resolves against can change later and
|
|
224
|
+
// a thread should keep saying who was actually pulled in that day.
|
|
225
|
+
mentions: Array.isArray(ev.mentions) ? [...ev.mentions] : [],
|
|
226
|
+
});
|
|
227
|
+
// A comment IS activity on the task — it moves updated_at, which is what
|
|
228
|
+
// `--updated-since` and every "what moved?" view read.
|
|
229
|
+
existing.updated_at = ev.ts;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
131
232
|
default:
|
|
132
233
|
// unknown op — record nothing, but don't throw
|
|
133
234
|
break;
|
|
@@ -142,9 +243,10 @@ function projectState(events) {
|
|
|
142
243
|
|
|
143
244
|
/**
|
|
144
245
|
* Create a new task. Returns the freshly projected task object.
|
|
145
|
-
* fields: { title (required), body?, tags?, due?, agent?,
|
|
246
|
+
* fields: { title (required), description?, body?, tags?, due?, agent?,
|
|
247
|
+
* source?, meta?, category?, location? }
|
|
146
248
|
*/
|
|
147
|
-
export function createTask(storagePath, fields) {
|
|
249
|
+
export function createTask(storagePath, fields, { statuses } = {}) {
|
|
148
250
|
if (!fields || typeof fields !== "object") throw new Error("createTask: fields required");
|
|
149
251
|
if (!fields.title || typeof fields.title !== "string") throw new Error("createTask: title required");
|
|
150
252
|
const id = shortId();
|
|
@@ -153,14 +255,23 @@ export function createTask(storagePath, fields) {
|
|
|
153
255
|
ts: nowIso(),
|
|
154
256
|
op: "create",
|
|
155
257
|
title: fields.title.trim(),
|
|
258
|
+
// A subtask is just a task with a parent. No second store, no second set of
|
|
259
|
+
// verbs: everything that lists, filters, closes or comments on a task works
|
|
260
|
+
// on a subtask unchanged, which is the whole reason it is one field.
|
|
261
|
+
parent: fields.parent || null,
|
|
262
|
+
description: fields.description || null,
|
|
156
263
|
body: fields.body || null,
|
|
157
|
-
status: normalizeStatus(fields.status),
|
|
264
|
+
status: normalizeStatus(fields.status, statuses),
|
|
158
265
|
tags: Array.isArray(fields.tags) ? fields.tags.filter((t) => typeof t === "string") : [],
|
|
159
266
|
due: fields.due || null,
|
|
160
|
-
agent: fields.agent
|
|
267
|
+
agent: normalizeTaskAssignee(fields.agent),
|
|
268
|
+
priority: normalizeTaskPriority(fields.priority),
|
|
269
|
+
reminder_frequency: normalizeTaskReminderFrequency(fields.reminder_frequency),
|
|
161
270
|
source: fields.source || null,
|
|
162
271
|
created_by: fields.created_by || null,
|
|
163
272
|
thread: fields.thread || null,
|
|
273
|
+
category: normalizeTaskCategory(fields.category),
|
|
274
|
+
location: normalizeTaskLocation(fields.location),
|
|
164
275
|
meta: fields.meta && typeof fields.meta === "object" ? fields.meta : {},
|
|
165
276
|
};
|
|
166
277
|
appendEvent(storagePath, ev);
|
|
@@ -181,10 +292,45 @@ function byNewest(a, b) {
|
|
|
181
292
|
return t !== 0 ? t : String(b.id || "").localeCompare(String(a.id || ""));
|
|
182
293
|
}
|
|
183
294
|
|
|
295
|
+
/**
|
|
296
|
+
* How many children each task has, and how many are closed. Computed once over
|
|
297
|
+
* the whole fold rather than per row, because "2/5" on a parent is the only
|
|
298
|
+
* thing that makes an epic readable at a glance.
|
|
299
|
+
*/
|
|
300
|
+
function childIndex(tasks) {
|
|
301
|
+
const idx = new Map();
|
|
302
|
+
for (const t of tasks) {
|
|
303
|
+
if (!t.parent) continue;
|
|
304
|
+
const e = idx.get(t.parent) || { total: 0, done: 0 };
|
|
305
|
+
e.total += 1;
|
|
306
|
+
if (t.state === "done") e.done += 1;
|
|
307
|
+
idx.set(t.parent, e);
|
|
308
|
+
}
|
|
309
|
+
return idx;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* A list row. Comments are DROPPED here and only counted: a page of 20 tasks
|
|
314
|
+
* with their full threads is a payload nobody on that screen reads, and the
|
|
315
|
+
* phone pays for it twice.
|
|
316
|
+
*/
|
|
317
|
+
function row(task, idx) {
|
|
318
|
+
const kids = idx.get(task.id);
|
|
319
|
+
const { comments, ...rest } = task;
|
|
320
|
+
return {
|
|
321
|
+
...rest,
|
|
322
|
+
comment_count: comments.length,
|
|
323
|
+
subtask_count: kids?.total || 0,
|
|
324
|
+
subtask_done: kids?.done || 0,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
184
328
|
/** List tasks with optional filters. */
|
|
185
329
|
export function listTasks(storagePath, opts = {}) {
|
|
186
330
|
const events = readAllEvents(storagePath);
|
|
187
|
-
const
|
|
331
|
+
const all = [...projectState(events).values()];
|
|
332
|
+
const idx = childIndex(all);
|
|
333
|
+
const tasks = all.map((t) => row(t, idx));
|
|
188
334
|
|
|
189
335
|
let out = tasks;
|
|
190
336
|
if (opts.state && opts.state !== "all") {
|
|
@@ -198,6 +344,12 @@ export function listTasks(storagePath, opts = {}) {
|
|
|
198
344
|
if (opts.agent) {
|
|
199
345
|
out = out.filter((t) => t.agent === opts.agent);
|
|
200
346
|
}
|
|
347
|
+
// Children of one task ("" / null asks for TOP-LEVEL tasks only, which is
|
|
348
|
+
// what a list wants so an epic's children do not also sit at the root).
|
|
349
|
+
if (opts.parent !== undefined) {
|
|
350
|
+
const want = opts.parent || null;
|
|
351
|
+
out = out.filter((t) => (t.parent || null) === want);
|
|
352
|
+
}
|
|
201
353
|
if (opts.due_before) {
|
|
202
354
|
out = out.filter((t) => t.due && t.due <= opts.due_before);
|
|
203
355
|
}
|
|
@@ -271,10 +423,15 @@ export function getTask(storagePath, idOrPrefix) {
|
|
|
271
423
|
if (!idOrPrefix || typeof idOrPrefix !== "string") return null;
|
|
272
424
|
const events = readAllEvents(storagePath);
|
|
273
425
|
const tasks = projectState(events);
|
|
274
|
-
|
|
426
|
+
const idx = childIndex([...tasks.values()]);
|
|
427
|
+
|
|
428
|
+
// The detail keeps its thread — it is the one screen that reads it.
|
|
429
|
+
const full = (t) => ({ ...row(t, idx), comments: t.comments.map((c) => ({ ...c })) });
|
|
430
|
+
|
|
431
|
+
if (tasks.has(idOrPrefix)) return full(tasks.get(idOrPrefix));
|
|
275
432
|
if (idOrPrefix.length < 3) return null;
|
|
276
433
|
const matches = [...tasks.values()].filter((t) => t.id.startsWith(idOrPrefix));
|
|
277
|
-
if (matches.length === 1) return matches[0];
|
|
434
|
+
if (matches.length === 1) return full(matches[0]);
|
|
278
435
|
return null;
|
|
279
436
|
}
|
|
280
437
|
|
|
@@ -283,24 +440,33 @@ export function patchTask(storagePath, idOrPrefix, patch) {
|
|
|
283
440
|
const existing = getTask(storagePath, idOrPrefix);
|
|
284
441
|
if (!existing) return null;
|
|
285
442
|
if (!patch || typeof patch !== "object") return existing;
|
|
443
|
+
const normalized = { ...patch };
|
|
444
|
+
if (Object.hasOwn(normalized, "agent")) normalized.agent = normalizeTaskAssignee(normalized.agent);
|
|
445
|
+
if (Object.hasOwn(normalized, "priority")) normalized.priority = normalizeTaskPriority(normalized.priority);
|
|
446
|
+
if (Object.hasOwn(normalized, "reminder_frequency")) {
|
|
447
|
+
normalized.reminder_frequency = normalizeTaskReminderFrequency(normalized.reminder_frequency);
|
|
448
|
+
}
|
|
286
449
|
appendEvent(storagePath, {
|
|
287
450
|
id: existing.id,
|
|
288
451
|
ts: nowIso(),
|
|
289
452
|
op: "update",
|
|
290
|
-
patch,
|
|
453
|
+
patch: normalized,
|
|
291
454
|
});
|
|
292
455
|
return getTask(storagePath, existing.id);
|
|
293
456
|
}
|
|
294
457
|
|
|
295
|
-
/**
|
|
296
|
-
|
|
458
|
+
/**
|
|
459
|
+
* Move an open task to a column. `statuses` is the vocabulary to validate
|
|
460
|
+
* against — omit it and the four built-ins apply.
|
|
461
|
+
*/
|
|
462
|
+
export function setTaskStatus(storagePath, idOrPrefix, status, { statuses } = {}) {
|
|
297
463
|
const existing = getTask(storagePath, idOrPrefix);
|
|
298
464
|
if (!existing) return null;
|
|
299
465
|
appendEvent(storagePath, {
|
|
300
466
|
id: existing.id,
|
|
301
467
|
ts: nowIso(),
|
|
302
468
|
op: "update",
|
|
303
|
-
patch: { status: normalizeStatus(status) },
|
|
469
|
+
patch: { status: normalizeStatus(status, statuses) },
|
|
304
470
|
});
|
|
305
471
|
return getTask(storagePath, existing.id);
|
|
306
472
|
}
|
|
@@ -331,6 +497,31 @@ export function dropTask(storagePath, idOrPrefix, by = null) {
|
|
|
331
497
|
return getTask(storagePath, existing.id);
|
|
332
498
|
}
|
|
333
499
|
|
|
500
|
+
/**
|
|
501
|
+
* Append a comment to a task's thread. Returns the projected task, or null if
|
|
502
|
+
* the task does not exist.
|
|
503
|
+
*
|
|
504
|
+
* `mentions` are agent slugs the caller already resolved — the store does no
|
|
505
|
+
* roster lookup of its own, so a thread keeps saying who was actually pulled in
|
|
506
|
+
* on the day it was written even after the project's agents change.
|
|
507
|
+
*/
|
|
508
|
+
export function addComment(storagePath, idOrPrefix, { by = null, text = "", mentions = [] } = {}) {
|
|
509
|
+
const existing = getTask(storagePath, idOrPrefix);
|
|
510
|
+
if (!existing) return null;
|
|
511
|
+
const body = typeof text === "string" ? text.trim() : "";
|
|
512
|
+
if (!body) throw new Error("addComment: text required");
|
|
513
|
+
appendEvent(storagePath, {
|
|
514
|
+
id: existing.id,
|
|
515
|
+
ts: nowIso(),
|
|
516
|
+
op: "comment",
|
|
517
|
+
comment_id: makeShortId("c"),
|
|
518
|
+
by,
|
|
519
|
+
text: body,
|
|
520
|
+
mentions: Array.isArray(mentions) ? mentions.filter((m) => typeof m === "string") : [],
|
|
521
|
+
});
|
|
522
|
+
return getTask(storagePath, existing.id);
|
|
523
|
+
}
|
|
524
|
+
|
|
334
525
|
/** Re-open a done/dropped task. */
|
|
335
526
|
export function reopenTask(storagePath, idOrPrefix) {
|
|
336
527
|
const existing = getTask(storagePath, idOrPrefix);
|
|
@@ -348,8 +539,11 @@ export function countTasks(storagePath) {
|
|
|
348
539
|
const tasks = [...projectState(readAllEvents(storagePath)).values()];
|
|
349
540
|
const today = new Date().toISOString().slice(0, 10);
|
|
350
541
|
const open = tasks.filter((t) => t.state === "open");
|
|
542
|
+
// Every built-in, plus any configured column actually in use — a board with a
|
|
543
|
+
// "qa" column whose summary never mentions qa is a summary of a different board.
|
|
351
544
|
const byStatus = {};
|
|
352
|
-
for (const s of TASK_STATUSES) byStatus[s] =
|
|
545
|
+
for (const s of TASK_STATUSES) byStatus[s] = 0;
|
|
546
|
+
for (const t of open) byStatus[t.status] = (byStatus[t.status] || 0) + 1;
|
|
353
547
|
return {
|
|
354
548
|
open: open.length,
|
|
355
549
|
done: tasks.filter((t) => t.state === "done").length,
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// One writer for one agent turn: prompt in, tools, answer out.
|
|
2
|
+
//
|
|
3
|
+
// A turn is recorded in two places and they answer different questions. The
|
|
4
|
+
// CONVERSATION FILE is the thread you reopen — the chat list's Schedule group,
|
|
5
|
+
// the session picker, `apx conversations`. The LEDGER is the cross-channel
|
|
6
|
+
// record — search, the RAG index, the inbox, "what has been going on today".
|
|
7
|
+
// Both have to hear about the same turn, and both have to hear the same thing.
|
|
8
|
+
//
|
|
9
|
+
// This existed twice. The web path wrote the ledger with full attribution
|
|
10
|
+
// (model, usage, tool summary — see api/super-agent.js `logWebTurn`); the
|
|
11
|
+
// routine runner had its own private pair, and its file half wrote text and
|
|
12
|
+
// nothing else. So a scheduled run — the one turn nobody watched stream, the
|
|
13
|
+
// one where the stored record is the ONLY record — opened as "0 tok", no model,
|
|
14
|
+
// no actor. A routine's turn is not a lesser kind of turn; it goes through the
|
|
15
|
+
// same treatment as a message typed by hand, and this is that treatment.
|
|
16
|
+
import {
|
|
17
|
+
startConversation,
|
|
18
|
+
appendTurn,
|
|
19
|
+
setStatus,
|
|
20
|
+
} from "#core/stores/conversations.js";
|
|
21
|
+
import { summarizeToolTrace } from "#core/agent/tool-summary.js";
|
|
22
|
+
|
|
23
|
+
/** Attribution every writer stamps on the assistant row — model, usage, tool summary. */
|
|
24
|
+
export function buildTurnAttribution({ agentSlug, agentName, model, usage, trace = [] }) {
|
|
25
|
+
const steps = Array.isArray(trace) ? trace.filter((s) => s?.tool) : [];
|
|
26
|
+
const toolSummary = summarizeToolTrace(steps);
|
|
27
|
+
return {
|
|
28
|
+
agent: agentSlug,
|
|
29
|
+
agent_name: agentName || agentSlug,
|
|
30
|
+
...(model ? { model } : {}),
|
|
31
|
+
...(usage ? { usage } : {}),
|
|
32
|
+
...(toolSummary ? { tool_summary: toolSummary } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Append tool rows then the assistant answer to an open conversation file. */
|
|
37
|
+
export function appendAgentReplyToConversation({ filePath, reply, trace = [], attribution }) {
|
|
38
|
+
const steps = Array.isArray(trace) ? trace.filter((s) => s?.tool) : [];
|
|
39
|
+
for (const step of steps) {
|
|
40
|
+
appendTurn({
|
|
41
|
+
filePath,
|
|
42
|
+
role: "tool",
|
|
43
|
+
content: JSON.stringify({
|
|
44
|
+
tool: step.tool,
|
|
45
|
+
args: step.args || {},
|
|
46
|
+
result: step.result,
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
appendTurn({
|
|
51
|
+
filePath,
|
|
52
|
+
role: "assistant",
|
|
53
|
+
content: reply || "",
|
|
54
|
+
meta: attribution,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Record a complete agent turn to the conversation file and the project ledger.
|
|
60
|
+
*
|
|
61
|
+
* @param {object} o
|
|
62
|
+
* @param {object} o.project ProjectManager entry — needs `storagePath`
|
|
63
|
+
* for the file half and `logMessage` for the
|
|
64
|
+
* ledger half. Either may be missing; each
|
|
65
|
+
* half is written only when it can be.
|
|
66
|
+
* @param {string} o.agentSlug Who answered (conversation owner + actor id).
|
|
67
|
+
* @param {string} [o.agentName] Display name. Defaults to the slug — the
|
|
68
|
+
* record always carries one.
|
|
69
|
+
* @param {string} o.channel Channel the turn happened on.
|
|
70
|
+
* @param {string} [o.title] Conversation title (a routine passes its name).
|
|
71
|
+
* @param {string} [o.model] Model that produced the reply.
|
|
72
|
+
* @param {string} o.prompt What the agent was asked.
|
|
73
|
+
* @param {string} [o.filedPrompt] The prompt as the THREAD should show it, when
|
|
74
|
+
* the thread wants a label the ledger doesn't
|
|
75
|
+
* ("[routine: nightly]\n\n…"). Defaults to `prompt`.
|
|
76
|
+
* @param {string} [o.reply] What it answered.
|
|
77
|
+
* @param {object[]}[o.trace] Tool calls, in order.
|
|
78
|
+
* @param {object} [o.usage] { input_tokens, output_tokens }.
|
|
79
|
+
* @param {object} [o.scope] Extra meta stamped on every ledger row
|
|
80
|
+
* (e.g. `{ routine: name }`).
|
|
81
|
+
* @param {string} [o.actorKind] "agent" (default) or "superagent" — the
|
|
82
|
+
* super-agent is not a project agent and its
|
|
83
|
+
* rows have always said so.
|
|
84
|
+
* @param {boolean} [o.conversation] Write the reopenable thread. False for an
|
|
85
|
+
* actor whose chats live in the ledger rather
|
|
86
|
+
* than in per-agent files (the super-agent).
|
|
87
|
+
* @returns {{ conversationId: string|null, toolSummary: object|null }}
|
|
88
|
+
*/
|
|
89
|
+
export function recordAgentTurn({
|
|
90
|
+
project,
|
|
91
|
+
agentSlug,
|
|
92
|
+
agentName,
|
|
93
|
+
channel,
|
|
94
|
+
title,
|
|
95
|
+
model,
|
|
96
|
+
prompt,
|
|
97
|
+
filedPrompt,
|
|
98
|
+
reply = "",
|
|
99
|
+
trace = [],
|
|
100
|
+
usage,
|
|
101
|
+
scope = {},
|
|
102
|
+
actorKind = "agent",
|
|
103
|
+
conversation = true,
|
|
104
|
+
}) {
|
|
105
|
+
const steps = Array.isArray(trace) ? trace.filter((s) => s?.tool) : [];
|
|
106
|
+
const toolSummary = summarizeToolTrace(steps);
|
|
107
|
+
const attribution = buildTurnAttribution({ agentSlug, agentName, model, usage, trace: steps });
|
|
108
|
+
|
|
109
|
+
const conversationId = conversation
|
|
110
|
+
? writeConversation({
|
|
111
|
+
storagePath: project?.storagePath,
|
|
112
|
+
agentSlug,
|
|
113
|
+
channel,
|
|
114
|
+
title,
|
|
115
|
+
model,
|
|
116
|
+
prompt: filedPrompt ?? prompt,
|
|
117
|
+
reply,
|
|
118
|
+
steps,
|
|
119
|
+
attribution,
|
|
120
|
+
})
|
|
121
|
+
: null;
|
|
122
|
+
|
|
123
|
+
writeLedger({
|
|
124
|
+
project,
|
|
125
|
+
agentSlug,
|
|
126
|
+
agentName,
|
|
127
|
+
actorKind,
|
|
128
|
+
channel,
|
|
129
|
+
prompt,
|
|
130
|
+
reply,
|
|
131
|
+
steps,
|
|
132
|
+
attribution,
|
|
133
|
+
scope: { ...scope, ...(conversationId ? { conversation: conversationId } : {}) },
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
return { conversationId, toolSummary };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** The thread you reopen. One file per turn for a routine (each run stands on
|
|
140
|
+
* its own); `null` when there is nowhere to put it. */
|
|
141
|
+
function writeConversation({ storagePath, agentSlug, channel, title, model, prompt, reply, steps, attribution }) {
|
|
142
|
+
if (!storagePath || !agentSlug) return null;
|
|
143
|
+
try {
|
|
144
|
+
const conv = startConversation({
|
|
145
|
+
storagePath,
|
|
146
|
+
agentSlug,
|
|
147
|
+
engine: model,
|
|
148
|
+
channel,
|
|
149
|
+
title,
|
|
150
|
+
});
|
|
151
|
+
appendTurn({ filePath: conv.path, role: "user", content: prompt });
|
|
152
|
+
appendAgentReplyToConversation({
|
|
153
|
+
filePath: conv.path,
|
|
154
|
+
reply,
|
|
155
|
+
trace: steps,
|
|
156
|
+
attribution,
|
|
157
|
+
});
|
|
158
|
+
setStatus(conv.path, "closed");
|
|
159
|
+
return conv.id;
|
|
160
|
+
} catch {
|
|
161
|
+
// Storage is best-effort at the edges — losing the file must not fail the
|
|
162
|
+
// run that produced it. The caller still gets its reply.
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** The cross-channel record: what search, the RAG index and the inbox read. */
|
|
168
|
+
function writeLedger({ project, agentSlug, agentName, actorKind, channel, prompt, reply, steps, attribution, scope }) {
|
|
169
|
+
if (!project?.logMessage) return;
|
|
170
|
+
try {
|
|
171
|
+
project.logMessage({
|
|
172
|
+
agent_slug: agentSlug,
|
|
173
|
+
channel,
|
|
174
|
+
direction: "in",
|
|
175
|
+
type: "user",
|
|
176
|
+
author: "user",
|
|
177
|
+
body: prompt,
|
|
178
|
+
meta: scope,
|
|
179
|
+
});
|
|
180
|
+
// One row per step — the same shape every other channel writes, which is
|
|
181
|
+
// what lets a reopened thread render the work instead of a bare answer.
|
|
182
|
+
for (const step of steps) {
|
|
183
|
+
project.logMessage({
|
|
184
|
+
agent_slug: agentSlug,
|
|
185
|
+
channel,
|
|
186
|
+
direction: "out",
|
|
187
|
+
type: "tool",
|
|
188
|
+
actor_id: step.tool,
|
|
189
|
+
actor_kind: "tool",
|
|
190
|
+
author: agentName || agentSlug,
|
|
191
|
+
body: `${step.tool}(${JSON.stringify(step.args || {}).slice(0, 200)})`,
|
|
192
|
+
meta: { ...scope, tool: step.tool, args: step.args, result: step.result },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
project.logMessage({
|
|
196
|
+
agent_slug: agentSlug,
|
|
197
|
+
channel,
|
|
198
|
+
direction: "out",
|
|
199
|
+
type: "agent",
|
|
200
|
+
actor_id: agentSlug,
|
|
201
|
+
actor_kind: actorKind,
|
|
202
|
+
author: agentName || agentSlug,
|
|
203
|
+
body: reply || "",
|
|
204
|
+
meta: { ...scope, ...attribution, ...(steps.length ? { tool_trace: steps } : {}) },
|
|
205
|
+
});
|
|
206
|
+
} catch {
|
|
207
|
+
/* best-effort: a ledger write must never break the run */
|
|
208
|
+
}
|
|
209
|
+
}
|