@bastani/atomic 0.9.11-alpha.7 → 0.9.11-alpha.8
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/CHANGELOG.md +24 -0
- package/README.md +3 -5
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/mcp/sampling-handler.ts +1 -5
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +1 -0
- package/dist/builtin/workflows/README.md +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +1 -24
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +31 -28
- package/dist/builtin/workflows/src/extension/workflow-model-catalog.ts +26 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +3 -2
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +5 -5
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +3 -3
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +2 -2
- package/dist/cli/list-models.d.ts +2 -2
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +5 -5
- package/dist/cli/list-models.js.map +1 -1
- package/dist/core/agent-session-accessors.js +1 -1
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +2 -5
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-compaction.js +1 -1
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +5 -5
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +4 -4
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-models.d.ts +1 -1
- package/dist/core/agent-session-models.d.ts.map +1 -1
- package/dist/core/agent-session-models.js +18 -14
- package/dist/core/agent-session-models.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +2 -4
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +3 -7
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-retry.js +1 -1
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-runtime-auth.d.ts +3 -3
- package/dist/core/agent-session-runtime-auth.d.ts.map +1 -1
- package/dist/core/agent-session-runtime-auth.js +4 -14
- package/dist/core/agent-session-runtime-auth.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +3 -3
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +3 -8
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +16 -23
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +2 -1
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -2
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts +1 -0
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +18 -4
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/auth-storage.d.ts +12 -139
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +68 -374
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/copilot-env-routing.d.ts +36 -0
- package/dist/core/copilot-env-routing.d.ts.map +1 -0
- package/dist/core/copilot-env-routing.js +94 -0
- package/dist/core/copilot-env-routing.js.map +1 -0
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +10 -2
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +0 -40
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/fallback-models.d.ts +4 -4
- package/dist/core/fallback-models.d.ts.map +1 -1
- package/dist/core/fallback-models.js +3 -3
- package/dist/core/fallback-models.js.map +1 -1
- package/dist/core/model-config.d.ts +542 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/{model-registry-schemas.js → model-config.js} +85 -34
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/model-registry.d.ts +25 -85
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +65 -388
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts +2 -2
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.js +2 -2
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts +4 -4
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +17 -17
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver-scope.d.ts +3 -3
- package/dist/core/model-resolver-scope.d.ts.map +1 -1
- package/dist/core/model-resolver-scope.js +4 -4
- package/dist/core/model-resolver-scope.js.map +1 -1
- package/dist/core/model-runtime-auth.d.ts +7 -0
- package/dist/core/model-runtime-auth.d.ts.map +1 -0
- package/dist/core/model-runtime-auth.js +14 -0
- package/dist/core/model-runtime-auth.js.map +1 -0
- package/dist/core/model-runtime-providers.d.ts +6 -0
- package/dist/core/model-runtime-providers.d.ts.map +1 -0
- package/dist/core/model-runtime-providers.js +22 -0
- package/dist/core/model-runtime-providers.js.map +1 -0
- package/dist/core/model-runtime-restoration.d.ts +6 -0
- package/dist/core/model-runtime-restoration.d.ts.map +1 -0
- package/dist/core/model-runtime-restoration.js +21 -0
- package/dist/core/model-runtime-restoration.js.map +1 -0
- package/dist/core/model-runtime-snapshot.d.ts +16 -0
- package/dist/core/model-runtime-snapshot.d.ts.map +1 -0
- package/dist/core/model-runtime-snapshot.js +52 -0
- package/dist/core/model-runtime-snapshot.js.map +1 -0
- package/dist/core/model-runtime-streaming.d.ts +17 -0
- package/dist/core/model-runtime-streaming.d.ts.map +1 -0
- package/dist/core/model-runtime-streaming.js +66 -0
- package/dist/core/model-runtime-streaming.js.map +1 -0
- package/dist/core/model-runtime-types.d.ts +21 -0
- package/dist/core/model-runtime-types.d.ts.map +1 -0
- package/dist/core/model-runtime-types.js +2 -0
- package/dist/core/model-runtime-types.js.map +1 -0
- package/dist/core/model-runtime.d.ts +50 -29
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +330 -90
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +2 -10
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -29
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/oauth-login.d.ts +24 -0
- package/dist/core/oauth-login.d.ts.map +1 -0
- package/dist/core/oauth-login.js +87 -0
- package/dist/core/oauth-login.js.map +1 -0
- package/dist/core/oauth-provider-metadata.d.ts +5 -0
- package/dist/core/oauth-provider-metadata.d.ts.map +1 -0
- package/dist/core/oauth-provider-metadata.js +19 -0
- package/dist/core/oauth-provider-metadata.js.map +1 -0
- package/dist/core/provider-composer-internal.d.ts +53 -0
- package/dist/core/provider-composer-internal.d.ts.map +1 -0
- package/dist/core/provider-composer-internal.js +273 -0
- package/dist/core/provider-composer-internal.js.map +1 -0
- package/dist/core/provider-composer.d.ts +16 -0
- package/dist/core/provider-composer.d.ts.map +1 -0
- package/dist/core/provider-composer.js +108 -0
- package/dist/core/provider-composer.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +74 -122
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts +8 -7
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +26 -23
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +16 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -0
- package/dist/core/runtime-credentials.js +42 -0
- package/dist/core/runtime-credentials.js.map +1 -0
- package/dist/core/sdk-types.d.ts +1 -7
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +27 -28
- package/dist/core/sdk.js.map +1 -1
- package/dist/extensions/llama/index.js +1 -1
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +2 -4
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +25 -17
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/main-runtime-api-key.d.ts +6 -0
- package/dist/main-runtime-api-key.d.ts.map +1 -0
- package/dist/main-runtime-api-key.js +6 -0
- package/dist/main-runtime-api-key.js.map +1 -0
- package/dist/main-session-options.d.ts +2 -2
- package/dist/main-session-options.d.ts.map +1 -1
- package/dist/main-session-options.js +3 -3
- package/dist/main-session-options.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +9 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -3
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +4 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +56 -73
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +4 -3
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +15 -24
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +1 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +20 -31
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.d.ts +1 -1
- package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-auth-routing.js +21 -47
- package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +3 -3
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +8 -8
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +2 -1
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-model-catalog-startup.js +2 -2
- package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +11 -11
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +1 -1
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +2 -2
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.d.ts +2 -2
- package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js +4 -3
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +4 -3
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts +0 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js +11 -50
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/rpc/rpc-client-api.d.ts +2 -2
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-api.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +26 -19
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-oauth-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-oauth-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-oauth-client.js +1 -1
- package/dist/modes/rpc/rpc-oauth-client.js.map +1 -1
- package/dist/modes/rpc/rpc-oauth-interaction.d.ts +1 -1
- package/dist/modes/rpc/rpc-oauth-interaction.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-oauth-interaction.js +1 -1
- package/dist/modes/rpc/rpc-oauth-interaction.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.d.ts +4 -5
- package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js +19 -66
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/modes/rpc/rpc-session-binding.js +1 -1
- package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +7 -4
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +5 -7
- package/dist/package-manager-cli.js.map +1 -1
- package/docs/changelog.mdx +1 -1
- package/docs/custom-provider.md +1 -1
- package/docs/models.md +4 -6
- package/docs/providers.md +13 -0
- package/docs/quickstart.md +2 -1
- package/docs/sdk.md +32 -49
- package/docs/workflows.md +3 -3
- package/examples/sdk/02-custom-model.ts +8 -10
- package/examples/sdk/09-api-keys-and-oauth.ts +17 -23
- package/examples/sdk/12-full-control.ts +9 -11
- package/examples/sdk/README.md +17 -21
- package/npm-shrinkwrap.json +23 -23
- package/package.json +2 -2
- package/dist/core/model-registry-auth.d.ts +0 -10
- package/dist/core/model-registry-auth.d.ts.map +0 -1
- package/dist/core/model-registry-auth.js +0 -98
- package/dist/core/model-registry-auth.js.map +0 -1
- package/dist/core/model-registry-builtins.d.ts +0 -8
- package/dist/core/model-registry-builtins.d.ts.map +0 -1
- package/dist/core/model-registry-builtins.js +0 -104
- package/dist/core/model-registry-builtins.js.map +0 -1
- package/dist/core/model-registry-custom-loader.d.ts +0 -3
- package/dist/core/model-registry-custom-loader.d.ts.map +0 -1
- package/dist/core/model-registry-custom-loader.js +0 -255
- package/dist/core/model-registry-custom-loader.js.map +0 -1
- package/dist/core/model-registry-dynamic.d.ts +0 -7
- package/dist/core/model-registry-dynamic.d.ts.map +0 -1
- package/dist/core/model-registry-dynamic.js +0 -189
- package/dist/core/model-registry-dynamic.js.map +0 -1
- package/dist/core/model-registry-extension-refresh.d.ts +0 -23
- package/dist/core/model-registry-extension-refresh.d.ts.map +0 -1
- package/dist/core/model-registry-extension-refresh.js +0 -32
- package/dist/core/model-registry-extension-refresh.js.map +0 -1
- package/dist/core/model-registry-loader.d.ts +0 -5
- package/dist/core/model-registry-loader.d.ts.map +0 -1
- package/dist/core/model-registry-loader.js +0 -29
- package/dist/core/model-registry-loader.js.map +0 -1
- package/dist/core/model-registry-schemas.d.ts +0 -1399
- package/dist/core/model-registry-schemas.d.ts.map +0 -1
- package/dist/core/model-registry-schemas.js.map +0 -1
- package/dist/core/model-registry-types.d.ts +0 -91
- package/dist/core/model-registry-types.d.ts.map +0 -1
- package/dist/core/model-registry-types.js +0 -2
- package/dist/core/model-registry-types.js.map +0 -1
- package/dist/core/model-registry-validation.d.ts +0 -7
- package/dist/core/model-registry-validation.d.ts.map +0 -1
- package/dist/core/model-registry-validation.js +0 -12
- package/dist/core/model-registry-validation.js.map +0 -1
- package/dist/core/oauth-compat.d.ts +0 -17
- package/dist/core/oauth-compat.d.ts.map +0 -1
- package/dist/core/oauth-compat.js +0 -2
- package/dist/core/oauth-compat.js.map +0 -1
- package/dist/core/oauth-provider-bridge.d.ts +0 -63
- package/dist/core/oauth-provider-bridge.d.ts.map +0 -1
- package/dist/core/oauth-provider-bridge.js +0 -232
- package/dist/core/oauth-provider-bridge.js.map +0 -1
|
@@ -1,120 +1,360 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { createModels, } from "@earendil-works/pi-ai";
|
|
3
|
+
import * as builtinProviderCatalog from "@earendil-works/pi-ai/providers/all";
|
|
4
|
+
import { getAgentDir } from "../config.js";
|
|
5
|
+
import { AuthStorage as DefaultAuthStorage } from "./auth-storage.js";
|
|
6
|
+
import { ModelConfig } from "./model-config.js";
|
|
7
|
+
import { FileModelsStore, InMemoryCodingAgentModelsStore } from "./models-store.js";
|
|
8
|
+
import { composeModelProvider, configuredRequestAuthStatus, resolveCompatibilityRequestConfig, validateExtensionProvider, } from "./provider-composer.js";
|
|
9
|
+
import { withRemoteCatalog } from "./remote-catalog-provider.js";
|
|
10
|
+
import { RuntimeCredentials } from "./runtime-credentials.js";
|
|
11
|
+
import { isOfflineModeEnabled } from "./package-manager-env.js";
|
|
12
|
+
import { collectOAuthProviderMetadata } from "./oauth-provider-metadata.js";
|
|
13
|
+
import { OAuthLoginTransactionError } from "./oauth-login.js";
|
|
14
|
+
import { addRuntimeApiKeyProvider, createEmptyModelRuntimeSnapshot, createModelRuntimeSnapshot, getSnapshotProviderAuthStatus, updateSnapshotModels, } from "./model-runtime-snapshot.js";
|
|
15
|
+
import { ModelRuntimeStreaming } from "./model-runtime-streaming.js";
|
|
16
|
+
import { canRestoreUnknownModel as canRestoreUnknownModelProvider } from "./model-runtime-restoration.js";
|
|
17
|
+
import { mergeConfiguredAuthHeaders } from "./model-runtime-auth.js";
|
|
18
|
+
import { configureBuiltinProviders } from "./model-runtime-providers.js";
|
|
19
|
+
/** Configured pi-ai Models collection used by coding-agent and SDK consumers. */
|
|
19
20
|
export class ModelRuntime {
|
|
20
|
-
constructor(
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
21
|
+
constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled) {
|
|
22
|
+
this.builtins = new Map();
|
|
23
|
+
this.nativeExtensionProviders = new Map();
|
|
24
|
+
this.extensionProviders = new Map();
|
|
25
|
+
this.compositionErrors = new Map();
|
|
26
|
+
this.snapshot = createEmptyModelRuntimeSnapshot();
|
|
27
|
+
this.credentials = credentials;
|
|
28
|
+
this.config = config;
|
|
29
|
+
this.modelsPath = modelsPath;
|
|
30
|
+
this.modelNetworkEnabled = modelNetworkEnabled;
|
|
31
|
+
this.defaultBuiltins = new Map(providers.map((provider) => [provider.id, provider]));
|
|
32
|
+
for (const [providerId, provider] of this.defaultBuiltins)
|
|
33
|
+
this.builtins.set(providerId, provider);
|
|
34
|
+
this.models = createModels({ credentials, modelsStore });
|
|
35
|
+
this.streaming = new ModelRuntimeStreaming(this.models, (model, overrides) => this.getAuth(model, overrides));
|
|
36
|
+
this.rebuildProviders();
|
|
23
37
|
}
|
|
24
38
|
static async create(options = {}) {
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
const credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));
|
|
40
|
+
const modelsPath = options.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), "models.json"));
|
|
41
|
+
const config = await ModelConfig.load(modelsPath);
|
|
42
|
+
const modelsStore = options.modelsStore ??
|
|
43
|
+
(modelsPath
|
|
44
|
+
? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), "models-store.json"))
|
|
45
|
+
: new InMemoryCodingAgentModelsStore());
|
|
46
|
+
const builtinModelDataGeneratedAt = builtinProviderCatalog.getBuiltinModelDataGeneratedAt();
|
|
47
|
+
const providers = builtinProviderCatalog
|
|
48
|
+
.builtinProviders()
|
|
49
|
+
.map((provider) => provider.id === "radius"
|
|
50
|
+
? provider
|
|
51
|
+
: withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt));
|
|
52
|
+
const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, !isOfflineModeEnabled());
|
|
53
|
+
runtime.configureRadiusProviders();
|
|
54
|
+
runtime.rebuildProviders();
|
|
55
|
+
const refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;
|
|
56
|
+
const controller = refreshFromNetwork ? new AbortController() : undefined;
|
|
57
|
+
const timeout = controller
|
|
58
|
+
? setTimeout(() => controller.abort(), options.modelRefreshTimeoutMs ?? 15_000)
|
|
59
|
+
: undefined;
|
|
60
|
+
try {
|
|
61
|
+
await runtime.refresh({ allowNetwork: refreshFromNetwork, signal: controller?.signal });
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (timeout)
|
|
65
|
+
clearTimeout(timeout);
|
|
66
|
+
}
|
|
35
67
|
return runtime;
|
|
36
68
|
}
|
|
37
|
-
|
|
38
|
-
|
|
69
|
+
configureRadiusProviders() {
|
|
70
|
+
configureBuiltinProviders(this.builtins, this.defaultBuiltins, this.config);
|
|
71
|
+
}
|
|
72
|
+
providerIds() {
|
|
73
|
+
return new Set([
|
|
74
|
+
...this.builtins.keys(),
|
|
75
|
+
...this.nativeExtensionProviders.keys(),
|
|
76
|
+
...this.config.getProviderIds(),
|
|
77
|
+
...this.extensionProviders.keys(),
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
recomposeProvider(providerId) {
|
|
81
|
+
const base = this.nativeExtensionProviders.get(providerId) ?? this.builtins.get(providerId);
|
|
82
|
+
const extension = this.extensionProviders.get(providerId);
|
|
83
|
+
if (!base && !this.config.getProvider(providerId) && !extension) {
|
|
84
|
+
this.models.deleteProvider(providerId);
|
|
85
|
+
this.compositionErrors.delete(providerId);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (base && !this.config.getProvider(providerId) && !extension) {
|
|
89
|
+
// No overlays: use the builtin untouched so its auth/login/stream behavior is exact.
|
|
90
|
+
this.models.setProvider(base);
|
|
91
|
+
this.compositionErrors.delete(providerId);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
this.models.setProvider(composeModelProvider(providerId, base, this.config, extension));
|
|
96
|
+
this.compositionErrors.delete(providerId);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.compositionErrors.set(providerId, error instanceof Error ? error.message : String(error));
|
|
100
|
+
if (base)
|
|
101
|
+
this.models.setProvider(base);
|
|
102
|
+
else
|
|
103
|
+
this.models.deleteProvider(providerId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
rebuildProviders() {
|
|
107
|
+
this.models.clearProviders();
|
|
108
|
+
this.compositionErrors.clear();
|
|
109
|
+
for (const providerId of this.providerIds())
|
|
110
|
+
this.recomposeProvider(providerId);
|
|
111
|
+
this.updateModelSnapshot();
|
|
112
|
+
}
|
|
113
|
+
updateModelSnapshot() {
|
|
114
|
+
this.snapshot = updateSnapshotModels(this.snapshot, [...this.models.getModels()]);
|
|
115
|
+
}
|
|
116
|
+
async runAvailabilityRefresh() {
|
|
117
|
+
const providers = this.models.getProviders();
|
|
118
|
+
const [available, checks, credentials] = await Promise.all([
|
|
119
|
+
this.models.getAvailable(),
|
|
120
|
+
Promise.all(providers.map(async (provider) => [
|
|
121
|
+
provider.id,
|
|
122
|
+
await this.models.checkAuth(provider.id),
|
|
123
|
+
])),
|
|
124
|
+
this.credentials.list(),
|
|
125
|
+
]);
|
|
126
|
+
this.snapshot = createModelRuntimeSnapshot([...this.models.getModels()], [...available], checks, credentials);
|
|
127
|
+
this.availabilityError = undefined;
|
|
128
|
+
}
|
|
129
|
+
queueAvailabilityRefresh(after) {
|
|
130
|
+
const refresh = (after ?? Promise.resolve()).catch(() => { }).then(() => this.runAvailabilityRefresh());
|
|
131
|
+
const recorded = refresh.catch((error) => {
|
|
132
|
+
this.availabilityError = error instanceof Error ? error.message : String(error);
|
|
133
|
+
throw error;
|
|
134
|
+
});
|
|
135
|
+
const tracked = recorded.finally(() => {
|
|
136
|
+
if (this.availabilityRefresh === tracked)
|
|
137
|
+
this.availabilityRefresh = undefined;
|
|
138
|
+
});
|
|
139
|
+
this.availabilityRefresh = tracked;
|
|
140
|
+
return tracked;
|
|
141
|
+
}
|
|
142
|
+
/** Coalesce concurrent readers onto the pending refresh. */
|
|
143
|
+
refreshAvailability() {
|
|
144
|
+
return this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);
|
|
145
|
+
}
|
|
146
|
+
/** Mutations must not observe an in-flight refresh started before them. */
|
|
147
|
+
forceRefreshAvailability() {
|
|
148
|
+
return this.queueAvailabilityRefresh(this.availabilityRefresh);
|
|
149
|
+
}
|
|
150
|
+
getProviders() {
|
|
151
|
+
return this.models.getProviders();
|
|
152
|
+
}
|
|
153
|
+
getProvider(providerId) {
|
|
154
|
+
return this.models.getProvider(providerId);
|
|
155
|
+
}
|
|
156
|
+
/** Whether an authenticated provider may reconstruct an absent saved model ID. */
|
|
157
|
+
canRestoreUnknownModel(providerId) {
|
|
158
|
+
return canRestoreUnknownModelProvider(providerId, this.defaultBuiltins.get(providerId), this.config.getProvider(providerId), this.extensionProviders.get(providerId), this.nativeExtensionProviders.get(providerId));
|
|
159
|
+
}
|
|
39
160
|
getModels(providerId) {
|
|
40
|
-
return
|
|
161
|
+
return this.models.getModels(providerId);
|
|
162
|
+
}
|
|
163
|
+
getModel(providerId, modelId) {
|
|
164
|
+
return this.models.getModel(providerId, modelId);
|
|
165
|
+
}
|
|
166
|
+
async checkAuth(providerId) {
|
|
167
|
+
return this.models.checkAuth(providerId);
|
|
41
168
|
}
|
|
42
|
-
getModel(providerId, modelId) { return this.modelRegistry.find(providerId, modelId); }
|
|
43
|
-
checkAuth(providerId) { return this.modelRegistry.checkAuth(providerId); }
|
|
44
169
|
async getAvailable(providerId) {
|
|
45
|
-
|
|
46
|
-
|
|
170
|
+
if (providerId) {
|
|
171
|
+
if (this.availabilityRefresh) {
|
|
172
|
+
await this.availabilityRefresh;
|
|
173
|
+
return this.snapshot.available.filter((model) => model.provider === providerId);
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
return await this.models.getAvailable(providerId);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
this.availabilityError = error instanceof Error ? error.message : String(error);
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
await this.refreshAvailability();
|
|
184
|
+
return this.snapshot.available;
|
|
185
|
+
}
|
|
186
|
+
getAvailableSnapshot() {
|
|
187
|
+
return this.snapshot.available;
|
|
47
188
|
}
|
|
48
|
-
getAvailableSnapshot() { return this.modelRegistry.getAvailable(); }
|
|
49
189
|
getError() {
|
|
50
|
-
const errors = [
|
|
51
|
-
|
|
190
|
+
const errors = [];
|
|
191
|
+
const configError = this.config.getError();
|
|
192
|
+
if (configError)
|
|
193
|
+
errors.push(configError);
|
|
194
|
+
for (const [providerId, error] of this.compositionErrors) {
|
|
195
|
+
errors.push(`Provider "${providerId}": ${error}`);
|
|
196
|
+
}
|
|
197
|
+
if (this.availabilityError)
|
|
198
|
+
errors.push(`Availability refresh: ${this.availabilityError}`);
|
|
199
|
+
return errors.length > 0 ? errors.join("\n\n") : undefined;
|
|
200
|
+
}
|
|
201
|
+
getRegisteredProviderConfig(providerId) {
|
|
202
|
+
return this.extensionProviders.get(providerId);
|
|
203
|
+
}
|
|
204
|
+
getRegisteredProviderIds() {
|
|
205
|
+
return [...new Set([...this.extensionProviders.keys(), ...this.nativeExtensionProviders.keys()])];
|
|
206
|
+
}
|
|
207
|
+
getRegisteredNativeProvider(providerId) {
|
|
208
|
+
return this.nativeExtensionProviders.get(providerId);
|
|
209
|
+
}
|
|
210
|
+
getOAuthProviderMetadata() { return collectOAuthProviderMetadata(this.getProviders(), this.extensionProviders); }
|
|
211
|
+
/** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */
|
|
212
|
+
getCompatibilityRequestConfig(model) {
|
|
213
|
+
return resolveCompatibilityRequestConfig(model, this.config.getProvider(model.provider), this.extensionProviders.get(model.provider));
|
|
214
|
+
}
|
|
215
|
+
isUsingOAuth(providerId) {
|
|
216
|
+
return this.snapshot.auth.get(providerId)?.type === "oauth";
|
|
217
|
+
}
|
|
218
|
+
hasConfiguredAuth(providerId) {
|
|
219
|
+
return this.snapshot.configuredProviders.has(providerId);
|
|
52
220
|
}
|
|
53
|
-
getAuth(providerOrModel, overrides) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
221
|
+
async getAuth(providerOrModel, overrides = {}) {
|
|
222
|
+
if (typeof providerOrModel === "string")
|
|
223
|
+
return this.models.getAuth(providerOrModel, overrides);
|
|
224
|
+
const resolution = await this.models.getAuth(providerOrModel, overrides);
|
|
225
|
+
if (!resolution)
|
|
226
|
+
return undefined;
|
|
227
|
+
return mergeConfiguredAuthHeaders(resolution, providerOrModel, this.config, this.extensionProviders.get(providerOrModel.provider), overrides);
|
|
57
228
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
229
|
+
/** Reload credentials changed by the authoritative isolated engine and update auth status snapshots. */
|
|
230
|
+
async reloadCredentials() {
|
|
231
|
+
await this.credentials.reload();
|
|
232
|
+
await this.forceRefreshAvailability();
|
|
233
|
+
}
|
|
234
|
+
async saveCredential(providerId, credential) {
|
|
235
|
+
await this.credentials.modify(providerId, async () => credential);
|
|
236
|
+
await this.refresh();
|
|
237
|
+
}
|
|
238
|
+
async setRuntimeApiKey(providerId, apiKey, refreshOptions = {}) {
|
|
239
|
+
this.credentials.setRuntimeApiKey(providerId, apiKey);
|
|
240
|
+
this.snapshot = addRuntimeApiKeyProvider(this.snapshot, providerId);
|
|
241
|
+
await this.refresh(refreshOptions);
|
|
64
242
|
}
|
|
65
243
|
async removeRuntimeApiKey(providerId) {
|
|
66
|
-
this.
|
|
67
|
-
await this.refresh({ allowNetwork:
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const { transformHeaders, ...providerOptions } = options ?? {};
|
|
78
|
-
let headers = mergeHeaders(auth.headers, providerOptions.headers);
|
|
79
|
-
if (transformHeaders)
|
|
80
|
-
headers = await transformHeaders(headers ?? {});
|
|
81
|
-
return {
|
|
82
|
-
provider,
|
|
83
|
-
model: auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model,
|
|
84
|
-
options: { ...providerOptions, apiKey: providerOptions.apiKey ?? auth.apiKey, headers },
|
|
85
|
-
};
|
|
244
|
+
this.credentials.removeRuntimeApiKey(providerId);
|
|
245
|
+
await this.refresh({ allowNetwork: this.modelNetworkEnabled });
|
|
246
|
+
}
|
|
247
|
+
listCredentials() {
|
|
248
|
+
return this.credentials.list();
|
|
249
|
+
}
|
|
250
|
+
getStoredCredentialType(providerId) {
|
|
251
|
+
return this.snapshot.storedCredentialTypes.get(providerId);
|
|
252
|
+
}
|
|
253
|
+
getProviderAuthStatus(providerId) {
|
|
254
|
+
return getSnapshotProviderAuthStatus(this.snapshot, providerId, this.credentials.hasRuntimeApiKey(providerId), configuredRequestAuthStatus(this.config.getProvider(providerId), this.extensionProviders.get(providerId)));
|
|
86
255
|
}
|
|
87
256
|
stream(model, context, options) {
|
|
88
|
-
return
|
|
89
|
-
const prepared = await this.prepare(model, options);
|
|
90
|
-
return prepared.provider.stream(prepared.model, context, prepared.options);
|
|
91
|
-
});
|
|
257
|
+
return this.streaming.stream(model, context, options);
|
|
92
258
|
}
|
|
93
259
|
complete(model, context, options) {
|
|
94
|
-
return this.
|
|
260
|
+
return this.streaming.complete(model, context, options);
|
|
95
261
|
}
|
|
96
262
|
streamSimple(model, context, options) {
|
|
97
|
-
return
|
|
98
|
-
const prepared = await this.prepare(model, options);
|
|
99
|
-
return prepared.provider.streamSimple(prepared.model, context, prepared.options);
|
|
100
|
-
});
|
|
263
|
+
return this.streaming.streamSimple(model, context, options);
|
|
101
264
|
}
|
|
102
265
|
completeSimple(model, context, options) {
|
|
103
|
-
return this.
|
|
266
|
+
return this.streaming.completeSimple(model, context, options);
|
|
104
267
|
}
|
|
105
268
|
async login(providerId, type, interaction) {
|
|
106
|
-
const credential = await this.
|
|
107
|
-
|
|
108
|
-
|
|
269
|
+
const credential = await this.models.login(providerId, type, interaction);
|
|
270
|
+
try {
|
|
271
|
+
await this.refresh({ allowNetwork: this.modelNetworkEnabled });
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
throw new OAuthLoginTransactionError(error);
|
|
275
|
+
}
|
|
109
276
|
return credential;
|
|
110
277
|
}
|
|
111
278
|
async logout(providerId) {
|
|
112
|
-
await this.
|
|
113
|
-
|
|
279
|
+
await this.models.logout(providerId);
|
|
280
|
+
// Reset credential-dependent compatibility projections before the unconfigured provider is skipped by refresh.
|
|
281
|
+
this.recomposeProvider(providerId);
|
|
282
|
+
await this.refresh({ allowNetwork: this.modelNetworkEnabled });
|
|
283
|
+
}
|
|
284
|
+
async refresh(options = {}) {
|
|
285
|
+
this.config = await ModelConfig.load(this.modelsPath);
|
|
286
|
+
this.configureRadiusProviders();
|
|
287
|
+
this.rebuildProviders();
|
|
288
|
+
const refreshOptions = {
|
|
289
|
+
...options,
|
|
290
|
+
allowNetwork: options.allowNetwork ?? this.modelNetworkEnabled,
|
|
291
|
+
};
|
|
292
|
+
// Published pi-ai builds before ModelsStore returned void and accepted a provider ID.
|
|
293
|
+
// The fallback keeps source-mode CLI tests working without rebuilding workspace dependencies.
|
|
294
|
+
const result = (await this.models.refresh(refreshOptions)) ?? {
|
|
295
|
+
aborted: refreshOptions.signal?.aborted ?? false,
|
|
296
|
+
errors: new Map(),
|
|
297
|
+
};
|
|
298
|
+
this.updateModelSnapshot();
|
|
299
|
+
try {
|
|
300
|
+
await this.forceRefreshAvailability();
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
// Availability errors are recorded by forceRefreshAvailability; refreshed models remain usable.
|
|
304
|
+
}
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
registerNativeProvider(provider) {
|
|
308
|
+
if (!provider.id.trim())
|
|
309
|
+
throw new Error("Provider id must not be empty.");
|
|
310
|
+
this.extensionProviders.delete(provider.id);
|
|
311
|
+
this.nativeExtensionProviders.set(provider.id, provider);
|
|
312
|
+
this.recomposeProvider(provider.id);
|
|
313
|
+
this.updateModelSnapshot();
|
|
314
|
+
void this.refresh({ allowNetwork: false });
|
|
315
|
+
}
|
|
316
|
+
registerProvider(providerId, config) {
|
|
317
|
+
// Validate the incoming registration on its own, like the legacy registry:
|
|
318
|
+
// a broken re-registration must throw without touching the stored config.
|
|
319
|
+
validateExtensionProvider(providerId, this.builtins.get(providerId), this.config.getProvider(providerId), config);
|
|
320
|
+
this.nativeExtensionProviders.delete(providerId);
|
|
321
|
+
// Re-registration merges defined values over the previous registration and
|
|
322
|
+
// preserves undefined ones, matching the legacy ModelRegistry contract.
|
|
323
|
+
const previous = this.extensionProviders.get(providerId);
|
|
324
|
+
const effective = { ...previous };
|
|
325
|
+
for (const [key, value] of Object.entries(config)) {
|
|
326
|
+
if (value !== undefined)
|
|
327
|
+
effective[key] = value;
|
|
328
|
+
}
|
|
329
|
+
this.extensionProviders.set(providerId, effective);
|
|
330
|
+
this.recomposeProvider(providerId);
|
|
331
|
+
this.updateModelSnapshot();
|
|
332
|
+
if (this.snapshot.storedProviders.has(providerId) ||
|
|
333
|
+
configuredRequestAuthStatus(this.config.getProvider(providerId), effective)?.configured) {
|
|
334
|
+
const configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);
|
|
335
|
+
const auth = new Map(this.snapshot.auth);
|
|
336
|
+
// Provisional entry until the async refresh lands; never clobber a real check result.
|
|
337
|
+
if (!auth.get(providerId)) {
|
|
338
|
+
auth.set(providerId, {
|
|
339
|
+
type: effective.oauth && !effective.apiKey ? "oauth" : "api_key",
|
|
340
|
+
source: "configured provider",
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
this.snapshot = {
|
|
344
|
+
...this.snapshot,
|
|
345
|
+
auth,
|
|
346
|
+
configuredProviders,
|
|
347
|
+
available: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
void this.refresh({ allowNetwork: false });
|
|
351
|
+
}
|
|
352
|
+
unregisterProvider(providerId) {
|
|
353
|
+
this.extensionProviders.delete(providerId);
|
|
354
|
+
this.nativeExtensionProviders.delete(providerId);
|
|
355
|
+
this.recomposeProvider(providerId);
|
|
356
|
+
this.updateModelSnapshot();
|
|
357
|
+
void this.refresh({ allowNetwork: false });
|
|
114
358
|
}
|
|
115
|
-
async reloadConfig() { await this.refresh({ allowNetwork: false }); }
|
|
116
|
-
refresh(options = {}) { return this.modelRegistry.refresh(options); }
|
|
117
|
-
registerProvider(provider) { this.modelRegistry.registerProvider(provider); }
|
|
118
|
-
unregisterProvider(providerId) { this.modelRegistry.unregisterProvider(providerId); }
|
|
119
359
|
}
|
|
120
360
|
//# sourceMappingURL=model-runtime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-runtime.js","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ApiStreamOptions,\n AssistantMessage,\n AssistantMessageEventStream,\n AuthInteraction,\n AuthResult,\n AuthType,\n Context,\n Credential,\n CredentialInfo,\n Models,\n ModelsApiStreamOptions,\n ModelsRefreshOptions,\n ModelsRefreshResult,\n ModelsSimpleStreamOptions,\n Provider,\n ProviderHeaders,\n StreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { lazyStream } from \"@earendil-works/pi-ai\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentConfigPaths } from \"../config.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { AuthStatus } from \"./auth-storage.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\n\nexport interface CreateModelRuntimeOptions {\n authStorage?: AuthStorage;\n authPath?: string | string[];\n modelRegistry?: ModelRegistry;\n modelsPath?: string | string[] | null;\n allowModelNetwork?: boolean;\n modelRefreshTimeoutMs?: number;\n}\n\nexport interface ModelRuntimeAuthOverrides {\n apiKey?: string;\n env?: Record<string, string>;\n}\n\nfunction mergeHeaders(base?: ProviderHeaders, override?: ProviderHeaders): ProviderHeaders | undefined {\n if (!base && !override) return undefined;\n const merged = { ...base };\n for (const [name, value] of Object.entries(override ?? {})) {\n for (const existing of Object.keys(merged)) {\n if (existing.toLowerCase() === name.toLowerCase()) delete merged[existing];\n }\n merged[name] = value;\n }\n return merged;\n}\n\n/** Canonical model/auth facade for SDK consumers. */\nexport class ModelRuntime implements Models {\n readonly modelRegistry: ModelRegistry;\n readonly authStorage: AuthStorage;\n\n constructor(modelRegistry: ModelRegistry, authStorage: AuthStorage = modelRegistry.authStorage) {\n this.modelRegistry = modelRegistry;\n this.authStorage = authStorage;\n }\n\n static async create(options: CreateModelRuntimeOptions = {}): Promise<ModelRuntime> {\n const authStorage = options.authStorage ?? AuthStorage.create(options.authPath);\n const paths = options.modelsPath === null ? [] : (options.modelsPath ?? getAgentConfigPaths(\"models.json\"));\n const modelRegistry = options.modelRegistry ?? (\n Array.isArray(paths) && paths.length === 0\n ? ModelRegistry.inMemory(authStorage)\n : ModelRegistry.create(authStorage, paths)\n );\n const runtime = new ModelRuntime(modelRegistry, authStorage);\n await modelRegistry.refresh({\n allowNetwork: options.allowModelNetwork ?? false,\n timeoutMs: options.modelRefreshTimeoutMs,\n });\n return runtime;\n }\n\n getProviders(): readonly Provider[] { return this.modelRegistry.getProviders(); }\n getProvider(providerId: string): Provider | undefined { return this.modelRegistry.getProvider(providerId); }\n getModels(providerId?: string): readonly Model<Api>[] {\n return providerId ? this.modelRegistry.getAll().filter((model) => model.provider === providerId) : this.modelRegistry.getAll();\n }\n getModel(providerId: string, modelId: string): Model<Api> | undefined { return this.modelRegistry.find(providerId, modelId); }\n checkAuth(providerId: string) { return this.modelRegistry.checkAuth(providerId); }\n async getAvailable(providerId?: string): Promise<readonly Model<Api>[]> {\n const models = this.modelRegistry.getAvailable();\n return providerId ? models.filter((model) => model.provider === providerId) : models;\n }\n getAvailableSnapshot(): readonly Model<Api>[] { return this.modelRegistry.getAvailable(); }\n getError(): string | undefined {\n const errors = [this.modelRegistry.getError(), this.authStorage.getLoadError()?.message].filter((value): value is string => Boolean(value));\n return errors.length ? errors.join(\"\\n\\n\") : undefined;\n }\n getAuth(providerId: string, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n getAuth(model: Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n getAuth(providerOrModel: string | Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined> {\n return typeof providerOrModel === \"string\"\n ? this.modelRegistry.getAuth(providerOrModel, overrides)\n : this.modelRegistry.getAuth(providerOrModel, overrides);\n }\n getProviderAuthStatus(providerId: string): AuthStatus { return this.modelRegistry.getProviderAuthStatus(providerId); }\n isUsingOAuth(providerId: string): boolean { return this.authStorage.get(providerId)?.type === \"oauth\"; }\n hasConfiguredAuth(providerId: string): boolean { return this.modelRegistry.getProviderAuthStatus(providerId).configured; }\n async setRuntimeApiKey(providerId: string, apiKey: string, options: ModelsRefreshOptions = {}): Promise<void> {\n this.authStorage.setRuntimeApiKey(providerId, apiKey);\n await this.refresh(options);\n }\n async removeRuntimeApiKey(providerId: string): Promise<void> {\n this.authStorage.removeRuntimeApiKey(providerId);\n await this.refresh({ allowNetwork: false });\n }\n async listCredentials(): Promise<readonly CredentialInfo[]> { return this.authStorage.asCredentialStore().list(); }\n\n private async prepare(\n model: Model<Api>,\n options: (StreamOptions & { transformHeaders?: (headers: ProviderHeaders) => ProviderHeaders | Promise<ProviderHeaders> }) | undefined,\n ) {\n const provider = this.getProvider(model.provider);\n if (!provider) throw new Error(`Unknown provider: ${model.provider}`);\n const auth = await this.modelRegistry.getApiKeyAndHeaders(model);\n if (!auth.ok) throw new Error(auth.error);\n const { transformHeaders, ...providerOptions } = options ?? {};\n let headers = mergeHeaders(auth.headers, providerOptions.headers);\n if (transformHeaders) headers = await transformHeaders(headers ?? {});\n return {\n provider,\n model: auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model,\n options: { ...providerOptions, apiKey: providerOptions.apiKey ?? auth.apiKey, headers },\n };\n }\n stream<TApi extends Api>(model: Model<TApi>, context: Context, options?: ModelsApiStreamOptions<TApi>): AssistantMessageEventStream {\n return lazyStream(model, async () => {\n const prepared = await this.prepare(model, options as StreamOptions | undefined);\n return prepared.provider.stream(prepared.model as Model<TApi>, context, prepared.options as ApiStreamOptions<TApi>);\n });\n }\n complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: ModelsApiStreamOptions<TApi>): Promise<AssistantMessage> {\n return this.stream(model, context, options).result();\n }\n streamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream {\n return lazyStream(model, async () => {\n const prepared = await this.prepare(model, options);\n return prepared.provider.streamSimple(prepared.model, context, prepared.options);\n });\n }\n completeSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage> {\n return this.streamSimple(model, context, options).result();\n }\n async login(providerId: string, type: AuthType, interaction: AuthInteraction): Promise<Credential> {\n const credential = await this.modelRegistry.login(providerId, type, interaction);\n this.authStorage.reload();\n await this.refresh({ allowNetwork: false });\n return credential;\n }\n async logout(providerId: string): Promise<void> {\n await this.modelRegistry.logoutProvider(providerId);\n await this.refresh({ allowNetwork: false });\n }\n async reloadConfig(): Promise<void> { await this.refresh({ allowNetwork: false }); }\n refresh(options: ModelsRefreshOptions = {}): Promise<ModelsRefreshResult> { return this.modelRegistry.refresh(options); }\n registerProvider(provider: Provider): void { this.modelRegistry.registerProvider(provider); }\n unregisterProvider(providerId: string): void { this.modelRegistry.unregisterProvider(providerId); }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-runtime.js","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, join } from \"node:path\";\nimport {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\ttype AuthCheck,\n\ttype AuthInteraction,\n\ttype AuthResult,\n\ttype AuthType,\n\ttype Context,\n\ttype Credential,\n\ttype CredentialInfo,\n\tcreateModels,\n\ttype Model,\n\ttype Models,\n\ttype ModelsApiStreamOptions,\n\ttype ModelsRefreshOptions,\n\ttype ModelsRefreshResult,\n\ttype ModelsSimpleStreamOptions,\n\ttype ModelsStore,\n\ttype MutableModels,\n\ttype Provider,\n} from \"@earendil-works/pi-ai\";\nimport * as builtinProviderCatalog from \"@earendil-works/pi-ai/providers/all\";\nimport { getAgentDir } from \"../config.ts\";\nimport { AuthStorage as DefaultAuthStorage } from \"./auth-storage.ts\";\nimport { ModelConfig } from \"./model-config.ts\";\nimport { FileModelsStore, InMemoryCodingAgentModelsStore } from \"./models-store.ts\";\nimport {\n\ttype AuthStatus,\n\tcomposeModelProvider,\n\tconfiguredRequestAuthStatus,\n\ttype CompatibilityRequestConfig,\n\ttype ProviderConfigInput,\n\tresolveCompatibilityRequestConfig,\n\tvalidateExtensionProvider,\n} from \"./provider-composer.ts\";\nimport { withRemoteCatalog } from \"./remote-catalog-provider.ts\";\nimport { RuntimeCredentials } from \"./runtime-credentials.ts\";\nimport { isOfflineModeEnabled } from \"./package-manager-env.ts\";\nimport { collectOAuthProviderMetadata } from \"./oauth-provider-metadata.ts\";\nimport { OAuthLoginTransactionError } from \"./oauth-login.ts\";\nimport {\n\taddRuntimeApiKeyProvider,\n\tcreateEmptyModelRuntimeSnapshot,\n\tcreateModelRuntimeSnapshot,\n\tgetSnapshotProviderAuthStatus,\n\ttype ModelRuntimeSnapshot,\n\tupdateSnapshotModels,\n} from \"./model-runtime-snapshot.ts\";\nexport type { CreateModelRuntimeOptions, ModelRuntimeAuthOverrides } from \"./model-runtime-types.ts\";\nimport type { CreateModelRuntimeOptions, ModelRuntimeAuthOverrides } from \"./model-runtime-types.ts\";\nimport { ModelRuntimeStreaming } from \"./model-runtime-streaming.ts\";\nimport { canRestoreUnknownModel as canRestoreUnknownModelProvider } from \"./model-runtime-restoration.ts\";\nimport { mergeConfiguredAuthHeaders } from \"./model-runtime-auth.ts\";\nimport { configureBuiltinProviders } from \"./model-runtime-providers.ts\";\n/** Configured pi-ai Models collection used by coding-agent and SDK consumers. */\nexport class ModelRuntime implements Models {\n\tprivate readonly models: MutableModels;\n\tprivate readonly credentials: RuntimeCredentials;\n\tprivate readonly streaming: ModelRuntimeStreaming;\n\tprivate readonly defaultBuiltins: ReadonlyMap<string, Provider>;\n\tprivate readonly builtins = new Map<string, Provider>();\n\tprivate readonly nativeExtensionProviders = new Map<string, Provider>();\n\tprivate readonly extensionProviders = new Map<string, ProviderConfigInput>();\n\tprivate readonly compositionErrors = new Map<string, string>();\n\tprivate readonly modelsPath: string | undefined;\n\tprivate readonly modelNetworkEnabled: boolean;\n\tprivate config: ModelConfig;\n\tprivate snapshot: ModelRuntimeSnapshot = createEmptyModelRuntimeSnapshot();\n\tprivate availabilityRefresh: Promise<void> | undefined;\n\tprivate availabilityError: string | undefined;\n\tprivate constructor(\n\t\tcredentials: RuntimeCredentials,\n\t\tconfig: ModelConfig,\n\t\tmodelsPath: string | undefined,\n\t\tmodelsStore: ModelsStore,\n\t\tproviders: readonly Provider[],\n\t\tmodelNetworkEnabled: boolean,\n\t) {\n\t\tthis.credentials = credentials;\n\t\tthis.config = config;\n\t\tthis.modelsPath = modelsPath;\n\t\tthis.modelNetworkEnabled = modelNetworkEnabled;\n\t\tthis.defaultBuiltins = new Map(providers.map((provider) => [provider.id, provider]));\n\t\tfor (const [providerId, provider] of this.defaultBuiltins) this.builtins.set(providerId, provider);\n\t\tthis.models = createModels({ credentials, modelsStore });\n\t\tthis.streaming = new ModelRuntimeStreaming(this.models, (model, overrides) => this.getAuth(model, overrides));\n\t\tthis.rebuildProviders();\n\t}\n\tstatic async create(options: CreateModelRuntimeOptions = {}): Promise<ModelRuntime> {\n\t\tconst credentials = new RuntimeCredentials(options.credentials ?? DefaultAuthStorage.create(options.authPath));\n\t\tconst modelsPath =\n\t\t\toptions.modelsPath === null ? undefined : (options.modelsPath ?? join(getAgentDir(), \"models.json\"));\n\t\tconst config = await ModelConfig.load(modelsPath);\n\t\tconst modelsStore =\n\t\t\toptions.modelsStore ??\n\t\t\t(modelsPath\n\t\t\t\t? new FileModelsStore(options.modelsStorePath ?? join(dirname(modelsPath), \"models-store.json\"))\n\t\t\t\t: new InMemoryCodingAgentModelsStore());\n\t\tconst builtinModelDataGeneratedAt = builtinProviderCatalog.getBuiltinModelDataGeneratedAt();\n\t\tconst providers = builtinProviderCatalog\n\t\t\t.builtinProviders()\n\t\t\t.map((provider) =>\n\t\t\t\tprovider.id === \"radius\"\n\t\t\t\t\t? provider\n\t\t\t\t\t: withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt),\n\t\t\t);\n\t\tconst runtime = new ModelRuntime(\n\t\t\tcredentials,\n\t\t\tconfig,\n\t\t\tmodelsPath,\n\t\t\tmodelsStore,\n\t\t\tproviders,\n\t\t\t!isOfflineModeEnabled(),\n\t\t);\n\t\truntime.configureRadiusProviders();\n\t\truntime.rebuildProviders();\n\t\tconst refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;\n\t\tconst controller = refreshFromNetwork ? new AbortController() : undefined;\n\t\tconst timeout = controller\n\t\t\t? setTimeout(() => controller.abort(), options.modelRefreshTimeoutMs ?? 15_000)\n\t\t\t: undefined;\n\t\ttry {\n\t\t\tawait runtime.refresh({ allowNetwork: refreshFromNetwork, signal: controller?.signal });\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t}\n\t\treturn runtime;\n\t}\n\tprivate configureRadiusProviders(): void {\n\t\tconfigureBuiltinProviders(this.builtins, this.defaultBuiltins, this.config);\n\t}\n\tprivate providerIds(): Set<string> {\n\t\treturn new Set([\n\t\t\t...this.builtins.keys(),\n\t\t\t...this.nativeExtensionProviders.keys(),\n\t\t\t...this.config.getProviderIds(),\n\t\t\t...this.extensionProviders.keys(),\n\t\t]);\n\t}\n\tprivate recomposeProvider(providerId: string): void {\n\t\tconst base = this.nativeExtensionProviders.get(providerId) ?? this.builtins.get(providerId);\n\t\tconst extension = this.extensionProviders.get(providerId);\n\t\tif (!base && !this.config.getProvider(providerId) && !extension) {\n\t\t\tthis.models.deleteProvider(providerId);\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t\treturn;\n\t\t}\n\t\tif (base && !this.config.getProvider(providerId) && !extension) {\n\t\t\t// No overlays: use the builtin untouched so its auth/login/stream behavior is exact.\n\t\t\tthis.models.setProvider(base);\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.models.setProvider(composeModelProvider(providerId, base, this.config, extension));\n\t\t\tthis.compositionErrors.delete(providerId);\n\t\t} catch (error) {\n\t\t\tthis.compositionErrors.set(providerId, error instanceof Error ? error.message : String(error));\n\t\t\tif (base) this.models.setProvider(base);\n\t\t\telse this.models.deleteProvider(providerId);\n\t\t}\n\t}\n\tprivate rebuildProviders(): void {\n\t\tthis.models.clearProviders();\n\t\tthis.compositionErrors.clear();\n\t\tfor (const providerId of this.providerIds()) this.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t}\n\tprivate updateModelSnapshot(): void {\n\t\tthis.snapshot = updateSnapshotModels(this.snapshot, [...this.models.getModels()]);\n\t}\n\tprivate async runAvailabilityRefresh(): Promise<void> {\n\t\tconst providers = this.models.getProviders();\n\t\tconst [available, checks, credentials] = await Promise.all([\n\t\t\tthis.models.getAvailable(),\n\t\t\tPromise.all(\n\t\t\t\tproviders.map(\n\t\t\t\t\tasync (provider): Promise<[string, AuthCheck | undefined]> => [\n\t\t\t\t\t\tprovider.id,\n\t\t\t\t\t\tawait this.models.checkAuth(provider.id),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.credentials.list(),\n\t\t]);\n\t\tthis.snapshot = createModelRuntimeSnapshot(\n\t\t\t[...this.models.getModels()],\n\t\t\t[...available],\n\t\t\tchecks,\n\t\t\tcredentials,\n\t\t);\n\t\tthis.availabilityError = undefined;\n\t}\n\tprivate queueAvailabilityRefresh(after: Promise<void> | undefined): Promise<void> {\n\t\tconst refresh = (after ?? Promise.resolve()).catch(() => {}).then(() => this.runAvailabilityRefresh());\n\t\tconst recorded = refresh.catch((error) => {\n\t\t\tthis.availabilityError = error instanceof Error ? error.message : String(error);\n\t\t\tthrow error;\n\t\t});\n\t\tconst tracked = recorded.finally(() => {\n\t\t\tif (this.availabilityRefresh === tracked) this.availabilityRefresh = undefined;\n\t\t});\n\t\tthis.availabilityRefresh = tracked;\n\t\treturn tracked;\n\t}\n\t/** Coalesce concurrent readers onto the pending refresh. */\n\tprivate refreshAvailability(): Promise<void> {\n\t\treturn this.availabilityRefresh ?? this.queueAvailabilityRefresh(undefined);\n\t}\n\t/** Mutations must not observe an in-flight refresh started before them. */\n\tprivate forceRefreshAvailability(): Promise<void> {\n\t\treturn this.queueAvailabilityRefresh(this.availabilityRefresh);\n\t}\n\tgetProviders(): readonly Provider[] {\n\t\treturn this.models.getProviders();\n\t}\n\tgetProvider(providerId: string): Provider | undefined {\n\t\treturn this.models.getProvider(providerId);\n\t}\n\t/** Whether an authenticated provider may reconstruct an absent saved model ID. */\n\tcanRestoreUnknownModel(providerId: string): boolean {\n\t\treturn canRestoreUnknownModelProvider(\n\t\t\tproviderId,\n\t\t\tthis.defaultBuiltins.get(providerId),\n\t\t\tthis.config.getProvider(providerId),\n\t\t\tthis.extensionProviders.get(providerId),\n\t\t\tthis.nativeExtensionProviders.get(providerId),\n\t\t);\n\t}\n\tgetModels(providerId?: string): readonly Model<Api>[] {\n\t\treturn this.models.getModels(providerId);\n\t}\n\tgetModel(providerId: string, modelId: string): Model<Api> | undefined {\n\t\treturn this.models.getModel(providerId, modelId);\n\t}\n\tasync checkAuth(providerId: string): Promise<AuthCheck | undefined> {\n\t\treturn this.models.checkAuth(providerId);\n\t}\n\tasync getAvailable(providerId?: string): Promise<readonly Model<Api>[]> {\n\t\tif (providerId) {\n\t\t\tif (this.availabilityRefresh) {\n\t\t\t\tawait this.availabilityRefresh;\n\t\t\t\treturn this.snapshot.available.filter((model) => model.provider === providerId);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn await this.models.getAvailable(providerId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.availabilityError = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tawait this.refreshAvailability();\n\t\treturn this.snapshot.available;\n\t}\n\tgetAvailableSnapshot(): readonly Model<Api>[] {\n\t\treturn this.snapshot.available;\n\t}\n\tgetError(): string | undefined {\n\t\tconst errors: string[] = [];\n\t\tconst configError = this.config.getError();\n\t\tif (configError) errors.push(configError);\n\t\tfor (const [providerId, error] of this.compositionErrors) {\n\t\t\terrors.push(`Provider \"${providerId}\": ${error}`);\n\t\t}\n\t\tif (this.availabilityError) errors.push(`Availability refresh: ${this.availabilityError}`);\n\t\treturn errors.length > 0 ? errors.join(\"\\n\\n\") : undefined;\n\t}\n\n\tgetRegisteredProviderConfig(providerId: string): ProviderConfigInput | undefined {\n\t\treturn this.extensionProviders.get(providerId);\n\t}\n\n\tgetRegisteredProviderIds(): readonly string[] {\n\t\treturn [...new Set([...this.extensionProviders.keys(), ...this.nativeExtensionProviders.keys()])];\n\t}\n\n\tgetRegisteredNativeProvider(providerId: string): Provider | undefined {\n\t\treturn this.nativeExtensionProviders.get(providerId);\n\t}\n\tgetOAuthProviderMetadata() { return collectOAuthProviderMetadata(this.getProviders(), this.extensionProviders); }\n\t/** @internal Compatibility fallback for ModelRegistry when provider auth is unconfigured. */\n\tgetCompatibilityRequestConfig(model: Model<Api>): CompatibilityRequestConfig {\n\t\treturn resolveCompatibilityRequestConfig(\n\t\t\tmodel,\n\t\t\tthis.config.getProvider(model.provider),\n\t\t\tthis.extensionProviders.get(model.provider),\n\t\t);\n\t}\n\n\tisUsingOAuth(providerId: string): boolean {\n\t\treturn this.snapshot.auth.get(providerId)?.type === \"oauth\";\n\t}\n\n\thasConfiguredAuth(providerId: string): boolean {\n\t\treturn this.snapshot.configuredProviders.has(providerId);\n\t}\n\n\tgetAuth(providerId: string, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n\tgetAuth(model: Model<Api>, overrides?: ModelRuntimeAuthOverrides): Promise<AuthResult | undefined>;\n\tasync getAuth(\n\t\tproviderOrModel: string | Model<Api>,\n\t\toverrides: ModelRuntimeAuthOverrides = {},\n\t): Promise<AuthResult | undefined> {\n\t\tif (typeof providerOrModel === \"string\") return this.models.getAuth(providerOrModel, overrides);\n\t\tconst resolution = await this.models.getAuth(providerOrModel, overrides);\n\t\tif (!resolution) return undefined;\n\t\treturn mergeConfiguredAuthHeaders(\n\t\t\tresolution,\n\t\t\tproviderOrModel,\n\t\t\tthis.config,\n\t\t\tthis.extensionProviders.get(providerOrModel.provider),\n\t\t\toverrides,\n\t\t);\n\t}\n\t/** Reload credentials changed by the authoritative isolated engine and update auth status snapshots. */\n\tasync reloadCredentials(): Promise<void> {\n\t\tawait this.credentials.reload();\n\t\tawait this.forceRefreshAvailability();\n\t}\n\n\tasync saveCredential(providerId: string, credential: Credential): Promise<void> {\n\t\tawait this.credentials.modify(providerId, async () => credential);\n\t\tawait this.refresh();\n\t}\n\tasync setRuntimeApiKey(\n\t\tproviderId: string,\n\t\tapiKey: string,\n\t\trefreshOptions: ModelsRefreshOptions = {},\n\t): Promise<void> {\n\t\tthis.credentials.setRuntimeApiKey(providerId, apiKey);\n\t\tthis.snapshot = addRuntimeApiKeyProvider(this.snapshot, providerId);\n\t\tawait this.refresh(refreshOptions);\n\t}\n\n\tasync removeRuntimeApiKey(providerId: string): Promise<void> {\n\t\tthis.credentials.removeRuntimeApiKey(providerId);\n\t\tawait this.refresh({ allowNetwork: this.modelNetworkEnabled });\n\t}\n\n\tlistCredentials(): Promise<readonly CredentialInfo[]> {\n\t\treturn this.credentials.list();\n\t}\n\n\tgetStoredCredentialType(providerId: string): CredentialInfo[\"type\"] | undefined {\n\t\treturn this.snapshot.storedCredentialTypes.get(providerId);\n\t}\n\n\tgetProviderAuthStatus(providerId: string): AuthStatus {\n\t\treturn getSnapshotProviderAuthStatus(\n\t\t\tthis.snapshot,\n\t\t\tproviderId,\n\t\t\tthis.credentials.hasRuntimeApiKey(providerId),\n\t\t\tconfiguredRequestAuthStatus(\n\t\t\t\tthis.config.getProvider(providerId),\n\t\t\t\tthis.extensionProviders.get(providerId),\n\t\t\t),\n\t\t);\n\t}\n\n\tstream<TApi extends Api>(\n\t\tmodel: Model<TApi>,\n\t\tcontext: Context,\n\t\toptions?: ModelsApiStreamOptions<TApi>,\n\t): AssistantMessageEventStream {\n\t\treturn this.streaming.stream(model, context, options);\n\t}\n\n\tcomplete<TApi extends Api>(\n\t\tmodel: Model<TApi>,\n\t\tcontext: Context,\n\t\toptions?: ModelsApiStreamOptions<TApi>,\n\t): Promise<AssistantMessage> {\n\t\treturn this.streaming.complete(model, context, options);\n\t}\n\n\tstreamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream {\n\t\treturn this.streaming.streamSimple(model, context, options);\n\t}\n\n\tcompleteSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage> {\n\t\treturn this.streaming.completeSimple(model, context, options);\n\t}\n\n\tasync login(providerId: string, type: AuthType, interaction: AuthInteraction): Promise<Credential> {\n\t\tconst credential = await this.models.login(providerId, type, interaction);\n\t\ttry {\n\t\t\tawait this.refresh({ allowNetwork: this.modelNetworkEnabled });\n\t\t} catch (error) {\n\t\t\tthrow new OAuthLoginTransactionError(error);\n\t\t}\n\t\treturn credential;\n\t}\n\n\tasync logout(providerId: string): Promise<void> {\n\t\tawait this.models.logout(providerId);\n\t\t// Reset credential-dependent compatibility projections before the unconfigured provider is skipped by refresh.\n\t\tthis.recomposeProvider(providerId);\n\t\tawait this.refresh({ allowNetwork: this.modelNetworkEnabled });\n\t}\n\n\tasync refresh(options: ModelsRefreshOptions = {}): Promise<ModelsRefreshResult> {\n\t\tthis.config = await ModelConfig.load(this.modelsPath);\n\t\tthis.configureRadiusProviders();\n\t\tthis.rebuildProviders();\n\t\tconst refreshOptions = {\n\t\t\t...options,\n\t\t\tallowNetwork: options.allowNetwork ?? this.modelNetworkEnabled,\n\t\t};\n\t\t// Published pi-ai builds before ModelsStore returned void and accepted a provider ID.\n\t\t// The fallback keeps source-mode CLI tests working without rebuilding workspace dependencies.\n\t\tconst result = ((await this.models.refresh(refreshOptions)) as ModelsRefreshResult | undefined) ?? {\n\t\t\taborted: refreshOptions.signal?.aborted ?? false,\n\t\t\terrors: new Map(),\n\t\t};\n\t\tthis.updateModelSnapshot();\n\t\ttry {\n\t\t\tawait this.forceRefreshAvailability();\n\t\t} catch {\n\t\t\t// Availability errors are recorded by forceRefreshAvailability; refreshed models remain usable.\n\t\t}\n\t\treturn result;\n\t}\n\n\tregisterNativeProvider(provider: Provider): void {\n\t\tif (!provider.id.trim()) throw new Error(\"Provider id must not be empty.\");\n\t\tthis.extensionProviders.delete(provider.id);\n\t\tthis.nativeExtensionProviders.set(provider.id, provider);\n\t\tthis.recomposeProvider(provider.id);\n\t\tthis.updateModelSnapshot();\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n\n\tregisterProvider(providerId: string, config: ProviderConfigInput): void {\n\t\t// Validate the incoming registration on its own, like the legacy registry:\n\t\t// a broken re-registration must throw without touching the stored config.\n\t\tvalidateExtensionProvider(providerId, this.builtins.get(providerId), this.config.getProvider(providerId), config);\n\t\tthis.nativeExtensionProviders.delete(providerId);\n\t\t// Re-registration merges defined values over the previous registration and\n\t\t// preserves undefined ones, matching the legacy ModelRegistry contract.\n\t\tconst previous = this.extensionProviders.get(providerId);\n\t\tconst effective: ProviderConfigInput = { ...previous };\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value !== undefined) (effective as Record<string, unknown>)[key] = value;\n\t\t}\n\t\tthis.extensionProviders.set(providerId, effective);\n\t\tthis.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t\tif (\n\t\t\tthis.snapshot.storedProviders.has(providerId) ||\n\t\t\tconfiguredRequestAuthStatus(this.config.getProvider(providerId), effective)?.configured\n\t\t) {\n\t\t\tconst configuredProviders = new Set(this.snapshot.configuredProviders).add(providerId);\n\t\t\tconst auth = new Map(this.snapshot.auth);\n\t\t\t// Provisional entry until the async refresh lands; never clobber a real check result.\n\t\t\tif (!auth.get(providerId)) {\n\t\t\t\tauth.set(providerId, {\n\t\t\t\t\ttype: effective.oauth && !effective.apiKey ? \"oauth\" : \"api_key\",\n\t\t\t\t\tsource: \"configured provider\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.snapshot = {\n\t\t\t\t...this.snapshot,\n\t\t\t\tauth,\n\t\t\t\tconfiguredProviders,\n\t\t\t\tavailable: this.snapshot.all.filter((model) => configuredProviders.has(model.provider)),\n\t\t\t};\n\t\t}\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n\n\tunregisterProvider(providerId: string): void {\n\t\tthis.extensionProviders.delete(providerId);\n\t\tthis.nativeExtensionProviders.delete(providerId);\n\t\tthis.recomposeProvider(providerId);\n\t\tthis.updateModelSnapshot();\n\t\tvoid this.refresh({ allowNetwork: false });\n\t}\n}\n"]}
|
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
import type { ModelsStore, ModelsStoreEntry } from "@earendil-works/pi-ai";
|
|
2
|
-
export
|
|
3
|
-
writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
|
|
4
|
-
deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
|
|
5
|
-
}
|
|
6
|
-
export declare class InMemoryCodingAgentModelsStore implements CodingAgentModelsStore {
|
|
2
|
+
export declare class InMemoryCodingAgentModelsStore implements ModelsStore {
|
|
7
3
|
private readonly entries;
|
|
8
4
|
read(providerId: string): Promise<ModelsStoreEntry | undefined>;
|
|
9
5
|
write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
|
|
10
6
|
delete(providerId: string): Promise<void>;
|
|
11
|
-
writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
|
|
12
|
-
deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
|
|
13
7
|
}
|
|
14
8
|
/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */
|
|
15
|
-
export declare class FileModelsStore implements
|
|
9
|
+
export declare class FileModelsStore implements ModelsStore {
|
|
16
10
|
private readonly storage;
|
|
17
11
|
constructor(path?: string);
|
|
18
12
|
private parse;
|
|
19
13
|
read(providerId: string): Promise<ModelsStoreEntry | undefined>;
|
|
20
14
|
write(providerId: string, entry: ModelsStoreEntry): Promise<void>;
|
|
21
15
|
delete(providerId: string): Promise<void>;
|
|
22
|
-
writeIf(providerId: string, entry: ModelsStoreEntry, predicate: () => boolean): Promise<void>;
|
|
23
|
-
deleteIf(providerId: string, predicate: () => boolean): Promise<void>;
|
|
24
16
|
}
|
|
25
17
|
//# sourceMappingURL=models-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM3E,qBAAa,8BAA+B,YAAW,WAAW;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAEzD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAEpE;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9C;CACD;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,IAAI,GAAE,MAAiD,EAElE;IAED,OAAO,CAAC,KAAK;IAIP,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAIpE;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9C;CACD"}
|