mixdog 1.2.0 → 1.2.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/README.md +7 -5
- package/package.json +1 -1
- package/src/defaults/shipped-history.json +4 -0
- package/src/defaults/skills/pptx/SKILL.md +6 -6
- package/src/defaults/skills/pptx/references/review.md +6 -4
- package/src/defaults/skills/pptx/scripts/source-extract.mjs +1 -1
- package/src/defaults/skills/setup/references/actions.md +13 -3
- package/src/defaults/skills/visualize/SKILL.md +12 -9
- package/src/rules/shared/60-verification.md +3 -1
- package/src/rules/shared/70-delivery.md +4 -2
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +26 -5
- package/src/runtime/agent/orchestrator/config.mjs +10 -4
- package/src/runtime/agent/orchestrator/context/collect.mjs +2 -1
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +11 -5
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +74 -21
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +86 -8
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +5 -1
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +65 -7
- package/src/runtime/agent/orchestrator/mcp/client.mjs +128 -44
- package/src/runtime/agent/orchestrator/mcp/lazy-output-validator.mjs +25 -0
- package/src/runtime/agent/orchestrator/mcp/plugin-placeholders.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +108 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +19 -11
- package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +337 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-tokens.mjs +159 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +444 -0
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -4
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +41 -28
- package/src/runtime/agent/orchestrator/providers/lib/gemini-model-catalog.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-bridge.mjs +1080 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +15 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +35 -0
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +6 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +9 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +35 -9
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +15 -55
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +15 -2
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +267 -84
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +54 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +284 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +268 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/sqlite-gate.mjs +27 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +628 -0
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +184 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +136 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +128 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +127 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +101 -0
- package/src/runtime/agent/orchestrator/session/explicit-skills.mjs +83 -5
- package/src/runtime/agent/orchestrator/session/imported-message.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +6 -4
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +20 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +17 -4
- package/src/runtime/agent/orchestrator/session/manager.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +817 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +19 -12
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +158 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +183 -374
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +21 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +38 -17
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +17 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +173 -22
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-guards.mjs +8 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +15 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +13 -10
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +17 -12
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/route.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/read-redirects.mjs +34 -30
- package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +4 -0
- package/src/runtime/attachments/store.d.mts +3 -0
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +1 -1
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +16 -4
- package/src/runtime/channels/lib/worker-main.mjs +17 -14
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -2
- package/src/runtime/effort-judge/judge-client.mjs +56 -18
- package/src/runtime/memory/lib/memory.mjs +1 -1
- package/src/runtime/memory/lib/session-ingest.mjs +2 -2
- package/src/runtime/shared/atomic-file.mjs +25 -4
- package/src/runtime/shared/extension-scopes.mjs +5 -3
- package/src/runtime/shared/file-lock.mjs +37 -11
- package/src/runtime/shared/llm/anthropic-effort.mjs +14 -0
- package/src/runtime/shared/llm/model-catalog.mjs +0 -12
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +6 -0
- package/src/runtime/shared/plugin-manifest.mjs +18 -9
- package/src/runtime/shared/pristine-execution-contract.json +9 -2
- package/src/runtime/shared/pristine-execution.mjs +28 -4
- package/src/runtime/shared/provider-accounts.mjs +124 -20
- package/src/runtime/shared/provider-api-key.mjs +12 -0
- package/src/runtime/shared/shell-display.mjs +9 -3
- package/src/runtime/shared/skill-mentions.d.mts +10 -0
- package/src/runtime/shared/skill-mentions.mjs +133 -0
- package/src/runtime/shared/skill-script-runtime.mjs +264 -0
- package/src/runtime/shared/tool-primitives.mjs +35 -2
- package/src/runtime/shared/turn-worktree-snapshot.mjs +25 -5
- package/src/runtime/shared/worker-requests.mjs +15 -2
- package/src/session-runtime/automation-agents.mjs +8 -2
- package/src/session-runtime/boot/apis.mjs +55 -0
- package/src/session-runtime/boot/config.mjs +5 -2
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +29 -18
- package/src/session-runtime/conversation-import/discovery.mjs +698 -0
- package/src/session-runtime/conversation-import/service.mjs +369 -0
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +10 -5
- package/src/session-runtime/cwd-plugins/plugin-status.mjs +47 -42
- package/src/session-runtime/mcp-glue/connect.mjs +57 -10
- package/src/session-runtime/mcp-glue/plugin-servers.mjs +499 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +115 -30
- package/src/session-runtime/mcp-glue.mjs +22 -2
- package/src/session-runtime/new-session-config.mjs +3 -2
- package/src/session-runtime/notification-bus.mjs +9 -2
- package/src/session-runtime/provider-auth/accounts.mjs +33 -15
- package/src/session-runtime/provider-models/web-search-catalog.mjs +5 -1
- package/src/session-runtime/provider-readiness.mjs +16 -10
- package/src/session-runtime/resource-extension-sync.mjs +20 -5
- package/src/session-runtime/resource-mcp-api.mjs +101 -77
- package/src/session-runtime/resource-plugins-api.mjs +29 -41
- package/src/session-runtime/resource-scope-decorate.mjs +6 -8
- package/src/session-runtime/resource-skills-api.mjs +23 -2
- package/src/session-runtime/schedule-session-run.mjs +1 -1
- package/src/session-runtime/services/channel-session-router.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +4 -1
- package/src/session-runtime/services/hook-bus/handlers.mjs +7 -3
- package/src/session-runtime/services/provider-admin.mjs +64 -18
- package/src/session-runtime/services/usage-dashboard-model.mjs +3 -0
- package/src/session-runtime/setup-tool/executor.mjs +12 -1
- package/src/session-runtime/setup-tool/extended-actions.mjs +1 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +1 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +7 -1
- package/src/session-runtime/skills-api.mjs +7 -3
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/webhook-session-run.mjs +16 -4
- package/src/skill-script-entry.mjs +36 -0
- package/src/standalone/daemon-stored-session-views.mjs +11 -3
- package/src/standalone/daemon.mjs +41 -4
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +6 -1
- package/src/tui/App.jsx +9 -1
- package/src/tui/app/app-view/floating-panel.jsx +9 -1
- package/src/tui/app/app-view.jsx +6 -0
- package/src/tui/app/extension-pickers/plugins-pickers.mjs +35 -16
- package/src/tui/app/model-options.mjs +2 -0
- package/src/tui/app/skill-mention-palette.mjs +88 -0
- package/src/tui/app/slash-palette.mjs +23 -7
- package/src/tui/app/transcript-row-estimate.mjs +11 -3
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -2
- package/src/tui/app/use-prompt-state.mjs +5 -0
- package/src/tui/components/Message.jsx +22 -1
- package/src/tui/components/PromptInput.jsx +21 -3
- package/src/tui/components/SlashCommandPalette.jsx +12 -3
- package/src/tui/components/TranscriptItem.jsx +9 -1
- package/src/tui/components/prompt-input/key-handler.mjs +21 -8
- package/src/tui/components/user-message-skills.mjs +38 -0
- package/src/tui/dist/index.mjs +507 -171
- package/src/tui/session/queue-helpers.mjs +7 -2
- package/src/tui/session/session-api/extensions.mjs +4 -2
- package/src/tui/session/session-api/settings.mjs +7 -0
- package/src/tui/session/session-flow/drain.mjs +14 -4
- package/src/tui/session/tui-steering-persist.mjs +25 -9
- package/src/tui/session/turn.mjs +17 -0
- package/src/runtime/effort-judge/previous-human-request.mjs +0 -162
- package/src/runtime/effort-judge/verified-context-input.mjs +0 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
2
|
-
import {
|
|
2
|
+
import { reloadProviderApiKey, resolveProviderApiKey } from '../../../shared/provider-api-key.mjs';
|
|
3
3
|
import { canFallbackNonStreaming, emitProviderRetryStage, withRetry } from './retry-classifier.mjs';
|
|
4
4
|
import { noteErrorUsage } from './lib/note-error-usage.mjs';
|
|
5
5
|
import { traceNonStreamingFallback } from './lib/transport-fallback-trace.mjs';
|
|
@@ -153,8 +153,9 @@ export class GeminiProvider {
|
|
|
153
153
|
this._createGenAI =
|
|
154
154
|
typeof config.createGenAI === 'function' ? config.createGenAI : (apiKey) => new GoogleGenerativeAI(apiKey);
|
|
155
155
|
this._modelCache = config.modelCache || _modelCache;
|
|
156
|
-
|
|
157
|
-
this.
|
|
156
|
+
this._injectedGenAI = Boolean(config.genAI);
|
|
157
|
+
this._genAIKey = resolveProviderApiKey('gemini', config);
|
|
158
|
+
this.genAI = config.genAI || this._createGenAI(this._genAIKey);
|
|
158
159
|
// Warm a kept-alive socket to the Gemini REST API so the first cache/
|
|
159
160
|
// generateContent request skips the cold TLS handshake. Best-effort.
|
|
160
161
|
this._preconnect('https://generativelanguage.googleapis.com');
|
|
@@ -162,12 +163,13 @@ export class GeminiProvider {
|
|
|
162
163
|
|
|
163
164
|
reloadApiKey() {
|
|
164
165
|
try {
|
|
165
|
-
const newKey =
|
|
166
|
+
const newKey = reloadProviderApiKey('gemini', this.config);
|
|
166
167
|
if (newKey) {
|
|
167
|
-
// Keep this.config in sync so REST/cache paths
|
|
168
|
-
// key
|
|
169
|
-
// the stale key after a rotation; genAI alone is not enough.
|
|
168
|
+
// Keep this.config in sync so REST/cache paths don't keep using the
|
|
169
|
+
// stale key after a rotation; genAI alone is not enough.
|
|
170
170
|
this.config = { ...(this.config || {}), apiKey: newKey };
|
|
171
|
+
this._injectedGenAI = false;
|
|
172
|
+
this._genAIKey = newKey;
|
|
171
173
|
this.genAI = this._createGenAI(newKey);
|
|
172
174
|
}
|
|
173
175
|
return newKey || '';
|
|
@@ -178,7 +180,18 @@ export class GeminiProvider {
|
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
_getApiKey() {
|
|
181
|
-
return this.config
|
|
183
|
+
return resolveProviderApiKey('gemini', this.config);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// SDK client for the currently resolved key; rebuilt when the key changed
|
|
187
|
+
// since construction (e.g. a keyless-constructed instance).
|
|
188
|
+
_currentGenAI() {
|
|
189
|
+
const key = this._getApiKey();
|
|
190
|
+
if (!this._injectedGenAI && key !== this._genAIKey) {
|
|
191
|
+
this._genAIKey = key;
|
|
192
|
+
this.genAI = this._createGenAI(key);
|
|
193
|
+
}
|
|
194
|
+
return this.genAI;
|
|
182
195
|
}
|
|
183
196
|
|
|
184
197
|
/**
|
|
@@ -673,7 +686,7 @@ export class GeminiProvider {
|
|
|
673
686
|
|
|
674
687
|
async _streamViaSdk(stream) {
|
|
675
688
|
const { opts, signal, useModel, systemInstruction, geminiTools, toolConfig, generationConfig, contents } = stream;
|
|
676
|
-
const genModel = this.
|
|
689
|
+
const genModel = this._currentGenAI().getGenerativeModel({
|
|
677
690
|
model: useModel,
|
|
678
691
|
systemInstruction,
|
|
679
692
|
tools: geminiTools,
|
|
@@ -714,7 +727,7 @@ export class GeminiProvider {
|
|
|
714
727
|
const cached = this._modelCache.loadSync();
|
|
715
728
|
if (cached) return cached;
|
|
716
729
|
// Dynamic lookup via Gemini v1beta /models. Requires API key.
|
|
717
|
-
const apiKey = this.
|
|
730
|
+
const apiKey = this._getApiKey();
|
|
718
731
|
if (!apiKey) return MODELS; // no key — return minimal static list
|
|
719
732
|
try {
|
|
720
733
|
return await this._fetchAndCacheModels(apiKey);
|
|
@@ -738,26 +751,26 @@ export class GeminiProvider {
|
|
|
738
751
|
|
|
739
752
|
// Force a catalog refresh (ignores the 24h disk TTL). De-duped via
|
|
740
753
|
// _modelRefreshInFlight so concurrent callers share one HTTP round-trip.
|
|
741
|
-
//
|
|
754
|
+
// Resolves null when there is no key; fetch/normalize failures reject so
|
|
755
|
+
// callers (registry refresh) report them.
|
|
742
756
|
async _refreshModelCache() {
|
|
743
757
|
if (_modelRefreshInFlight) return _modelRefreshInFlight;
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
return enriched;
|
|
752
|
-
} catch (err) {
|
|
753
|
-
if (!process.env.MIXDOG_QUIET_PROVIDER_LOG)
|
|
754
|
-
process.stderr.write(`[gemini] catalog refresh failed (${err.message})\n`);
|
|
755
|
-
return null;
|
|
756
|
-
} finally {
|
|
757
|
-
_modelRefreshInFlight = null;
|
|
758
|
-
}
|
|
758
|
+
const refresh = (async () => {
|
|
759
|
+
const apiKey = this._getApiKey();
|
|
760
|
+
if (!apiKey) return null; // no key — nothing to refresh
|
|
761
|
+
const enriched = await this._fetchAndCacheModels(apiKey);
|
|
762
|
+
if (!process.env.MIXDOG_QUIET_PROVIDER_LOG)
|
|
763
|
+
process.stderr.write(`[gemini] catalog refreshed (${enriched.length} models)\n`);
|
|
764
|
+
return enriched;
|
|
759
765
|
})();
|
|
760
|
-
|
|
766
|
+
// Clear only after the shared promise is published: a refresh that settles
|
|
767
|
+
// synchronously (no key) must not leave its settled promise memoized.
|
|
768
|
+
_modelRefreshInFlight = refresh;
|
|
769
|
+
try {
|
|
770
|
+
return await refresh;
|
|
771
|
+
} finally {
|
|
772
|
+
if (_modelRefreshInFlight === refresh) _modelRefreshInFlight = null;
|
|
773
|
+
}
|
|
761
774
|
}
|
|
762
775
|
|
|
763
776
|
async isAvailable() {
|
|
@@ -766,7 +779,7 @@ export class GeminiProvider {
|
|
|
766
779
|
controller.abort(providerTimeoutError('Gemini availability probe', GEMINI_AVAILABILITY_TIMEOUT_MS));
|
|
767
780
|
}, GEMINI_AVAILABILITY_TIMEOUT_MS);
|
|
768
781
|
try {
|
|
769
|
-
const model = this.
|
|
782
|
+
const model = this._currentGenAI().getGenerativeModel({ model: DEFAULT_MODEL });
|
|
770
783
|
const generation = Promise.resolve(model.generateContent('hi', { signal: controller.signal }));
|
|
771
784
|
generation.catch(() => {});
|
|
772
785
|
await Promise.race([
|
|
@@ -79,7 +79,13 @@ function resolveLatestGeminiModel() {
|
|
|
79
79
|
export async function ensureLatestGeminiModel(provider) {
|
|
80
80
|
let model = resolveLatestGeminiModel();
|
|
81
81
|
if (model) return model;
|
|
82
|
-
|
|
82
|
+
try {
|
|
83
|
+
await provider._refreshModelCache();
|
|
84
|
+
} catch (err) {
|
|
85
|
+
throw new Error(`[gemini] model catalog refresh failed — cannot resolve default model (${err.message})`, {
|
|
86
|
+
cause: err,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
83
89
|
model = resolveLatestGeminiModel();
|
|
84
90
|
if (model) return model;
|
|
85
91
|
throw new Error('[gemini] model catalog unavailable after warmup — cannot resolve default model');
|