cordisx 0.1.0-beta.21 → 0.1.0-beta.22
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/THIRD_PARTY_NOTICES.md +10 -0
- package/dist/assets/model-brands/aws-bedrock.svg +12 -0
- package/dist/assets/model-brands/azure-foundry.svg +1 -0
- package/dist/assets/model-brands/azure-openai.svg +1 -0
- package/dist/assets/model-brands/cerebras.png +0 -0
- package/dist/assets/model-brands/claude.svg +1 -0
- package/dist/assets/model-brands/dashscope.svg +45 -0
- package/dist/assets/model-brands/deepseek.svg +3 -0
- package/dist/assets/model-brands/fireworks.svg +5 -0
- package/dist/assets/model-brands/gemini.png +0 -0
- package/dist/assets/model-brands/google-vertex.svg +25 -0
- package/dist/assets/model-brands/huggingface.svg +8 -0
- package/dist/assets/model-brands/kimi-dark.svg +5 -0
- package/dist/assets/model-brands/kimi-light.svg +5 -0
- package/dist/assets/model-brands/minimax-dark.svg +1 -0
- package/dist/assets/model-brands/minimax-light.svg +1 -0
- package/dist/assets/model-brands/moonshot-dark.svg +1 -0
- package/dist/assets/model-brands/moonshot-light.svg +1 -0
- package/dist/assets/model-brands/openai.svg +1 -0
- package/dist/assets/model-brands/opencode-dark.svg +18 -0
- package/dist/assets/model-brands/opencode-light.svg +18 -0
- package/dist/assets/model-brands/openrouter-dark.svg +3 -0
- package/dist/assets/model-brands/openrouter-light.svg +3 -0
- package/dist/assets/model-brands/siliconflow.png +0 -0
- package/dist/assets/model-brands/together.svg +21 -0
- package/dist/assets/model-brands/xai-dark.svg +19 -0
- package/dist/assets/model-brands/xai-light.svg +19 -0
- package/dist/assets/model-brands/zai-dark.svg +35 -0
- package/dist/assets/model-brands/zai-light.svg +35 -0
- package/dist/shortcut-presentation.js +19 -2
- package/dist/src/app-launcher/install.test.d.ts +2 -0
- package/dist/src/app-launcher/install.test.d.ts.map +1 -0
- package/dist/src/app-launcher/install.test.js +57 -0
- package/dist/src/app-launcher/install.test.js.map +1 -0
- package/dist/src/app-launcher/model.d.ts +23 -0
- package/dist/src/app-launcher/model.d.ts.map +1 -0
- package/dist/src/app-launcher/model.js +18 -0
- package/dist/src/app-launcher/model.js.map +1 -0
- package/dist/src/app-launcher/runtime.test.d.ts +2 -0
- package/dist/src/app-launcher/runtime.test.d.ts.map +1 -0
- package/dist/src/app-launcher/runtime.test.js +92 -0
- package/dist/src/app-launcher/runtime.test.js.map +1 -0
- package/dist/src/cli/activate-owned-host.d.ts +10 -0
- package/dist/src/cli/activate-owned-host.d.ts.map +1 -0
- package/dist/src/cli/activate-owned-host.js +29 -0
- package/dist/src/cli/activate-owned-host.js.map +1 -0
- package/dist/src/cli/app-command.d.ts +7 -0
- package/dist/src/cli/app-command.d.ts.map +1 -0
- package/dist/src/cli/app-command.js +111 -0
- package/dist/src/cli/app-command.js.map +1 -0
- package/dist/src/cli/app-entry.d.ts +12 -0
- package/dist/src/cli/app-entry.d.ts.map +1 -0
- package/dist/src/cli/app-entry.js +99 -0
- package/dist/src/cli/app-entry.js.map +1 -0
- package/dist/src/cli/parse.d.ts +5 -2
- package/dist/src/cli/parse.d.ts.map +1 -1
- package/dist/src/cli/parse.js +2 -1
- package/dist/src/cli/parse.js.map +1 -1
- package/dist/src/cli/run-command-dispatch.d.ts.map +1 -1
- package/dist/src/cli/run-command-dispatch.js +5 -0
- package/dist/src/cli/run-command-dispatch.js.map +1 -1
- package/dist/src/cli/run-command.d.ts.map +1 -1
- package/dist/src/cli/run-command.js +15 -3
- package/dist/src/cli/run-command.js.map +1 -1
- package/dist/src/cli/run-support.d.ts +8 -1
- package/dist/src/cli/run-support.d.ts.map +1 -1
- package/dist/src/cli/run-support.js +1 -0
- package/dist/src/cli/run-support.js.map +1 -1
- package/dist/src/cli/shortcut-entry.d.ts +2 -6
- package/dist/src/cli/shortcut-entry.d.ts.map +1 -1
- package/dist/src/cli/shortcut-entry.js +2 -25
- package/dist/src/cli/shortcut-entry.js.map +1 -1
- package/dist/src/cli/supervisor-command.d.ts.map +1 -1
- package/dist/src/cli/supervisor-command.js +12 -4
- package/dist/src/cli/supervisor-command.js.map +1 -1
- package/dist/src/config/home-config-model-catalogs.d.ts +13 -0
- package/dist/src/config/home-config-model-catalogs.d.ts.map +1 -0
- package/dist/src/config/home-config-model-catalogs.js +107 -0
- package/dist/src/config/home-config-model-catalogs.js.map +1 -0
- package/dist/src/config/home-config.d.ts +3 -0
- package/dist/src/config/home-config.d.ts.map +1 -1
- package/dist/src/config/home-config.js +10 -8
- package/dist/src/config/home-config.js.map +1 -1
- package/dist/src/current-user-native-pins.d.ts +6 -0
- package/dist/src/current-user-native-pins.d.ts.map +1 -1
- package/dist/src/current-user-native-pins.js +7 -0
- package/dist/src/current-user-native-pins.js.map +1 -1
- package/dist/src/launcher/codex-config-model-providers.d.ts +9 -1
- package/dist/src/launcher/codex-config-model-providers.d.ts.map +1 -1
- package/dist/src/launcher/codex-config-model-providers.js +86 -23
- package/dist/src/launcher/codex-config-model-providers.js.map +1 -1
- package/dist/src/launcher/model-catalog/abort.d.ts +3 -0
- package/dist/src/launcher/model-catalog/abort.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/abort.js +16 -0
- package/dist/src/launcher/model-catalog/abort.js.map +1 -0
- package/dist/src/launcher/model-catalog/atomic-store.d.ts +13 -0
- package/dist/src/launcher/model-catalog/atomic-store.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/atomic-store.js +85 -0
- package/dist/src/launcher/model-catalog/atomic-store.js.map +1 -0
- package/dist/src/launcher/model-catalog/builtin-registry.d.ts +4 -0
- package/dist/src/launcher/model-catalog/builtin-registry.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/builtin-registry.js +7 -0
- package/dist/src/launcher/model-catalog/builtin-registry.js.map +1 -0
- package/dist/src/launcher/model-catalog/configured-source.d.ts +15 -0
- package/dist/src/launcher/model-catalog/configured-source.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/configured-source.js +99 -0
- package/dist/src/launcher/model-catalog/configured-source.js.map +1 -0
- package/dist/src/launcher/model-catalog/contracts.d.ts +87 -0
- package/dist/src/launcher/model-catalog/contracts.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/contracts.js +54 -0
- package/dist/src/launcher/model-catalog/contracts.js.map +1 -0
- package/dist/src/launcher/model-catalog/deepseek.d.ts +4 -0
- package/dist/src/launcher/model-catalog/deepseek.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/deepseek.js +123 -0
- package/dist/src/launcher/model-catalog/deepseek.js.map +1 -0
- package/dist/src/launcher/model-catalog/file-source.d.ts +10 -0
- package/dist/src/launcher/model-catalog/file-source.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/file-source.js +136 -0
- package/dist/src/launcher/model-catalog/file-source.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.d.ts +33 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.js +528 -0
- package/dist/src/launcher/model-catalog/managed-catalog-composition.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.d.ts +16 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.js +130 -0
- package/dist/src/launcher/model-catalog/managed-catalog-state.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.d.ts +14 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.js +53 -0
- package/dist/src/launcher/model-catalog/managed-provider-api.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.d.ts +4 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.js +71 -0
- package/dist/src/launcher/model-catalog/managed-provider-capture.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.d.ts +38 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.js +348 -0
- package/dist/src/launcher/model-catalog/managed-provider-owner.js.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.d.ts +31 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.js +71 -0
- package/dist/src/launcher/model-catalog/managed-provider-schema.js.map +1 -0
- package/dist/src/launcher/model-catalog/owner-projection.d.ts +20 -0
- package/dist/src/launcher/model-catalog/owner-projection.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/owner-projection.js +37 -0
- package/dist/src/launcher/model-catalog/owner-projection.js.map +1 -0
- package/dist/src/launcher/model-catalog/registry.d.ts +7 -0
- package/dist/src/launcher/model-catalog/registry.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/registry.js +19 -0
- package/dist/src/launcher/model-catalog/registry.js.map +1 -0
- package/dist/src/launcher/model-catalog/request-capability.d.ts +10 -0
- package/dist/src/launcher/model-catalog/request-capability.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/request-capability.js +74 -0
- package/dist/src/launcher/model-catalog/request-capability.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-composition.d.ts +18 -0
- package/dist/src/launcher/model-catalog/script-composition.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-composition.js +25 -0
- package/dist/src/launcher/model-catalog/script-composition.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-executor.d.ts +5 -0
- package/dist/src/launcher/model-catalog/script-executor.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-executor.js +140 -0
- package/dist/src/launcher/model-catalog/script-executor.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-management.d.ts +4 -0
- package/dist/src/launcher/model-catalog/script-management.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-management.js +29 -0
- package/dist/src/launcher/model-catalog/script-management.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-output-parser.d.ts +3 -0
- package/dist/src/launcher/model-catalog/script-output-parser.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-output-parser.js +59 -0
- package/dist/src/launcher/model-catalog/script-output-parser.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-runtime.d.ts +30 -0
- package/dist/src/launcher/model-catalog/script-runtime.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-runtime.js +164 -0
- package/dist/src/launcher/model-catalog/script-runtime.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-schema.d.ts +42 -0
- package/dist/src/launcher/model-catalog/script-schema.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-schema.js +129 -0
- package/dist/src/launcher/model-catalog/script-schema.js.map +1 -0
- package/dist/src/launcher/model-catalog/script-types.d.ts +84 -0
- package/dist/src/launcher/model-catalog/script-types.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/script-types.js +9 -0
- package/dist/src/launcher/model-catalog/script-types.js.map +1 -0
- package/dist/src/launcher/model-catalog/service.d.ts +39 -0
- package/dist/src/launcher/model-catalog/service.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/service.js +292 -0
- package/dist/src/launcher/model-catalog/service.js.map +1 -0
- package/dist/src/launcher/model-catalog/supplement.d.ts +4 -0
- package/dist/src/launcher/model-catalog/supplement.d.ts.map +1 -0
- package/dist/src/launcher/model-catalog/supplement.js +44 -0
- package/dist/src/launcher/model-catalog/supplement.js.map +1 -0
- package/dist/src/launcher/native-model-provider-catalog.d.ts +6 -1
- package/dist/src/launcher/native-model-provider-catalog.d.ts.map +1 -1
- package/dist/src/launcher/native-model-provider-catalog.js +16 -3
- package/dist/src/launcher/native-model-provider-catalog.js.map +1 -1
- package/dist/src/launcher/native-submission-cdp-channel.d.ts +7 -0
- package/dist/src/launcher/native-submission-cdp-channel.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-cdp-channel.js +54 -7
- package/dist/src/launcher/native-submission-cdp-channel.js.map +1 -1
- package/dist/src/launcher/native-submission-composition.d.ts +6 -0
- package/dist/src/launcher/native-submission-composition.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-composition.js +58 -8
- package/dist/src/launcher/native-submission-composition.js.map +1 -1
- package/dist/src/launcher/native-submission-controller.d.ts +1 -0
- package/dist/src/launcher/native-submission-controller.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-controller.js +24 -3
- package/dist/src/launcher/native-submission-controller.js.map +1 -1
- package/dist/src/launcher/native-submission-structure.d.ts.map +1 -1
- package/dist/src/launcher/native-submission-structure.js +15 -1
- package/dist/src/launcher/native-submission-structure.js.map +1 -1
- package/dist/src/launcher/secret-resolver.d.ts.map +1 -1
- package/dist/src/launcher/secret-resolver.js +3 -0
- package/dist/src/launcher/secret-resolver.js.map +1 -1
- package/dist/src/model-catalog/management-overlay.d.ts +67 -0
- package/dist/src/model-catalog/management-overlay.d.ts.map +1 -0
- package/dist/src/model-catalog/management-overlay.js +193 -0
- package/dist/src/model-catalog/management-overlay.js.map +1 -0
- package/dist/src/model-catalog-management.d.ts +130 -0
- package/dist/src/model-catalog-management.d.ts.map +1 -0
- package/dist/src/model-catalog-management.js +2 -0
- package/dist/src/model-catalog-management.js.map +1 -0
- package/dist/src/model-selector-branding.d.ts +24 -0
- package/dist/src/model-selector-branding.d.ts.map +1 -0
- package/dist/src/model-selector-branding.js +201 -0
- package/dist/src/model-selector-branding.js.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.d.ts +4 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.d.ts.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.js +45 -0
- package/dist/src/renderer/adapter/native-model-provider-interaction.js.map +1 -0
- package/dist/src/renderer/adapter/native-model-provider-seat.d.ts +2 -0
- package/dist/src/renderer/adapter/native-model-provider-seat.d.ts.map +1 -1
- package/dist/src/renderer/adapter/native-model-provider-seat.js +7 -7
- package/dist/src/renderer/adapter/native-model-provider-seat.js.map +1 -1
- package/dist/src/renderer/current-user/native.d.ts +17 -1
- package/dist/src/renderer/current-user/native.d.ts.map +1 -1
- package/dist/src/renderer/current-user/native.js +20 -7
- package/dist/src/renderer/current-user/native.js.map +1 -1
- package/dist/src/renderer/host-ui/HostMenu.d.ts +2 -1
- package/dist/src/renderer/host-ui/HostMenu.d.ts.map +1 -1
- package/dist/src/renderer/host-ui/HostMenu.js +13 -4
- package/dist/src/renderer/host-ui/HostMenu.js.map +1 -1
- package/dist/src/renderer/host-ui/ModelBrandIcon.d.ts +8 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.d.ts.map +1 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.js +93 -0
- package/dist/src/renderer/host-ui/ModelBrandIcon.js.map +1 -0
- package/dist/src/renderer/install-model-provider-selector.d.ts.map +1 -1
- package/dist/src/renderer/install-model-provider-selector.js +23 -7
- package/dist/src/renderer/install-model-provider-selector.js.map +1 -1
- package/dist/src/renderer/model-provider-selector.d.ts +2 -1
- package/dist/src/renderer/model-provider-selector.d.ts.map +1 -1
- package/dist/src/renderer/model-provider-selector.js +46 -12
- package/dist/src/renderer/model-provider-selector.js.map +1 -1
- package/dist/src/renderer/model-providers.css +14 -1
- package/dist/src/renderer/model-providers.d.ts +17 -2
- package/dist/src/renderer/model-providers.d.ts.map +1 -1
- package/dist/src/renderer/model-providers.js +51 -1
- package/dist/src/renderer/model-providers.js.map +1 -1
- package/dist/src/renderer/native-model-provider-transport.d.ts +1 -0
- package/dist/src/renderer/native-model-provider-transport.d.ts.map +1 -1
- package/dist/src/renderer/native-model-provider-transport.js +36 -6
- package/dist/src/renderer/native-model-provider-transport.js.map +1 -1
- package/dist/src/renderer/native-provider-selection-client.d.ts +6 -0
- package/dist/src/renderer/native-provider-selection-client.d.ts.map +1 -1
- package/dist/src/renderer/native-provider-selection-client.js.map +1 -1
- package/dist/src/shortcuts/native.d.ts +2 -0
- package/dist/src/shortcuts/native.d.ts.map +1 -1
- package/dist/src/shortcuts/native.js +7 -0
- package/dist/src/shortcuts/native.js.map +1 -1
- package/package.json +1 -1
- package/third_party/lobe-icons-MIT.txt +21 -0
- package/third_party/openai-apps-sdk-ui-MIT.txt +19 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, realpath, rmdir } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createMacOSKeychainBackend } from '../secret-store.js';
|
|
5
|
+
import { CatalogError, object } from './contracts.js';
|
|
6
|
+
import { withAbort } from './abort.js';
|
|
7
|
+
import { createDiscoveryRequestCapability } from './request-capability.js';
|
|
8
|
+
import { ManagedCatalogState } from './managed-catalog-state.js';
|
|
9
|
+
import { managedProviderSettings, managedProviderView, opaqueProviderId, parseManagedProviderRecord, } from './managed-provider-schema.js';
|
|
10
|
+
const nonce = () => randomBytes(32).toString('base64url');
|
|
11
|
+
const failure = () => new CatalogError('credential-unavailable');
|
|
12
|
+
const metadataOf = ({ secret: _secret, ...value }) => Object.freeze(value);
|
|
13
|
+
/** Host composition only. Never register this object as a plugin context service or renderer global. */
|
|
14
|
+
export class ManagedProviderOwner {
|
|
15
|
+
#backend;
|
|
16
|
+
#service;
|
|
17
|
+
#lock;
|
|
18
|
+
#lockIdentity;
|
|
19
|
+
#fetcher;
|
|
20
|
+
#records = new Map();
|
|
21
|
+
#retired = [];
|
|
22
|
+
#index = '';
|
|
23
|
+
#tail = Promise.resolve();
|
|
24
|
+
#closed = false;
|
|
25
|
+
#closePromise;
|
|
26
|
+
#leases = new Set();
|
|
27
|
+
#listeners = new Set();
|
|
28
|
+
#state;
|
|
29
|
+
constructor(backend, service, lock, identity, fetcher) {
|
|
30
|
+
this.#backend = backend;
|
|
31
|
+
this.#service = service;
|
|
32
|
+
this.#lock = lock;
|
|
33
|
+
this.#lockIdentity = identity;
|
|
34
|
+
this.#fetcher = fetcher;
|
|
35
|
+
this.#state = new ManagedCatalogState(`${lock}.state`, backend, service, () => this.#assertCurrent());
|
|
36
|
+
}
|
|
37
|
+
static async open(options) {
|
|
38
|
+
if (!/^[a-z0-9][a-z0-9._-]{0,63}$/u.test(options.profileId))
|
|
39
|
+
throw failure();
|
|
40
|
+
if (!options.keychain && (options.platform ?? process.platform) !== 'darwin')
|
|
41
|
+
throw failure();
|
|
42
|
+
const home = await realpath(options.homeDir);
|
|
43
|
+
const directory = path.join(home, 'state', 'host-provider-owners');
|
|
44
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
45
|
+
const metadata = await lstat(directory);
|
|
46
|
+
if (!metadata.isDirectory() || (metadata.mode & 0o077) !== 0 || (process.getuid && metadata.uid !== process.getuid())) {
|
|
47
|
+
throw failure();
|
|
48
|
+
}
|
|
49
|
+
const lock = path.join(directory, `${options.profileId}.lock`);
|
|
50
|
+
// A crashed owner needs explicit lock recovery. Never steal a possibly healthy owner's lease.
|
|
51
|
+
try {
|
|
52
|
+
await mkdir(lock, { mode: 0o700 });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw failure();
|
|
56
|
+
}
|
|
57
|
+
const identity = await lstat(lock);
|
|
58
|
+
const scope = createHash('sha256').update(JSON.stringify([home, options.profileId])).digest('hex');
|
|
59
|
+
const owner = new ManagedProviderOwner(options.keychain ?? createMacOSKeychainBackend(), `cordisx/host-provider/v1/${scope}`, lock, identity, options.fetcher);
|
|
60
|
+
try {
|
|
61
|
+
await owner.#load();
|
|
62
|
+
return owner;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
await owner.close();
|
|
66
|
+
throw failure();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
snapshot() {
|
|
70
|
+
if (this.#closed)
|
|
71
|
+
return [];
|
|
72
|
+
return Object.freeze([...this.#records.values()].map(record => managedProviderView(record.value)));
|
|
73
|
+
}
|
|
74
|
+
subscribe(listener) {
|
|
75
|
+
this.#listeners.add(listener);
|
|
76
|
+
return () => {
|
|
77
|
+
this.#listeners.delete(listener);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Host-only encrypted configuration/cache/overlay state; never mount these methods on RPC. */
|
|
81
|
+
readCatalogState() {
|
|
82
|
+
return this.#serial(() => this.#state.read());
|
|
83
|
+
}
|
|
84
|
+
writeCatalogState(value, authorized) {
|
|
85
|
+
return this.#serial(() => this.#state.write(value, authorized));
|
|
86
|
+
}
|
|
87
|
+
validateCurrent() {
|
|
88
|
+
return this.#assertCurrent();
|
|
89
|
+
}
|
|
90
|
+
/** Only the native credential broker consumes this private session. Not an adapter capability. */
|
|
91
|
+
async nativeConnection(id, admittedResponses = () => false) {
|
|
92
|
+
await this.#assertCurrent();
|
|
93
|
+
const entry = this.#records.get(id);
|
|
94
|
+
if (!entry || entry.value.settings.protocol !== 'responses' && !admittedResponses()) {
|
|
95
|
+
throw new CatalogError('unsupported');
|
|
96
|
+
}
|
|
97
|
+
const record = await this.#readRecord(entry);
|
|
98
|
+
await this.#assertCurrent();
|
|
99
|
+
if (this.#records.get(id) !== entry || record.settings.protocol !== 'responses' && !admittedResponses()) {
|
|
100
|
+
throw new CatalogError('cancelled');
|
|
101
|
+
}
|
|
102
|
+
const endpoint = new URL(record.settings.endpoint);
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
value: Object.freeze({
|
|
105
|
+
service: { pluginId: 'cordisx-host', serviceId: id, generation: record.scopeRevision },
|
|
106
|
+
endpoint: {
|
|
107
|
+
origin: endpoint.origin,
|
|
108
|
+
apiPath: endpoint.pathname,
|
|
109
|
+
auth: { scheme: 'bearer', token: record.secret },
|
|
110
|
+
},
|
|
111
|
+
models: { generation: record.revision, defaultAlias: '', aliases: [] },
|
|
112
|
+
cleanup: { authorityId: record.scopeRevision },
|
|
113
|
+
}),
|
|
114
|
+
dispose() { },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/** capture must be a trusted Host-private prompt, not a renderer/plugin secret field. */
|
|
118
|
+
save(input, capture, authorized = () => true) {
|
|
119
|
+
return this.#serial(async () => {
|
|
120
|
+
if (!authorized())
|
|
121
|
+
throw new CatalogError('permission');
|
|
122
|
+
await this.#assertCurrent();
|
|
123
|
+
await this.#cleanup();
|
|
124
|
+
const settings = managedProviderSettings(input.settings);
|
|
125
|
+
const prior = input.id === undefined ? undefined : this.#records.get(input.id);
|
|
126
|
+
if (input.id !== undefined && (!prior || prior.value.revision !== input.expectedRevision)) {
|
|
127
|
+
throw new CatalogError('source-invalid');
|
|
128
|
+
}
|
|
129
|
+
if (!prior && (input.expectedRevision !== undefined || !capture || this.#records.size >= 64)) {
|
|
130
|
+
throw new CatalogError('source-invalid');
|
|
131
|
+
}
|
|
132
|
+
const abort = new AbortController();
|
|
133
|
+
this.#leases.add(abort);
|
|
134
|
+
const timer = setTimeout(() => abort.abort(), 60_000);
|
|
135
|
+
timer.unref?.();
|
|
136
|
+
try {
|
|
137
|
+
const secret = capture
|
|
138
|
+
? await withAbort(capture(abort.signal), abort.signal)
|
|
139
|
+
: (await this.#readRecord(prior)).secret;
|
|
140
|
+
await this.#assertCurrent();
|
|
141
|
+
if (!authorized())
|
|
142
|
+
throw new CatalogError('permission');
|
|
143
|
+
const changedScope = !prior || capture !== undefined || settings.endpoint !== prior.value.settings.endpoint
|
|
144
|
+
|| settings.protocol !== prior.value.settings.protocol;
|
|
145
|
+
if (changedScope && prior && settings.supplement.length)
|
|
146
|
+
throw new CatalogError('source-invalid');
|
|
147
|
+
const record = parseManagedProviderRecord({
|
|
148
|
+
id: prior?.value.id ?? nonce(),
|
|
149
|
+
revision: nonce(),
|
|
150
|
+
scopeRevision: changedScope ? nonce() : prior.value.scopeRevision,
|
|
151
|
+
credentialRevision: capture ? nonce() : prior.value.credentialRevision,
|
|
152
|
+
credentialRef: capture ? nonce() : prior.value.credentialRef,
|
|
153
|
+
settings,
|
|
154
|
+
secret,
|
|
155
|
+
});
|
|
156
|
+
const ref = nonce();
|
|
157
|
+
const raw = JSON.stringify(record);
|
|
158
|
+
if (raw.length > 16 * 1024)
|
|
159
|
+
throw new CatalogError('source-invalid');
|
|
160
|
+
// Journal the new slot before writing it so interrupted provisioning can erase it on reopen.
|
|
161
|
+
await this.#commit(this.#records, [ref], authorized);
|
|
162
|
+
// The new Keychain record is immutable. The index switch is the durable commit point.
|
|
163
|
+
await this.#backend.upsert(this.#service, ref, raw);
|
|
164
|
+
const next = new Map(this.#records).set(record.id, { ref, value: metadataOf(record) });
|
|
165
|
+
try {
|
|
166
|
+
await this.#commit(next, prior ? [prior.ref] : [], authorized);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// A backend failure may occur after its write. Never delete a possibly committed record.
|
|
170
|
+
this.#closed = true;
|
|
171
|
+
this.#revoke();
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
await this.#cleanup();
|
|
175
|
+
return managedProviderView(record);
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
this.#leases.delete(abort);
|
|
180
|
+
abort.abort();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
remove(id, expectedRevision, authorized = () => true) {
|
|
185
|
+
return this.#serial(async () => {
|
|
186
|
+
if (!authorized())
|
|
187
|
+
throw new CatalogError('permission');
|
|
188
|
+
await this.#assertCurrent();
|
|
189
|
+
await this.#cleanup();
|
|
190
|
+
const prior = this.#records.get(id);
|
|
191
|
+
if (!prior || prior.value.revision !== expectedRevision)
|
|
192
|
+
throw new CatalogError('source-invalid');
|
|
193
|
+
const next = new Map(this.#records);
|
|
194
|
+
next.delete(id);
|
|
195
|
+
await this.#commit(next, [prior.ref], authorized);
|
|
196
|
+
await this.#cleanup();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/** At most one fixed operation. No plugin-supplied adapter, URL, headers or credential lookup. */
|
|
200
|
+
connection(id) {
|
|
201
|
+
const entry = this.#records.get(id);
|
|
202
|
+
if (this.#closed || !entry || !entry.value.settings.discoveryEnabled || entry.value.settings.strategy.kind !== 'auto')
|
|
203
|
+
return undefined;
|
|
204
|
+
const record = entry.value;
|
|
205
|
+
const current = () => !this.#closed && this.#records.get(id) === entry;
|
|
206
|
+
return Object.freeze({
|
|
207
|
+
endpoint: record.settings.endpoint,
|
|
208
|
+
scopeRevision: record.scopeRevision,
|
|
209
|
+
current,
|
|
210
|
+
request: async (operation, externalSignal) => {
|
|
211
|
+
if (this.#leases.size >= 4)
|
|
212
|
+
throw new CatalogError('temporary');
|
|
213
|
+
const abort = new AbortController();
|
|
214
|
+
this.#leases.add(abort);
|
|
215
|
+
const timer = setTimeout(() => abort.abort(), 10_000);
|
|
216
|
+
timer.unref?.();
|
|
217
|
+
const signal = AbortSignal.any([externalSignal, abort.signal]);
|
|
218
|
+
try {
|
|
219
|
+
await this.#assertCurrent();
|
|
220
|
+
const request = createDiscoveryRequestCapability({
|
|
221
|
+
operation: { origin: 'https://api.deepseek.com', method: 'GET', path: '/models' },
|
|
222
|
+
current: () => current() && !signal.aborted,
|
|
223
|
+
bearer: async () => {
|
|
224
|
+
await this.#assertCurrent();
|
|
225
|
+
const latest = await this.#readRecord(entry);
|
|
226
|
+
return latest.secret;
|
|
227
|
+
},
|
|
228
|
+
...(this.#fetcher ? { fetcher: this.#fetcher } : {}),
|
|
229
|
+
});
|
|
230
|
+
const response = await request(operation, signal);
|
|
231
|
+
await this.#assertCurrent();
|
|
232
|
+
if (!current())
|
|
233
|
+
throw new CatalogError('cancelled');
|
|
234
|
+
return response;
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
throw error instanceof CatalogError ? error : failure();
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
clearTimeout(timer);
|
|
241
|
+
this.#leases.delete(abort);
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async #load() {
|
|
247
|
+
if (await this.#backend.status(this.#service, 'index') === 'unset') {
|
|
248
|
+
this.#index = JSON.stringify({ version: 1, entries: [], retired: [] });
|
|
249
|
+
await this.#backend.upsert(this.#service, 'index', this.#index);
|
|
250
|
+
}
|
|
251
|
+
else
|
|
252
|
+
this.#index = await this.#backend.read(this.#service, 'index');
|
|
253
|
+
const index = object(JSON.parse(this.#index));
|
|
254
|
+
if (!index || index.version !== 1 || Object.keys(index).length !== 3 || !Array.isArray(index.entries)
|
|
255
|
+
|| index.entries.length > 64
|
|
256
|
+
|| !Array.isArray(index.retired) || index.retired.length > 64 || !index.retired.every(opaqueProviderId))
|
|
257
|
+
throw failure();
|
|
258
|
+
this.#retired = [...index.retired];
|
|
259
|
+
for (const value of index.entries) {
|
|
260
|
+
const item = object(value);
|
|
261
|
+
if (!item || Object.keys(item).length !== 2 || !opaqueProviderId(item.id) || !opaqueProviderId(item.ref)
|
|
262
|
+
|| this.#records.has(item.id))
|
|
263
|
+
throw failure();
|
|
264
|
+
const record = parseManagedProviderRecord(JSON.parse(await this.#backend.read(this.#service, item.ref)));
|
|
265
|
+
if (record.id !== item.id)
|
|
266
|
+
throw failure();
|
|
267
|
+
if (this.#retired.includes(item.ref))
|
|
268
|
+
throw failure();
|
|
269
|
+
this.#records.set(item.id, { ref: item.ref, value: metadataOf(record) });
|
|
270
|
+
}
|
|
271
|
+
await this.#cleanup();
|
|
272
|
+
}
|
|
273
|
+
async #readRecord(entry) {
|
|
274
|
+
const latest = parseManagedProviderRecord(JSON.parse(await this.#backend.read(this.#service, entry.ref)));
|
|
275
|
+
if (JSON.stringify(metadataOf(latest)) !== JSON.stringify(entry.value))
|
|
276
|
+
throw failure();
|
|
277
|
+
return latest;
|
|
278
|
+
}
|
|
279
|
+
async #cleanup() {
|
|
280
|
+
if (!this.#retired.length)
|
|
281
|
+
return;
|
|
282
|
+
for (const ref of this.#retired)
|
|
283
|
+
await this.#backend.remove(this.#service, ref);
|
|
284
|
+
await this.#commit(this.#records, []);
|
|
285
|
+
}
|
|
286
|
+
async #assertCurrent() {
|
|
287
|
+
if (this.#closed)
|
|
288
|
+
throw failure();
|
|
289
|
+
const metadata = await lstat(this.#lock).catch(() => undefined);
|
|
290
|
+
if (!metadata?.isDirectory() || metadata.dev !== this.#lockIdentity.dev || metadata.ino !== this.#lockIdentity.ino
|
|
291
|
+
|| await this.#backend.read(this.#service, 'index') !== this.#index) {
|
|
292
|
+
this.#closed = true;
|
|
293
|
+
this.#revoke();
|
|
294
|
+
throw failure();
|
|
295
|
+
}
|
|
296
|
+
if (this.#closed)
|
|
297
|
+
throw failure();
|
|
298
|
+
}
|
|
299
|
+
async #commit(next, retired, authorized = () => true) {
|
|
300
|
+
await this.#assertCurrent();
|
|
301
|
+
if (!authorized())
|
|
302
|
+
throw new CatalogError('permission');
|
|
303
|
+
const index = JSON.stringify({
|
|
304
|
+
version: 1,
|
|
305
|
+
entries: [...next].map(([id, record]) => ({ id, ref: record.ref })),
|
|
306
|
+
retired,
|
|
307
|
+
});
|
|
308
|
+
await this.#backend.upsert(this.#service, 'index', index);
|
|
309
|
+
this.#index = index;
|
|
310
|
+
this.#records = next;
|
|
311
|
+
this.#retired = retired;
|
|
312
|
+
this.#revoke();
|
|
313
|
+
if (this.#closed)
|
|
314
|
+
return;
|
|
315
|
+
for (const listener of this.#listeners) {
|
|
316
|
+
try {
|
|
317
|
+
listener();
|
|
318
|
+
}
|
|
319
|
+
catch { /* Reader isolation. */ }
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
#revoke() {
|
|
323
|
+
for (const lease of this.#leases)
|
|
324
|
+
lease.abort();
|
|
325
|
+
this.#leases.clear();
|
|
326
|
+
}
|
|
327
|
+
#serial(action) {
|
|
328
|
+
const job = this.#tail.then(action).catch(error => {
|
|
329
|
+
throw error instanceof CatalogError ? error : failure();
|
|
330
|
+
});
|
|
331
|
+
this.#tail = job.catch(() => undefined);
|
|
332
|
+
return job;
|
|
333
|
+
}
|
|
334
|
+
close() {
|
|
335
|
+
this.#closePromise ??= (async () => {
|
|
336
|
+
this.#closed = true;
|
|
337
|
+
this.#revoke();
|
|
338
|
+
this.#listeners.clear();
|
|
339
|
+
await this.#tail;
|
|
340
|
+
this.#records.clear();
|
|
341
|
+
const metadata = await lstat(this.#lock).catch(() => undefined);
|
|
342
|
+
if (metadata?.dev === this.#lockIdentity.dev && metadata.ino === this.#lockIdentity.ino)
|
|
343
|
+
await rmdir(this.#lock);
|
|
344
|
+
})();
|
|
345
|
+
return this.#closePromise;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=managed-provider-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-provider-owner.js","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/managed-provider-owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type CatalogStrategy } from './contracts.js';
|
|
2
|
+
export interface ManagedProviderSettings {
|
|
3
|
+
readonly title: string;
|
|
4
|
+
readonly endpoint: string;
|
|
5
|
+
readonly protocol: 'responses' | 'chat-completions';
|
|
6
|
+
readonly discoveryEnabled: boolean;
|
|
7
|
+
readonly strategy: CatalogStrategy;
|
|
8
|
+
readonly supplement: readonly {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly label?: string;
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
export declare function managedProviderSettings(value: unknown): ManagedProviderSettings;
|
|
14
|
+
export declare const opaqueProviderId: (value: unknown) => value is string;
|
|
15
|
+
export interface ManagedProviderView {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly revision: string;
|
|
18
|
+
readonly scopeRevision: string;
|
|
19
|
+
readonly credentialRevision: string;
|
|
20
|
+
readonly credentialState: 'set';
|
|
21
|
+
readonly settings: ManagedProviderSettings;
|
|
22
|
+
}
|
|
23
|
+
/** Stored only in the dedicated Host Keychain namespace; never a renderer/plugin descriptor. */
|
|
24
|
+
export interface ManagedProviderRecord extends Omit<ManagedProviderView, 'credentialState'> {
|
|
25
|
+
readonly credentialRef: string;
|
|
26
|
+
readonly secret: string;
|
|
27
|
+
readonly settings: ManagedProviderSettings;
|
|
28
|
+
}
|
|
29
|
+
export declare function parseManagedProviderRecord(value: unknown): ManagedProviderRecord;
|
|
30
|
+
export declare function managedProviderView(record: Omit<ManagedProviderRecord, 'secret'>): ManagedProviderView;
|
|
31
|
+
//# sourceMappingURL=managed-provider-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-provider-schema.d.ts","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/managed-provider-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,eAAe,EAAgC,MAAM,gBAAgB,CAAA;AAIhH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,kBAAkB,CAAA;IACnD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACjF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CA0C/E;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACM,CAAA;AAEjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAA;CAC3C;AAED,gGAAgG;AAChG,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;IACzF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAA;CAC3C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAqBhF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,GAAG,mBAAmB,CAStG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { boundedString, CatalogError, object, parseCatalogStrategy } from './contracts.js';
|
|
2
|
+
import { parseSupplement } from './supplement.js';
|
|
3
|
+
import { isDeepSeekOfficialEndpoint } from './deepseek.js';
|
|
4
|
+
export function managedProviderSettings(value) {
|
|
5
|
+
const input = object(value);
|
|
6
|
+
if (!input
|
|
7
|
+
|| Object.keys(input).some(key => !['title', 'endpoint', 'protocol', 'discoveryEnabled', 'strategy', 'supplement'].includes(key)) || !boundedString(input.title, 128) || !boundedString(input.endpoint, 2048)
|
|
8
|
+
|| !['responses', 'chat-completions'].includes(String(input.protocol))
|
|
9
|
+
|| typeof input.discoveryEnabled !== 'boolean')
|
|
10
|
+
throw new CatalogError('source-invalid');
|
|
11
|
+
let endpoint;
|
|
12
|
+
try {
|
|
13
|
+
endpoint = new URL(input.endpoint);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new CatalogError('source-invalid');
|
|
17
|
+
}
|
|
18
|
+
if (endpoint.protocol !== 'https:' || endpoint.username || endpoint.password || endpoint.search || endpoint.hash
|
|
19
|
+
|| /[\\?#]/u.test(input.endpoint) || endpoint.href !== input.endpoint && endpoint.href !== `${input.endpoint}/`)
|
|
20
|
+
throw new CatalogError('source-invalid');
|
|
21
|
+
const strategy = parseCatalogStrategy(input.strategy);
|
|
22
|
+
// This owner does not execute scripts, read native secrets, or accept arbitrary local file references.
|
|
23
|
+
if (strategy.kind !== 'auto' && !(strategy.kind === 'manual' && 'ids' in strategy)) {
|
|
24
|
+
throw new CatalogError('unsupported');
|
|
25
|
+
}
|
|
26
|
+
if (strategy.kind === 'auto'
|
|
27
|
+
&& (!isDeepSeekOfficialEndpoint(input.endpoint) || !['detect', 'deepseek-official'].includes(strategy.adapter)))
|
|
28
|
+
throw new CatalogError('unsupported');
|
|
29
|
+
const supplement = parseSupplement({
|
|
30
|
+
scopeRevision: 'validation',
|
|
31
|
+
authorityRevision: 'validation',
|
|
32
|
+
models: input.supplement,
|
|
33
|
+
});
|
|
34
|
+
return Object.freeze({
|
|
35
|
+
title: input.title,
|
|
36
|
+
endpoint: input.endpoint,
|
|
37
|
+
protocol: input.protocol,
|
|
38
|
+
discoveryEnabled: input.discoveryEnabled,
|
|
39
|
+
strategy,
|
|
40
|
+
supplement: supplement.models,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export const opaqueProviderId = (value) => typeof value === 'string' && /^[A-Za-z0-9_-]{43}$/u.test(value);
|
|
44
|
+
export function parseManagedProviderRecord(value) {
|
|
45
|
+
const input = object(value);
|
|
46
|
+
if (!input
|
|
47
|
+
|| Object.keys(input).some(key => !['id', 'revision', 'scopeRevision', 'credentialRevision', 'credentialRef', 'settings', 'secret'].includes(key))
|
|
48
|
+
|| ![input.id, input.revision, input.scopeRevision, input.credentialRevision, input.credentialRef].every(opaqueProviderId)
|
|
49
|
+
|| !boundedString(input.secret, 8192) || /\s/u.test(input.secret))
|
|
50
|
+
throw new CatalogError('source-invalid');
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
id: input.id,
|
|
53
|
+
revision: input.revision,
|
|
54
|
+
scopeRevision: input.scopeRevision,
|
|
55
|
+
credentialRevision: input.credentialRevision,
|
|
56
|
+
credentialRef: input.credentialRef,
|
|
57
|
+
secret: input.secret,
|
|
58
|
+
settings: managedProviderSettings(input.settings),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export function managedProviderView(record) {
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
id: record.id,
|
|
64
|
+
revision: record.revision,
|
|
65
|
+
scopeRevision: record.scopeRevision,
|
|
66
|
+
credentialRevision: record.credentialRevision,
|
|
67
|
+
credentialState: 'set',
|
|
68
|
+
settings: record.settings,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=managed-provider-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-provider-schema.js","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/managed-provider-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NativeModelProviderCatalogEntry } from '../native-model-provider-catalog.js';
|
|
2
|
+
import type { CatalogBinding, CatalogModel, DiscoveryConnection } from './contracts.js';
|
|
3
|
+
import { ModelCatalogService } from './service.js';
|
|
4
|
+
import type { DiscoveryAdapterRegistry } from './registry.js';
|
|
5
|
+
export interface CatalogOwnerBinding {
|
|
6
|
+
readonly binding: CatalogBinding;
|
|
7
|
+
readonly provider: Omit<NativeModelProviderCatalogEntry, 'models'>;
|
|
8
|
+
readonly connection?: DiscoveryConnection;
|
|
9
|
+
readonly read: (signal: AbortSignal) => Promise<readonly CatalogModel[]>;
|
|
10
|
+
}
|
|
11
|
+
/** The effective target owner supplies bindings; this adapter never scans native credentials. */
|
|
12
|
+
export declare function createOwnerCatalogProjection(registry: DiscoveryAdapterRegistry): {
|
|
13
|
+
service: ModelCatalogService;
|
|
14
|
+
update(binding: CatalogOwnerBinding): void;
|
|
15
|
+
remove(bindingRef: string): void;
|
|
16
|
+
catalog(): readonly NativeModelProviderCatalogEntry[];
|
|
17
|
+
subscribe: (listener: () => void) => () => void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=owner-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-projection.d.ts","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/owner-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAA;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAA;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAA;CACzE;AAED,iGAAiG;AACjG,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,wBAAwB;;oBAS3D,mBAAmB;uBAShB,MAAM;eAId,SAAS,+BAA+B,EAAE;0BAM/B,MAAM,IAAI;;EAMnC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ModelCatalogService } from './service.js';
|
|
2
|
+
/** The effective target owner supplies bindings; this adapter never scans native credentials. */
|
|
3
|
+
export function createOwnerCatalogProjection(registry) {
|
|
4
|
+
const bindings = new Map();
|
|
5
|
+
const service = new ModelCatalogService({
|
|
6
|
+
registry,
|
|
7
|
+
connection: binding => bindings.get(binding.bindingRef)?.connection,
|
|
8
|
+
read: (binding, signal) => bindings.get(binding.bindingRef)?.read(signal) ?? Promise.resolve([]),
|
|
9
|
+
});
|
|
10
|
+
return {
|
|
11
|
+
service,
|
|
12
|
+
update(binding) {
|
|
13
|
+
const duplicate = [...bindings.values()].find(value => value.provider.providerId === binding.provider.providerId
|
|
14
|
+
&& value.binding.bindingRef !== binding.binding.bindingRef);
|
|
15
|
+
if (duplicate)
|
|
16
|
+
throw new Error('Ambiguous target provider identity');
|
|
17
|
+
bindings.set(binding.binding.bindingRef, binding);
|
|
18
|
+
service.configure(binding.binding);
|
|
19
|
+
},
|
|
20
|
+
remove(bindingRef) {
|
|
21
|
+
bindings.delete(bindingRef);
|
|
22
|
+
service.remove(bindingRef);
|
|
23
|
+
},
|
|
24
|
+
catalog() {
|
|
25
|
+
return Object.freeze([...bindings.values()].map(({ binding, provider }) => {
|
|
26
|
+
const snapshot = service.snapshot(binding.bindingRef);
|
|
27
|
+
return Object.freeze({ ...provider, models: snapshot?.models ?? Object.freeze([]) });
|
|
28
|
+
}));
|
|
29
|
+
},
|
|
30
|
+
subscribe: (listener) => service.subscribe(listener),
|
|
31
|
+
dispose() {
|
|
32
|
+
service.dispose();
|
|
33
|
+
bindings.clear();
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=owner-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-projection.js","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/owner-projection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAUlD,iGAAiG;AACjG,MAAM,UAAU,4BAA4B,CAAC,QAAkC;IAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IACvD,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;QACtC,QAAQ;QACR,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU;QACnE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KACjG,CAAC,CAAA;IACF,OAAO;QACL,OAAO;QACP,MAAM,CAAC,OAA4B;YACjC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACpD,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,UAAU;mBACtD,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,CAC3D,CAAA;YACD,IAAI,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;YACpE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YACjD,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;QACD,MAAM,CAAC,UAAkB;YACvB,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAC3B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC5B,CAAC;QACD,OAAO;YACL,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBACrD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACtF,CAAC,CAAC,CAAC,CAAA;QACL,CAAC;QACD,SAAS,EAAE,CAAC,QAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;QAChE,OAAO;YACL,OAAO,CAAC,OAAO,EAAE,CAAA;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type DiscoveryAdapter } from './contracts.js';
|
|
2
|
+
export declare class DiscoveryAdapterRegistry {
|
|
3
|
+
private readonly adapters;
|
|
4
|
+
constructor(adapters: readonly DiscoveryAdapter[]);
|
|
5
|
+
resolve(endpoint: string, requested?: string): DiscoveryAdapter;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAE1C,QAAQ,EAAE,SAAS,gBAAgB,EAAE;IAOjD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAW,GAAG,gBAAgB;CAQlE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CatalogError } from './contracts.js';
|
|
2
|
+
export class DiscoveryAdapterRegistry {
|
|
3
|
+
adapters;
|
|
4
|
+
constructor(adapters) {
|
|
5
|
+
if (new Set(adapters.map(adapter => adapter.id)).size !== adapters.length) {
|
|
6
|
+
throw new Error('Duplicate discovery adapter');
|
|
7
|
+
}
|
|
8
|
+
this.adapters = Object.freeze([...adapters]);
|
|
9
|
+
}
|
|
10
|
+
resolve(endpoint, requested = 'detect') {
|
|
11
|
+
const matches = this.adapters.filter(adapter => (requested === 'detect' || adapter.id === requested) && adapter.matches(endpoint));
|
|
12
|
+
if (matches.length === 0)
|
|
13
|
+
throw new CatalogError('unsupported');
|
|
14
|
+
if (matches.length !== 1)
|
|
15
|
+
throw new CatalogError('ambiguous');
|
|
16
|
+
return matches[0];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,gBAAgB,CAAA;AAEpE,MAAM,OAAO,wBAAwB;IAClB,QAAQ,CAA6B;IAEtD,YAAY,QAAqC;QAC/C,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,SAAS,GAAG,QAAQ;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAC7C,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAClF,CAAA;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,aAAa,CAAC,CAAA;QAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,WAAW,CAAC,CAAA;QAC7D,OAAO,OAAO,CAAC,CAAC,CAAE,CAAA;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DiscoveryConnection, type DiscoveryRequest } from './contracts.js';
|
|
2
|
+
export type DiscoveryFetch = (url: string, init: RequestInit) => Promise<Response>;
|
|
3
|
+
/** Host-only credential use. Adapters cannot supply headers, a body or a destination. */
|
|
4
|
+
export declare function createDiscoveryRequestCapability(input: {
|
|
5
|
+
readonly operation: DiscoveryRequest;
|
|
6
|
+
readonly current: () => boolean;
|
|
7
|
+
readonly bearer: (signal: AbortSignal) => Promise<string | undefined>;
|
|
8
|
+
readonly fetcher?: DiscoveryFetch;
|
|
9
|
+
}): DiscoveryConnection['request'];
|
|
10
|
+
//# sourceMappingURL=request-capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-capability.d.ts","sourceRoot":"","sources":["../../../../src/launcher/model-catalog/request-capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAG7G,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,yFAAyF;AACzF,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAA;CAClC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CA+DjC"}
|