@klarkxy/dsh-model-center 0.1.0
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/LICENSE +41 -0
- package/README.md +37 -0
- package/cordis.patch.yml +5 -0
- package/docs/README.zh-CN.md +13 -0
- package/lib/client.inner.cjs +1776 -0
- package/lib/client.inner.cjs.map +1 -0
- package/lib/client.js +1946 -0
- package/lib/contracts.d.ts +76 -0
- package/lib/contracts.js +21 -0
- package/lib/contracts.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.js +43 -0
- package/lib/index.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.inner.cjs","names":["isRecord","useId","useRef","useState"],"sources":["../src/catalogue.ts","../../dsh-ai-services/src/contracts.ts","../src/contracts.ts","../src/client-view.ts","../src/model-catalog.ts","../src/policy.ts","../src/providers.ts","../src/schema.ts","../src/load.ts","../src/client.tsx"],"sourcesContent":["import type { PurposeSpec } from './contracts.ts'\n\n/** DSH GenerateOptions.purpose values. Shown only as labels for live registrations. */\nexport const BUILTIN_PURPOSE_CATALOGUE: readonly Pick<PurposeSpec, 'id' | 'label' | 'defaultTarget'>[] = [\n { id: 'compaction', label: '会话压缩', defaultTarget: { kind: 'role', role: 'weak' } },\n { id: 'session-title', label: '会话标题', defaultTarget: { kind: 'role', role: 'weak' } },\n]\n\nexport const DSH_GENERATE_PURPOSES = ['compaction', 'session-title'] as const\n\nexport function purposeLabel(id: string, registeredLabel?: string, locale: 'zh' | 'en' = 'zh'): string {\n if (registeredLabel) return registeredLabel\n const known = BUILTIN_PURPOSE_CATALOGUE.find(item => item.id === id)\n if (known) {\n if (locale === 'en') return id === 'compaction' ? 'Compaction' : 'Session title'\n return known.label\n }\n return id\n}\n\nexport function catalogueLabel(id: string): string | undefined {\n return BUILTIN_PURPOSE_CATALOGUE.find(item => item.id === id)?.label\n}\n","import type { ContextFormed } from '@deepseek-ai/dsh-llm'\n\n/** Public, browser-safe contracts. Host implementations stay in their owning packages. */\nexport type ProducerSourceKind = `plugin:${string}`\nexport type ProducerMessageSource = { kind: ProducerSourceKind; plugin: string } & ContextFormed\n\n/**\n * V4 sessions persist the producing extension in `kind`; the retired generic\n * `plugin` wrapper is not admitted. The AI service is the shared producer for\n * feature scopes, so its map must cover every registered feature id.\n */\ndeclare module '@deepseek-ai/dsh-llm' {\n interface MessageSourceMap {\n [kind: ProducerSourceKind]: ProducerMessageSource\n }\n}\n\nexport function producerMessageSource(plugin: string): ProducerMessageSource {\n return { kind: `plugin:${plugin}`, plugin }\n}\nexport type ModelRole = 'normal' | 'weak' | 'strong' | 'fantasy'\nexport interface ModelRoute { provider: string; model: string; reasoningEffort?: string }\nexport type ModelTarget = { kind: 'role'; role: ModelRole } | { kind: 'session' } | ({ kind: 'model' } & ModelRoute)\nexport interface AiPolicy {\n revision: number\n roles: Partial<Record<ModelRole, ModelRoute>>\n purposes: Record<string, ModelTarget>\n limits: { concurrency: number; timeoutMs: number; maxInputChars: number; maxOutputTokens: number; maxAttempts: number }\n}\nexport interface PurposeSpec {\n id: string\n label: string\n defaultTarget: ModelTarget\n maxOutputTokens?: number\n maxInputChars?: number\n timeoutMs?: number\n}\nexport interface ResolvedRoute extends ModelRoute {\n source: 'override' | 'purpose' | 'default'\n target: ModelTarget\n policyRevision: number\n inheritedRole?: ModelRole\n}\nexport interface AuxiliaryRequest {\n purpose: string\n sessionId?: string\n input: string\n system: string\n sourceVersion: string\n contractVersion?: number\n promptVersion?: string\n schemaVersion?: string\n override?: ModelTarget\n signal?: AbortSignal\n /** Rechecked after every await and before returning a publishable result. */\n isCurrent?: () => boolean\n priority?: 'interactive' | 'background'\n /** Plain writing candidates can stop once this many visible characters are available. */\n insert?: { maxChars: number }\n}\nexport interface UsageReceipt {\n id: string\n plugin: string\n purpose: string\n sessionId?: string\n sourceVersion: string\n contractVersion?: number\n promptVersion?: string\n schemaVersion?: string\n route?: ResolvedRoute\n status: 'success' | 'failed' | 'cancelled' | 'superseded' | 'skipped'\n attempts: number\n inputTokens?: number\n outputTokens?: number\n cost: number | null\n startedAt: number\n finishedAt: number\n error?: string\n}\nexport interface AuxiliaryResult { text: string; receipt: UsageReceipt }\nexport interface AiFeatureScope {\n readonly plugin: string\n readonly signal: AbortSignal\n readonly active: boolean\n registerPurpose(spec: PurposeSpec): () => void\n run(request: AuxiliaryRequest): Promise<AuxiliaryResult>\n dispose(): void\n}\nexport interface AiServices {\n activate(plugin: string): AiFeatureScope\n /** Atomically import missing purpose defaults once; host-only compatibility entrypoint. */\n importPurposes(migrationId: string, defaults: Record<string, ModelTarget>, roles?: AiPolicy['roles']): Promise<AiPolicy>\n getPolicy(): AiPolicy\n updatePolicy(policy: Omit<AiPolicy, 'revision'>, expectedRevision: number): Promise<AiPolicy>\n resolve(purpose: string, sessionId?: string, override?: ModelTarget): Promise<ResolvedRoute>\n purposes(): Array<PurposeSpec & { plugin: string }>\n usage(): UsageReceipt[]\n}\nexport type RpcResult<T = unknown> = { ok: true; value: T } | { ok: false; error: { code: string; message: string } }\nexport const AI_RPC_CHANNEL = '/dsh-ai-services'\nexport const CHAT_EVENTS_SLOT = 'dsh-editor.chat.events'\nexport const MODEL_SETTINGS_SLOT = 'dsh-editor.settings.models'\nexport interface EvidenceRef { sessionId: string; seq: number; kind: 'user' | 'tool' | 'turn' | 'manual'; excerpt?: string }\nexport interface TaskContract {\n id: string\n sessionId: string\n sourceVersion: string\n revision: number\n goal: string\n deliverables: string[]\n inScope: string[]\n outOfScope: string[]\n constraints: string[]\n acceptance: string[]\n assumptions: string[]\n questions: string[]\n evidence: EvidenceRef[]\n readiness: 'pending' | 'clear-request' | 'user-confirmed' | 'disclosed-assumptions' | 'cancelled' | 'stale'\n updatedAt: number\n}\nexport interface TaskCheckpoint {\n id: string\n sessionId: string\n sourceVersion: string\n contractVersion?: number\n fromSeq: number\n toSeq: number\n revision: number\n status: 'running' | 'completed' | 'failed' | 'cancelled'\n items: Array<{ label: string; state: 'pending' | 'verified' | 'failed'; evidence: EvidenceRef[] }>\n constraints: string[]\n nextAction: string\n createdAt: number\n}\nexport type KnowledgeScope = { kind: 'global' } | { kind: 'project'; projectId: string }\nexport type KnowledgeKind = 'preference' | 'project-fact' | 'decision' | 'lesson'\nexport interface MemoryRecord {\n id: string\n revision: number\n scope: KnowledgeScope\n kind: KnowledgeKind\n status: 'candidate' | 'active' | 'rejected' | 'superseded' | 'revoked' | 'deleted'\n title: string\n content: string\n tags: string[]\n evidence: EvidenceRef[]\n exceptions: string[]\n source: 'user' | 'memory' | 'dream' | 'self-improvement'\n createdAt: number\n updatedAt: number\n expiresAt?: number\n supersedes?: string[]\n /** Exact record revisions behind a derived candidate; revalidated on adoption. */\n basis?: Array<{ id: string; revision: number }>\n}\nexport type NewMemoryRecord = Omit<MemoryRecord, 'id' | 'revision' | 'createdAt' | 'updatedAt'>\nexport interface MemoryQuery { scope: KnowledgeScope; query?: string; kinds?: KnowledgeKind[]; statuses?: MemoryRecord['status'][]; limit?: number }\nexport interface MemoryMutationOptions { signal?: AbortSignal; isCurrent?: () => boolean }\nexport interface MemoryService {\n list(query: MemoryQuery): Promise<MemoryRecord[]>\n create(record: NewMemoryRecord, options?: MemoryMutationOptions): Promise<MemoryRecord>\n update(id: string, patch: Partial<Pick<MemoryRecord, 'title' | 'content' | 'tags' | 'exceptions' | 'status' | 'expiresAt'>>, expectedRevision: number, options?: MemoryMutationOptions): Promise<MemoryRecord>\n /** Explicit user promotion, persisted atomically on the same record; preserves expiry and evidence. */\n promoteToGlobal(id: string, expectedRevision: number, options?: MemoryMutationOptions): Promise<MemoryRecord>\n remove(id: string, expectedRevision: number, options?: MemoryMutationOptions): Promise<void>\n recall(query: MemoryQuery): Promise<MemoryRecord[]>\n}\n\n/** Project keys come only from the host-validated session directory, never client input. */\nexport function projectIdFromCwd(cwd: string | undefined): string | undefined {\n if (typeof cwd !== 'string') return undefined\n const normalized = cwd.trim().replaceAll('\\\\', '/')\n if (!normalized) return undefined\n return normalized === '/' || /^[A-Za-z]:\\/$/.test(normalized) ? normalized : normalized.replace(/\\/+$/, '')\n}\n","export {\n AI_RPC_CHANNEL,\n MODEL_SETTINGS_SLOT,\n} from '@klarkxy/dsh-ai-services/contracts'\nexport type {\n AiPolicy,\n ModelRole,\n ModelRoute,\n ModelTarget,\n PurposeSpec,\n ResolvedRoute,\n RpcResult,\n} from '@klarkxy/dsh-ai-services/contracts'\n\nimport type { AiPolicy, ModelRole, ModelRoute, ModelTarget, ResolvedRoute } from '@klarkxy/dsh-ai-services/contracts'\n\nexport const MODEL_CENTER_RPC_CHANNEL = '/dsh-model-center'\nexport const MODEL_CENTER_PLUGIN = '@klarkxy/dsh-model-center'\nexport const MODEL_CENTER_ENTRY_ID = 'model-center'\n\nexport const MODEL_ROLES = ['weak', 'normal', 'strong', 'fantasy'] as const satisfies readonly ModelRole[]\n\nexport interface ModelCenterStatus {\n enabled: boolean\n plugin: typeof MODEL_CENTER_PLUGIN\n}\n\nexport interface RegisteredPurpose {\n id: string\n label: string\n defaultTarget: ModelTarget\n plugin: string\n maxOutputTokens?: number\n maxInputChars?: number\n timeoutMs?: number\n}\n\nexport interface AiServicesStatus {\n policy: AiPolicy\n purposes: RegisteredPurpose[]\n storageFailed: boolean\n}\n\nexport interface AiServicesUpdateRequest {\n policy: Omit<AiPolicy, 'revision'>\n expectedRevision: number\n}\n\nexport interface AiServicesResolveRequest {\n purpose: string\n sessionId?: string\n override?: ModelTarget\n}\n\nexport type ModelCenterLocale = 'zh' | 'en'\nexport type ModelCenterTab = 'policy' | 'runtime' | 'providers'\n\nexport interface ModelCenterRenderProps {\n sessionId?: string\n locale?: ModelCenterLocale\n renderProviders?: (options?: { includeWritingRoutes?: boolean }) => unknown\n renderChatModel?: () => unknown\n}\n\nexport interface ProviderListing {\n id: string\n displayName: string\n settingsNs: string\n settingsPath: string[]\n live: boolean\n declared?: boolean\n error?: string\n auth: 'configured' | 'missing' | 'unknown'\n writable?: boolean\n credentialRef?: string\n}\n\nexport interface DiscoveredModel {\n id: string\n name?: string\n contextWindow?: number\n maxTokens?: number\n}\n\nexport type RoutePreview = {\n ok: true\n route: ResolvedRoute\n conflict?: string\n} | {\n ok: false\n error: string\n target?: ModelTarget\n policyRevision: number\n}\n\nexport function isModelRole(value: unknown): value is ModelRole {\n return value === 'normal' || value === 'weak' || value === 'strong' || value === 'fantasy'\n}\n\nexport function isBoundRoute(route: ModelRoute | undefined): route is ModelRoute {\n return Boolean(route && route.provider.trim() && route.model.trim())\n}\n","import {\n AI_RPC_CHANNEL, MODEL_CENTER_RPC_CHANNEL, MODEL_SETTINGS_SLOT, type ModelCenterLocale, type ModelCenterStatus,\n type ModelCenterTab, type RpcResult,\n} from './contracts.ts'\n\nexport const SETTINGS_SECTION_SLOT = 'settings.section'\nexport const MODEL_CENTER_SLOT_ID = 'model-center'\nexport const MODEL_CENTER_SLOT_ORDER = 40\n\nexport const SETTINGS_SEAT = {\n replacement: MODEL_SETTINGS_SLOT,\n fallback: SETTINGS_SECTION_SLOT,\n exclusive: true,\n} as const\n\nexport function visibleSettingsSeat(replacementAvailable: boolean): 'replacement' | 'section' {\n return replacementAvailable ? 'replacement' : 'section'\n}\n\nexport class RpcCallError extends Error {\n constructor(message: string, readonly code?: string) {\n super(message)\n this.name = 'RpcCallError'\n }\n}\n\nexport function unwrapRpc<T>(result: unknown): T {\n if (!result || typeof result !== 'object') throw new RpcCallError('请求失败。')\n const row = result as RpcResult<T>\n if ('ok' in row) {\n if (!row.ok) throw new RpcCallError(row.error.message || '请求失败。', row.error.code)\n return row.value\n }\n return result as T\n}\n\nexport function isHostEnabledStatus(value: unknown): boolean {\n try {\n const status = unwrapRpc<ModelCenterStatus>(value)\n return status.enabled === true\n } catch {\n return false\n }\n}\n\nexport function shouldReplaceModelsUi(enabled: boolean): boolean {\n return enabled === true\n}\n\nexport function tablistKey(current: ModelCenterTab, key: string): ModelCenterTab | undefined {\n if (key === 'Home') return 'policy'\n if (key === 'End') return 'providers'\n if (key === 'ArrowRight' || key === 'ArrowLeft') {\n const tabs: ModelCenterTab[] = ['policy', 'runtime', 'providers']\n const index = tabs.indexOf(current)\n const step = key === 'ArrowRight' ? 1 : -1\n return tabs[(index + step + tabs.length) % tabs.length]\n }\n return undefined\n}\n\nexport function tabLabel(tab: ModelCenterTab, locale: ModelCenterLocale): string {\n if (tab === 'providers') return locale === 'en' ? 'Providers' : '供应商'\n if (tab === 'runtime') return locale === 'en' ? 'Runtime' : '运行设置'\n return locale === 'en' ? 'Model routing' : '模型配置'\n}\n\nexport function centerLabel(locale: ModelCenterLocale): string {\n return locale === 'en' ? 'Model Center' : '模型中心'\n}\n\nexport type SlotSpec = { name: string; id: string; label: string; order: number }\n\nexport function modelSettingsSlotSpec(locale: ModelCenterLocale): SlotSpec {\n return { name: MODEL_SETTINGS_SLOT, id: MODEL_CENTER_SLOT_ID, order: 0, label: centerLabel(locale) }\n}\n\nexport function settingsSectionSlotSpec(locale: ModelCenterLocale): SlotSpec {\n return { name: SETTINGS_SECTION_SLOT, id: MODEL_CENTER_SLOT_ID, order: MODEL_CENTER_SLOT_ORDER, label: centerLabel(locale) }\n}\n\nexport type SlotHandle = {\n inject: (key: string, callback: () => unknown) => unknown\n register: (spec: SlotSpec, render: unknown) => unknown\n}\n\n/** Bind the replacement seat when declared; otherwise the standalone settings.section. Never both. */\nexport function registerExclusiveSettingsSeats(\n slots: SlotHandle,\n render: unknown,\n locale: ModelCenterLocale = 'zh',\n): () => void {\n let replacementLive = false\n let dropFallbackInject = () => {}\n let dropFallbackRegister = () => {}\n\n const dropReplacement = slots.inject(SETTINGS_SEAT.replacement, () => {\n replacementLive = true\n dropFallbackRegister()\n dropFallbackRegister = () => {}\n dropFallbackInject()\n dropFallbackInject = () => {}\n return slots.register(modelSettingsSlotSpec(locale), render)\n }) as () => void\n\n if (!replacementLive) {\n dropFallbackInject = slots.inject(SETTINGS_SEAT.fallback, () => {\n if (replacementLive) return () => {}\n dropFallbackRegister = slots.register(settingsSectionSlotSpec(locale), render) as () => void\n return () => { dropFallbackRegister() }\n }) as () => void\n }\n\n return () => {\n dropReplacement()\n dropFallbackInject()\n dropFallbackRegister()\n }\n}\n\nexport const AI_STATUS_ENDPOINT = 'status'\nexport const AI_UPDATE_ENDPOINT = 'update'\nexport const AI_RESOLVE_ENDPOINT = 'resolve'\nexport const HOST_STATUS_ENDPOINT = 'status'\n\nexport function aiChannel(): string {\n return AI_RPC_CHANNEL\n}\n\nexport function hostChannel(): string {\n return MODEL_CENTER_RPC_CHANNEL\n}\n\nexport async function readHostEnabled(\n call: (channel: string, endpoint: string, payload: unknown, signal?: AbortSignal) => Promise<unknown>,\n signal?: AbortSignal,\n): Promise<boolean> {\n try {\n return isHostEnabledStatus(await call(MODEL_CENTER_RPC_CHANNEL, HOST_STATUS_ENDPOINT, {}, signal))\n } catch {\n return false\n }\n}\n\nexport const COPY = {\n zh: {\n loading: '正在读取模型中心…',\n reconnect: '重新连接',\n hostOff: '模型中心未启用。',\n policyMissing: '无法读取 AI 策略。',\n save: '保存',\n saved: '已保存。',\n retry: '重试',\n limits: '限额与超时',\n retryLimit: '失败重试次数',\n concurrency: '并发',\n timeout: '超时(毫秒)',\n maxInput: '输入字符上限',\n maxOutput: '输出 token 上限',\n roles: '模型档位',\n fantasyPreset: '幻想',\n capabilityHint: '跟随档位时,模型与思考强度会一起更新。',\n capabilities: '能力默认值',\n unsaved: '有未保存的更改',\n notConfigured: '请先设置对话档',\n purposes: '其他功能',\n noPurposes: '没有其他功能需要单独配置。',\n unbound: '跟随对话',\n bindNormal: '对话',\n commonModels: '常用功能',\n otherModels: '其他功能',\n advanced: '高级设置',\n defaultPreset: '对话',\n efficientPreset: '快速',\n qualityPreset: '思考',\n followDefault: '跟随对话',\n followEfficient: '跟随快速',\n followQuality: '跟随思考',\n useModel: '使用模型',\n followSession: '跟随当前会话',\n explicit: '单独设置',\n provider: '供应商',\n model: '模型',\n effort: '思考强度',\n chooseModel: '选择模型',\n catalog: '模型',\n resolved: '解析结果',\n source: '配置来源',\n conflict: '冲突',\n discovery: '发现模型',\n discovering: '正在发现…',\n noProviders: '没有可列出的供应商。',\n live: '已激活',\n dormant: '未激活',\n openNative: '打开原生设置',\n nativeHint: '凭据请在原生设置中编辑。',\n editorHint: '供应商编辑由宿主提供。',\n revisionConflict: '配置已被更新,请刷新后重试。',\n storageFailed: '策略存储失败。',\n defaultEffort: '默认',\n unknownOp: '未知操作。',\n },\n en: {\n loading: 'Loading Model Center…',\n reconnect: 'Reconnect',\n hostOff: 'Model Center is off.',\n policyMissing: 'Could not read AI policy.',\n save: 'Save',\n saved: 'Saved.',\n retry: 'Retry',\n limits: 'Limits and timeouts',\n retryLimit: 'Retry attempts',\n concurrency: 'Concurrency',\n timeout: 'Timeout (ms)',\n maxInput: 'Input character cap',\n maxOutput: 'Output token cap',\n roles: 'Model tiers',\n fantasyPreset: 'Fantasy',\n capabilityHint: 'Following a tier inherits both its model and reasoning effort.',\n capabilities: 'Capability defaults',\n unsaved: 'Unsaved changes',\n notConfigured: 'Configure the Chat tier first',\n purposes: 'Other features',\n noPurposes: 'No other features need a separate model.',\n unbound: 'Follow Chat',\n bindNormal: 'Chat',\n commonModels: 'Common features',\n otherModels: 'Other features',\n advanced: 'Advanced settings',\n defaultPreset: 'Chat',\n efficientPreset: 'Quick',\n qualityPreset: 'Thinking',\n followDefault: 'Follow Chat',\n followEfficient: 'Follow Quick',\n followQuality: 'Follow Thinking',\n useModel: 'Use model',\n followSession: 'Follow current session',\n explicit: 'Custom',\n provider: 'Provider',\n model: 'Model',\n effort: 'Reasoning',\n chooseModel: 'Choose a model',\n catalog: 'Model',\n resolved: 'Resolved',\n source: 'Source',\n conflict: 'Conflict',\n discovery: 'Discover models',\n discovering: 'Discovering…',\n noProviders: 'No providers to list.',\n live: 'Live',\n dormant: 'Dormant',\n openNative: 'Open native settings',\n nativeHint: 'Edit credentials in native settings.',\n editorHint: 'The host supplies the provider editor.',\n revisionConflict: 'Policy changed; refresh and retry.',\n storageFailed: 'Policy storage failed.',\n defaultEffort: 'Default',\n unknownOp: 'Unknown operation.',\n },\n} as const\n\nexport function copy(locale: ModelCenterLocale) {\n return COPY[locale]\n}\n","import type { ModelRoute } from './contracts.ts'\n\nexport type CatalogEffort = { id: string; name: string }\nexport type CatalogModel = {\n id: string\n name: string\n reasoning?: { efforts: readonly CatalogEffort[]; defaultEffort?: string }\n}\nexport type CatalogGroup = { id: string; name: string; models: readonly CatalogModel[] }\nexport type SessionModelCatalog = {\n default?: { provider: string; model: string; reasoningEffort?: string }\n groups: readonly CatalogGroup[]\n}\n\nexport type CatalogChoice = {\n provider: string\n model: string\n label: string\n efforts: readonly CatalogEffort[]\n defaultEffort?: string\n}\n\nconst KEY_SEP = '\\u001f'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction parseEffort(value: unknown): CatalogEffort | undefined {\n if (!isRecord(value)) return undefined\n const id = text(value.id)\n if (!id) return undefined\n return { id, name: text(value.name) ?? id }\n}\n\nfunction parseModel(value: unknown): CatalogModel | undefined {\n if (!isRecord(value)) return undefined\n const id = text(value.id)\n if (!id) return undefined\n const name = text(value.name) ?? id\n if (value.reasoning === undefined) return { id, name }\n if (!isRecord(value.reasoning) || !Array.isArray(value.reasoning.efforts)) return { id, name }\n const efforts = value.reasoning.efforts.map(parseEffort).filter((item): item is CatalogEffort => Boolean(item))\n const defaultEffort = text(value.reasoning.defaultEffort)\n return { id, name, reasoning: defaultEffort ? { efforts, defaultEffort } : { efforts } }\n}\n\nfunction parseGroup(value: unknown): CatalogGroup | undefined {\n if (!isRecord(value)) return undefined\n const id = text(value.id)\n if (!id || !Array.isArray(value.models)) return undefined\n const models = value.models.map(parseModel).filter((item): item is CatalogModel => Boolean(item))\n return { id, name: text(value.name) ?? id, models }\n}\n\nexport function parseModelCatalog(value: unknown): SessionModelCatalog {\n const root = isRecord(value) ? value : {}\n const groups = Array.isArray(root.groups)\n ? root.groups.map(parseGroup).filter((item): item is CatalogGroup => Boolean(item))\n : []\n const fallback = isRecord(root.default) ? root.default : undefined\n const provider = fallback ? text(fallback.provider) : undefined\n const model = fallback ? text(fallback.model) : undefined\n const reasoningEffort = fallback ? text(fallback.reasoningEffort) : undefined\n const catalog: SessionModelCatalog = { groups }\n if (provider && model) catalog.default = reasoningEffort ? { provider, model, reasoningEffort } : { provider, model }\n return catalog\n}\n\nexport function catalogChoices(catalog: SessionModelCatalog, bound?: Pick<ModelRoute, 'provider' | 'model'>): CatalogChoice[] {\n const choices: CatalogChoice[] = []\n for (const group of catalog.groups) {\n for (const model of group.models) {\n choices.push({\n provider: group.id,\n model: model.id,\n label: `${group.name} / ${model.name}`,\n efforts: model.reasoning?.efforts ?? [],\n defaultEffort: model.reasoning?.defaultEffort,\n })\n }\n }\n if (bound?.provider && bound.model && !choices.some(item => item.provider === bound.provider && item.model === bound.model)) {\n choices.push({\n provider: bound.provider,\n model: bound.model,\n label: `${bound.provider} / ${bound.model}`,\n efforts: [],\n })\n }\n return choices\n}\n\nexport function choiceOf(choices: readonly CatalogChoice[], provider: string, model: string): CatalogChoice | undefined {\n return choices.find(item => item.provider === provider && item.model === model)\n}\n\n/** Advertised efforts plus the current value if it is not in the list. Unlisted IDs stay selectable. */\nexport function effortOptions(choice: CatalogChoice | undefined, current?: string): CatalogEffort[] {\n const listed = choice?.efforts.map(item => ({ ...item })) ?? []\n if (current && !listed.some(item => item.id === current)) listed.push({ id: current, name: current })\n return listed\n}\n\nexport function routeKey(provider: string, model: string): string {\n return `${provider}${KEY_SEP}${model}`\n}\n\nexport function parseRouteKey(value: string): { provider: string; model: string } | undefined {\n const index = value.indexOf(KEY_SEP)\n if (index <= 0) return undefined\n const provider = value.slice(0, index)\n const model = value.slice(index + KEY_SEP.length)\n if (!provider || !model) return undefined\n return { provider, model }\n}\n\nexport function emptyCatalog(): SessionModelCatalog {\n return { groups: [] }\n}\n","import type {\n AiPolicy, ModelRole, ModelRoute, ModelTarget, PurposeSpec, RegisteredPurpose, ResolvedRoute, RoutePreview,\n} from './contracts.ts'\nimport { isBoundRoute } from './contracts.ts'\n\nexport function roleRoute(policy: AiPolicy, role: ModelRole): { route: ModelRoute; inheritedRole?: ModelRole } | { error: string } {\n const bound = policy.roles[role]\n if (isBoundRoute(bound)) return { route: bound }\n if (role !== 'normal') {\n const normal = policy.roles.normal\n if (isBoundRoute(normal)) return { route: normal, inheritedRole: 'normal' }\n }\n if (role === 'normal') return { error: '对话档尚未设置模型。' }\n return { error: `${roleLabel(role)}档尚未设置模型,且对话档不可用。` }\n}\n\nexport function roleLabel(role: ModelRole, locale: 'zh' | 'en' = 'zh'): string {\n if (locale === 'en') return { normal: 'Chat', weak: 'Quick', strong: 'Thinking', fantasy: 'Fantasy' }[role]\n return { normal: '对话', weak: '快速', strong: '思考', fantasy: '幻想' }[role]\n}\n\nexport function sourceLabel(source: ResolvedRoute['source'], locale: 'zh' | 'en' = 'zh'): string {\n if (locale === 'en') return source === 'override' ? 'Request override' : source === 'purpose' ? 'Purpose' : 'Default'\n return source === 'override' ? '请求覆盖' : source === 'purpose' ? '用途配置' : '默认'\n}\n\nexport function targetKindLabel(target: ModelTarget, locale: 'zh' | 'en' = 'zh'): string {\n if (target.kind === 'session') return locale === 'en' ? 'Follow current session' : '跟随当前会话'\n if (target.kind === 'model') return locale === 'en' ? 'Explicit model' : '指定模型'\n return roleLabel(target.role, locale)\n}\n\nfunction resolveTarget(\n target: ModelTarget,\n policy: AiPolicy,\n session?: ModelRoute,\n): { route: ModelRoute; inheritedRole?: ModelRole } | { error: string } {\n if (target.kind === 'session') {\n if (!isBoundRoute(session)) return { error: '当前会话没有可用模型。' }\n return { route: session }\n }\n if (target.kind === 'model') {\n if (!isBoundRoute(target)) return { error: '指定模型不完整。' }\n return { route: { provider: target.provider, model: target.model, reasoningEffort: target.reasoningEffort } }\n }\n return roleRoute(policy, target.role)\n}\n\nexport function purposeTarget(\n policy: AiPolicy,\n purpose: string,\n specs: readonly Pick<PurposeSpec, 'id' | 'defaultTarget'>[],\n override?: ModelTarget,\n): { target: ModelTarget; source: ResolvedRoute['source'] } | { error: string } {\n if (override) return { target: override, source: 'override' }\n const configured = policy.purposes[purpose]\n if (configured) return { target: configured, source: 'purpose' }\n const spec = specs.find(item => item.id === purpose)\n if (spec) return { target: spec.defaultTarget, source: 'default' }\n return { error: '未配置该用途。' }\n}\n\nexport function previewResolve(\n policy: AiPolicy,\n purpose: string,\n options: {\n specs?: readonly Pick<PurposeSpec, 'id' | 'defaultTarget'>[]\n session?: ModelRoute\n override?: ModelTarget\n knownProviders?: ReadonlySet<string>\n knownModels?: ReadonlySet<string>\n } = {},\n): RoutePreview {\n const selected = purposeTarget(policy, purpose, options.specs ?? [], options.override)\n if ('error' in selected) return { ok: false, error: selected.error, policyRevision: policy.revision }\n const resolved = resolveTarget(selected.target, policy, options.session)\n if ('error' in resolved) {\n return { ok: false, error: resolved.error, target: selected.target, policyRevision: policy.revision }\n }\n let conflict: string | undefined\n if (options.knownProviders && !options.knownProviders.has(resolved.route.provider)) {\n conflict = '供应商当前不可用。'\n } else if (options.knownModels && !options.knownModels.has(`${resolved.route.provider}/${resolved.route.model}`)) {\n conflict = '模型当前不可用。'\n }\n return {\n ok: true,\n conflict,\n route: {\n ...resolved.route,\n source: selected.source,\n target: selected.target,\n policyRevision: policy.revision,\n inheritedRole: resolved.inheritedRole,\n },\n }\n}\n\nexport function purposeRows(policy: AiPolicy, registered: readonly RegisteredPurpose[]): Array<RegisteredPurpose & { target: ModelTarget; source: 'purpose' | 'default' }> {\n return registered.map(spec => {\n const configured = policy.purposes[spec.id]\n return {\n ...spec,\n target: configured ?? spec.defaultTarget,\n source: configured ? 'purpose' as const : 'default' as const,\n }\n })\n}\n\nexport function formatRoute(route: Pick<ModelRoute, 'provider' | 'model' | 'reasoningEffort'>): string {\n const effort = route.reasoningEffort ? ` · ${route.reasoningEffort}` : ''\n return `${route.provider} / ${route.model}${effort}`\n}\n\nexport function inheritanceNote(inheritedRole: ModelRole | undefined, locale: 'zh' | 'en' = 'zh'): string {\n if (!inheritedRole) return ''\n return locale === 'en' ? `Inherited from ${roleLabel(inheritedRole, locale)}` : `继承自${roleLabel(inheritedRole, locale)}`\n}\n","import type { DiscoveredModel, ProviderListing } from './contracts.ts'\n\nexport function providerIdOf(entry: { provider?: unknown; id?: unknown }): string {\n if (typeof entry.provider === 'string' && entry.provider.length > 0) return entry.provider\n if (typeof entry.id === 'string' && entry.id.length > 0) return entry.id\n return ''\n}\n\nexport function displayNameOf(entry: { displayName?: unknown; name?: unknown; provider?: unknown; id?: unknown }): string {\n if (typeof entry.displayName === 'string' && entry.displayName.length > 0) return entry.displayName\n if (typeof entry.name === 'string' && entry.name.length > 0) return entry.name\n return providerIdOf(entry) || 'provider'\n}\n\nexport type ConfigurableProvider = {\n provider?: unknown\n id?: unknown\n displayName?: unknown\n name?: unknown\n settingsNs?: unknown\n settingsPath?: unknown\n declared?: unknown\n error?: unknown\n}\n\nexport type LiveProvider = { id?: unknown; name?: unknown }\n\nexport type CredentialView = { configured?: unknown; writable?: unknown; source?: unknown }\n\nexport type SettingsSchemaWalk = {\n getPath?(value: unknown, path: string[]): unknown\n}\n\nexport function settingsPathOf(entry: ConfigurableProvider): string[] {\n return Array.isArray(entry.settingsPath)\n ? entry.settingsPath.filter((item): item is string => typeof item === 'string')\n : []\n}\n\nexport function profileAt(value: unknown, path: string[]): unknown {\n let current: unknown = value\n for (const segment of path) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nexport function apiKeyEnvOf(profile: unknown): string | undefined {\n if (!profile || typeof profile !== 'object' || Array.isArray(profile)) return undefined\n const ref = (profile as { apiKeyEnv?: unknown }).apiKeyEnv\n return typeof ref === 'string' && ref.trim() ? ref.trim() : undefined\n}\n\nexport function namespacesOf(snapshot: unknown): Map<string, unknown> {\n const map = new Map<string, unknown>()\n if (!snapshot || typeof snapshot !== 'object' || Array.isArray(snapshot)) return map\n const view = (snapshot as { view?: { namespaces?: unknown } }).view\n const namespaces = view && typeof view === 'object' && !Array.isArray(view) ? view.namespaces : undefined\n if (!Array.isArray(namespaces)) return map\n for (const entry of namespaces) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue\n const ns = (entry as { ns?: unknown }).ns\n if (typeof ns === 'string' && ns) map.set(ns, (entry as { value?: unknown }).value)\n }\n return map\n}\n\n/** Resolve the profile's apiKeyEnv. Never invent PROVIDER_API_KEY. */\nexport function resolveApiKeyEnv(\n namespaces: Map<string, unknown>,\n settingsNs: string,\n settingsPath: string[],\n schema?: SettingsSchemaWalk,\n): string | undefined {\n if (!settingsNs) return undefined\n const namespace = namespaces.get(settingsNs)\n const profile = schema?.getPath ? schema.getPath(namespace, settingsPath) : profileAt(namespace, settingsPath)\n return apiKeyEnvOf(profile)\n}\n\nfunction authOf(credential: CredentialView | undefined): ProviderListing['auth'] {\n if (credential?.configured === true) return 'configured'\n if (credential?.configured === false) return 'missing'\n return 'unknown'\n}\n\nexport function joinProviderListings(\n configurable: readonly ConfigurableProvider[],\n live: readonly LiveProvider[],\n credentials: Record<string, CredentialView> = {},\n apiKeyEnvs: ReadonlyMap<string, string> = new Map(),\n): ProviderListing[] {\n const liveIds = new Set(live.map(item => typeof item.id === 'string' ? item.id : '').filter(Boolean))\n const rows = configurable.map(entry => {\n const id = providerIdOf(entry)\n const credentialRef = id ? apiKeyEnvs.get(id) : undefined\n const credential = credentialRef ? credentials[credentialRef] : undefined\n return {\n id: id || displayNameOf(entry),\n displayName: displayNameOf(entry),\n settingsNs: typeof entry.settingsNs === 'string' ? entry.settingsNs : '',\n settingsPath: settingsPathOf(entry),\n live: id ? liveIds.has(id) : false,\n declared: entry.declared === true ? true : entry.declared === false ? false : undefined,\n error: typeof entry.error === 'string' && entry.error ? entry.error : undefined,\n auth: authOf(credential),\n writable: typeof credential?.writable === 'boolean' ? credential.writable : undefined,\n credentialRef,\n } satisfies ProviderListing\n })\n for (const item of live) {\n const id = typeof item.id === 'string' ? item.id : ''\n if (!id || rows.some(row => row.id === id)) continue\n const credentialRef = apiKeyEnvs.get(id)\n const credential = credentialRef ? credentials[credentialRef] : undefined\n rows.push({\n id,\n displayName: typeof item.name === 'string' && item.name ? item.name : id,\n settingsNs: '',\n settingsPath: [],\n live: true,\n declared: undefined,\n error: undefined,\n auth: authOf(credential),\n writable: typeof credential?.writable === 'boolean' ? credential.writable : undefined,\n credentialRef,\n })\n }\n return rows\n}\n\nexport function credentialRefsToDescribe(rows: readonly ProviderListing[]): string[] {\n return [...new Set(rows.flatMap(row => row.credentialRef ? [row.credentialRef] : []))]\n}\n\nexport function shouldLoadNativeProviders(renderProviders?: unknown): boolean {\n return typeof renderProviders !== 'function'\n}\n\nexport function authLabel(auth: ProviderListing['auth'], locale: 'zh' | 'en' = 'zh'): string {\n if (auth === 'configured') return locale === 'en' ? 'Key configured' : '已配置密钥'\n if (auth === 'missing') return locale === 'en' ? 'Key missing' : '未配置密钥'\n return locale === 'en' ? 'Auth unknown' : '密钥状态未知'\n}\n\nexport function discoveredIds(models: readonly DiscoveredModel[]): string[] {\n return [...new Set(models.map(model => model.id).filter(Boolean))]\n}\n\nexport function canDiscoverModels(llm: { discoverModels?: unknown } | undefined): boolean {\n return typeof llm?.discoverModels === 'function'\n}\n\nexport function canOpenSettingsDocument(settings: { openSettingsDocument?: unknown } | undefined): boolean {\n return typeof settings?.openSettingsDocument === 'function'\n}\n\nexport function nativeSettingsNote(locale: 'zh' | 'en' = 'zh'): string {\n return locale === 'en' ? 'Open native settings for provider credentials.' : '凭据请在原生设置中编辑。'\n}\n","import type { AiPolicy, AiServicesStatus, AiServicesUpdateRequest, ModelRole, ModelRoute, ModelTarget, RegisteredPurpose, ResolvedRoute } from './contracts.ts'\nimport { isModelRole } from './contracts.ts'\n\nexport const LIMIT_BOUNDS = {\n concurrency: { min: 1, max: 8 },\n timeoutMs: { min: 1_000, max: 300_000 },\n maxInputChars: { min: 1, max: 200_000 },\n maxOutputTokens: { min: 1, max: 8_192 },\n maxAttempts: { min: 1, max: 5 },\n} as const\n\nexport const ROUTE_BOUNDS = {\n provider: 128,\n model: 256,\n effort: 64,\n purpose: 80,\n} as const\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction fail(error: string): { ok: false; error: string } {\n return { ok: false, error }\n}\n\nfunction boundedInt(value: unknown, min: number, max: number): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= min && value <= max ? value : undefined\n}\n\nfunction boundedText(value: unknown, max: number): string | undefined {\n if (typeof value !== 'string') return undefined\n const text = value.trim()\n if (!text || text.length > max) return undefined\n return text\n}\n\nexport function parseModelRoute(value: unknown): ModelRoute | undefined {\n if (!isRecord(value)) return undefined\n const provider = boundedText(value.provider, ROUTE_BOUNDS.provider)\n const model = boundedText(value.model, ROUTE_BOUNDS.model)\n if (!provider || !model) return undefined\n if (value.reasoningEffort === undefined) return { provider, model }\n if (typeof value.reasoningEffort !== 'string') return undefined\n const reasoningEffort = value.reasoningEffort.trim()\n if (!reasoningEffort) return { provider, model }\n if (reasoningEffort.length > ROUTE_BOUNDS.effort) return undefined\n return { provider, model, reasoningEffort }\n}\n\nexport function parseModelTarget(value: unknown): ModelTarget | undefined {\n if (!isRecord(value) || typeof value.kind !== 'string') return undefined\n if (value.kind === 'session') return { kind: 'session' }\n if (value.kind === 'role' && isModelRole(value.role)) return { kind: 'role', role: value.role }\n if (value.kind === 'model') {\n const route = parseModelRoute(value)\n return route ? { kind: 'model', ...route } : undefined\n }\n return undefined\n}\n\nexport function parseLimits(value: unknown): AiPolicy['limits'] | undefined {\n if (!isRecord(value)) return undefined\n const concurrency = boundedInt(value.concurrency, LIMIT_BOUNDS.concurrency.min, LIMIT_BOUNDS.concurrency.max)\n const timeoutMs = boundedInt(value.timeoutMs, LIMIT_BOUNDS.timeoutMs.min, LIMIT_BOUNDS.timeoutMs.max)\n const maxInputChars = boundedInt(value.maxInputChars, LIMIT_BOUNDS.maxInputChars.min, LIMIT_BOUNDS.maxInputChars.max)\n const maxOutputTokens = boundedInt(value.maxOutputTokens, LIMIT_BOUNDS.maxOutputTokens.min, LIMIT_BOUNDS.maxOutputTokens.max)\n const maxAttempts = boundedInt(value.maxAttempts, LIMIT_BOUNDS.maxAttempts.min, LIMIT_BOUNDS.maxAttempts.max)\n if (concurrency === undefined || timeoutMs === undefined || maxInputChars === undefined || maxOutputTokens === undefined || maxAttempts === undefined) {\n return undefined\n }\n return { concurrency, timeoutMs, maxInputChars, maxOutputTokens, maxAttempts }\n}\n\nexport function parseRoles(value: unknown): AiPolicy['roles'] | undefined {\n if (!isRecord(value)) return undefined\n const roles: AiPolicy['roles'] = {}\n for (const role of ['normal', 'weak', 'strong', 'fantasy'] as const) {\n if (value[role] === undefined) continue\n const route = parseModelRoute(value[role])\n if (!route) return undefined\n roles[role] = route\n }\n return roles\n}\n\nexport function parsePurposes(value: unknown): Record<string, ModelTarget> | undefined {\n if (!isRecord(value)) return undefined\n const keys = Object.keys(value)\n if (keys.length > 200) return undefined\n const purposes: Record<string, ModelTarget> = {}\n for (const key of keys) {\n if (!key || key.length > ROUTE_BOUNDS.purpose) return undefined\n const target = parseModelTarget(value[key])\n if (!target) return undefined\n purposes[key] = target\n }\n return purposes\n}\n\nexport function parsePolicyBody(value: unknown): Omit<AiPolicy, 'revision'> | undefined {\n if (!isRecord(value)) return undefined\n const roles = parseRoles(value.roles)\n const purposes = parsePurposes(value.purposes)\n const limits = parseLimits(value.limits)\n if (!roles || !purposes || !limits) return undefined\n return { roles, purposes, limits }\n}\n\nexport function parseAiPolicy(value: unknown): AiPolicy | undefined {\n if (!isRecord(value)) return undefined\n const revision = boundedInt(value.revision, 0, Number.MAX_SAFE_INTEGER)\n const body = parsePolicyBody(value)\n if (revision === undefined || !body) return undefined\n return { revision, ...body }\n}\n\nexport function parsePurposeSpec(value: unknown): RegisteredPurpose | undefined {\n if (!isRecord(value) || typeof value.id !== 'string' || typeof value.label !== 'string' || typeof value.plugin !== 'string') return undefined\n if (!value.id || value.id.length > ROUTE_BOUNDS.purpose || !value.label || !value.plugin) return undefined\n const defaultTarget = parseModelTarget(value.defaultTarget)\n if (!defaultTarget) return undefined\n return {\n id: value.id,\n label: value.label,\n plugin: value.plugin,\n defaultTarget,\n maxOutputTokens: typeof value.maxOutputTokens === 'number' ? value.maxOutputTokens : undefined,\n maxInputChars: typeof value.maxInputChars === 'number' ? value.maxInputChars : undefined,\n timeoutMs: typeof value.timeoutMs === 'number' ? value.timeoutMs : undefined,\n }\n}\n\nexport function parsePolicyUpdate(payload: unknown): { ok: true; value: AiServicesUpdateRequest } | { ok: false; error: string } {\n if (!isRecord(payload)) return fail('AI 策略格式无效。')\n const expectedRevision = boundedInt(payload.expectedRevision, 0, Number.MAX_SAFE_INTEGER)\n const policy = parsePolicyBody(payload.policy)\n if (expectedRevision === undefined || !policy) return fail('AI 策略格式无效。')\n return { ok: true, value: { expectedRevision, policy } }\n}\n\nexport function parseAiServicesStatus(value: unknown): { ok: true; value: AiServicesStatus } | { ok: false; error: string } {\n if (!isRecord(value) || value.policy === undefined || !Array.isArray(value.purposes)) {\n return fail('AI 策略接口与约定不一致。')\n }\n const policy = parseAiPolicy(value.policy)\n if (!policy) return fail('AI 策略接口与约定不一致。')\n const purposes = value.purposes.map(parsePurposeSpec)\n if (purposes.some(item => !item)) return fail('AI 策略接口与约定不一致。')\n if (value.storageFailed !== undefined && typeof value.storageFailed !== 'boolean') return fail('AI 策略接口与约定不一致。')\n return {\n ok: true,\n value: { policy, purposes: purposes as RegisteredPurpose[], storageFailed: value.storageFailed === true },\n }\n}\n\nexport function parseResolvedRoute(value: unknown): { success: true; data: ResolvedRoute } | { success: false } {\n if (!isRecord(value)) return { success: false }\n const route = parseModelRoute(value)\n const target = parseModelTarget(value.target)\n const policyRevision = boundedInt(value.policyRevision, 0, Number.MAX_SAFE_INTEGER)\n const source = value.source\n if (!route || !target || policyRevision === undefined || (source !== 'override' && source !== 'purpose' && source !== 'default')) {\n return { success: false }\n }\n const inheritedRole = value.inheritedRole\n if (inheritedRole !== undefined && !isModelRole(inheritedRole)) return { success: false }\n return {\n success: true,\n data: {\n ...route,\n source,\n target,\n policyRevision,\n inheritedRole: inheritedRole as ModelRole | undefined,\n },\n }\n}\n\nexport function editablePolicy(policy: AiPolicy): Omit<AiPolicy, 'revision'> {\n return { roles: { ...policy.roles }, purposes: { ...policy.purposes }, limits: { ...policy.limits } }\n}\n\nexport const POLICY_CONFLICT_CODE = 'AI_POLICY_CONFLICT'\n\nexport function isPolicyConflict(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const code = 'code' in error ? String((error as { code?: unknown }).code) : ''\n if (code === POLICY_CONFLICT_CODE) return true\n const message = error instanceof Error ? error.message : ''\n return /策略已被|revision|conflict/i.test(message)\n}\n","import { AI_RPC_CHANNEL } from './contracts.ts'\nimport type { AiPolicy, ProviderListing, RegisteredPurpose, ResolvedRoute } from './contracts.ts'\nimport { unwrapRpc } from './client-view.ts'\nimport { emptyCatalog, parseModelCatalog, type SessionModelCatalog } from './model-catalog.ts'\nimport { previewResolve } from './policy.ts'\nimport {\n credentialRefsToDescribe, joinProviderListings, namespacesOf, resolveApiKeyEnv, type ConfigurableProvider,\n type CredentialView, type LiveProvider, type SettingsSchemaWalk,\n} from './providers.ts'\nimport { isPolicyConflict, parseAiPolicy, parseAiServicesStatus, parsePolicyUpdate, parseResolvedRoute } from './schema.ts'\n\nexport type RpcCall = (channel: string, endpoint: string, payload?: unknown, signal?: AbortSignal) => Promise<unknown>\n\nexport type GenerationGate = {\n current: () => number\n next: () => number\n isCurrent: (token: number) => boolean\n}\n\nexport function createGenerationGate(start = 0): GenerationGate {\n let current = start\n return {\n current: () => current,\n next: () => {\n current += 1\n return current\n },\n isCurrent: token => token === current,\n }\n}\n\nexport function stillCurrent(token: number, gate: Pick<GenerationGate, 'isCurrent'>, signal?: AbortSignal): boolean {\n return gate.isCurrent(token) && !signal?.aborted\n}\n\nexport interface LoadModelCenterInput {\n call: RpcCall\n sessionId?: string\n loadProviders: boolean\n llm?: {\n listConfigurableProviders(): Promise<unknown>\n listProviders?(): Promise<unknown>\n }\n credentials?: { describe(refs: string[]): Promise<unknown> }\n session?: { modelCatalog(): Promise<unknown> }\n configForms?: { describe?: () => { getSnapshot?: () => unknown; ensure?: () => Promise<unknown> } }\n settingsSchema?: SettingsSchemaWalk\n signal?: AbortSignal\n}\n\nexport interface ModelCenterSnapshot {\n policy: AiPolicy\n purposes: RegisteredPurpose[]\n storageFailed: boolean\n catalog: SessionModelCatalog\n providers: ProviderListing[]\n resolved: Record<string, ResolvedRoute | { error: string }>\n}\n\nfunction asList<T>(result: unknown): T[] {\n try {\n const value = unwrapRpc<T[]>(result)\n return Array.isArray(value) ? value : []\n } catch {\n return []\n }\n}\n\nfunction statusValue(result: unknown): unknown {\n try { return unwrapRpc(result) }\n catch { return result }\n}\n\nexport async function loadModelCenter(\n input: LoadModelCenterInput,\n isCurrent: () => boolean,\n): Promise<ModelCenterSnapshot | undefined> {\n const { signal } = input\n const aiResult = await input.call(AI_RPC_CHANNEL, 'status', {}, signal)\n if (!isCurrent()) return undefined\n const ai = parseAiServicesStatus(statusValue(aiResult))\n if (!ai.ok) throw new Error(ai.error)\n\n let catalog = emptyCatalog()\n if (input.session?.modelCatalog) {\n try {\n catalog = parseModelCatalog(statusValue(await input.session.modelCatalog()))\n } catch {\n catalog = emptyCatalog()\n }\n if (!isCurrent()) return undefined\n }\n\n let providers: ProviderListing[] = []\n if (input.loadProviders && input.llm) {\n const configurableResult = await input.llm.listConfigurableProviders()\n if (!isCurrent()) return undefined\n const liveResult = input.llm.listProviders ? await input.llm.listProviders() : { ok: true as const, value: [] }\n if (!isCurrent()) return undefined\n const configurable = asList<ConfigurableProvider>(configurableResult)\n const live = asList<LiveProvider>(liveResult)\n\n let namespaces = new Map<string, unknown>()\n const described = input.configForms?.describe?.()\n if (described?.ensure) {\n try { await described.ensure() }\n catch { /* describe stays empty */ }\n if (!isCurrent()) return undefined\n }\n if (described?.getSnapshot) namespaces = namespacesOf(described.getSnapshot())\n\n const apiKeyEnvs = new Map<string, string>()\n for (const entry of configurable) {\n const id = typeof entry.provider === 'string' && entry.provider ? entry.provider\n : typeof entry.id === 'string' ? entry.id : ''\n if (!id) continue\n const settingsNs = typeof entry.settingsNs === 'string' ? entry.settingsNs : ''\n const settingsPath = Array.isArray(entry.settingsPath)\n ? entry.settingsPath.filter((item): item is string => typeof item === 'string')\n : []\n const ref = resolveApiKeyEnv(namespaces, settingsNs, settingsPath, input.settingsSchema)\n if (ref) apiKeyEnvs.set(id, ref)\n }\n\n const draft = joinProviderListings(configurable, live, {}, apiKeyEnvs)\n const refs = credentialRefsToDescribe(draft)\n let credentials: Record<string, CredentialView> = {}\n if (refs.length && input.credentials?.describe) {\n try { credentials = unwrapRpc(await input.credentials.describe(refs)) }\n catch { credentials = {} }\n if (!isCurrent()) return undefined\n }\n providers = joinProviderListings(configurable, live, credentials, apiKeyEnvs)\n }\n\n const resolved: Record<string, ResolvedRoute | { error: string }> = {}\n for (const spec of ai.value.purposes) {\n try {\n const raw = unwrapRpc(await input.call(AI_RPC_CHANNEL, 'resolve', {\n purpose: spec.id,\n sessionId: input.sessionId,\n }, signal))\n if (!isCurrent()) return undefined\n const parsed = parseResolvedRoute(raw)\n if (parsed.success) {\n resolved[spec.id] = parsed.data\n continue\n }\n } catch {\n if (!isCurrent()) return undefined\n }\n const local = previewResolve(ai.value.policy, spec.id, { specs: ai.value.purposes })\n resolved[spec.id] = local.ok ? local.route : { error: local.error }\n }\n if (!isCurrent()) return undefined\n return {\n policy: ai.value.policy,\n purposes: ai.value.purposes,\n storageFailed: ai.value.storageFailed,\n catalog,\n providers,\n resolved,\n }\n}\n\nexport type PolicySaveResult =\n | { ok: true; policy: AiPolicy }\n | { ok: false; reason: 'stale' | 'conflict' | 'invalid'; error: string }\n\nexport async function savePolicyUpdate(\n call: RpcCall,\n request: unknown,\n isCurrent: () => boolean,\n signal?: AbortSignal,\n): Promise<PolicySaveResult> {\n const parsed = parsePolicyUpdate(request)\n if (!parsed.ok) return { ok: false, reason: 'invalid', error: parsed.error }\n try {\n const raw = await call(AI_RPC_CHANNEL, 'update', parsed.value, signal)\n if (!isCurrent()) return { ok: false, reason: 'stale', error: '' }\n const policy = parseAiPolicy(unwrapRpc(raw))\n if (!policy) return { ok: false, reason: 'invalid', error: 'AI 策略接口与约定不一致。' }\n return { ok: true, policy }\n } catch (error) {\n if (!isCurrent()) return { ok: false, reason: 'stale', error: '' }\n if (isPolicyConflict(error)) {\n return { ok: false, reason: 'conflict', error: error instanceof Error ? error.message : '策略冲突。' }\n }\n return { ok: false, reason: 'invalid', error: error instanceof Error ? error.message : '保存失败。' }\n }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport { purposeLabel } from './catalogue.ts'\nimport {\n MODEL_ROLES, type AiPolicy, type DiscoveredModel, type ModelCenterLocale, type ModelCenterRenderProps,\n type ModelCenterTab, type ModelRole, type ModelRoute, type ModelTarget, type ProviderListing, type RegisteredPurpose,\n type ResolvedRoute,\n} from './contracts.ts'\nimport {\n centerLabel, copy, hostChannel, isHostEnabledStatus, readHostEnabled, registerExclusiveSettingsSeats, tabLabel,\n tablistKey, unwrapRpc, type SlotSpec,\n} from './client-view.ts'\nimport { loadModelCenter, savePolicyUpdate, stillCurrent, createGenerationGate } from './load.ts'\nimport {\n catalogChoices, choiceOf, effortOptions, emptyCatalog, parseRouteKey, routeKey, type SessionModelCatalog,\n} from './model-catalog.ts'\nimport { formatRoute, previewResolve, purposeRows } from './policy.ts'\nimport {\n authLabel, canDiscoverModels, canOpenSettingsDocument, nativeSettingsNote, shouldLoadNativeProviders,\n} from './providers.ts'\nimport { LIMIT_BOUNDS, editablePolicy } from './schema.ts'\n\nexport const name = 'dsh-model-center-client'\nexport const inject = ['slots', 'connection', 'remote', 'remote.llm', 'remote.settings', 'remote.session', 'remote.credentials', 'configForms', 'settingsSchema'] as const\n\ninterface CredentialsRemote {\n describe(refs: string[]): Promise<unknown>\n}\ninterface LlmRemote {\n listConfigurableProviders(): Promise<unknown>\n listProviders?(): Promise<unknown>\n discoverModels?(settingsNs: string, request: unknown, signal?: AbortSignal): Promise<unknown>\n}\ninterface SettingsRemote {\n openSettingsDocument?(signal?: AbortSignal): Promise<unknown>\n}\nexport interface ModelCenterClient {\n connection: { rpc: { call(channel: string, endpoint: string, payload?: unknown, signal?: AbortSignal): Promise<unknown> } }\n remote: {\n llm: LlmRemote\n settings: SettingsRemote\n session: { modelCatalog(): Promise<unknown> }\n credentials?: CredentialsRemote\n }\n configForms?: { describe?: () => { getSnapshot?: () => unknown; ensure?: () => Promise<unknown> } }\n settingsSchema?: { getPath?(value: unknown, path: string[]): unknown }\n slots: {\n inject(key: string, callback: () => unknown): () => void\n register(spec: SlotSpec, render: unknown): () => void\n }\n}\n\nconst COMMON_PURPOSES = ['chat', 'manuscript.completion', 'manuscript.rewrite']\n\nexport function presetLabel(role: ModelRole, locale: ModelCenterLocale): string {\n const text = copy(locale)\n return role === 'normal' ? text.defaultPreset : role === 'weak' ? text.efficientPreset : role === 'strong' ? text.qualityPreset : text.fantasyPreset\n}\n\nexport function purposeTargetValue(target: ModelTarget): string {\n if (target.kind === 'session') return 'session'\n if (target.kind === 'role') return `role:${target.role}`\n return `model:${routeKey(target.provider, target.model)}`\n}\n\nexport function purposeTargetFromValue(value: string): ModelTarget {\n if (value === 'session') return { kind: 'session' }\n if (value.startsWith('role:')) {\n const role = value.slice(5) as ModelRole\n if (MODEL_ROLES.includes(role)) return { kind: 'role', role }\n }\n if (value.startsWith('model:')) {\n const parsed = parseRouteKey(value.slice(6))\n if (parsed) return { kind: 'model', ...parsed }\n }\n return { kind: 'role', role: 'normal' }\n}\n\nexport function registerModelCenterSlots(\n client: ModelCenterClient,\n render: (props: ModelCenterRenderProps) => ReactNode,\n locale: ModelCenterLocale = 'zh',\n): () => void {\n return registerExclusiveSettingsSeats(client.slots, render, locale)\n}\n\nexport async function activateClientUi(\n client: ModelCenterClient,\n cancelled: () => boolean,\n signal?: AbortSignal,\n): Promise<() => void> {\n const enabled = await readHostEnabled((channel, endpoint, payload, next) => (\n client.connection.rpc.call(channel, endpoint, payload, next ?? signal)\n ), signal)\n if (cancelled() || signal?.aborted || !shouldAttach(enabled)) return () => {}\n return registerModelCenterSlots(client, props => <ModelCenterSettings client={client} {...props} />)\n}\n\nexport function shouldAttach(enabled: boolean): boolean {\n return enabled === true\n}\n\nexport function apply(ctx: Context): void {\n const client = ctx as unknown as ModelCenterClient\n ctx.effect(() => {\n if (typeof document === 'undefined') return () => {}\n const style = document.createElement('style')\n style.setAttribute('data-plugin', name)\n style.textContent = styles\n document.head.appendChild(style)\n return () => style.remove()\n }, 'model-center.styles')\n ctx.effect(() => {\n const controller = new AbortController()\n let disposeSlots = () => {}\n void activateClientUi(client, () => controller.signal.aborted, controller.signal).then(dispose => {\n if (controller.signal.aborted) { dispose(); return }\n disposeSlots = dispose\n })\n return () => { controller.abort(); disposeSlots() }\n }, 'model-center.ui')\n}\n\nexport function ModelCenterSettings(props: ModelCenterRenderProps & { client: ModelCenterClient }): ReactNode {\n const locale: ModelCenterLocale = props.locale === 'en' ? 'en' : 'zh'\n const text = copy(locale)\n const tabsId = useId()\n const generation = useRef(createGenerationGate())\n const [tab, setTab] = useState<ModelCenterTab>('policy')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const [policy, setPolicy] = useState<AiPolicy>()\n const [savedPolicy, setSavedPolicy] = useState('')\n const [purposes, setPurposes] = useState<RegisteredPurpose[]>([])\n const [providers, setProviders] = useState<ProviderListing[]>([])\n const [resolved, setResolved] = useState<Record<string, ResolvedRoute | { error: string }>>({})\n const [catalog, setCatalog] = useState<SessionModelCatalog>(emptyCatalog())\n const [discovered, setDiscovered] = useState<Record<string, DiscoveredModel[]>>({})\n const [enabled, setEnabled] = useState<boolean | undefined>(undefined)\n const [storageFailed, setStorageFailed] = useState(false)\n const hostedProviders = !shouldLoadNativeProviders(props.renderProviders)\n\n async function hostStatus(signal?: AbortSignal): Promise<boolean> {\n return isHostEnabledStatus(await props.client.connection.rpc.call(hostChannel(), 'status', {}, signal))\n }\n\n async function load(token: number, signal: AbortSignal): Promise<void> {\n const gate = generation.current\n const live = await hostStatus(signal)\n if (!stillCurrent(token, gate, signal)) return\n setEnabled(live)\n if (!live) {\n setError(text.hostOff)\n return\n }\n const snapshot = await loadModelCenter({\n call: (channel, endpoint, payload, next) => props.client.connection.rpc.call(channel, endpoint, payload, next ?? signal),\n sessionId: props.sessionId,\n loadProviders: !hostedProviders,\n llm: props.client.remote.llm,\n credentials: props.client.remote.credentials,\n session: props.client.remote.session,\n configForms: props.client.configForms,\n settingsSchema: props.client.settingsSchema,\n signal,\n }, () => stillCurrent(token, gate, signal))\n if (!stillCurrent(token, gate, signal) || !snapshot) return\n setPolicy(snapshot.policy)\n setSavedPolicy(JSON.stringify(editablePolicy(snapshot.policy)))\n setPurposes(snapshot.purposes)\n setProviders(snapshot.providers)\n setResolved(snapshot.resolved)\n setCatalog(snapshot.catalog)\n setStorageFailed(snapshot.storageFailed)\n }\n\n useEffect(() => {\n const token = generation.current.next()\n const controller = new AbortController()\n setError('')\n setNote('')\n void load(token, controller.signal).catch(cause => {\n if (!stillCurrent(token, generation.current, controller.signal)) return\n setError(cause instanceof Error ? cause.message : text.policyMissing)\n })\n return () => {\n controller.abort()\n generation.current.next()\n }\n }, [props.client, props.sessionId, locale, hostedProviders])\n\n async function action(run: () => Promise<void>): Promise<void> {\n const token = generation.current.current()\n const signal = new AbortController().signal\n setBusy(true); setNote(''); setError('')\n try {\n await run()\n } catch (cause) {\n if (!stillCurrent(token, generation.current, signal)) return\n setError(cause instanceof Error ? cause.message : text.policyMissing)\n } finally {\n if (stillCurrent(token, generation.current, signal)) setBusy(false)\n }\n }\n\n if (enabled === false) {\n return <section className=\"model-center\" aria-label={centerLabel(locale)}>\n <p role=\"status\">{text.hostOff}</p>\n </section>\n }\n if (!policy && enabled === undefined) {\n return <section className=\"model-center\" aria-label={centerLabel(locale)}>\n <p role=\"status\">{error || text.loading}</p>\n <button type=\"button\" onClick={() => {\n const token = generation.current.next()\n const controller = new AbortController()\n void action(() => load(token, controller.signal))\n }}>{text.reconnect}</button>\n </section>\n }\n\n const draft = policy\n const rows = draft ? purposeRows(draft, purposes) : []\n const saveDraft = () => {\n if (!draft) return\n void action(async () => {\n const token = generation.current.current()\n const result = await savePolicyUpdate(\n (channel, endpoint, payload, signal) => props.client.connection.rpc.call(channel, endpoint, payload, signal),\n { expectedRevision: draft.revision, policy: editablePolicy(draft) },\n () => generation.current.isCurrent(token),\n )\n if (!generation.current.isCurrent(token)) return\n if (!result.ok) {\n if (result.reason === 'stale') return\n throw new Error(result.reason === 'conflict' ? text.revisionConflict : result.error)\n }\n setPolicy(result.policy)\n const reload = generation.current.current()\n await load(reload, new AbortController().signal)\n if (!generation.current.isCurrent(reload)) return\n setNote(text.saved)\n })\n }\n\n return <section className=\"model-center\" data-testid=\"model-center\" aria-label={centerLabel(locale)}>\n <div className=\"model-center-tabs\" role=\"tablist\" aria-label={centerLabel(locale)} onKeyDown={event => {\n const next = tablistKey(tab, event.key)\n if (!next) return\n event.preventDefault()\n setTab(next)\n const button = event.currentTarget.querySelector<HTMLButtonElement>(`[data-tab=\"${next}\"]`)\n button?.focus()\n }}>\n {(['policy', 'runtime', 'providers'] as const).map(key => (\n <button key={key} type=\"button\" role=\"tab\" data-tab={key} id={`${tabsId}-${key}-tab`}\n aria-controls={`${tabsId}-${key}-panel`} aria-selected={tab === key}\n tabIndex={tab === key ? 0 : -1} onClick={() => setTab(key)}>{tabLabel(key, locale)}</button>\n ))}\n </div>\n {storageFailed ? <p role=\"alert\" className=\"model-center-error\">{text.storageFailed}</p> : null}\n {error ? <p role=\"alert\" className=\"model-center-error\">{error}</p> : null}\n {note ? <p role=\"status\">{note}</p> : null}\n <div role=\"tabpanel\" id={`${tabsId}-providers-panel`} aria-labelledby={`${tabsId}-providers-tab`} hidden={tab !== 'providers'} tabIndex={0}>\n <ProvidersPanel\n locale={locale}\n busy={busy}\n providers={providers}\n discovered={discovered}\n renderProviders={props.renderProviders}\n canDiscover={canDiscoverModels(props.client.remote.llm)}\n canOpenNative={canOpenSettingsDocument(props.client.remote.settings)}\n onDiscover={row => void action(async () => {\n if (!props.client.remote.llm.discoverModels) throw new Error(text.noProviders)\n const token = generation.current.current()\n const result = unwrapRpc<DiscoveredModel[]>(await props.client.remote.llm.discoverModels(row.settingsNs, { provider: row.id }))\n if (!generation.current.isCurrent(token)) return\n setDiscovered(current => ({ ...current, [row.id]: Array.isArray(result) ? result : [] }))\n })}\n onOpenNative={() => void action(async () => {\n unwrapRpc(await props.client.remote.settings.openSettingsDocument?.())\n })}\n />\n </div>\n <div role=\"tabpanel\" id={`${tabsId}-policy-panel`} aria-labelledby={`${tabsId}-policy-tab`} hidden={tab !== 'policy'} tabIndex={0}>\n {draft ? <PolicyPanel\n locale={locale}\n busy={busy}\n dirty={JSON.stringify(editablePolicy(draft)) !== savedPolicy}\n policy={draft}\n catalog={catalog}\n rows={rows}\n resolved={resolved}\n renderChatModel={props.renderChatModel}\n onRoles={roles => { setNote(''); setPolicy({ ...draft, roles }) }}\n onPurpose={(id, target) => { setNote(''); setPolicy({ ...draft, purposes: { ...draft.purposes, [id]: target } }) }}\n onSave={saveDraft}\n /> : <p role=\"alert\">{text.policyMissing}</p>}\n </div>\n <div role=\"tabpanel\" id={`${tabsId}-runtime-panel`} aria-labelledby={`${tabsId}-runtime-tab`} hidden={tab !== 'runtime'} tabIndex={0}>\n {draft ? <RuntimePanel locale={locale} busy={busy} limits={draft.limits}\n onLimits={limits => { setNote(''); setPolicy({ ...draft, limits }) }} onSave={saveDraft} /> : <p role=\"alert\">{text.policyMissing}</p>}\n </div>\n </section>\n}\n\nfunction ProvidersPanel(props: {\n locale: ModelCenterLocale\n busy: boolean\n providers: ProviderListing[]\n discovered: Record<string, DiscoveredModel[]>\n renderProviders?: (options?: { includeWritingRoutes?: boolean }) => unknown\n canDiscover: boolean\n canOpenNative: boolean\n onDiscover(row: ProviderListing): void\n onOpenNative(): void\n}): ReactNode {\n const text = copy(props.locale)\n const hosted = typeof props.renderProviders === 'function'\n ? props.renderProviders({ includeWritingRoutes: false })\n : undefined\n return <div className=\"model-center-providers\">\n {hosted !== undefined && hosted !== null ? hosted as ReactNode : <>\n <p className=\"model-center-meta\">{nativeSettingsNote(props.locale)}</p>\n {props.providers.length === 0 ? <p className=\"model-center-meta\">{text.noProviders}</p> : <ul className=\"model-center-list\">\n {props.providers.map(row => {\n const models = props.discovered[row.id] ?? []\n return <li key={row.id}>\n <div className=\"model-center-provider-head\">\n <strong>{row.displayName}</strong>\n <span>{row.live ? text.live : text.dormant}</span>\n <span>{authLabel(row.auth, props.locale)}</span>\n </div>\n {row.error ? <p role=\"alert\" className=\"model-center-error\">{row.error}</p> : null}\n {row.settingsNs ? <p className=\"model-center-meta\">{row.settingsNs}{row.settingsPath.length ? ` / ${row.settingsPath.join('/')}` : ''}</p> : null}\n {row.credentialRef ? <p className=\"model-center-meta\">{row.credentialRef}</p> : null}\n <div className=\"model-center-actions\">\n {props.canDiscover && row.settingsNs ? <button type=\"button\" disabled={props.busy}\n aria-label={`${text.discovery} ${row.displayName}`}\n onClick={() => props.onDiscover(row)}>{text.discovery}</button> : null}\n </div>\n {models.length ? <ul className=\"model-center-models\" aria-label={`${row.displayName} ${text.model}`}>\n {models.map(model => <li key={model.id}>{model.name ? `${model.name} (${model.id})` : model.id}</li>)}\n </ul> : null}\n </li>\n })}\n </ul>}\n {props.canOpenNative ? <button type=\"button\" disabled={props.busy} onClick={props.onOpenNative}>{text.openNative}</button> : null}\n </>}\n </div>\n}\n\nfunction RuntimePanel(props: {\n locale: ModelCenterLocale\n busy: boolean\n limits: AiPolicy['limits']\n onLimits(limits: AiPolicy['limits']): void\n onSave(): void\n}): ReactNode {\n const text = copy(props.locale)\n const limits = [\n ['concurrency', text.concurrency, LIMIT_BOUNDS.concurrency.min, LIMIT_BOUNDS.concurrency.max],\n ['timeoutMs', text.timeout, LIMIT_BOUNDS.timeoutMs.min, LIMIT_BOUNDS.timeoutMs.max],\n ['maxInputChars', text.maxInput, LIMIT_BOUNDS.maxInputChars.min, LIMIT_BOUNDS.maxInputChars.max],\n ['maxOutputTokens', text.maxOutput, LIMIT_BOUNDS.maxOutputTokens.min, LIMIT_BOUNDS.maxOutputTokens.max],\n ['maxAttempts', text.retryLimit, LIMIT_BOUNDS.maxAttempts.min, LIMIT_BOUNDS.maxAttempts.max],\n ] as const\n return <div className=\"model-center-runtime\">\n <fieldset className=\"model-center-limits\" disabled={props.busy} aria-label={text.limits}>\n <legend>{text.limits}</legend>\n {limits.map(([key, label, min, max]) => (\n <label key={key}>{label}\n <input type=\"number\" min={min} max={max} step={1} value={props.limits[key]}\n aria-label={label}\n onChange={event => props.onLimits({ ...props.limits, [key]: Number(event.target.value) })} />\n </label>\n ))}\n </fieldset>\n <button type=\"button\" disabled={props.busy} onClick={props.onSave}>{text.save}</button>\n </div>\n}\n\nexport function PolicyPanel(props: {\n locale: ModelCenterLocale\n busy: boolean\n dirty?: boolean\n policy: AiPolicy\n catalog: SessionModelCatalog\n rows: ReturnType<typeof purposeRows>\n resolved: Record<string, ResolvedRoute | { error: string }>\n renderChatModel?: () => unknown\n onRoles(roles: AiPolicy['roles']): void\n onPurpose(id: string, target: ModelTarget): void\n onSave(): void\n}): ReactNode {\n const text = copy(props.locale)\n const rows = [...COMMON_PURPOSES.flatMap(id => props.rows.filter(row => row.id === id)), ...props.rows.filter(row => !COMMON_PURPOSES.includes(row.id))]\n const describe = (route: ModelRoute) => {\n const selected = choiceOf(catalogChoices(props.catalog, route), route.provider, route.model)\n const effort = route.reasoningEffort ?? selected?.defaultEffort\n return (selected?.label ?? formatRoute(route)) + (effort ? ' · ' + reasoningLabel(effort, selected?.efforts.find(item => item.id === effort)?.name ?? effort, props.locale) : '')\n }\n return <div className=\"model-center-policy\">\n <section className=\"model-center-tier-section\" aria-label={text.roles}>\n <header><h3>{text.roles}</h3></header>\n <fieldset className=\"model-center-tiers\" disabled={props.busy} aria-label={text.roles}>\n {props.catalog.groups.length ? <div className=\"model-center-tier-head\" aria-hidden=\"true\"><span /><span>{text.model}</span><span>{text.effort}</span></div> : null}\n {MODEL_ROLES.map(role => {\n const route = props.policy.roles[role] ?? { provider: '', model: '' }\n const label = presetLabel(role, props.locale)\n return <div key={role} className=\"model-center-tier\" data-tier={role}>\n <div className=\"model-center-tier-name\"><strong>{label}</strong></div>\n <RouteFields locale={props.locale} route={route} disabled={props.busy}\n catalog={props.catalog} ariaPrefix={label}\n emptyLabel={role === 'normal' ? text.chooseModel : text.followDefault}\n onChange={next => {\n const roles = { ...props.policy.roles }\n if (!next.provider && !next.model && !next.reasoningEffort) delete roles[role]\n else roles[role] = next\n props.onRoles(roles)\n }} />\n </div>\n })}\n </fieldset>\n </section>\n <section className=\"model-center-capabilities\" aria-label={text.capabilities}>\n <header><h3>{text.capabilities}</h3><p className=\"model-center-meta\">{text.capabilityHint}</p></header>\n <fieldset disabled={props.busy} aria-label={text.capabilities}>\n {rows.length === 0 ? <p className=\"model-center-meta\">{text.noPurposes}</p> : rows.map(row => {\n const label = purposeLabel(row.id, row.label, props.locale)\n const preview = previewResolve(props.policy, row.id, { specs: props.rows })\n const custom = row.target.kind === 'model'\n const value = custom ? 'custom' : purposeTargetValue(row.target)\n return <div key={row.id} className=\"model-center-capability\" data-purpose={row.id}>\n <div className=\"model-center-capability-heading\">\n <label htmlFor={'capability-' + row.id}>{label}</label>\n <select id={'capability-' + row.id} aria-label={label + ' ' + text.useModel} value={value}\n onChange={event => {\n if (event.target.value === 'custom') {\n const route = preview.ok ? preview.route : props.policy.roles.normal ?? props.catalog.default ?? { provider: '', model: '' }\n props.onPurpose(row.id, { kind: 'model', provider: route.provider, model: route.model, ...(route.reasoningEffort ? { reasoningEffort: route.reasoningEffort } : {}) })\n } else props.onPurpose(row.id, purposeTargetFromValue(event.target.value))\n }}>\n {MODEL_ROLES.map(role => <option key={role} value={'role:' + role}>{presetLabel(role, props.locale)}</option>)}\n <option value=\"custom\">{text.explicit}</option>\n {row.id !== 'chat' ? <option value=\"session\">{text.followSession}</option> : null}\n </select>\n </div>\n {custom ? <RouteFields locale={props.locale} route={row.target as ModelRoute} disabled={props.busy}\n catalog={props.catalog} ariaPrefix={label} onChange={route => props.onPurpose(row.id, { kind: 'model', ...route })} />\n : row.target.kind === 'role' ? <p className=\"model-center-meta model-center-route-summary\">{preview.ok ? describe(preview.route) : text.notConfigured}</p> : null}\n </div>\n })}\n </fieldset>\n </section>\n <div className=\"model-center-savebar\">\n <button type=\"button\" disabled={props.busy || props.dirty === false} onClick={props.onSave}>{text.save}</button>\n {props.dirty ? <span className=\"model-center-meta\" role=\"status\">{text.unsaved}</span> : null}\n </div>\n </div>\n}\n\nfunction reasoningLabel(id: string, name: string, locale: ModelCenterLocale): string {\n if (locale === 'en') return name\n return ({ off: '关', none: '关', minimal: '极低', low: '低', medium: '中', high: '高', xhigh: '极高', max: '最高' } as Record<string, string>)[id] ?? name\n}\n\nfunction withEffort(route: ModelRoute, reasoningEffort: string): ModelRoute {\n return reasoningEffort ? { ...route, reasoningEffort } : { provider: route.provider, model: route.model }\n}\n\nfunction RouteFields(props: {\n locale: ModelCenterLocale\n route: ModelRoute\n disabled: boolean\n catalog: SessionModelCatalog\n ariaPrefix: string\n emptyLabel?: string\n onChange(route: ModelRoute): void\n}): ReactNode {\n const text = copy(props.locale)\n const choices = catalogChoices(props.catalog, props.route)\n const selected = choiceOf(choices, props.route.provider, props.route.model)\n const efforts = effortOptions(selected, props.route.reasoningEffort)\n const key = props.route.provider && props.route.model ? routeKey(props.route.provider, props.route.model) : ''\n const hasCatalog = choices.length > 0\n const defaultLabel = selected?.defaultEffort\n ? `${text.defaultEffort} (${selected.defaultEffort})`\n : text.defaultEffort\n return <div className=\"model-center-route\" data-catalog={hasCatalog}>\n {hasCatalog ? <label>{text.catalog}\n <select value={key} disabled={props.disabled} aria-label={`${props.ariaPrefix} ${text.catalog}`}\n onChange={event => {\n const parsed = parseRouteKey(event.target.value)\n if (!parsed) {\n props.onChange({ provider: '', model: '' })\n return\n }\n props.onChange(withEffort({ provider: parsed.provider, model: parsed.model }, props.route.reasoningEffort ?? ''))\n }}>\n <option value=\"\">{props.emptyLabel ?? text.chooseModel}</option>\n {choices.map(item => (\n <option key={routeKey(item.provider, item.model)} value={routeKey(item.provider, item.model)}>{item.label}</option>\n ))}\n </select>\n </label> : <>\n <label>{text.provider}\n <input value={props.route.provider} disabled={props.disabled}\n aria-label={`${props.ariaPrefix} ${text.provider}`}\n onChange={event => props.onChange({ ...props.route, provider: event.target.value })} />\n </label>\n <label>{text.model}\n <input value={props.route.model} disabled={props.disabled}\n aria-label={`${props.ariaPrefix} ${text.model}`}\n onChange={event => props.onChange({ ...props.route, model: event.target.value })} />\n </label>\n </>}\n <label>{text.effort}\n <select value={props.route.reasoningEffort ?? ''} disabled={props.disabled || !key}\n aria-label={`${props.ariaPrefix} ${text.effort}`}\n onChange={event => props.onChange(withEffort(props.route, event.target.value))}>\n <option value=\"\">{defaultLabel}</option>\n {efforts.map(item => <option key={item.id} value={item.id}>{reasoningLabel(item.id, item.name, props.locale)}</option>)}\n </select>\n </label>\n </div>\n}\n\n\nexport const styles = `\n.model-center{max-width:760px;display:grid;gap:20px;color:inherit;font:400 var(--font-size-2,14px)/1.5 var(--default-font-family,system-ui,sans-serif)}\n.model-center p,.model-center h3{margin:0}\n.model-center-meta,.model-center small{font-size:var(--font-size-1,13px);color:var(--gray-11,inherit)}\n.model-center-error{color:var(--red-11,#b42318)}\n.model-center-tabs{display:flex;gap:20px;border-bottom:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent))}\n.model-center-tabs button[role=\"tab\"]{padding:8px 0;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;color:var(--gray-11,inherit);font:inherit;cursor:pointer;transition:color 150ms ease,border-color 150ms ease}\n.model-center-tabs button[role=\"tab\"]:hover{color:inherit}\n.model-center-tabs button[aria-selected=\"true\"]{border-bottom-color:var(--accent-9,#3b82f6);color:var(--accent-11,inherit);font-weight:600}\n.model-center [role=\"tabpanel\"]{border-radius:12px}\n.model-center fieldset{margin:0;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:10px;padding:12px;display:grid;gap:12px}\n.model-center label{display:grid;gap:6px}\n.model-center input,.model-center select{box-sizing:border-box;width:100%;min-width:0;padding:8px 10px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 22%,transparent));border-radius:8px;background:var(--color-surface,transparent);color:inherit;font:inherit;transition:border-color 150ms ease,box-shadow 150ms ease}\n.model-center input:focus,.model-center select:focus{border-color:var(--accent-9,#3b82f6);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-9,#3b82f6) 25%,transparent)}\n.model-center button{min-height:34px;padding:6px 12px;border:1px solid color-mix(in srgb,currentColor 25%,transparent);border-radius:8px;background:transparent;color:inherit;cursor:pointer;font:inherit;justify-self:start;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,box-shadow 150ms ease,transform 150ms ease}\n.model-center button:not([role=\"tab\"]):hover:not(:disabled){background:var(--gray-3,color-mix(in srgb,currentColor 6%,transparent));border-color:color-mix(in srgb,currentColor 35%,transparent)}\n.model-center button:not([role=\"tab\"]):active:not(:disabled){transform:scale(.97)}\n.model-center button:disabled{opacity:.45;cursor:not-allowed}\n.model-center :focus-visible{outline:2px solid var(--accent-9,currentColor);outline-offset:3px}\n.model-center-list,.model-center-models{margin:0;padding:0;list-style:none;display:grid;gap:12px}\n.model-center-list>li{display:grid;gap:8px;padding:12px 4px;border-top:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:10px}\n.model-center-provider-head,.model-center-actions,.model-center-route{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center}\n.model-center-route label{flex:1 1 160px}\n.model-center-policy,.model-center-runtime{display:grid;gap:24px}\n.model-center-limits{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 20px}\n.model-center-tier-section,.model-center-capabilities{display:grid;gap:14px}\n.model-center header{display:grid;gap:4px}\n.model-center h3{font-size:16px;font-weight:600}\n.model-center .model-center-tiers,.model-center-capabilities>fieldset{padding:0;border:0;border-radius:0;gap:0;min-width:0}\n.model-center-tier{display:grid;grid-template-columns:68px minmax(0,1fr);gap:4px 14px;padding:8px 0;border-bottom:1px solid var(--gray-6)}\n.model-center-tier-name{padding-top:9px}\n.model-center-tier .model-center-route{display:grid;grid-template-columns:minmax(0,1fr) 132px;align-items:start}\n.model-center-tier .model-center-route label{font-size:12px;color:var(--gray-11)}\n.model-center-tier-head{display:grid;grid-template-columns:68px minmax(0,1fr) 132px;gap:14px;font-size:12px;color:var(--gray-11)}\n.model-center-tier .model-center-route[data-catalog=\"true\"]>label{font-size:0;gap:0}\n.model-center-tier .model-center-route select,.model-center-tier .model-center-route input{font-size:14px;color:var(--gray-12)}\n.model-center-capability{display:grid;gap:10px;padding:14px 0;border-bottom:1px solid var(--gray-6)}\n.model-center-capability-heading{display:grid;grid-template-columns:minmax(0,1fr) 180px;gap:16px;align-items:center}\n.model-center-capability-heading>label{font-weight:500}\n.model-center-route-summary{overflow-wrap:anywhere}\n.model-center-savebar{position:sticky;bottom:0;display:flex;align-items:center;gap:14px;padding:12px 0;background:var(--color-panel-solid,var(--gray-1));border-top:1px solid var(--gray-6);z-index:1}\n.model-center-savebar button{background:var(--accent-9);color:var(--accent-contrast,white);border-color:transparent;min-width:80px}\n.model-center .model-center-savebar button:hover:not(:disabled){background:var(--accent-10,var(--accent-9,#3b82f6))}\n@media(max-width:560px){.model-center-tier-head{display:none}.model-center-tier .model-center-route[data-catalog=\"true\"]>label{font-size:12px;gap:6px}.model-center-tier{grid-template-columns:1fr}.model-center-tier-name{padding-top:0}.model-center-capability-heading{grid-template-columns:minmax(0,1fr) 150px}}\n@media(max-width:560px){.model-center-limits{grid-template-columns:minmax(0,1fr)}}\n@media(prefers-reduced-motion:reduce){.model-center button,.model-center input,.model-center select,.model-center-tabs button[role=\"tab\"]{transition:none}}\n`\n"],"mappings":"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"}
|