@agentprojectcontext/apx 1.80.2 → 1.89.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -8
- package/skills/apc-context/SKILL.md +14 -7
- package/skills/apx/SKILL.md +62 -2
- package/skills/apx-mcp/SKILL.md +42 -15
- package/src/core/agent/a2a/peers.js +161 -0
- package/src/core/agent/a2a/reply.js +379 -27
- package/src/core/agent/abort.js +25 -0
- package/src/core/agent/agent-model.js +58 -0
- package/src/core/agent/agent-tools.js +101 -0
- package/src/core/agent/author-line.js +110 -0
- package/src/core/agent/build-agent-system.js +52 -18
- package/src/core/agent/channels/voice-context.js +17 -2
- package/src/core/agent/closing-floor.js +117 -0
- package/src/core/agent/constants.js +119 -11
- package/src/core/agent/engine-call.js +56 -0
- package/src/core/agent/group/run-group-turn.js +218 -0
- package/src/core/agent/group/turn-resolver.js +165 -0
- package/src/core/agent/judge.js +138 -11
- package/src/core/agent/loop/side-effects.js +106 -3
- package/src/core/agent/memory.js +31 -18
- package/src/core/agent/model-capabilities.js +47 -0
- package/src/core/agent/model-router.js +11 -40
- package/src/core/agent/prompt-builder.js +47 -0
- package/src/core/agent/prompts/channels/a2a.md +12 -0
- package/src/core/agent/prompts/channels/code.md +3 -1
- package/src/core/agent/prompts/channels/telegram.md +2 -0
- package/src/core/agent/prompts/channels/web_code.md +1 -1
- package/src/core/agent/prompts/channels/whatsapp.md +37 -0
- package/src/core/agent/prompts/core/agent-base.md +2 -0
- package/src/core/agent/prompts/discipline/action.md +1 -0
- package/src/core/agent/prompts/discipline/two-segment.md +2 -1
- package/src/core/agent/prompts/modes/mobility.md +36 -0
- package/src/core/agent/retry.js +42 -0
- package/src/core/agent/run-agent.js +322 -25
- package/src/core/agent/run-turn.js +253 -0
- package/src/core/agent/self-memory.js +18 -52
- package/src/core/agent/skills/agent-skills.js +118 -0
- package/src/core/agent/skills/catalog.js +1 -1
- package/src/core/agent/skills/declared.js +13 -0
- package/src/core/agent/skills/index-store.js +8 -1
- package/src/core/agent/skills/inspector.js +20 -3
- package/src/core/agent/skills/loader.js +18 -3
- package/src/core/agent/skills/media.js +121 -0
- package/src/core/agent/skills/origin.js +61 -0
- package/src/core/agent/skills/sections.js +136 -0
- package/src/core/agent/super-agent.js +54 -14
- package/src/core/agent/tools/handlers/_calendar.js +50 -0
- package/src/core/agent/tools/handlers/add-mcp.js +103 -0
- package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
- package/src/core/agent/tools/handlers/attach-media.js +56 -0
- package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
- package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
- package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
- package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
- package/src/core/agent/tools/handlers/call-agent.js +14 -6
- package/src/core/agent/tools/handlers/call-runtime.js +27 -49
- package/src/core/agent/tools/handlers/comment-task.js +78 -0
- package/src/core/agent/tools/handlers/complete-task.js +60 -0
- package/src/core/agent/tools/handlers/configure-agent.js +70 -0
- package/src/core/agent/tools/handlers/create-agent.js +68 -0
- package/src/core/agent/tools/handlers/create-task.js +41 -3
- package/src/core/agent/tools/handlers/import-agent.js +5 -5
- package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
- package/src/core/agent/tools/handlers/list-routines.js +46 -0
- package/src/core/agent/tools/handlers/list-tasks.js +8 -1
- package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
- package/src/core/agent/tools/handlers/read-skill.js +64 -0
- package/src/core/agent/tools/handlers/remember-routine.js +2 -8
- package/src/core/agent/tools/handlers/remember.js +82 -6
- package/src/core/agent/tools/handlers/remove-agent.js +42 -0
- package/src/core/agent/tools/handlers/run-routine.js +94 -0
- package/src/core/agent/tools/handlers/run-shell.js +44 -2
- package/src/core/agent/tools/handlers/send-telegram.js +41 -19
- package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
- package/src/core/agent/tools/handlers/view-media.js +69 -0
- package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
- package/src/core/agent/tools/helpers.js +36 -4
- package/src/core/agent/tools/names.js +64 -0
- package/src/core/agent/tools/registry-bridge.js +24 -1
- package/src/core/agent/tools/registry.js +79 -0
- package/src/core/agent/tools/tool-call-parser.js +136 -13
- package/src/core/agent/vision-bridge.js +69 -0
- package/src/core/apc/agent-identity.js +74 -0
- package/src/core/apc/agent-rename-refs.js +187 -0
- package/src/core/apc/agent-write.js +312 -0
- package/src/core/apc/agents-vault.js +1 -1
- package/src/core/apc/blob-keys.js +42 -0
- package/src/core/apc/frontmatter.js +166 -10
- package/src/core/apc/parser.js +33 -83
- package/src/core/apc/paths.js +4 -6
- package/src/core/apc/project-memory.js +44 -0
- package/src/core/apc/projects-helpers.js +33 -0
- package/src/core/apc/scaffold.js +36 -16
- package/src/core/channels/telegram/ask-callbacks.js +103 -0
- package/src/core/channels/telegram/dispatch.js +154 -30
- package/src/core/channels/telegram/helpers.js +59 -7
- package/src/core/channels/telegram/inbound/audio.js +26 -30
- package/src/core/channels/telegram/inbound/file.js +22 -32
- package/src/core/channels/telegram/inbound/photo.js +24 -28
- package/src/core/channels/telegram/progress-gate.js +76 -0
- package/src/core/channels/telegram/reply.js +151 -43
- package/src/core/channels/telegram/voice-note.js +150 -0
- package/src/core/config/index.js +53 -54
- package/src/core/config/paths.js +117 -31
- package/src/core/config/redact.js +89 -4
- package/src/core/config/secret-values.js +2 -4
- package/src/core/constants/actors.js +5 -0
- package/src/core/constants/channels.js +3 -1
- package/src/core/constants/task-categories.js +73 -0
- package/src/core/constants/task-fields.js +28 -0
- package/src/core/engines/_globs.js +33 -0
- package/src/core/engines/anthropic.js +19 -1
- package/src/core/engines/catalog.js +20 -0
- package/src/core/engines/gemini.js +84 -16
- package/src/core/engines/index.js +19 -3
- package/src/core/engines/mock.js +145 -1
- package/src/core/engines/openai-compatible.js +150 -15
- package/src/core/engines/presets.js +36 -9
- package/src/core/engines/zen.js +131 -0
- package/src/core/events/bus.js +140 -0
- package/src/core/events/mascot-notify.js +156 -0
- package/src/core/http-tools/browser.js +366 -36
- package/src/core/http-tools/catalog.js +206 -22
- package/src/core/http-tools/grep.js +62 -7
- package/src/core/http-tools/registry.js +3 -1
- package/src/core/i18n/en.js +34 -3
- package/src/core/i18n/es.js +36 -4
- package/src/core/i18n/index.js +5 -5
- package/src/core/i18n/pt.js +32 -3
- package/src/core/identity/self.js +14 -1
- package/src/core/images/engines/a1111.js +219 -0
- package/src/core/images/engines/index.js +187 -0
- package/src/core/images/engines/mock.js +74 -0
- package/src/core/images/engines/openai.js +130 -0
- package/src/core/images/engines/sdcpp.js +204 -0
- package/src/core/images/engines/shared.js +218 -0
- package/src/core/images/generate.js +260 -0
- package/src/core/integrations/catalog.js +8 -3
- package/src/core/integrations/plugins/_google-oauth.js +179 -0
- package/src/core/integrations/plugins/asana.js +7 -3
- package/src/core/integrations/plugins/calendar.js +404 -0
- package/src/core/integrations/store.js +2 -0
- package/src/core/memory/broker.js +16 -1
- package/src/core/memory/compactor.js +19 -3
- package/src/core/memory/consolidate.js +2 -2
- package/src/core/memory/dated-log.js +66 -0
- package/src/core/memory/embed-engines/custom.js +59 -0
- package/src/core/memory/embed-engines/gemini.js +9 -3
- package/src/core/memory/embed-engines/index.js +87 -15
- package/src/core/memory/embeddings.js +52 -24
- package/src/core/memory/index.js +13 -3
- package/src/core/memory/indexer.js +83 -27
- package/src/core/memory/prune.js +182 -0
- package/src/core/memory/store.js +22 -0
- package/src/core/memory/summarizer.js +72 -8
- package/src/core/mobility/answer.js +80 -0
- package/src/core/mobility/geofence.js +667 -0
- package/src/core/mobility/osm-route.js +282 -0
- package/src/core/mobility/preferences.js +91 -0
- package/src/core/mobility/state.js +245 -0
- package/src/core/mobility/trip-event.js +384 -0
- package/src/core/net/tailscale.js +168 -0
- package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
- package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
- package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
- package/src/core/profiles/bundled/secretary/profile.json +3 -1
- package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
- package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
- package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
- package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
- package/src/core/profiles/lifecycle.js +243 -19
- package/src/core/profiles/paths.js +12 -0
- package/src/core/profiles/store.js +47 -0
- package/src/core/routines/active-runs.js +213 -0
- package/src/core/routines/delivery.js +612 -0
- package/src/core/routines/header.js +88 -0
- package/src/core/routines/index.js +26 -0
- package/src/core/routines/run-log.js +78 -0
- package/src/core/routines/runner.js +629 -66
- package/src/core/routines/signals.js +75 -0
- package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
- package/src/core/runtime-skills/apx/SKILL.md +93 -1
- package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
- package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
- package/src/core/runtime-skills/apx-commitment/SKILL.md +134 -0
- package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
- package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
- package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
- package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
- package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
- package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
- package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
- package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
- package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
- package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
- package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
- package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
- package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
- package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
- package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
- package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
- package/src/core/runtimes/_spawn.js +9 -1
- package/src/core/runtimes/claude-code.js +11 -2
- package/src/core/runtimes/codex.js +44 -10
- package/src/core/runtimes/index.js +17 -2
- package/src/core/runtimes/opencode.js +88 -9
- package/src/core/runtimes/outcome.js +119 -0
- package/src/core/sessions/index.js +193 -1
- package/src/core/stores/agent-inbox.js +109 -23
- package/src/core/stores/code-sessions.js +21 -0
- package/src/core/stores/commitments.js +27 -3
- package/src/core/stores/conversations.js +220 -20
- package/src/core/stores/deliveries.js +177 -0
- package/src/core/stores/media-archive.js +228 -0
- package/src/core/stores/messages.js +1096 -112
- package/src/core/stores/organization.js +34 -0
- package/src/core/stores/project-memory.js +71 -0
- package/src/core/stores/routine-memory.js +16 -8
- package/src/core/stores/routines.js +27 -49
- package/src/core/stores/sessions.js +4 -8
- package/src/core/stores/tasks.js +212 -18
- package/src/core/stores/turn-record.js +209 -0
- package/src/core/tasks/columns.js +136 -0
- package/src/core/tasks/comment-turn.js +258 -0
- package/src/core/util/time.js +13 -0
- package/src/core/voice/engines/index.js +54 -1
- package/src/core/voice/engines/openai.js +50 -4
- package/src/core/voice/opus.js +67 -0
- package/src/core/voice/pronounceable.js +43 -0
- package/src/core/voice/transcription.js +4 -0
- package/src/core/voice/tts.js +114 -24
- package/src/host/daemon/active-turns.js +188 -0
- package/src/host/daemon/api/admin-config.js +9 -0
- package/src/host/daemon/api/agents.js +99 -90
- package/src/host/daemon/api/artifact-preview.js +7 -6
- package/src/host/daemon/api/artifacts.js +3 -2
- package/src/host/daemon/api/code.js +55 -9
- package/src/host/daemon/api/commitments.js +11 -0
- package/src/host/daemon/api/confirm.js +3 -2
- package/src/host/daemon/api/conversations.js +543 -35
- package/src/host/daemon/api/deck.js +9 -8
- package/src/host/daemon/api/deliveries.js +33 -0
- package/src/host/daemon/api/desktop.js +5 -4
- package/src/host/daemon/api/embeddings.js +15 -6
- package/src/host/daemon/api/engines.js +59 -8
- package/src/host/daemon/api/exec.js +437 -121
- package/src/host/daemon/api/groups.js +215 -0
- package/src/host/daemon/api/images.js +107 -0
- package/src/host/daemon/api/inbox.js +123 -2
- package/src/host/daemon/api/integrations.js +64 -2
- package/src/host/daemon/api/mcps.js +7 -6
- package/src/host/daemon/api/media.js +283 -0
- package/src/host/daemon/api/mobility.js +177 -0
- package/src/host/daemon/api/net.js +182 -0
- package/src/host/daemon/api/pairing.js +38 -5
- package/src/host/daemon/api/profiles.js +30 -2
- package/src/host/daemon/api/routines.js +36 -4
- package/src/host/daemon/api/runtimes.js +74 -39
- package/src/host/daemon/api/sessions-search.js +7 -2
- package/src/host/daemon/api/sessions.js +44 -2
- package/src/host/daemon/api/shared.js +127 -20
- package/src/host/daemon/api/skills.js +11 -4
- package/src/host/daemon/api/super-agent.js +384 -53
- package/src/host/daemon/api/tasks.js +180 -10
- package/src/host/daemon/api/telegram.js +11 -10
- package/src/host/daemon/api/thread-faces.js +159 -0
- package/src/host/daemon/api/top-level.js +3 -3
- package/src/host/daemon/api/transcribe.js +11 -10
- package/src/host/daemon/api/tts.js +97 -4
- package/src/host/daemon/api/turn-abort.js +23 -0
- package/src/host/daemon/api/turns.js +49 -0
- package/src/host/daemon/api/voice.js +5 -4
- package/src/host/daemon/api/web.js +98 -0
- package/src/host/daemon/api.js +39 -0
- package/src/host/daemon/delivery-sweep.js +58 -0
- package/src/host/daemon/desktop-ws.js +5 -23
- package/src/host/daemon/events-ws.js +273 -0
- package/src/host/daemon/index.js +59 -15
- package/src/host/daemon/plugins/desktop/index.js +17 -4
- package/src/host/daemon/plugins/telegram/index.js +78 -40
- package/src/host/daemon/pty-bridge.py +99 -0
- package/src/host/daemon/routines-scheduler.js +1 -0
- package/src/host/daemon/smoke.js +1 -2
- package/src/host/daemon/terminal-ws.js +132 -0
- package/src/host/daemon/tts-keepwarm.js +87 -0
- package/src/host/daemon/wakeup.js +11 -6
- package/src/host/daemon/whisper-server.js +44 -0
- package/src/host/daemon/whisper-server.py +70 -13
- package/src/host/daemon/ws-auth.js +28 -0
- package/src/interfaces/android/app/build.gradle +42 -0
- package/src/interfaces/android/app/proguard-rules.pro +4 -0
- package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
- package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
- package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
- package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
- package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
- package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
- package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
- package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
- package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
- package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
- package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
- package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
- package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
- package/src/interfaces/android/build.gradle +3 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/src/interfaces/android/gradle.properties +3 -0
- package/src/interfaces/android/gradlew +248 -0
- package/src/interfaces/android/gradlew.bat +82 -0
- package/src/interfaces/android/settings.gradle +18 -0
- package/src/interfaces/cli/commands/a2a.js +145 -4
- package/src/interfaces/cli/commands/agent.js +247 -22
- package/src/interfaces/cli/commands/code.js +1 -1
- package/src/interfaces/cli/commands/commitment.js +5 -0
- package/src/interfaces/cli/commands/config.js +85 -6
- package/src/interfaces/cli/commands/exec.js +90 -1
- package/src/interfaces/cli/commands/image.js +314 -0
- package/src/interfaces/cli/commands/mcp.js +87 -23
- package/src/interfaces/cli/commands/memory.js +35 -22
- package/src/interfaces/cli/commands/panel.js +94 -0
- package/src/interfaces/cli/commands/profile.js +14 -0
- package/src/interfaces/cli/commands/project.js +29 -0
- package/src/interfaces/cli/commands/routine.js +45 -10
- package/src/interfaces/cli/commands/runtime.js +30 -7
- package/src/interfaces/cli/commands/session.js +90 -38
- package/src/interfaces/cli/commands/sessions.js +35 -2
- package/src/interfaces/cli/commands/skills.js +15 -9
- package/src/interfaces/cli/commands/status.js +2 -3
- package/src/interfaces/cli/commands/task.js +54 -5
- package/src/interfaces/cli/commands/telegram.js +12 -4
- package/src/interfaces/cli/commands/transcribe.js +177 -0
- package/src/interfaces/cli/help/index.js +311 -72
- package/src/interfaces/cli/http.js +61 -13
- package/src/interfaces/cli/index.js +1 -1
- package/src/interfaces/cli/routes/agent.js +5 -4
- package/src/interfaces/cli/routes/commitment.js +3 -2
- package/src/interfaces/cli/routes/config.js +7 -2
- package/src/interfaces/cli/routes/image.js +11 -0
- package/src/interfaces/cli/routes/index.js +2 -0
- package/src/interfaces/cli/routes/log.js +1 -1
- package/src/interfaces/cli/routes/memory.js +3 -2
- package/src/interfaces/cli/routes/panel.js +15 -2
- package/src/interfaces/cli/routes/profile.js +3 -2
- package/src/interfaces/cli/routes/transcribe.js +10 -0
- package/src/interfaces/cli/stdin.js +29 -0
- package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
- package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
- package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
- package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
- package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
- package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
- package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
- package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
- package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
- package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
- package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
- package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
- package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
- package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
- package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
- package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
- package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
- package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
- package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
- package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
- package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
- package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
- package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
- package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
- package/src/interfaces/desktop/assets/notification.mp3 +0 -0
- package/src/interfaces/desktop/main.js +473 -29
- package/src/interfaces/desktop/mascot-blobs.js +41 -0
- package/src/interfaces/desktop/mascot-preload.js +32 -0
- package/src/interfaces/desktop/mascot.css +186 -0
- package/src/interfaces/desktop/mascot.html +40 -0
- package/src/interfaces/desktop/mascot.js +163 -0
- package/src/interfaces/desktop/preload.js +10 -0
- package/src/interfaces/desktop/renderer.js +308 -48
- package/src/interfaces/desktop/style.css +34 -0
- package/src/interfaces/mcp-server/index.js +87 -0
- package/src/interfaces/tui/_shims/util-locale.ts +0 -2
- package/src/interfaces/tui/app.tsx +0 -6
- package/src/interfaces/tui/attach.ts +0 -1
- package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
- package/src/interfaces/tui/plugin/api.tsx +0 -3
- package/src/interfaces/tui/plugin/runtime.ts +0 -3
- package/src/interfaces/tui/thread.ts +0 -16
- package/src/interfaces/web/README.md +22 -14
- package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
- package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
- package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
- package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/dist/index.html +22 -6
- package/src/interfaces/web/dist/index.html.br +0 -0
- package/src/interfaces/web/dist/index.html.gz +0 -0
- package/src/interfaces/web/dist/manifest.webmanifest +25 -0
- package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/dist/sw.js +106 -0
- package/src/interfaces/web/dist/sw.js.br +0 -0
- package/src/interfaces/web/dist/sw.js.gz +0 -0
- package/src/interfaces/web/eslint.config.js +83 -0
- package/src/interfaces/web/index.html +20 -4
- package/src/interfaces/web/package-lock.json +1651 -1280
- package/src/interfaces/web/package.json +9 -10
- package/src/interfaces/web/pnpm-lock.yaml +867 -869
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
- package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
- package/src/interfaces/web/public/manifest.webmanifest +25 -0
- package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
- package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
- package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
- package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
- package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
- package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
- package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
- package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
- package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
- package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
- package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
- package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
- package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
- package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
- package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
- package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
- package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
- package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
- package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
- package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
- package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
- package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
- package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
- package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
- package/src/interfaces/web/public/sw.js +106 -0
- package/src/interfaces/web/src/App.tsx +106 -10
- package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
- package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
- package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
- package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
- package/src/interfaces/web/src/components/Combobox.tsx +201 -0
- package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
- package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
- package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
- package/src/interfaces/web/src/components/Roby.tsx +5 -3
- package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
- package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
- package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
- package/src/interfaces/web/src/components/Toast.tsx +50 -14
- package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
- package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
- package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
- package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
- package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
- package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
- package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
- package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
- package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
- package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
- package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
- package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
- package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
- package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
- package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
- package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
- package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
- package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
- package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
- package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
- package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
- package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
- package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
- package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
- package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
- package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
- package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
- package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
- package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
- package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
- package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
- package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
- package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
- package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
- package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
- package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
- package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
- package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
- package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
- package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
- package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
- package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
- package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
- package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
- package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
- package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
- package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
- package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
- package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
- package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
- package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
- package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
- package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
- package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
- package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
- package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
- package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
- package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
- package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
- package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
- package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
- package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
- package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
- package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
- package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
- package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
- package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
- package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
- package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
- package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
- package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
- package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
- package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
- package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
- package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
- package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
- package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
- package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
- package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
- package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
- package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
- package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
- package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
- package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
- package/src/interfaces/web/src/components/ui.tsx +62 -23
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
- package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
- package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
- package/src/interfaces/web/src/constants/index.ts +1 -0
- package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
- package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
- package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
- package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
- package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
- package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
- package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
- package/src/interfaces/web/src/i18n/en.ts +832 -175
- package/src/interfaces/web/src/i18n/es.ts +841 -188
- package/src/interfaces/web/src/lib/api/agents.ts +23 -4
- package/src/interfaces/web/src/lib/api/code.ts +17 -0
- package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
- package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
- package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
- package/src/interfaces/web/src/lib/api/engines.ts +14 -0
- package/src/interfaces/web/src/lib/api/groups.ts +93 -0
- package/src/interfaces/web/src/lib/api/images.ts +193 -0
- package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
- package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
- package/src/interfaces/web/src/lib/api/media.ts +126 -0
- package/src/interfaces/web/src/lib/api/net.ts +44 -0
- package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
- package/src/interfaces/web/src/lib/api/projects.ts +9 -1
- package/src/interfaces/web/src/lib/api/routines.ts +9 -1
- package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
- package/src/interfaces/web/src/lib/api/skills.ts +8 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
- package/src/interfaces/web/src/lib/api/tools.ts +2 -0
- package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
- package/src/interfaces/web/src/lib/api/turns.ts +20 -0
- package/src/interfaces/web/src/lib/api/voice.ts +72 -2
- package/src/interfaces/web/src/lib/api.ts +3 -0
- package/src/interfaces/web/src/lib/channels.ts +214 -0
- package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
- package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
- package/src/interfaces/web/src/lib/code-context.ts +0 -2
- package/src/interfaces/web/src/lib/http.ts +51 -17
- package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
- package/src/interfaces/web/src/lib/live.ts +252 -0
- package/src/interfaces/web/src/lib/net.ts +211 -0
- package/src/interfaces/web/src/lib/notify.ts +331 -0
- package/src/interfaces/web/src/lib/projectNav.ts +40 -0
- package/src/interfaces/web/src/lib/pwa.ts +115 -0
- package/src/interfaces/web/src/lib/qvox.ts +24 -0
- package/src/interfaces/web/src/lib/slug.ts +3 -0
- package/src/interfaces/web/src/lib/tone.ts +150 -0
- package/src/interfaces/web/src/main.tsx +15 -4
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
- package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
- package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
- package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
- package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
- package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
- package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
- package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
- package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
- package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
- package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
- package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
- package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
- package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
- package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
- package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
- package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
- package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
- package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
- package/src/interfaces/web/src/styles.css +106 -31
- package/src/interfaces/web/src/types/daemon.ts +246 -2
- package/src/interfaces/web/src/vite-env.d.ts +20 -0
- package/src/interfaces/tui/plugin/command-shim.ts +0 -109
- package/src/interfaces/web/components.json +0 -25
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
- package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
- package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
- package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
- package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
- package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
- package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
- package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
- package/src/interfaces/web/src/components/ui/card.tsx +0 -103
- package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
- package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
- package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
- package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
- package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
- package/src/interfaces/web/src/components/ui/command.tsx +0 -196
- package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
- package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
- package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
- package/src/interfaces/web/src/components/ui/field.tsx +0 -236
- package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
- package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
- package/src/interfaces/web/src/components/ui/item.tsx +0 -201
- package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
- package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
- package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
- package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
- package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
- package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
- package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
- package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
- package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
- package/src/interfaces/web/src/components/ui/table.tsx +0 -116
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
- package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
- package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// stable-diffusion.cpp native adapter — asynchronous job + polling.
|
|
2
|
+
//
|
|
3
|
+
// POST /sdcpp/v1/img_gen → { id, poll_url, status: "queued" }
|
|
4
|
+
// GET /sdcpp/v1/jobs/<id> → { status, queue_position, result, error }
|
|
5
|
+
// POST /sdcpp/v1/jobs/<id>/cancel
|
|
6
|
+
// GET /sdcpp/v1/capabilities → model, samplers, schedulers, defaults, limits
|
|
7
|
+
//
|
|
8
|
+
// Statuses seen from the server: queued → generating → completed (or failed,
|
|
9
|
+
// with `error` set). The finished job carries
|
|
10
|
+
// result: { images: [{ b64_json }], output_format: "png" }
|
|
11
|
+
//
|
|
12
|
+
// This is the adapter to prefer for anything unattended. The A1111 route holds
|
|
13
|
+
// one socket open for the whole render, so a queued job behind someone else's
|
|
14
|
+
// batch looks like a hung request; here the socket closes immediately and the
|
|
15
|
+
// caller polls, which also means we can report queue position while waiting.
|
|
16
|
+
//
|
|
17
|
+
// One model per server: stable-diffusion.cpp loads a checkpoint at launch, so
|
|
18
|
+
// there is no field to switch it and `model` is declared unsupported rather
|
|
19
|
+
// than quietly ignored.
|
|
20
|
+
//
|
|
21
|
+
// ── ControlNet ─────────────────────────────────────────────────────────────
|
|
22
|
+
// A `control_image` conditions the render on the structure of a picture —
|
|
23
|
+
// pose, composition, edges — while the prompt still decides everything else.
|
|
24
|
+
// It rides on this native route (the A1111 shim has no field for it), needs a
|
|
25
|
+
// server launched with a ControlNet model loaded, and `control_strength`
|
|
26
|
+
// (0..1, default 0.8) sets how hard the structure is enforced.
|
|
27
|
+
//
|
|
28
|
+
// This is NOT img2img: the control image is never the canvas, so the output
|
|
29
|
+
// does not start from those pixels. To *edit* a picture use the a1111
|
|
30
|
+
// adapter's `init_image` instead.
|
|
31
|
+
//
|
|
32
|
+
// The finished job's envelope is the trap here — `result.images[0].b64_json`.
|
|
33
|
+
// It is not a list of strings the way the A1111 route answers, and it is not
|
|
34
|
+
// `.b64` or `.data`; imagesFrom() below is what absorbs that difference.
|
|
35
|
+
|
|
36
|
+
import { postJson, getJson, probeUrl, joinUrl, trimBase, writeImage, decodeBase64Image, toRawBase64 } from "./shared.js";
|
|
37
|
+
|
|
38
|
+
const DEFAULT_POLL_MS = 1200;
|
|
39
|
+
const DEFAULT_TIMEOUT_S = 900;
|
|
40
|
+
const TERMINAL_OK = new Set(["completed", "succeeded", "success", "done"]);
|
|
41
|
+
const TERMINAL_BAD = new Set(["failed", "error", "cancelled", "canceled"]);
|
|
42
|
+
|
|
43
|
+
function headersFor(config) {
|
|
44
|
+
const h = {};
|
|
45
|
+
if (config.api_key) h.authorization = `Bearer ${config.api_key}`;
|
|
46
|
+
return h;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The server hands back a relative poll_url ("/sdcpp/v1/jobs/<id>"). Honor it
|
|
53
|
+
* rather than rebuilding the path: a server behind a sub-path proxy tells us
|
|
54
|
+
* where it really lives, and reconstructing would send us to a 404.
|
|
55
|
+
*/
|
|
56
|
+
function pollUrlFor(config, submitted) {
|
|
57
|
+
const rel = submitted?.poll_url;
|
|
58
|
+
if (typeof rel === "string" && rel.startsWith("/")) return trimBase(config.base_url) + rel;
|
|
59
|
+
if (typeof rel === "string" && /^https?:/i.test(rel)) return rel;
|
|
60
|
+
return joinUrl(config.base_url, `/sdcpp/v1/jobs/${submitted?.id}`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Pull the base64 images out of whichever envelope the build uses. */
|
|
64
|
+
function imagesFrom(result) {
|
|
65
|
+
if (!result) return [];
|
|
66
|
+
const list = result.images || result.data || [];
|
|
67
|
+
return list
|
|
68
|
+
.map((item) => (typeof item === "string" ? item : item?.b64_json || item?.b64 || item?.image))
|
|
69
|
+
.filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export default {
|
|
73
|
+
id: "sdcpp",
|
|
74
|
+
|
|
75
|
+
// `model` is absent on purpose — see the header.
|
|
76
|
+
supports: [
|
|
77
|
+
"negative_prompt", "width", "height", "steps", "cfg_scale",
|
|
78
|
+
"seed", "sampler", "scheduler", "count", "format",
|
|
79
|
+
"control_image", "control_strength",
|
|
80
|
+
],
|
|
81
|
+
|
|
82
|
+
async isAvailable(config = {}) {
|
|
83
|
+
if (!config.base_url) return false;
|
|
84
|
+
return probeUrl(joinUrl(config.base_url, "/sdcpp/v1/capabilities"), {
|
|
85
|
+
headers: headersFor(config),
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
async generate({
|
|
90
|
+
prompt, negative_prompt, width, height, steps, cfg_scale, seed,
|
|
91
|
+
sampler, scheduler, count, format, outDir, config = {}, signal, onProgress,
|
|
92
|
+
control_image, control_strength,
|
|
93
|
+
}) {
|
|
94
|
+
if (!config.base_url) throw new Error("sdcpp: base_url required");
|
|
95
|
+
|
|
96
|
+
const sample_params = {};
|
|
97
|
+
if (steps) sample_params.sample_steps = steps;
|
|
98
|
+
if (sampler) sample_params.sample_method = sampler;
|
|
99
|
+
if (scheduler) sample_params.scheduler = scheduler;
|
|
100
|
+
if (cfg_scale != null) sample_params.guidance = { txt_cfg: cfg_scale };
|
|
101
|
+
|
|
102
|
+
const body = { prompt };
|
|
103
|
+
if (negative_prompt) body.negative_prompt = negative_prompt;
|
|
104
|
+
if (width) body.width = width;
|
|
105
|
+
if (height) body.height = height;
|
|
106
|
+
if (count) body.batch_count = count;
|
|
107
|
+
if (seed != null) body.seed = seed;
|
|
108
|
+
if (format) body.output_format = format;
|
|
109
|
+
// Bare base64: this server decodes the "data:…;base64," prefix as pixels
|
|
110
|
+
// and fails inside the sampler without naming the field.
|
|
111
|
+
if (control_image) {
|
|
112
|
+
body.control_image = toRawBase64(control_image);
|
|
113
|
+
body.control_strength = control_strength != null ? control_strength : 0.8;
|
|
114
|
+
}
|
|
115
|
+
if (Object.keys(sample_params).length) body.sample_params = sample_params;
|
|
116
|
+
|
|
117
|
+
const submitted = await postJson(
|
|
118
|
+
joinUrl(config.base_url, "/sdcpp/v1/img_gen"),
|
|
119
|
+
body,
|
|
120
|
+
{ headers: headersFor(config), signal, timeoutMs: 60_000 }
|
|
121
|
+
);
|
|
122
|
+
if (!submitted?.id) throw new Error("sdcpp: server did not return a job id");
|
|
123
|
+
|
|
124
|
+
const pollUrl = pollUrlFor(config, submitted);
|
|
125
|
+
const intervalMs = Number(config.poll_interval_ms) || DEFAULT_POLL_MS;
|
|
126
|
+
const deadline = Date.now() + (Number(config.timeout_s) || DEFAULT_TIMEOUT_S) * 1000;
|
|
127
|
+
|
|
128
|
+
let job = submitted;
|
|
129
|
+
while (true) {
|
|
130
|
+
if (signal?.aborted) {
|
|
131
|
+
// Best-effort: tell the server to stop burning GPU on a job nobody
|
|
132
|
+
// is waiting for any more. Failure here is not worth surfacing.
|
|
133
|
+
fetch(`${pollUrl}/cancel`, { method: "POST", headers: headersFor(config) }).catch(() => {});
|
|
134
|
+
throw new Error("sdcpp: cancelled");
|
|
135
|
+
}
|
|
136
|
+
if (Date.now() > deadline) {
|
|
137
|
+
fetch(`${pollUrl}/cancel`, { method: "POST", headers: headersFor(config) }).catch(() => {});
|
|
138
|
+
throw new Error(`sdcpp: job ${submitted.id} timed out`);
|
|
139
|
+
}
|
|
140
|
+
await sleep(intervalMs);
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
job = await getJson(pollUrl, { headers: headersFor(config), timeoutMs: 30_000 });
|
|
144
|
+
} catch (e) {
|
|
145
|
+
// A restarting server drops its job table and answers "job not found".
|
|
146
|
+
// Say so plainly — the generic 4xx text sends people hunting for a bug
|
|
147
|
+
// in the request instead of looking at the box.
|
|
148
|
+
if (/not found/i.test(e.message)) {
|
|
149
|
+
throw new Error(`sdcpp: job ${submitted.id} disappeared (the server restarted mid-render)`);
|
|
150
|
+
}
|
|
151
|
+
throw e;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const status = String(job?.status || "").toLowerCase();
|
|
155
|
+
if (onProgress) onProgress({ status, queue_position: job?.queue_position ?? null });
|
|
156
|
+
if (TERMINAL_BAD.has(status)) {
|
|
157
|
+
throw new Error(`sdcpp: job ${status}${job?.error ? ` — ${job.error}` : ""}`);
|
|
158
|
+
}
|
|
159
|
+
if (TERMINAL_OK.has(status)) break;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const b64s = imagesFrom(job?.result);
|
|
163
|
+
if (!b64s.length) throw new Error("sdcpp: job completed with no images");
|
|
164
|
+
const outFormat = job?.result?.output_format || format;
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
images: b64s.map((b64, i) =>
|
|
168
|
+
({ ...writeImage(decodeBase64Image(b64), { outDir, provider: "sdcpp", format: outFormat, index: i }),
|
|
169
|
+
seed: seed >= 0 ? seed : null })),
|
|
170
|
+
model: null, // filled in by the facade from capabilities() when known
|
|
171
|
+
meta: {
|
|
172
|
+
job_id: submitted.id,
|
|
173
|
+
elapsed_s: job?.completed && job?.started ? job.completed - job.started : null,
|
|
174
|
+
...(control_image ? { mode: "controlnet", control_strength: body.control_strength } : {}),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* The richest catalog of the three adapters: the settings UI reads samplers,
|
|
181
|
+
* schedulers and the server's own defaults straight off it, so nothing has
|
|
182
|
+
* to be hardcoded per install.
|
|
183
|
+
*/
|
|
184
|
+
async capabilities(config = {}) {
|
|
185
|
+
if (!config.base_url) return null;
|
|
186
|
+
try {
|
|
187
|
+
const caps = await getJson(joinUrl(config.base_url, "/sdcpp/v1/capabilities"), {
|
|
188
|
+
headers: headersFor(config),
|
|
189
|
+
timeoutMs: 8000,
|
|
190
|
+
});
|
|
191
|
+
if (!caps) return null;
|
|
192
|
+
return {
|
|
193
|
+
models: caps.model ? [caps.model.stem || caps.model.name].filter(Boolean) : [],
|
|
194
|
+
samplers: caps.samplers || [],
|
|
195
|
+
schedulers: caps.schedulers || [],
|
|
196
|
+
defaults: caps.defaults || null,
|
|
197
|
+
modes: caps.supported_modes || [],
|
|
198
|
+
formats: caps.output_formats_by_mode?.img_gen || caps.output_formats || [],
|
|
199
|
+
};
|
|
200
|
+
} catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// Helpers shared by every image adapter. Nothing here talks to a specific
|
|
2
|
+
// server — it is the plumbing three of the four adapters would otherwise each
|
|
3
|
+
// grow their own copy of (base64 → file, size parsing, endpoint joining).
|
|
4
|
+
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
|
|
9
|
+
/** Strip a trailing slash so `${base}/v1/x` never becomes `//v1/x`. */
|
|
10
|
+
export function trimBase(url) {
|
|
11
|
+
return String(url || "").replace(/\/+$/, "");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Join a base URL and a path, tolerating a base that already carries the API
|
|
16
|
+
* prefix. A user who pastes `http://host:8189/v1` into the OpenAI field and one
|
|
17
|
+
* who pastes `http://host:8189` must both end up at /v1/images/generations —
|
|
18
|
+
* getting this wrong is the single most common way a local endpoint "doesn't
|
|
19
|
+
* work" (it 404s and the error says nothing about the URL).
|
|
20
|
+
*/
|
|
21
|
+
export function joinUrl(base, suffix) {
|
|
22
|
+
const b = trimBase(base);
|
|
23
|
+
const s = suffix.startsWith("/") ? suffix : `/${suffix}`;
|
|
24
|
+
// e.g. base ".../v1" + suffix "/v1/images/generations" → don't repeat /v1
|
|
25
|
+
const firstSeg = s.split("/")[1];
|
|
26
|
+
if (firstSeg && b.endsWith(`/${firstSeg}`)) {
|
|
27
|
+
return b + s.slice(firstSeg.length + 1);
|
|
28
|
+
}
|
|
29
|
+
return b + s;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** "512x768" → { width: 512, height: 768 }. Returns null when unparseable. */
|
|
33
|
+
export function parseSize(size) {
|
|
34
|
+
const m = /^\s*(\d{2,5})\s*[x×*]\s*(\d{2,5})\s*$/.exec(String(size || ""));
|
|
35
|
+
if (!m) return null;
|
|
36
|
+
return { width: Number(m[1]), height: Number(m[2]) };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Reverse of parseSize — what OpenAI-shaped APIs want. */
|
|
40
|
+
export function formatSize(width, height) {
|
|
41
|
+
return `${width}x${height}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const MIME_BY_EXT = {
|
|
45
|
+
png: "image/png",
|
|
46
|
+
jpg: "image/jpeg",
|
|
47
|
+
jpeg: "image/jpeg",
|
|
48
|
+
webp: "image/webp",
|
|
49
|
+
gif: "image/gif",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export function mimeFor(format) {
|
|
53
|
+
return MIME_BY_EXT[String(format || "png").toLowerCase()] || "application/octet-stream";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Sniff the real container from the first bytes. Servers lie about (or omit)
|
|
58
|
+
* the format: stable-diffusion.cpp answers `output_format: "png"` for a
|
|
59
|
+
* request that asked for webp. The file extension should describe the actual
|
|
60
|
+
* bytes, or every viewer downstream has to guess.
|
|
61
|
+
*/
|
|
62
|
+
export function sniffFormat(buf, fallback = "png") {
|
|
63
|
+
if (!buf || buf.length < 12) return fallback;
|
|
64
|
+
if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) return "png";
|
|
65
|
+
if (buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) return "jpeg";
|
|
66
|
+
if (buf.toString("ascii", 0, 4) === "RIFF" && buf.toString("ascii", 8, 12) === "WEBP") return "webp";
|
|
67
|
+
if (buf.toString("ascii", 0, 3) === "GIF") return "gif";
|
|
68
|
+
return fallback;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Write one decoded image into `outDir` and describe it. `index` only shapes
|
|
73
|
+
* the filename, so a batch stays ordered on disk the way it was generated.
|
|
74
|
+
*/
|
|
75
|
+
export function writeImage(buf, { outDir, provider, format, index = 0 }) {
|
|
76
|
+
const ext = sniffFormat(buf, format);
|
|
77
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
78
|
+
const suffix = index > 0 ? `-${index + 1}` : "";
|
|
79
|
+
const file = path.join(outDir, `${provider}-${randomUUID()}${suffix}.${ext === "jpeg" ? "jpg" : ext}`);
|
|
80
|
+
fs.writeFileSync(file, buf);
|
|
81
|
+
return { path: file, bytes: buf.length, mime: mimeFor(ext), format: ext };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Decode a base64 payload, tolerating a `data:image/png;base64,…` prefix. */
|
|
85
|
+
export function decodeBase64Image(b64) {
|
|
86
|
+
const raw = String(b64 || "").replace(/^data:[^;]+;base64,/, "");
|
|
87
|
+
if (!raw) throw new Error("empty image payload");
|
|
88
|
+
return Buffer.from(raw, "base64");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Outbound counterpart of decodeBase64Image: hand a server bare base64.
|
|
93
|
+
*
|
|
94
|
+
* Diffusion servers are inconsistent about the `data:` prefix — A1111 strips it,
|
|
95
|
+
* stable-diffusion.cpp does not and decodes the literal "data:image/png;base64,"
|
|
96
|
+
* as image bytes, which fails deep inside the sampler with a message that names
|
|
97
|
+
* neither the field nor the prefix. Normalizing on the way out costs nothing and
|
|
98
|
+
* removes a whole class of "the reference image did nothing" reports.
|
|
99
|
+
*/
|
|
100
|
+
export function toRawBase64(b64) {
|
|
101
|
+
const raw = String(b64 || "").replace(/^data:[^;]+;base64,/, "").trim();
|
|
102
|
+
if (!raw) throw new Error("empty image payload");
|
|
103
|
+
return raw;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Pixel dimensions of a PNG or JPEG, straight from the header bytes.
|
|
108
|
+
*
|
|
109
|
+
* There is no image library in this tree and this does not need one: an
|
|
110
|
+
* inpainting mask whose size differs from the canvas is the single most common
|
|
111
|
+
* way the feature "does nothing", and the servers accept the mismatch silently.
|
|
112
|
+
* Reading two headers is enough to turn that into an error that names the fix.
|
|
113
|
+
*
|
|
114
|
+
* Returns null for anything it cannot parse — callers treat that as "unknown",
|
|
115
|
+
* never as "mismatched", so an exotic-but-valid file is not rejected.
|
|
116
|
+
*/
|
|
117
|
+
export function imageSize(buf) {
|
|
118
|
+
if (!buf || buf.length < 24) return null;
|
|
119
|
+
// PNG: an 8-byte signature, then the IHDR chunk with width/height at 16..24.
|
|
120
|
+
if (buf[0] === 0x89 && buf.toString("ascii", 1, 4) === "PNG") {
|
|
121
|
+
return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
|
|
122
|
+
}
|
|
123
|
+
// JPEG: walk the marker segments to the first SOF, which carries the size.
|
|
124
|
+
if (buf[0] === 0xff && buf[1] === 0xd8) {
|
|
125
|
+
let i = 2;
|
|
126
|
+
while (i + 9 < buf.length) {
|
|
127
|
+
if (buf[i] !== 0xff) { i++; continue; }
|
|
128
|
+
const marker = buf[i + 1];
|
|
129
|
+
// SOF0-SOF15, minus the four that are not frame headers (DHT/JPG/DAC/RST).
|
|
130
|
+
if (marker >= 0xc0 && marker <= 0xcf &&
|
|
131
|
+
marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
132
|
+
return { height: buf.readUInt16BE(i + 5), width: buf.readUInt16BE(i + 7) };
|
|
133
|
+
}
|
|
134
|
+
i += 2 + buf.readUInt16BE(i + 2);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* A stand-in for an image payload in anything a human or a log will read.
|
|
142
|
+
*
|
|
143
|
+
* The resolved request travels back to the caller and into `--json`; a 700 KB
|
|
144
|
+
* base64 string in there turns a readable receipt into an unreadable one and
|
|
145
|
+
* bloats every stored session. The size is what a reader actually wants.
|
|
146
|
+
*/
|
|
147
|
+
export function redactImagePayload(b64) {
|
|
148
|
+
const n = String(b64 || "").length;
|
|
149
|
+
return `<base64 ${Math.round((n * 3) / 4 / 1024)} KB>`;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* POST JSON and parse the reply, turning a non-2xx into an Error whose message
|
|
154
|
+
* carries the server's own words — a 400 from a diffusion server usually names
|
|
155
|
+
* the offending field, and swallowing that costs the user the fix.
|
|
156
|
+
*/
|
|
157
|
+
export async function postJson(url, body, { headers = {}, signal, timeoutMs } = {}) {
|
|
158
|
+
const ctrl = timeoutMs ? new AbortController() : null;
|
|
159
|
+
const timer = ctrl ? setTimeout(() => ctrl.abort(), timeoutMs) : null;
|
|
160
|
+
try {
|
|
161
|
+
const res = await fetch(url, {
|
|
162
|
+
method: "POST",
|
|
163
|
+
headers: { "content-type": "application/json", ...headers },
|
|
164
|
+
body: JSON.stringify(body),
|
|
165
|
+
signal: signal || ctrl?.signal,
|
|
166
|
+
});
|
|
167
|
+
const text = await res.text();
|
|
168
|
+
let json = null;
|
|
169
|
+
try { json = text ? JSON.parse(text) : null; } catch { /* keep text */ }
|
|
170
|
+
if (!res.ok) {
|
|
171
|
+
const detail = json?.error?.message || json?.error || json?.detail || text;
|
|
172
|
+
throw new Error(`${res.status}: ${String(detail).slice(0, 300)}`);
|
|
173
|
+
}
|
|
174
|
+
return json;
|
|
175
|
+
} finally {
|
|
176
|
+
if (timer) clearTimeout(timer);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** GET JSON with the same error shaping as postJson. */
|
|
181
|
+
export async function getJson(url, { headers = {}, signal, timeoutMs } = {}) {
|
|
182
|
+
const ctrl = timeoutMs ? new AbortController() : null;
|
|
183
|
+
const timer = ctrl ? setTimeout(() => ctrl.abort(), timeoutMs) : null;
|
|
184
|
+
try {
|
|
185
|
+
const res = await fetch(url, { headers, signal: signal || ctrl?.signal });
|
|
186
|
+
const text = await res.text();
|
|
187
|
+
let json = null;
|
|
188
|
+
try { json = text ? JSON.parse(text) : null; } catch { /* keep text */ }
|
|
189
|
+
if (!res.ok) {
|
|
190
|
+
const detail = json?.error?.message || json?.error || json?.detail || text;
|
|
191
|
+
throw new Error(`${res.status}: ${String(detail).slice(0, 300)}`);
|
|
192
|
+
}
|
|
193
|
+
return json;
|
|
194
|
+
} finally {
|
|
195
|
+
if (timer) clearTimeout(timer);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Is this endpoint answering at all? Used by isAvailable() probes: a
|
|
201
|
+
* configured-but-unreachable local server must not win the routing chain, or
|
|
202
|
+
* every generation fails with a connection error instead of falling through to
|
|
203
|
+
* the next engine.
|
|
204
|
+
*/
|
|
205
|
+
export async function probeUrl(url, { headers = {}, timeoutMs = 1500 } = {}) {
|
|
206
|
+
try {
|
|
207
|
+
const ctrl = new AbortController();
|
|
208
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
209
|
+
try {
|
|
210
|
+
const res = await fetch(url, { headers, signal: ctrl.signal });
|
|
211
|
+
return res.ok;
|
|
212
|
+
} finally {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
}
|
|
215
|
+
} catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
// Unified image-generation facade. Callers don't pick the engine — the
|
|
2
|
+
// selector does, exactly like core/voice/tts.js does for speech.
|
|
3
|
+
//
|
|
4
|
+
// generate({ prompt, ... }) → { images: [{path, …}], provider, model, … }
|
|
5
|
+
// listProviders() → catalog + availability for the settings UI
|
|
6
|
+
// capabilities({ provider }) → live model/sampler list from one server
|
|
7
|
+
//
|
|
8
|
+
// Files land under ~/.apx/images/<YYYY-MM-DD>/ and STAY there: a generated
|
|
9
|
+
// picture is an artifact the user asked for, not a scratch file, and nothing
|
|
10
|
+
// is ever written into a project checkout unless a caller passes an explicit
|
|
11
|
+
// destination.
|
|
12
|
+
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import { IMAGES_DIR } from "#core/config/paths.js";
|
|
16
|
+
import { readConfig } from "#core/config/index.js";
|
|
17
|
+
import {
|
|
18
|
+
selectImageEngine,
|
|
19
|
+
listAvailableImageEngines,
|
|
20
|
+
getImageAdapter,
|
|
21
|
+
providerConfig,
|
|
22
|
+
imagesConfig,
|
|
23
|
+
resolveMode,
|
|
24
|
+
resolveChainOrder,
|
|
25
|
+
} from "./engines/index.js";
|
|
26
|
+
import { parseSize, redactImagePayload } from "./engines/shared.js";
|
|
27
|
+
|
|
28
|
+
export { IMAGES_DIR };
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Family-wide fallbacks. Deliberately conservative — 512² at 20 steps renders
|
|
32
|
+
* on any machine — and every one of them is overridable per call, then per
|
|
33
|
+
* engine (images.<id>.defaults), then globally (images.defaults).
|
|
34
|
+
*/
|
|
35
|
+
export const FAMILY_DEFAULTS = Object.freeze({
|
|
36
|
+
width: 512,
|
|
37
|
+
height: 512,
|
|
38
|
+
steps: 20,
|
|
39
|
+
cfg_scale: 7,
|
|
40
|
+
seed: -1,
|
|
41
|
+
count: 1,
|
|
42
|
+
format: "png",
|
|
43
|
+
negative_prompt: "",
|
|
44
|
+
sampler: "",
|
|
45
|
+
scheduler: "",
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/** Every knob an adapter may be asked to honor. Order is display order. */
|
|
49
|
+
export const REQUEST_OPTIONS = Object.freeze([
|
|
50
|
+
"negative_prompt", "width", "height", "steps", "cfg_scale",
|
|
51
|
+
"seed", "sampler", "scheduler", "count", "format", "model",
|
|
52
|
+
"init_image", "denoising_strength", "control_image", "control_strength",
|
|
53
|
+
"mask", "mask_blur", "inpainting_fill", "inpaint_full_res",
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The two ways a caller can hand in a reference picture. They are different
|
|
58
|
+
* operations against different routes, not two spellings of one:
|
|
59
|
+
*
|
|
60
|
+
* init_image the canvas the sampler starts from (img2img, a1111 route)
|
|
61
|
+
* control_image a structural hint it renders around (ControlNet, sdcpp route)
|
|
62
|
+
*
|
|
63
|
+
* `mask` is not a third one: it is a modifier on init_image that confines the
|
|
64
|
+
* repaint to part of the canvas (inpainting), which is why it rides the same
|
|
65
|
+
* route and is refused on its own.
|
|
66
|
+
*
|
|
67
|
+
* No engine speaks both, which is exactly why they are separate keys — folding
|
|
68
|
+
* them into one "reference image" would make the engine silently pick a
|
|
69
|
+
* meaning, and the two produce very different pictures.
|
|
70
|
+
*/
|
|
71
|
+
export const IMAGE_INPUTS = Object.freeze(["init_image", "control_image", "mask"]);
|
|
72
|
+
|
|
73
|
+
/** Swap base64 payloads for a size marker in anything echoed back to a caller. */
|
|
74
|
+
function redactInputs(request) {
|
|
75
|
+
const out = { ...request };
|
|
76
|
+
for (const k of IMAGE_INPUTS) {
|
|
77
|
+
if (out[k]) out[k] = redactImagePayload(out[k]);
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Today's folder under the gallery. Dated so a busy week stays navigable. */
|
|
83
|
+
export function imageOutDir(now = new Date()) {
|
|
84
|
+
const day = now.toISOString().slice(0, 10);
|
|
85
|
+
const dir = path.join(IMAGES_DIR, day);
|
|
86
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
87
|
+
return dir;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Drop undefined/empty entries so a later layer's value isn't masked by "". */
|
|
91
|
+
function present(obj) {
|
|
92
|
+
const out = {};
|
|
93
|
+
for (const [k, v] of Object.entries(obj || {})) {
|
|
94
|
+
if (v === undefined || v === null || v === "") continue;
|
|
95
|
+
out[k] = v;
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Fold the four layers of settings into one request. Later wins:
|
|
102
|
+
* family defaults → images.defaults → images.<engine>.defaults → the call.
|
|
103
|
+
* A `size: "768x512"` at any layer expands into width/height, because that is
|
|
104
|
+
* how humans and OpenAI-shaped APIs say it.
|
|
105
|
+
*/
|
|
106
|
+
export function resolveRequest({ imgCfg = {}, engineCfg = {}, request = {} } = {}) {
|
|
107
|
+
const expand = (layer) => {
|
|
108
|
+
const copy = present(layer);
|
|
109
|
+
if (copy.size) {
|
|
110
|
+
const parsed = parseSize(copy.size);
|
|
111
|
+
delete copy.size;
|
|
112
|
+
if (parsed) Object.assign(copy, parsed);
|
|
113
|
+
}
|
|
114
|
+
return copy;
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
...FAMILY_DEFAULTS,
|
|
118
|
+
...expand(imgCfg.defaults),
|
|
119
|
+
...expand(engineCfg.defaults),
|
|
120
|
+
...expand(request),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Which of the caller's *explicit* knobs this engine cannot honor.
|
|
126
|
+
*
|
|
127
|
+
* Project rule: an adapter must honor — or explicitly declare it lacks — every
|
|
128
|
+
* option the family passes. Declaring is what `supports` does; this is the
|
|
129
|
+
* other half, so `--steps 8` against an OpenAI endpoint says so out loud
|
|
130
|
+
* instead of rendering something silently different from what was asked.
|
|
131
|
+
*/
|
|
132
|
+
export function ignoredOptions(adapter, request = {}) {
|
|
133
|
+
const supported = new Set(adapter?.supports || []);
|
|
134
|
+
return REQUEST_OPTIONS.filter((k) => {
|
|
135
|
+
if (supported.has(k)) return false;
|
|
136
|
+
const v = request[k];
|
|
137
|
+
if (v === undefined || v === null || v === "") return false;
|
|
138
|
+
// A default-valued knob was not "asked for" — only report a real choice.
|
|
139
|
+
if (k === "seed" && Number(v) === -1) return false;
|
|
140
|
+
if (k === "count" && Number(v) === 1) return false;
|
|
141
|
+
return true;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Generate one or more images. Throws on real errors; only falls back to the
|
|
147
|
+
* mock engine when nothing at all is configured AND no provider was forced
|
|
148
|
+
* (same contract as synthesize()).
|
|
149
|
+
*
|
|
150
|
+
* @param {object} opts
|
|
151
|
+
* @param {string} opts.prompt What to draw. Required.
|
|
152
|
+
* @param {string} [opts.negative_prompt] What to avoid.
|
|
153
|
+
* @param {number} [opts.width] Pixels; also settable as `size`.
|
|
154
|
+
* @param {number} [opts.height]
|
|
155
|
+
* @param {string} [opts.size] "768x512" — expands to width/height.
|
|
156
|
+
* @param {number} [opts.steps] Sampling steps.
|
|
157
|
+
* @param {number} [opts.cfg_scale] Prompt adherence.
|
|
158
|
+
* @param {number} [opts.seed] -1 for random.
|
|
159
|
+
* @param {string} [opts.sampler] Engine-specific sampler id.
|
|
160
|
+
* @param {string} [opts.scheduler] Engine-specific scheduler id.
|
|
161
|
+
* @param {number} [opts.count] How many images.
|
|
162
|
+
* @param {string} [opts.format] png | jpeg | webp.
|
|
163
|
+
* @param {string} [opts.model] Checkpoint / model id.
|
|
164
|
+
* @param {string} [opts.provider] Force an engine (skips the chain).
|
|
165
|
+
* @param {string} [opts.outDir] Where to write; defaults to the gallery.
|
|
166
|
+
* @param {object} [opts.globalConfig] Pass-in for tests; else readConfig().
|
|
167
|
+
* @param {Function}[opts.onProgress] ({status, queue_position}) while polling.
|
|
168
|
+
* @param {AbortSignal} [opts.signal]
|
|
169
|
+
* @returns {Promise<{images, provider, model, prompt, request, ignored, elapsed_ms, meta}>}
|
|
170
|
+
*/
|
|
171
|
+
export async function generate({
|
|
172
|
+
prompt,
|
|
173
|
+
provider,
|
|
174
|
+
outDir,
|
|
175
|
+
globalConfig,
|
|
176
|
+
onProgress,
|
|
177
|
+
signal,
|
|
178
|
+
...rest
|
|
179
|
+
} = {}) {
|
|
180
|
+
if (typeof prompt !== "string" || !prompt.trim()) {
|
|
181
|
+
throw new Error("generate: prompt required");
|
|
182
|
+
}
|
|
183
|
+
const cfg = globalConfig || readConfig() || {};
|
|
184
|
+
const { provider: selected, adapter, engineConfig } = await selectImageEngine({
|
|
185
|
+
globalConfig: cfg,
|
|
186
|
+
provider,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const request = resolveRequest({
|
|
190
|
+
imgCfg: imagesConfig(cfg),
|
|
191
|
+
engineCfg: engineConfig,
|
|
192
|
+
request: rest,
|
|
193
|
+
});
|
|
194
|
+
const declaredIgnored = ignoredOptions(adapter, { ...present(rest) });
|
|
195
|
+
|
|
196
|
+
const dir = outDir || imageOutDir();
|
|
197
|
+
const started = Date.now();
|
|
198
|
+
const result = await adapter.generate({
|
|
199
|
+
...request,
|
|
200
|
+
prompt: prompt.trim(),
|
|
201
|
+
outDir: dir,
|
|
202
|
+
config: engineConfig,
|
|
203
|
+
parentEnginesCfg: cfg.engines,
|
|
204
|
+
onProgress,
|
|
205
|
+
signal,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// An adapter may discover, from the reply, that the server dropped something
|
|
209
|
+
// it had declared support for — a single-checkpoint clone answering 200 to a
|
|
210
|
+
// checkpoint switch it never made. The static declaration is the promise;
|
|
211
|
+
// this is the receipt.
|
|
212
|
+
const ignored = [...new Set([...declaredIgnored, ...(result.unhonored || [])])];
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
images: result.images || [],
|
|
216
|
+
provider: selected,
|
|
217
|
+
// Only claim the requested model when the adapter could actually act on
|
|
218
|
+
// it: a server that hosts one checkpoint would otherwise report back the
|
|
219
|
+
// name it just ignored, which reads as "your model was used".
|
|
220
|
+
model: result.model
|
|
221
|
+
|| (adapter.supports?.includes("model") ? request.model : null)
|
|
222
|
+
|| null,
|
|
223
|
+
prompt: prompt.trim(),
|
|
224
|
+
// Redacted: the payload is up to a megabyte of base64 and this object ends
|
|
225
|
+
// up in --json, in logs and in stored sessions.
|
|
226
|
+
request: redactInputs(request),
|
|
227
|
+
ignored,
|
|
228
|
+
elapsed_ms: Date.now() - started,
|
|
229
|
+
meta: result.meta || {},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Engines, availability, and the configured routing — for CLI and settings. */
|
|
234
|
+
export async function listProviders(globalConfig) {
|
|
235
|
+
const cfg = globalConfig || readConfig() || {};
|
|
236
|
+
const imgCfg = imagesConfig(cfg);
|
|
237
|
+
return {
|
|
238
|
+
configured_provider: imgCfg.provider || "auto",
|
|
239
|
+
mode: resolveMode(imgCfg),
|
|
240
|
+
order: resolveChainOrder(imgCfg),
|
|
241
|
+
defaults: { ...FAMILY_DEFAULTS, ...present(imgCfg.defaults) },
|
|
242
|
+
engines: await listAvailableImageEngines(cfg),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Ask one server what it can do (models, samplers, schedulers). Returns null
|
|
248
|
+
* when the engine has no catalog route or is unreachable — the settings UI
|
|
249
|
+
* treats that as "type it by hand", not as an error.
|
|
250
|
+
*/
|
|
251
|
+
export async function capabilities({ provider, globalConfig } = {}) {
|
|
252
|
+
const cfg = globalConfig || readConfig() || {};
|
|
253
|
+
const id = provider && provider !== "auto"
|
|
254
|
+
? provider
|
|
255
|
+
: (await selectImageEngine({ globalConfig: cfg })).provider;
|
|
256
|
+
const adapter = getImageAdapter(id, cfg);
|
|
257
|
+
if (typeof adapter.capabilities !== "function") return { provider: id, capabilities: null };
|
|
258
|
+
const caps = await adapter.capabilities(providerConfig(cfg, id), cfg.engines);
|
|
259
|
+
return { provider: id, capabilities: caps };
|
|
260
|
+
}
|