@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,219 @@
|
|
|
1
|
+
// AUTOMATIC1111-compatible adapter — POST /sdapi/v1/txt2img, synchronous.
|
|
2
|
+
//
|
|
3
|
+
// The most widely spoken text-to-image dialect there is: A1111 itself, Forge,
|
|
4
|
+
// SD.Next, Draw Things on macOS, and the stable-diffusion.cpp server all
|
|
5
|
+
// answer on it. One adapter therefore covers "the homelab box" and "a local
|
|
6
|
+
// Mac server" with nothing different but a base_url.
|
|
7
|
+
//
|
|
8
|
+
// Synchronous: the request stays open for the whole generation and the reply
|
|
9
|
+
// carries the images as base64. That is why it has no progress callback — the
|
|
10
|
+
// server sends nothing until it is done. For a long queue prefer the sdcpp
|
|
11
|
+
// adapter, which polls instead of holding a socket open.
|
|
12
|
+
//
|
|
13
|
+
// Shape of the reply (verified against stable-diffusion.cpp's shim):
|
|
14
|
+
// { images: ["<base64 png>", …], info: "<json string>", parameters: {…} }
|
|
15
|
+
// `info` is a JSON *string* (not an object) and carries the resolved seed —
|
|
16
|
+
// the only way to learn which seed a `seed: -1` request actually used.
|
|
17
|
+
//
|
|
18
|
+
// ── img2img ────────────────────────────────────────────────────────────────
|
|
19
|
+
// An `init_image` switches the route to POST /sdapi/v1/img2img, where the
|
|
20
|
+
// picture is the starting canvas rather than a structural hint: the reply keeps
|
|
21
|
+
// the same envelope, so only the URL and two fields differ. `denoising_strength`
|
|
22
|
+
// is how far the sampler is allowed to walk away from it — ~0.3 retouches,
|
|
23
|
+
// ~0.45 is the useful middle, >0.6 reinvents the scene. Verified against
|
|
24
|
+
// stable-diffusion.cpp at 512x768.
|
|
25
|
+
//
|
|
26
|
+
// ── Inpainting ─────────────────────────────────────────────────────────────
|
|
27
|
+
// A `mask` alongside the init image confines the repaint to the white areas
|
|
28
|
+
// and leaves the black ones byte-identical, which is the only way to change one
|
|
29
|
+
// thing in a picture and keep the rest of the scene. Verified against
|
|
30
|
+
// stable-diffusion.cpp's shim.
|
|
31
|
+
//
|
|
32
|
+
// `inpainting_fill` decides what the masked region starts from, and it is the
|
|
33
|
+
// setting that decides whether the prompt lands at all:
|
|
34
|
+
// 1 "original" (default) keeps the existing pixels — a gentle edit, but on a
|
|
35
|
+
// turbo checkpoint at cfg 1.0 the old content can outvote the prompt
|
|
36
|
+
// entirely and nothing visibly changes;
|
|
37
|
+
// 2 "latent noise" throws them away, which is what a prompt that has to
|
|
38
|
+
// override the region needs.
|
|
39
|
+
// Measured on Z-Image Turbo: fill 1 at denoise 0.75 left a green body green;
|
|
40
|
+
// fill 2 at denoise 1.0 turned it red with the rest of the frame untouched.
|
|
41
|
+
//
|
|
42
|
+
// Structural conditioning (ControlNet) is NOT here: that server takes a
|
|
43
|
+
// `control_image` on its own native route, so it lives in the sdcpp adapter.
|
|
44
|
+
|
|
45
|
+
import { postJson, probeUrl, joinUrl, writeImage, decodeBase64Image, toRawBase64, imageSize } from "./shared.js";
|
|
46
|
+
|
|
47
|
+
const DEFAULT_TIMEOUT_S = 600;
|
|
48
|
+
|
|
49
|
+
function headersFor(config) {
|
|
50
|
+
const h = {};
|
|
51
|
+
if (config.api_key) h.authorization = `Bearer ${config.api_key}`;
|
|
52
|
+
return h;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Is `asked` the checkpoint the server says it `rendered` with? Compared
|
|
57
|
+
* loosely on purpose: a server reports "z_image_turbo-Q4_K.gguf" for what a
|
|
58
|
+
* person types as "z_image_turbo-Q4_K", and a strict compare would cry wolf on
|
|
59
|
+
* every correct request.
|
|
60
|
+
*/
|
|
61
|
+
function sameCheckpoint(asked, rendered) {
|
|
62
|
+
if (!asked || !rendered) return false;
|
|
63
|
+
const norm = (v) => String(v).toLowerCase().replace(/\.(gguf|safetensors|ckpt|pt)$/, "").trim();
|
|
64
|
+
const a = norm(asked);
|
|
65
|
+
const r = norm(rendered);
|
|
66
|
+
return a === r || r.includes(a) || a.includes(r);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The resolved seed hides inside a JSON string; a malformed one is not fatal. */
|
|
70
|
+
function parseInfo(info) {
|
|
71
|
+
if (!info) return null;
|
|
72
|
+
if (typeof info === "object") return info;
|
|
73
|
+
try { return JSON.parse(info); } catch { return null; }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default {
|
|
77
|
+
id: "a1111",
|
|
78
|
+
|
|
79
|
+
// Everything in the family contract except `format`: the A1111 API has no
|
|
80
|
+
// output-format field — the server decides (PNG in practice) and we sniff
|
|
81
|
+
// the real container from the bytes rather than trusting a request that was
|
|
82
|
+
// never sent.
|
|
83
|
+
//
|
|
84
|
+
// `model` is listed, but it is the one entry this adapter cannot promise
|
|
85
|
+
// STATICALLY. Real A1111 and Forge switch checkpoints through
|
|
86
|
+
// override_settings; a single-checkpoint clone accepts the field, answers
|
|
87
|
+
// 200, and renders with whatever it loaded at launch — measured against
|
|
88
|
+
// stable-diffusion.cpp, which happily took a checkpoint name that does not
|
|
89
|
+
// exist. So the promise is verified per RESPONSE instead: `info` names the
|
|
90
|
+
// model that actually rendered, and generate() reports `model` as unhonored
|
|
91
|
+
// when that is not the one asked for. Declaring it here is right for the
|
|
92
|
+
// dialect; the per-response check is what keeps it honest per server.
|
|
93
|
+
supports: [
|
|
94
|
+
"negative_prompt", "width", "height", "steps", "cfg_scale",
|
|
95
|
+
"seed", "sampler", "scheduler", "count", "model",
|
|
96
|
+
"init_image", "denoising_strength",
|
|
97
|
+
"mask", "mask_blur", "inpainting_fill", "inpaint_full_res",
|
|
98
|
+
],
|
|
99
|
+
|
|
100
|
+
async isAvailable(config = {}) {
|
|
101
|
+
if (!config.base_url) return false;
|
|
102
|
+
// /sdapi/v1/options is the cheapest route every A1111 clone implements.
|
|
103
|
+
// A server that answers 404 there but serves txt2img still counts as
|
|
104
|
+
// reachable, so fall back to the root document before giving up.
|
|
105
|
+
return (
|
|
106
|
+
(await probeUrl(joinUrl(config.base_url, "/sdapi/v1/options"))) ||
|
|
107
|
+
(await probeUrl(joinUrl(config.base_url, "/")))
|
|
108
|
+
);
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
async generate({
|
|
112
|
+
prompt, negative_prompt, width, height, steps, cfg_scale, seed,
|
|
113
|
+
sampler, scheduler, count, model, format, outDir, config = {}, signal,
|
|
114
|
+
init_image, denoising_strength,
|
|
115
|
+
mask, mask_blur, inpainting_fill, inpaint_full_res,
|
|
116
|
+
}) {
|
|
117
|
+
if (!config.base_url) throw new Error("a1111: base_url required");
|
|
118
|
+
|
|
119
|
+
// A mask with nothing to mask is a request that would render a plain
|
|
120
|
+
// txt2img and look like the mask was ignored. Refuse instead.
|
|
121
|
+
if (mask && !init_image) {
|
|
122
|
+
throw new Error("a1111: mask needs an init image — inpainting repaints part of a picture");
|
|
123
|
+
}
|
|
124
|
+
const img2img = !!init_image;
|
|
125
|
+
const body = { prompt };
|
|
126
|
+
if (negative_prompt) body.negative_prompt = negative_prompt;
|
|
127
|
+
if (width) body.width = width;
|
|
128
|
+
if (height) body.height = height;
|
|
129
|
+
if (steps) body.steps = steps;
|
|
130
|
+
if (cfg_scale != null) body.cfg_scale = cfg_scale;
|
|
131
|
+
if (seed != null) body.seed = seed;
|
|
132
|
+
if (sampler) body.sampler_name = sampler;
|
|
133
|
+
if (scheduler) body.scheduler = scheduler;
|
|
134
|
+
if (count && count > 1) { body.n_iter = count; body.batch_size = 1; }
|
|
135
|
+
// A1111 switches checkpoints through override_settings, not a top-level
|
|
136
|
+
// field. Servers that host a single model (sd.cpp) ignore it harmlessly.
|
|
137
|
+
if (model) body.override_settings = { sd_model_checkpoint: model };
|
|
138
|
+
|
|
139
|
+
// img2img carries the canvas plus how far the sampler may stray from it.
|
|
140
|
+
// The field is `init_images` (plural, an array) even for a single picture —
|
|
141
|
+
// an `init_image` singular is silently ignored and you get plain txt2img.
|
|
142
|
+
if (img2img) {
|
|
143
|
+
body.init_images = [toRawBase64(init_image)];
|
|
144
|
+
body.denoising_strength = denoising_strength != null ? denoising_strength : 0.45;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (mask) {
|
|
148
|
+
const initBuf = decodeBase64Image(init_image);
|
|
149
|
+
const maskBuf = decodeBase64Image(mask);
|
|
150
|
+
const a = imageSize(initBuf);
|
|
151
|
+
const b = imageSize(maskBuf);
|
|
152
|
+
// Servers accept a mismatched mask without complaint and then inpaint the
|
|
153
|
+
// wrong region (or nothing), so catch it here where the fix is sayable.
|
|
154
|
+
if (a && b && (a.width !== b.width || a.height !== b.height)) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`a1111: mask is ${b.width}x${b.height} but the init image is ${a.width}x${a.height} — ` +
|
|
157
|
+
"they must match exactly; resize the mask first"
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
body.mask = toRawBase64(mask);
|
|
161
|
+
if (mask_blur != null) body.mask_blur = mask_blur;
|
|
162
|
+
body.inpainting_fill = inpainting_fill != null ? inpainting_fill : 1;
|
|
163
|
+
body.inpaint_full_res = inpaint_full_res != null ? inpaint_full_res : false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const timeoutMs = (Number(config.timeout_s) || DEFAULT_TIMEOUT_S) * 1000;
|
|
167
|
+
const reply = await postJson(
|
|
168
|
+
joinUrl(config.base_url, img2img ? "/sdapi/v1/img2img" : "/sdapi/v1/txt2img"),
|
|
169
|
+
body,
|
|
170
|
+
{ headers: headersFor(config), signal, timeoutMs }
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const b64s = Array.isArray(reply?.images) ? reply.images : [];
|
|
174
|
+
if (!b64s.length) throw new Error("a1111: server returned no images");
|
|
175
|
+
|
|
176
|
+
const info = parseInfo(reply?.info);
|
|
177
|
+
const seeds = Array.isArray(info?.all_seeds) ? info.all_seeds : [];
|
|
178
|
+
const rendered = info?.sd_model_name || null;
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
images: b64s.map((b64, i) =>
|
|
182
|
+
({ ...writeImage(decodeBase64Image(b64), { outDir, provider: "a1111", format, index: i }),
|
|
183
|
+
seed: seeds[i] ?? info?.seed ?? (seed >= 0 ? seed : null) })),
|
|
184
|
+
// Report the model that RENDERED, never the one that was asked for — a
|
|
185
|
+
// server that ignored the request must not have its silence read as
|
|
186
|
+
// agreement.
|
|
187
|
+
model: rendered || (sameCheckpoint(model, rendered) ? model : null) || null,
|
|
188
|
+
unhonored: model && rendered && !sameCheckpoint(model, rendered) ? ["model"] : [],
|
|
189
|
+
meta: {
|
|
190
|
+
mode: mask ? "inpaint" : img2img ? "img2img" : "txt2img",
|
|
191
|
+
sampler: info?.sampler_name || sampler || null,
|
|
192
|
+
steps: info?.steps ?? steps ?? null,
|
|
193
|
+
cfg_scale: info?.cfg_scale ?? cfg_scale ?? null,
|
|
194
|
+
...(img2img ? { denoising_strength: body.denoising_strength } : {}),
|
|
195
|
+
...(mask ? { inpainting_fill: body.inpainting_fill, mask_blur: body.mask_blur ?? null } : {}),
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
/** Live catalog for the settings UI: which checkpoints and samplers exist. */
|
|
201
|
+
async capabilities(config = {}) {
|
|
202
|
+
if (!config.base_url) return null;
|
|
203
|
+
const out = {};
|
|
204
|
+
const pull = async (route, shape) => {
|
|
205
|
+
try {
|
|
206
|
+
const res = await fetch(joinUrl(config.base_url, route), { headers: headersFor(config) });
|
|
207
|
+
if (!res.ok) return;
|
|
208
|
+
Object.assign(out, shape(await res.json()));
|
|
209
|
+
} catch { /* a missing sub-route is normal on minimal clones */ }
|
|
210
|
+
};
|
|
211
|
+
await pull("/sdapi/v1/sd-models", (j) =>
|
|
212
|
+
({ models: (j || []).map((m) => m.model_name || m.title).filter(Boolean) }));
|
|
213
|
+
await pull("/sdapi/v1/samplers", (j) =>
|
|
214
|
+
({ samplers: (j || []).map((s) => s.name).filter(Boolean) }));
|
|
215
|
+
await pull("/sdapi/v1/schedulers", (j) =>
|
|
216
|
+
({ schedulers: (j || []).map((s) => s.name || s.label).filter(Boolean) }));
|
|
217
|
+
return Object.keys(out).length ? out : null;
|
|
218
|
+
},
|
|
219
|
+
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Image-engine registry. Same shape as the TTS registry at core/voice/engines/
|
|
2
|
+
// and the LLM one at core/engines/ — one directory of uniform adapters plus an
|
|
3
|
+
// id→adapter map, so adding a provider touches its own file and one line here.
|
|
4
|
+
//
|
|
5
|
+
// Two selection modes (config.images.mode):
|
|
6
|
+
// "chain" — ordered fallback router. Walk config.images.order (falling back
|
|
7
|
+
// to AUTO_PREFERENCE), skip engines turned off
|
|
8
|
+
// (config.images.<id>.enabled === false), and take the first whose
|
|
9
|
+
// isAvailable() says yes. "mock" is always kept as the final rung.
|
|
10
|
+
// "single" — use exactly config.images.provider, no fallback.
|
|
11
|
+
//
|
|
12
|
+
// An explicit `provider` argument always wins (the settings tester and
|
|
13
|
+
// `apx image --provider` both rely on that).
|
|
14
|
+
//
|
|
15
|
+
// ── Custom providers ───────────────────────────────────────────────────────
|
|
16
|
+
// Any number of extra endpoints live under images.custom.<slug> and surface as
|
|
17
|
+
// "custom:<slug>". Unlike TTS — where every custom endpoint is OpenAI-shaped —
|
|
18
|
+
// an image server can speak any of the three dialects, so a custom entry
|
|
19
|
+
// carries a `kind` ("a1111" | "sdcpp" | "openai", default "a1111") naming which
|
|
20
|
+
// adapter drives it. Getting that wrong is a 404, not a subtle degradation,
|
|
21
|
+
// which is why it is explicit rather than sniffed.
|
|
22
|
+
|
|
23
|
+
import a1111 from "./a1111.js";
|
|
24
|
+
import sdcpp from "./sdcpp.js";
|
|
25
|
+
import openai from "./openai.js";
|
|
26
|
+
import mock from "./mock.js";
|
|
27
|
+
|
|
28
|
+
const ADAPTERS = { a1111, sdcpp, openai, mock };
|
|
29
|
+
export const IMAGE_ENGINE_IDS = Object.keys(ADAPTERS);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Local-first, and A1111 ahead of the native sdcpp route on purpose: the same
|
|
33
|
+
* stable-diffusion.cpp server answers both, but only the A1111 dialect carries
|
|
34
|
+
* steps and cfg scale, and a turbo checkpoint left on a server's stock 20
|
|
35
|
+
* steps / cfg 7 renders several times slower for a worse picture.
|
|
36
|
+
*/
|
|
37
|
+
export const AUTO_PREFERENCE = ["a1111", "sdcpp", "openai", "mock"];
|
|
38
|
+
|
|
39
|
+
/** Dialects a custom endpoint may declare. */
|
|
40
|
+
export const CUSTOM_KINDS = ["a1111", "sdcpp", "openai"];
|
|
41
|
+
export const CUSTOM_PREFIX = "custom:";
|
|
42
|
+
|
|
43
|
+
export function isCustomId(id) {
|
|
44
|
+
return typeof id === "string" && id.startsWith(CUSTOM_PREFIX);
|
|
45
|
+
}
|
|
46
|
+
function slugOf(id) {
|
|
47
|
+
return isCustomId(id) ? id.slice(CUSTOM_PREFIX.length) : id;
|
|
48
|
+
}
|
|
49
|
+
function customEngineIds(imgCfg) {
|
|
50
|
+
return Object.keys(imgCfg?.custom || {}).map((slug) => CUSTOM_PREFIX + slug);
|
|
51
|
+
}
|
|
52
|
+
function knownIds(imgCfg) {
|
|
53
|
+
return [...IMAGE_ENGINE_IDS, ...customEngineIds(imgCfg)];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function imagesConfig(globalConfig) {
|
|
57
|
+
return globalConfig?.images || {};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function providerConfig(globalConfig, provider) {
|
|
61
|
+
const img = imagesConfig(globalConfig);
|
|
62
|
+
if (isCustomId(provider)) return img?.custom?.[slugOf(provider)] || {};
|
|
63
|
+
return img?.[provider] || {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Which adapter drives an engine id (a custom one names its dialect). */
|
|
67
|
+
export function getImageAdapter(provider, globalConfig) {
|
|
68
|
+
if (isCustomId(provider)) {
|
|
69
|
+
const kind = providerConfig(globalConfig, provider).kind || "a1111";
|
|
70
|
+
const adapter = ADAPTERS[kind];
|
|
71
|
+
if (!adapter) {
|
|
72
|
+
throw new Error(`unknown kind "${kind}" for ${provider}. Known: ${CUSTOM_KINDS.join(", ")}`);
|
|
73
|
+
}
|
|
74
|
+
return adapter;
|
|
75
|
+
}
|
|
76
|
+
const adapter = ADAPTERS[provider];
|
|
77
|
+
if (!adapter) {
|
|
78
|
+
throw new Error(`unknown image provider "${provider}". Known: ${IMAGE_ENGINE_IDS.join(", ")}`);
|
|
79
|
+
}
|
|
80
|
+
return adapter;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function isEnabled(imgCfg, id) {
|
|
84
|
+
if (isCustomId(id)) return imgCfg?.custom?.[slugOf(id)]?.enabled !== false;
|
|
85
|
+
return imgCfg?.[id]?.enabled !== false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Effective routing mode for the chain/single decision. */
|
|
89
|
+
export function resolveMode(imgCfg) {
|
|
90
|
+
if (imgCfg?.mode === "chain" || imgCfg?.mode === "single") return imgCfg.mode;
|
|
91
|
+
const p = imgCfg?.provider;
|
|
92
|
+
return p && p !== "auto" ? "single" : "chain";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Full engine order for chain mode: the user's order first (known ids only),
|
|
97
|
+
* then whatever AUTO_PREFERENCE and the custom entries add. Disabled engines
|
|
98
|
+
* stay in the list so the settings UI can render and reorder every row;
|
|
99
|
+
* filtering happens at selection time.
|
|
100
|
+
*/
|
|
101
|
+
export function resolveChainOrder(imgCfg) {
|
|
102
|
+
const known = knownIds(imgCfg);
|
|
103
|
+
const ordered = Array.isArray(imgCfg?.order) ? imgCfg.order.filter((id) => known.includes(id)) : [];
|
|
104
|
+
const rest = [...AUTO_PREFERENCE, ...customEngineIds(imgCfg)].filter((id) => !ordered.includes(id));
|
|
105
|
+
const full = [...ordered, ...rest];
|
|
106
|
+
if (!full.includes("mock")) full.push("mock");
|
|
107
|
+
return full;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Resolve which engine handles a generate() call.
|
|
112
|
+
* Returns { provider, adapter, engineConfig }.
|
|
113
|
+
*/
|
|
114
|
+
export async function selectImageEngine({ globalConfig, provider }) {
|
|
115
|
+
const imgCfg = imagesConfig(globalConfig);
|
|
116
|
+
|
|
117
|
+
// 1. Explicit override (CLI --provider, the settings tester) always wins.
|
|
118
|
+
if (provider && provider !== "auto") {
|
|
119
|
+
return {
|
|
120
|
+
provider,
|
|
121
|
+
adapter: getImageAdapter(provider, globalConfig),
|
|
122
|
+
engineConfig: providerConfig(globalConfig, provider),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 2. Single mode: the configured engine verbatim, no fallback.
|
|
127
|
+
if (resolveMode(imgCfg) === "single") {
|
|
128
|
+
const id = imgCfg?.provider;
|
|
129
|
+
if (id && id !== "auto") {
|
|
130
|
+
return {
|
|
131
|
+
provider: id,
|
|
132
|
+
adapter: getImageAdapter(id, globalConfig),
|
|
133
|
+
engineConfig: providerConfig(globalConfig, id),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Misconfigured single mode (no concrete provider) falls through to chain.
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// 3. Chain mode: probe the enabled order, first available wins.
|
|
140
|
+
for (const id of resolveChainOrder(imgCfg)) {
|
|
141
|
+
if (id !== "mock" && !isEnabled(imgCfg, id)) continue;
|
|
142
|
+
let adapter;
|
|
143
|
+
try { adapter = getImageAdapter(id, globalConfig); } catch { continue; }
|
|
144
|
+
const cfg = providerConfig(globalConfig, id);
|
|
145
|
+
try {
|
|
146
|
+
if (await adapter.isAvailable(cfg, globalConfig?.engines)) {
|
|
147
|
+
return { provider: id, adapter, engineConfig: cfg };
|
|
148
|
+
}
|
|
149
|
+
} catch { /* probe failures fall through to the next engine */ }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return { provider: "mock", adapter: mock, engineConfig: providerConfig(globalConfig, "mock") };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Which engines are configured/available right now. Every entry is probed, so
|
|
157
|
+
* this makes real (short-timeout) network calls — fine for a settings screen,
|
|
158
|
+
* not for a hot path.
|
|
159
|
+
*/
|
|
160
|
+
export async function listAvailableImageEngines(globalConfig) {
|
|
161
|
+
const imgCfg = imagesConfig(globalConfig);
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const id of knownIds(imgCfg)) {
|
|
164
|
+
const cfg = providerConfig(globalConfig, id);
|
|
165
|
+
let adapter = null;
|
|
166
|
+
try { adapter = getImageAdapter(id, globalConfig); } catch { /* unknown kind */ }
|
|
167
|
+
let available = false;
|
|
168
|
+
try {
|
|
169
|
+
available = adapter ? await adapter.isAvailable(cfg, globalConfig?.engines) : false;
|
|
170
|
+
} catch { available = false; }
|
|
171
|
+
const custom = isCustomId(id);
|
|
172
|
+
out.push({
|
|
173
|
+
id,
|
|
174
|
+
available,
|
|
175
|
+
// `enabled`, `label` and `kind` are routing/display metadata, not config —
|
|
176
|
+
// excluding them keeps "configured" from turning true the moment someone
|
|
177
|
+
// toggles a row off.
|
|
178
|
+
configured: Object.keys(cfg).filter((k) => !["enabled", "label", "kind"].includes(k)).length > 0,
|
|
179
|
+
enabled: isEnabled(imgCfg, id),
|
|
180
|
+
supports: adapter?.supports || [],
|
|
181
|
+
...(custom
|
|
182
|
+
? { custom: true, kind: cfg.kind || "a1111", label: cfg.label || slugOf(id), note: cfg.base_url || "" }
|
|
183
|
+
: { note: cfg.base_url || "" }),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Deterministic offline engine. Always available, always last in the chain.
|
|
2
|
+
//
|
|
3
|
+
// It exists for the same reason the TTS mock does: tests run with no network
|
|
4
|
+
// and no keys (project rule 1), and a caller that asks for a picture when
|
|
5
|
+
// nothing is configured should get a real file back rather than an exception
|
|
6
|
+
// from four different servers in a row. The PNG is a solid colour derived from
|
|
7
|
+
// the prompt, so the same prompt always yields the same swatch — a useful
|
|
8
|
+
// property when a test wants to assert "the pipeline wrote the bytes it was
|
|
9
|
+
// given" without shipping a fixture.
|
|
10
|
+
|
|
11
|
+
import { createHash } from "node:crypto";
|
|
12
|
+
import { deflateSync } from "node:zlib";
|
|
13
|
+
import { writeImage } from "./shared.js";
|
|
14
|
+
|
|
15
|
+
const SIZE = 64;
|
|
16
|
+
|
|
17
|
+
function crc32(buf) {
|
|
18
|
+
let c = ~0;
|
|
19
|
+
for (const byte of buf) {
|
|
20
|
+
c ^= byte;
|
|
21
|
+
for (let k = 0; k < 8; k++) c = (c >>> 1) ^ (0xedb88320 & -(c & 1));
|
|
22
|
+
}
|
|
23
|
+
return (~c) >>> 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function chunk(type, data) {
|
|
27
|
+
const len = Buffer.alloc(4);
|
|
28
|
+
len.writeUInt32BE(data.length);
|
|
29
|
+
const body = Buffer.concat([Buffer.from(type, "ascii"), data]);
|
|
30
|
+
const crc = Buffer.alloc(4);
|
|
31
|
+
crc.writeUInt32BE(crc32(body));
|
|
32
|
+
return Buffer.concat([len, body, crc]);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Minimal hand-rolled PNG encoder — no image dependency for a test fixture. */
|
|
36
|
+
function solidPng(r, g, b) {
|
|
37
|
+
const ihdr = Buffer.alloc(13);
|
|
38
|
+
ihdr.writeUInt32BE(SIZE, 0);
|
|
39
|
+
ihdr.writeUInt32BE(SIZE, 4);
|
|
40
|
+
ihdr[8] = 8; // bit depth
|
|
41
|
+
ihdr[9] = 2; // colour type: truecolour
|
|
42
|
+
const row = Buffer.concat([Buffer.from([0]), Buffer.concat(Array(SIZE).fill(Buffer.from([r, g, b])))]);
|
|
43
|
+
const raw = Buffer.concat(Array(SIZE).fill(row));
|
|
44
|
+
return Buffer.concat([
|
|
45
|
+
Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),
|
|
46
|
+
chunk("IHDR", ihdr),
|
|
47
|
+
chunk("IDAT", deflateSync(raw)),
|
|
48
|
+
chunk("IEND", Buffer.alloc(0)),
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default {
|
|
53
|
+
id: "mock",
|
|
54
|
+
|
|
55
|
+
// `count` is the one option it genuinely honors — it really does write N
|
|
56
|
+
// files. Everything else is accepted and ignored, and saying so is what
|
|
57
|
+
// keeps the "ignored options" report honest.
|
|
58
|
+
supports: ["count"],
|
|
59
|
+
|
|
60
|
+
async isAvailable() { return true; },
|
|
61
|
+
|
|
62
|
+
async generate({ prompt, count, outDir }) {
|
|
63
|
+
const digest = createHash("sha256").update(String(prompt || "")).digest();
|
|
64
|
+
const n = Math.max(1, Math.min(Number(count) || 1, 4));
|
|
65
|
+
return {
|
|
66
|
+
images: Array.from({ length: n }, (_, i) =>
|
|
67
|
+
({ ...writeImage(solidPng(digest[i * 3], digest[i * 3 + 1], digest[i * 3 + 2]),
|
|
68
|
+
{ outDir, provider: "mock", format: "png", index: i }),
|
|
69
|
+
seed: digest.readUInt32BE(0) })),
|
|
70
|
+
model: "mock",
|
|
71
|
+
meta: { note: "generated offline by the mock engine" },
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// OpenAI Images adapter — POST /v1/images/generations.
|
|
2
|
+
//
|
|
3
|
+
// Two lives, same code path, distinguished by whether base_url is set:
|
|
4
|
+
// • stock OpenAI (gpt-image-1 / dall-e-3), keyed from engines.openai.api_key
|
|
5
|
+
// • any OpenAI-compatible server, including the stable-diffusion.cpp box,
|
|
6
|
+
// LocalAI, vLLM-style shims and a hosted gateway.
|
|
7
|
+
//
|
|
8
|
+
// The compatibility that makes this dialect universal is also its ceiling: the
|
|
9
|
+
// schema has no steps, no cfg scale, no sampler and no negative prompt. Against
|
|
10
|
+
// a local diffusion server that means the server's own defaults decide, and
|
|
11
|
+
// `z_image_turbo` at its stock 20 steps / cfg 7 took ~4× longer than the same
|
|
12
|
+
// picture through the A1111 route at 8 steps / cfg 1. Those knobs are declared
|
|
13
|
+
// unsupported here rather than silently dropped, and the facade reports them
|
|
14
|
+
// back so a caller can see why its `--steps` did nothing.
|
|
15
|
+
//
|
|
16
|
+
// As with TTS, a custom endpoint uses ONLY its own key: never leak the stock
|
|
17
|
+
// OpenAI key (or OPENAI_API_KEY) to somebody else's server.
|
|
18
|
+
|
|
19
|
+
import { postJson, getJson, probeUrl, joinUrl, writeImage, decodeBase64Image, formatSize } from "./shared.js";
|
|
20
|
+
|
|
21
|
+
const DEFAULT_URL = "https://api.openai.com/v1";
|
|
22
|
+
const DEFAULT_MODEL = "gpt-image-1";
|
|
23
|
+
const DEFAULT_TIMEOUT_S = 600;
|
|
24
|
+
|
|
25
|
+
function getKey(config, parentEnginesCfg) {
|
|
26
|
+
if (config.base_url) return config.api_key || "";
|
|
27
|
+
return config.api_key || parentEnginesCfg?.openai?.api_key || process.env.OPENAI_API_KEY || "";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function baseFor(config) {
|
|
31
|
+
return config.base_url || DEFAULT_URL;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function headersFor(config, parentEnginesCfg) {
|
|
35
|
+
const h = {};
|
|
36
|
+
const key = getKey(config, parentEnginesCfg);
|
|
37
|
+
if (key) h.authorization = `Bearer ${key}`;
|
|
38
|
+
return h;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default {
|
|
42
|
+
id: "openai",
|
|
43
|
+
|
|
44
|
+
// No steps / cfg_scale / sampler / scheduler / negative_prompt / seed: the
|
|
45
|
+
// API has nowhere to put them.
|
|
46
|
+
supports: ["width", "height", "count", "model", "format"],
|
|
47
|
+
|
|
48
|
+
async isAvailable(config = {}, parentEnginesCfg) {
|
|
49
|
+
if (config.base_url) {
|
|
50
|
+
return probeUrl(joinUrl(config.base_url, "/v1/models"), {
|
|
51
|
+
headers: headersFor(config, parentEnginesCfg),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return Boolean(getKey(config, parentEnginesCfg));
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
async generate({
|
|
58
|
+
prompt, width, height, count, model, format,
|
|
59
|
+
outDir, config = {}, parentEnginesCfg, signal,
|
|
60
|
+
}) {
|
|
61
|
+
const isCustom = Boolean(config.base_url);
|
|
62
|
+
const key = getKey(config, parentEnginesCfg);
|
|
63
|
+
if (!isCustom && !key) {
|
|
64
|
+
throw new Error("openai-images: no api_key (set engines.openai.api_key or OPENAI_API_KEY)");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const body = { prompt };
|
|
68
|
+
const chosenModel = model || config.model || (isCustom ? undefined : DEFAULT_MODEL);
|
|
69
|
+
if (chosenModel) body.model = chosenModel;
|
|
70
|
+
if (count && count > 1) body.n = count;
|
|
71
|
+
if (width && height) body.size = formatSize(width, height);
|
|
72
|
+
else if (config.size) body.size = config.size;
|
|
73
|
+
// gpt-image-1 always answers in base64; dall-e-3 answers with a URL unless
|
|
74
|
+
// asked otherwise, and a URL would leave nothing on disk.
|
|
75
|
+
if (!isCustom) body.response_format = "b64_json";
|
|
76
|
+
if (!isCustom && config.quality) body.quality = config.quality;
|
|
77
|
+
if (isCustom && format) body.output_format = format;
|
|
78
|
+
|
|
79
|
+
const timeoutMs = (Number(config.timeout_s) || DEFAULT_TIMEOUT_S) * 1000;
|
|
80
|
+
const reply = await postJson(
|
|
81
|
+
joinUrl(baseFor(config), "/v1/images/generations"),
|
|
82
|
+
body,
|
|
83
|
+
{ headers: headersFor(config, parentEnginesCfg), signal, timeoutMs }
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const entries = Array.isArray(reply?.data) ? reply.data : [];
|
|
87
|
+
if (!entries.length) throw new Error("openai-images: server returned no images");
|
|
88
|
+
|
|
89
|
+
const images = [];
|
|
90
|
+
for (const [i, entry] of entries.entries()) {
|
|
91
|
+
let buf;
|
|
92
|
+
if (entry?.b64_json) {
|
|
93
|
+
buf = decodeBase64Image(entry.b64_json);
|
|
94
|
+
} else if (entry?.url) {
|
|
95
|
+
// dall-e-3's default. Fetch it now: those URLs expire within the hour.
|
|
96
|
+
const res = await fetch(entry.url, { signal });
|
|
97
|
+
if (!res.ok) throw new Error(`openai-images: could not fetch ${res.status} from the image URL`);
|
|
98
|
+
buf = Buffer.from(await res.arrayBuffer());
|
|
99
|
+
} else {
|
|
100
|
+
throw new Error("openai-images: reply entry carried neither b64_json nor url");
|
|
101
|
+
}
|
|
102
|
+
images.push(writeImage(buf, {
|
|
103
|
+
outDir,
|
|
104
|
+
provider: "openai",
|
|
105
|
+
format: reply?.output_format || format,
|
|
106
|
+
index: i,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return { images, model: chosenModel || null, meta: {} };
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
async capabilities(config = {}, parentEnginesCfg) {
|
|
114
|
+
if (!config.base_url) {
|
|
115
|
+
// Stock OpenAI: a fixed, small catalog. Listing /v1/models would return
|
|
116
|
+
// every chat model too, which is noise in an image picker.
|
|
117
|
+
return { models: ["gpt-image-1", "dall-e-3", "dall-e-2"], sizes: ["1024x1024", "1024x1536", "1536x1024"] };
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const j = await getJson(joinUrl(config.base_url, "/v1/models"), {
|
|
121
|
+
headers: headersFor(config, parentEnginesCfg),
|
|
122
|
+
timeoutMs: 8000,
|
|
123
|
+
});
|
|
124
|
+
const models = (j?.data || []).map((m) => m.id).filter(Boolean);
|
|
125
|
+
return models.length ? { models } : null;
|
|
126
|
+
} catch {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|