dsh-plugin-effort-declare 0.1.2 → 0.1.3
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/CONTRIBUTING.en.md +2 -0
- package/CONTRIBUTING.md +2 -0
- package/INSTALL.en.md +1 -1
- package/INSTALL.md +1 -1
- package/README.en.md +2 -1
- package/README.md +2 -1
- package/lib/client.js +242 -53
- package/lib/client.js.map +1 -1
- package/lib/types/client/EffortDeclareSection.d.ts +12 -2
- package/lib/types/client/EffortDeclareSection.d.ts.map +1 -1
- package/lib/types/client/build-info.d.ts +2 -0
- package/lib/types/client/build-info.d.ts.map +1 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/load-drafts.d.ts +36 -6
- package/lib/types/client/load-drafts.d.ts.map +1 -1
- package/lib/types/core/attribution.d.ts +13 -0
- package/lib/types/core/attribution.d.ts.map +1 -0
- package/lib/types/core/efforts.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/README.en.md +1 -1
- package/src/README.md +1 -1
- package/src/client/EffortDeclareSection.tsx +143 -41
- package/src/client/README.en.md +5 -3
- package/src/client/README.md +5 -3
- package/src/client/build-info.ts +12 -0
- package/src/client/effort-declare.module.css +8 -0
- package/src/client/globals.d.ts +5 -0
- package/src/client/index.ts +13 -11
- package/src/client/load-drafts.ts +124 -8
- package/src/core/README.en.md +2 -1
- package/src/core/README.md +2 -1
- package/src/core/attribution.ts +24 -0
- package/src/core/efforts.ts +4 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["css"],"sources":["../src/core/catalog.ts","../src/core/paths.ts","../src/core/filter.ts","../src/core/path-ops.ts","../src/core/drafts.ts","../src/core/efforts.ts","../src/core/presets.ts","../src/core/validate.ts","../src/client/load-drafts.ts","../src/client/schema-ops.ts","../src/client/EffortDeclareSection.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Canonical thinking levels and openai-completions thinkingFormat names.\n *\n * Levels match `@deepseek-ai/dsh-llm-pi-ai` catalog.ts `THINKING_LEVELS`.\n * Formats match `SUPPORTED_THINKING_FORMATS` in the same file (rc.8).\n * Tests pin these lists against a checked-in schema fixture\n * (`tests/fixtures/pi-ai-thinking-format-union.ts`) and the local level\n * whitelist. The settings page never offers the handwritten thinkingFormat\n * list as writable choices — only the live schema union, plus a stored\n * value that the union omitted.\n */\n\n/** Selectable reasoning levels, in pi-ai escalation order. */\nexport const THINKING_LEVELS = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'max',\n] as const\n\nexport type ThinkingLevel = (typeof THINKING_LEVELS)[number]\n\n/** Thinking levels other than Off; Off has its own tri-state control. */\nexport const THINKING_LEVELS_WITHOUT_OFF = THINKING_LEVELS.filter(\n (level): level is Exclude<ThinkingLevel, 'off'> => level !== 'off',\n)\n\n/**\n * openai-completions thinkingFormat values from llm-pi-ai catalog.ts rc.8.\n * Test pin only — not a writable UI fallback.\n */\nexport const FALLBACK_THINKING_FORMATS = [\n 'openai',\n 'deepseek',\n 'openrouter',\n 'together',\n 'zai',\n 'qwen',\n 'chat-template',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n] as const\n\nexport type ThinkingFormat = (typeof FALLBACK_THINKING_FORMATS)[number]\n\n/** Wire protocol this plugin's v1 editor supports. */\nexport const OPENAI_COMPLETIONS = 'openai-completions'\n\n/** Settings namespace this plugin writes. */\nexport const LLM_PI_AI_NS = 'llm-pi-ai'\n\n/** Official DeepSeek adapter namespace — skip. */\nexport const LLM_DEEPSEEK_NS = 'llm-deepseek'\n\n/** Official DeepSeek provider route — skip. */\nexport const DEEPSEEK_OFFICIAL = 'deepseek-official'\n\n/** Any route key walks a dict schema to the same profile node. */\nexport const SCHEMA_PROBE_ROUTE = '\\u0000probe'\n","/**\n * Nested get/has over plain JSON, matching ui-settings SettingsSchemaService\n * for the paths this plugin needs. Kept in-repo so tests do not import a\n * Cordis service.\n */\n\n/** Read a nested value by string keys / array indexes. */\nexport function getPath(value: unknown, path: readonly string[]): unknown {\n let current: unknown = value\n for (const key of path) {\n if (Array.isArray(current)) {\n current = current[Number(key)]\n continue\n }\n if (typeof current !== 'object' || current === null) return undefined\n current = (current as Record<string, unknown>)[key]\n }\n return current\n}\n\n/** Whether the final path key exists, independently of its value. */\nexport function hasPath(value: unknown, path: readonly string[]): boolean {\n if (path.length === 0) return value !== undefined\n const parent = getPath(value, path.slice(0, -1))\n const key = path[path.length - 1] as string\n if (Array.isArray(parent)) return Number(key) < parent.length\n if (typeof parent !== 'object' || parent === null) return false\n return key in parent\n}\n\n/** Plain object (not array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Structured clone of a JSON object, or `{}` when the source is not one. */\nexport function cloneObject(value: unknown): Record<string, unknown> {\n return isPlainObject(value) ? structuredClone(value) : {}\n}\n\n/** Structured clone of a models array; non-arrays and non-object rows are skipped. */\nexport function cloneModels(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return []\n return value.flatMap((row) => (isPlainObject(row) ? [structuredClone(row)] : []))\n}\n","import {\n DEEPSEEK_OFFICIAL,\n LLM_DEEPSEEK_NS,\n LLM_PI_AI_NS,\n OPENAI_COMPLETIONS,\n} from './catalog.ts'\nimport { getPath, isPlainObject } from './paths.ts'\n\n/** Directory row from `llm.providers()` (the fields v1 filtering reads). */\nexport interface ProviderDirectoryEntry {\n provider: string\n displayName?: string\n settingsNs?: string\n settingsPath?: readonly string[]\n declared?: boolean\n active?: boolean\n}\n\n/**\n * Resolve the wire protocol for a route.\n * User/effective `api` wins; then schema default; then openai-completions.\n */\nexport function resolveRouteApi(\n profile: unknown,\n schemaDefault: string | undefined,\n): string {\n if (isPlainObject(profile) && typeof profile.api === 'string' && profile.api.length > 0) {\n return profile.api\n }\n if (schemaDefault !== undefined && schemaDefault.length > 0) return schemaDefault\n return OPENAI_COMPLETIONS\n}\n\nexport interface EditableDecision {\n editable: boolean\n reason?: 'not-pi-ai' | 'official-deepseek' | 'catalog' | 'not-completions'\n}\n\n/**\n * v1 editable routes: hand-declared llm-pi-ai openai-completions.\n * Catalog routes are excluded (writing `models` replaces the whole catalog).\n */\nexport function classifyRoute(\n entry: ProviderDirectoryEntry,\n profile: unknown,\n schemaDefaultApi?: string,\n): EditableDecision {\n if (entry.provider === DEEPSEEK_OFFICIAL || entry.settingsNs === LLM_DEEPSEEK_NS) {\n return { editable: false, reason: 'official-deepseek' }\n }\n if (entry.settingsNs !== LLM_PI_AI_NS) {\n return { editable: false, reason: 'not-pi-ai' }\n }\n if (entry.declared !== true) {\n return { editable: false, reason: 'catalog' }\n }\n const api = resolveRouteApi(profile, schemaDefaultApi)\n if (api !== OPENAI_COMPLETIONS) {\n return { editable: false, reason: 'not-completions' }\n }\n return { editable: true }\n}\n\n/** Profile object at `providers.<route>` from an llm-pi-ai section value. */\nexport function profileAt(\n section: unknown,\n settingsPath: readonly string[] | undefined,\n provider: string,\n): unknown {\n const path = settingsPath !== undefined && settingsPath.length > 0\n ? settingsPath\n : ['providers', provider]\n return getPath(section, path)\n}\n\n/** String choices from a schemastery union node (`type: 'union'`). */\nexport function unionStringChoices(node: unknown): string[] {\n if (!isPlainObject(node) || node.type !== 'union' || !Array.isArray(node.list)) return []\n return node.list\n .map((entry) => (isPlainObject(entry) ? entry.value : undefined))\n .filter((value): value is string => typeof value === 'string')\n}\n","/**\n * Minimal path ops, same one-level-key algorithm as the official\n * ProviderEditor.pathOps: only keys that differ produce a set/unset.\n */\n\nexport type PathOp =\n | { op: 'set'; path: string[]; value: unknown }\n | { op: 'unset'; path: string[] }\n\n/**\n * The minimal path ops carrying `after` over `before`.\n * @param base - path of the edited subtree.\n * @param before - subtree as loaded, or undefined when new.\n * @param after - subtree as edited.\n */\nexport function pathOps(\n base: readonly string[],\n before: unknown,\n after: Record<string, unknown>,\n): PathOp[] {\n const previous = typeof before === 'object' && before !== null && !Array.isArray(before)\n ? before as Record<string, unknown>\n : {}\n const ops: PathOp[] = []\n for (const [key, value] of Object.entries(after)) {\n if (JSON.stringify(previous[key]) === JSON.stringify(value)) continue\n ops.push({ op: 'set', path: [...base, key], value })\n }\n for (const key of Object.keys(previous)) {\n if (!(key in after)) ops.push({ op: 'unset', path: [...base, key] })\n }\n return ops\n}\n\nexport interface SaveSlices {\n /** Profile path from `llm.providers[].settingsPath` (not a hardcoded route id). */\n settingsPath: readonly string[]\n /** Models array before the edit (user layer). */\n beforeModels: unknown\n /** Models array after the edit — every existing row, spread intact. */\n afterModels: unknown[]\n /** Route-level compat before the edit (`undefined` = field absent on user). */\n beforeCompat: unknown\n /**\n * Route-level compat after the edit. `undefined` means leave the field\n * untouched (no compat ops at all).\n */\n afterCompat: Record<string, unknown> | undefined\n}\n\n/**\n * Ops for one route: whole-array `models` replace when the table changed,\n * plus one-level compat path ops. Never replace the `llm-pi-ai` section.\n */\nexport function buildSaveOps(slices: SaveSlices): PathOp[] {\n const base = [...slices.settingsPath]\n const ops: PathOp[] = []\n if (JSON.stringify(slices.beforeModels) !== JSON.stringify(slices.afterModels)) {\n ops.push({ op: 'set', path: [...base, 'models'], value: slices.afterModels })\n }\n if (slices.afterCompat !== undefined) {\n ops.push(...pathOps([...base, 'compat'], slices.beforeCompat, slices.afterCompat))\n }\n return ops\n}\n","/**\n * Route-card draft merge: user-layer slices, namespace revision, dirty preserve.\n * No React — settings UI and tests share these helpers.\n */\nimport { profileAt } from './filter.ts'\nimport { buildSaveOps } from './path-ops.ts'\nimport { cloneModels, cloneObject, isPlainObject } from './paths.ts'\n\n/** Editable llm-pi-ai route as the settings section holds it. */\nexport interface RouteDraft {\n provider: string\n displayName: string\n /** Path inside the llm-pi-ai section (`llm.providers[].settingsPath`). */\n settingsPath: readonly string[]\n /** Namespace revision (one value for the whole llm-pi-ai document). */\n revision: number\n models: Record<string, unknown>[]\n originalModels: Record<string, unknown>[]\n compat: Record<string, unknown>\n originalCompat: Record<string, unknown>\n /** Whether `compat` is present on the user profile (not the effective view). */\n compatPresent: boolean\n}\n\n/** JSON-stable equality matching pathOps (key order included). */\nexport function sliceEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\n/** Whether two settings slices differ. */\nexport function sliceChanged(before: unknown, after: unknown): boolean {\n return !sliceEqual(before, after)\n}\n\n/** Build a draft from the stored user subtree (never from effective `value`). */\nexport function routeDraftFromUserProfile(args: {\n provider: string\n displayName: string\n settingsPath: readonly string[]\n revision: number\n userProfile: unknown\n}): RouteDraft {\n const { provider, displayName, settingsPath, revision, userProfile } = args\n const models = cloneModels(isPlainObject(userProfile) ? userProfile.models : [])\n const compatPresent = isPlainObject(userProfile) && 'compat' in userProfile && isPlainObject(userProfile.compat)\n const compat = cloneObject(isPlainObject(userProfile) ? userProfile.compat : {})\n return {\n provider,\n displayName,\n settingsPath: [...settingsPath],\n revision,\n models,\n originalModels: cloneModels(models),\n compat,\n originalCompat: cloneObject(compat),\n compatPresent,\n }\n}\n\n/** Dirty iff pathOps would emit something (same comparison as save). */\nexport function draftDirty(draft: RouteDraft): boolean {\n return buildSaveOps({\n settingsPath: draft.settingsPath,\n beforeModels: draft.originalModels,\n afterModels: draft.models,\n beforeCompat: draft.compatPresent ? draft.originalCompat : undefined,\n afterCompat: draft.compat,\n }).length > 0\n}\n\n/** Treat the current models/compat as the committed originals (no-op save). */\nexport function alignDraft(draft: RouteDraft): RouteDraft {\n return {\n ...draft,\n originalModels: cloneModels(draft.models),\n originalCompat: cloneObject(draft.compat),\n compatPresent: Object.keys(draft.compat).length > 0 ? true : draft.compatPresent,\n }\n}\n\n/** Fold a successful mutate view: saved card realigns; every card gets the new revision. */\nexport function applySaveSuccess(\n drafts: readonly RouteDraft[],\n savedProvider: string,\n slice: { user: unknown; revision: number },\n): RouteDraft[] {\n return drafts.map((draft) => {\n if (draft.provider !== savedProvider) {\n return { ...draft, revision: slice.revision }\n }\n const userProfile = profileAt(slice.user, draft.settingsPath, draft.provider)\n return routeDraftFromUserProfile({\n provider: draft.provider,\n displayName: draft.displayName,\n settingsPath: draft.settingsPath,\n revision: slice.revision,\n userProfile,\n })\n })\n}\n\nfunction modelRowId(row: Record<string, unknown>): string {\n return String(row.id)\n}\n\nfunction indexById(rows: readonly Record<string, unknown>[]): Map<string, Record<string, unknown>> {\n const map = new Map<string, Record<string, unknown>>()\n for (const row of rows) {\n const id = modelRowId(row)\n if (!map.has(id)) map.set(id, row)\n }\n return map\n}\n\nfunction effortsPresence(row: Record<string, unknown> | undefined): { present: boolean; value: unknown } {\n if (row === undefined || !Object.hasOwn(row, 'reasoningEfforts')) {\n return { present: false, value: undefined }\n }\n return { present: true, value: row.reasoningEfforts }\n}\n\nfunction effortsEqual(\n left: { present: boolean; value: unknown },\n right: { present: boolean; value: unknown },\n): boolean {\n if (left.present !== right.present) return false\n if (!left.present) return true\n return sliceEqual(left.value, right.value)\n}\n\nfunction overlayLocalEfforts(\n incomingRow: Record<string, unknown>,\n prevRow: Record<string, unknown>,\n): Record<string, unknown> {\n const next = structuredClone(incomingRow)\n if (Object.hasOwn(prevRow, 'reasoningEfforts')) {\n next.reasoningEfforts = structuredClone(prevRow.reasoningEfforts)\n } else {\n delete next.reasoningEfforts\n }\n return next\n}\n\nfunction objectKeyChanged(\n left: Record<string, unknown>,\n right: Record<string, unknown>,\n key: string,\n): boolean {\n const leftHas = Object.hasOwn(left, key)\n const rightHas = Object.hasOwn(right, key)\n if (leftHas !== rightHas) return true\n if (!leftHas) return false\n return sliceChanged(left[key], right[key])\n}\n\n/**\n * Membership follows the latest user-layer models list (Models page add/delete).\n * Local unsaved `reasoningEfforts` (including a cleared key) overlay by id.\n */\nexport function mergeModelsById(args: {\n prevModels: readonly Record<string, unknown>[]\n prevOriginal: readonly Record<string, unknown>[]\n incomingModels: readonly Record<string, unknown>[]\n incomingOriginal: readonly Record<string, unknown>[]\n}): { models: Record<string, unknown>[]; conflicted: boolean } {\n const prevById = indexById(args.prevModels)\n const prevOrigById = indexById(args.prevOriginal)\n const incomingOrigById = indexById(args.incomingOriginal)\n const incomingIds = new Set(args.incomingModels.map(modelRowId))\n let conflicted = false\n\n const models = args.incomingModels.map((incomingRow) => {\n const id = modelRowId(incomingRow)\n const prevRow = prevById.get(id)\n if (prevRow === undefined) return structuredClone(incomingRow)\n const prevOrig = prevOrigById.get(id)\n const localDirty = !effortsEqual(effortsPresence(prevRow), effortsPresence(prevOrig))\n if (!localDirty) return structuredClone(incomingRow)\n const incomingOrig = incomingOrigById.get(id)\n if (!effortsEqual(effortsPresence(prevOrig), effortsPresence(incomingOrig))) {\n conflicted = true\n }\n return overlayLocalEfforts(incomingRow, prevRow)\n })\n\n for (const [id, prevRow] of prevById) {\n if (incomingIds.has(id)) continue\n const prevOrig = prevOrigById.get(id)\n if (effortsEqual(effortsPresence(prevRow), effortsPresence(prevOrig))) continue\n if (!effortsEqual(effortsPresence(prevOrig), effortsPresence(incomingOrigById.get(id)))) {\n conflicted = true\n }\n }\n\n return { models, conflicted }\n}\n\n/**\n * Three-way compat merge: locally changed keys stay local; everything else\n * follows incoming. Conflict only when a locally dirty key also moved in originals.\n */\nexport function mergeCompat(args: {\n prev: Record<string, unknown>\n prevOriginal: Record<string, unknown>\n incoming: Record<string, unknown>\n incomingOriginal: Record<string, unknown>\n}): { compat: Record<string, unknown>; conflicted: boolean } {\n if (!sliceChanged(args.prev, args.prevOriginal)) {\n return { compat: cloneObject(args.incoming), conflicted: false }\n }\n const compat = cloneObject(args.incoming)\n let conflicted = false\n const keys = new Set([...Object.keys(args.prev), ...Object.keys(args.prevOriginal)])\n for (const key of keys) {\n if (!objectKeyChanged(args.prev, args.prevOriginal, key)) continue\n if (objectKeyChanged(args.prevOriginal, args.incomingOriginal, key)) conflicted = true\n if (Object.hasOwn(args.prev, key)) compat[key] = structuredClone(args.prev[key])\n else delete compat[key]\n }\n return { compat, conflicted }\n}\n\n/**\n * Apply a freshly loaded table. Membership and metadata follow incoming;\n * unsaved reasoningEfforts / dirty compat keys overlay by id. Conflict only\n * when a locally dirty field also changed in originals (revision-only bumps\n * and sibling-card saves do not warn).\n */\nexport function mergeLoadedDrafts(\n current: readonly RouteDraft[],\n incoming: readonly RouteDraft[],\n options: { preserveDirty: boolean },\n): { drafts: RouteDraft[]; conflicted: string[] } {\n const currentByProvider = new Map(current.map(draft => [draft.provider, draft]))\n const conflicted: string[] = []\n const drafts = incoming.map((next) => {\n const prev = currentByProvider.get(next.provider)\n if (prev === undefined || !options.preserveDirty || !draftDirty(prev)) return next\n const modelsMerge = mergeModelsById({\n prevModels: prev.models,\n prevOriginal: prev.originalModels,\n incomingModels: next.models,\n incomingOriginal: next.originalModels,\n })\n const compatMerge = mergeCompat({\n prev: prev.compat,\n prevOriginal: prev.originalCompat,\n incoming: next.compat,\n incomingOriginal: next.originalCompat,\n })\n if (modelsMerge.conflicted || compatMerge.conflicted) conflicted.push(next.provider)\n return {\n provider: next.provider,\n displayName: next.displayName,\n settingsPath: next.settingsPath,\n revision: next.revision,\n models: modelsMerge.models,\n originalModels: cloneModels(next.originalModels),\n compat: compatMerge.compat,\n originalCompat: cloneObject(next.originalCompat),\n compatPresent: next.compatPresent,\n }\n })\n return { drafts, conflicted }\n}\n\n/** Increment a generation counter; callers discard stale async settlements. */\nexport function nextGeneration(holder: { current: number }): number {\n holder.current += 1\n return holder.current\n}\n\n/** Whether `generation` is still the latest issued token. */\nexport function generationIsCurrent(holder: { current: number }, generation: number): boolean {\n return holder.current === generation\n}\n\n/** Keep a stored thinkingFormat visible even if the schema union omitted it. */\nexport function thinkingFormatChoices(formats: readonly string[], current: unknown): string[] {\n if (typeof current === 'string' && current.length > 0 && !formats.includes(current)) {\n return [current, ...formats]\n }\n return [...formats]\n}\n","import { THINKING_LEVELS, type ThinkingLevel } from './catalog.ts'\n\n/** Per-model reasoningEfforts dict as stored in llm-pi-ai settings. */\nexport type ReasoningEfforts = Partial<Record<ThinkingLevel, string | null>>\n\n/** Off tri-state. Must not be collapsed into a single checkbox. */\nexport type OffMode = 'absent' | 'empty' | 'value'\n\nexport type ReasoningEffortsField = ReasoningEfforts | false | undefined\n\n/** Read Off's three states from a stored dict. */\nexport function readOff(efforts: ReasoningEfforts | undefined): { mode: OffMode; value: string } {\n if (efforts === undefined || !('off' in efforts) || efforts.off === undefined) {\n return { mode: 'absent', value: 'none' }\n }\n if (efforts.off === null) return { mode: 'empty', value: 'none' }\n return { mode: 'value', value: efforts.off }\n}\n\n/** Write Off's three states onto a dict (does not mutate the input). */\nexport function writeOff(\n efforts: ReasoningEfforts,\n mode: OffMode,\n value: string,\n): ReasoningEfforts {\n const next: ReasoningEfforts = { ...efforts }\n delete next.off\n if (mode === 'empty') next.off = null\n else if (mode === 'value') next.off = value.trim().length > 0 ? value : 'none'\n return next\n}\n\n/** Whether a thinking level (other than Off) is currently declared. */\nexport function hasLevel(efforts: ReasoningEfforts | undefined, level: Exclude<ThinkingLevel, 'off'>): boolean {\n return efforts !== undefined && efforts[level] !== undefined && efforts[level] !== null\n}\n\n/** Toggle a non-off level. New levels default the wire spelling to the key. */\nexport function toggleLevel(\n efforts: ReasoningEfforts,\n level: Exclude<ThinkingLevel, 'off'>,\n enabled: boolean,\n wire?: string,\n): ReasoningEfforts {\n const next: ReasoningEfforts = { ...efforts }\n if (enabled) next[level] = wire !== undefined && wire.length > 0 ? wire : level\n else delete next[level]\n return next\n}\n\n/** Set the wire spelling for a declared non-off level. */\nexport function setWireSpelling(\n efforts: ReasoningEfforts,\n level: Exclude<ThinkingLevel, 'off'>,\n wire: string,\n): ReasoningEfforts {\n if (!hasLevel(efforts, level)) return efforts\n return { ...efforts, [level]: wire }\n}\n\n/**\n * Validate a reasoningEfforts field. Returns an error code; never throws.\n * Absence / `false` are valid (default-off / catalog strip). Empty dict and\n * off-only are rejected by the official resolver.\n */\nexport function validateReasoningEfforts(efforts: unknown): 'empty' | 'off-only' | 'bad-wire' | undefined {\n if (efforts === undefined || efforts === false) return undefined\n if (efforts === null || (typeof efforts === 'object' && !Array.isArray(efforts) && Object.keys(efforts).length === 0)) {\n return 'empty'\n }\n if (typeof efforts !== 'object' || Array.isArray(efforts)) return 'empty'\n const record = efforts as Record<string, unknown>\n const known = new Set<string>(THINKING_LEVELS)\n for (const key of Object.keys(record)) {\n if (!known.has(key)) return 'bad-wire'\n }\n const declared = THINKING_LEVELS.flatMap((level) => {\n if (!(level in record) || record[level] === undefined) return []\n return [[level, record[level]] as const]\n })\n for (const [level, wire] of declared) {\n if (wire === null) {\n if (level !== 'off') return 'bad-wire'\n } else if (typeof wire !== 'string' || wire.length === 0) {\n return 'bad-wire'\n }\n }\n if (!declared.some(([level]) => level !== 'off')) return 'off-only'\n return undefined\n}\n\n/** Drop reasoningEfforts from a model row; keep every other field. */\nexport function clearReasoningEfforts(row: Record<string, unknown>): Record<string, unknown> {\n const next = { ...row }\n delete next.reasoningEfforts\n return next\n}\n\n/** Read reasoningEfforts from a model row. `false` is treated as absent for the editor. */\nexport function readEfforts(row: Record<string, unknown>): ReasoningEfforts | undefined {\n const value = row.reasoningEfforts\n if (value === undefined || value === false || value === null) return undefined\n if (typeof value !== 'object' || Array.isArray(value)) return undefined\n return value as ReasoningEfforts\n}\n\n/** Put a dict (or omit the field) onto a spread row. */\nexport function writeEfforts(\n row: Record<string, unknown>,\n efforts: ReasoningEfforts | undefined,\n): Record<string, unknown> {\n const next = { ...row }\n if (efforts === undefined || Object.keys(efforts).length === 0) {\n delete next.reasoningEfforts\n return next\n }\n next.reasoningEfforts = efforts\n return next\n}\n","import type { ReasoningEfforts } from './efforts.ts'\n\nexport type PresetId = 'deepseek' | 'openai' | 'toggle'\n\nexport interface PresetCompatPatch {\n /**\n * Every preset states all three UI dialect keys. `set` writes the key;\n * `unset` removes it. Unknown extra compat keys are left in place.\n */\n thinkingFormat: 'set' | 'unset'\n thinkingFormatValue?: string\n supportsDeveloperRole: 'set-false' | 'unset'\n supportsReasoningEffort: 'set-false' | 'unset'\n}\n\nexport interface EffortPreset {\n id: PresetId\n efforts: ReasoningEfforts\n compat: PresetCompatPatch\n /** True when selector levels do not change the on-wire request (except Off). */\n warnSameWire: boolean\n}\n\n/** DeepSeek-compatible gateway: explicit thinking.disabled on Off. */\nexport const DEEPSEEK_PRESET: EffortPreset = {\n id: 'deepseek',\n efforts: {\n off: null,\n low: 'low',\n high: 'high',\n max: 'max',\n },\n compat: {\n thinkingFormat: 'set',\n thinkingFormatValue: 'deepseek',\n supportsDeveloperRole: 'set-false',\n supportsReasoningEffort: 'unset',\n },\n warnSameWire: false,\n}\n\n/** OpenAI-compatible gateway: default thinkingFormat (omit the key). */\nexport const OPENAI_PRESET: EffortPreset = {\n id: 'openai',\n efforts: {\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n },\n compat: {\n thinkingFormat: 'unset',\n supportsDeveloperRole: 'unset',\n supportsReasoningEffort: 'unset',\n },\n warnSameWire: false,\n}\n\n/** On/off only: selector may list levels that are identical on the wire. */\nexport const TOGGLE_PRESET: EffortPreset = {\n id: 'toggle',\n efforts: {\n off: null,\n high: 'high',\n },\n compat: {\n thinkingFormat: 'unset',\n supportsDeveloperRole: 'unset',\n supportsReasoningEffort: 'set-false',\n },\n warnSameWire: true,\n}\n\nexport const PRESETS: Record<PresetId, EffortPreset> = {\n deepseek: DEEPSEEK_PRESET,\n openai: OPENAI_PRESET,\n toggle: TOGGLE_PRESET,\n}\n\n/** Apply a preset's efforts onto every model row (spread, keep other fields). */\nexport function applyPresetEfforts(\n models: readonly Record<string, unknown>[],\n preset: EffortPreset,\n): Record<string, unknown>[] {\n return models.map(row => ({ ...row, reasoningEfforts: { ...preset.efforts } }))\n}\n\n/** Merge a preset's compat patch onto the current route-level compat object. */\nexport function applyPresetCompat(\n compat: Record<string, unknown>,\n preset: EffortPreset,\n): Record<string, unknown> {\n const next = { ...compat }\n const { compat: patch } = preset\n if (patch.thinkingFormat === 'unset') delete next.thinkingFormat\n else if (patch.thinkingFormat === 'set' && patch.thinkingFormatValue !== undefined) {\n next.thinkingFormat = patch.thinkingFormatValue\n }\n if (patch.supportsDeveloperRole === 'unset') delete next.supportsDeveloperRole\n else if (patch.supportsDeveloperRole === 'set-false') next.supportsDeveloperRole = false\n if (patch.supportsReasoningEffort === 'unset') delete next.supportsReasoningEffort\n else if (patch.supportsReasoningEffort === 'set-false') next.supportsReasoningEffort = false\n return next\n}\n","import { validateReasoningEfforts } from './efforts.ts'\n\n/** Per-model client-side check used to show errors without throwing. */\nexport function modelEffortError(row: Record<string, unknown>): 'empty' | 'off-only' | 'bad-wire' | undefined {\n if (!('reasoningEfforts' in row) || row.reasoningEfforts === undefined) return undefined\n return validateReasoningEfforts(row.reasoningEfforts)\n}\n","/**\n * Load editable route drafts from llm.providers + the llm-pi-ai namespace.\n * Drafts come from the user layer; route protocol classification may use effective value.\n */\nimport type { IApiClient, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport {\n LLM_PI_AI_NS,\n SCHEMA_PROBE_ROUTE,\n} from '../core/catalog.ts'\nimport { routeDraftFromUserProfile, type RouteDraft } from '../core/drafts.ts'\nimport { classifyRoute, profileAt, unionStringChoices } from '../core/filter.ts'\nimport { isPlainObject } from '../core/paths.ts'\nimport type { SchemaOps } from './schema-ops.ts'\n\nfunction schemaDefaultString(node: unknown): string | undefined {\n if (!isPlainObject(node) || !isPlainObject(node.meta)) return undefined\n return typeof node.meta.default === 'string' ? node.meta.default : undefined\n}\n\nexport interface LoadDraftsResult {\n writable: boolean\n formats: string[]\n drafts: RouteDraft[]\n error?: string\n}\n\n/**\n * First paint: `ensure()` (reads only from idle). Never treat ensure as refresh.\n * Callers that must not apply a stale settlement compare generation themselves.\n *\n * `formats` is the live schema union only. Empty means the dropdown has no\n * writable choices (stored values stay visible via `thinkingFormatChoices`).\n */\nexport async function loadDrafts(\n api: Pick<IApiClient, 'llm'>,\n describe: Pick<SettingsDescribeFace, 'ensure' | 'getSnapshot'>,\n schema: SchemaOps,\n): Promise<LoadDraftsResult> {\n await describe.ensure()\n const mirrored = describe.getSnapshot()\n if (mirrored.view === undefined) {\n return { writable: false, formats: [], drafts: [], error: mirrored.error ?? undefined }\n }\n const providersResponse = await api.llm.providers({})\n if (!providersResponse.result.ok) {\n return {\n writable: mirrored.view.writable,\n formats: [],\n drafts: [],\n error: providersResponse.result.error.message,\n }\n }\n const namespaces = new Map(mirrored.view.namespaces.map((view: SettingsNamespaceView) => [view.ns, view]))\n const pi = namespaces.get(LLM_PI_AI_NS)\n let formats: string[] = []\n let schemaDefaultApi: string | undefined\n if (pi !== undefined) {\n try {\n const root = schema.rehydrate(pi.schema)\n const formatNode = schema.nodeAtPath(root, ['providers', SCHEMA_PROBE_ROUTE, 'compat', 'thinkingFormat'])\n const fromSchema = unionStringChoices(formatNode)\n if (fromSchema.length > 0) formats = fromSchema\n schemaDefaultApi = schemaDefaultString(schema.nodeAtPath(root, ['providers', SCHEMA_PROBE_ROUTE, 'api']))\n } catch {\n // Live schema walk is best-effort; UI options stay empty rather than a handwritten list.\n }\n }\n const drafts: RouteDraft[] = []\n for (const entry of providersResponse.result.value.providers) {\n const settingsPath = entry.settingsPath !== undefined && entry.settingsPath.length > 0\n ? [...entry.settingsPath]\n : ['providers', entry.provider]\n const effective = profileAt(pi?.value, settingsPath, entry.provider)\n if (!classifyRoute(entry, effective, schemaDefaultApi).editable) continue\n drafts.push(routeDraftFromUserProfile({\n provider: entry.provider,\n displayName: entry.displayName ?? entry.provider,\n settingsPath,\n revision: pi?.revision ?? 0,\n userProfile: profileAt(pi?.user, settingsPath, entry.provider),\n }))\n }\n return { writable: mirrored.view.writable, formats, drafts }\n}\n","/**\n * Bind the settings-owned schema service without importing executable\n * helpers from another client plugin (bundle purity).\n */\nexport interface SchemaOps {\n rehydrate: (serialized: unknown) => unknown\n nodeAtPath: (root: unknown, path: readonly string[]) => unknown\n getPath: (value: unknown, path: readonly string[]) => unknown\n hasPath: (value: unknown, path: readonly string[]) => boolean\n /**\n * Official `settingsSchema.validate`: failure text, or `undefined` when valid.\n * Missing nodes are skipped by the caller — do not invent a second validator.\n */\n validate: (node: unknown, draft: unknown) => string | undefined\n}\n\n/** Wrap a live settingsSchema service as plain callbacks. */\nexport function bindSchema(service: SchemaOps): SchemaOps {\n return {\n rehydrate: serialized => service.rehydrate(serialized),\n nodeAtPath: (root, path) => service.nodeAtPath(root, path),\n getPath: (value, path) => service.getPath(value, path),\n hasPath: (value, path) => service.hasPath(value, path),\n validate: (node, draft) => service.validate(node, draft),\n }\n}\n\n/**\n * Pre-mutate schema check used by the settings page.\n * A returned string means do not call `settings.mutate`.\n */\nexport function validateSaveDraft(\n schema: SchemaOps,\n root: unknown,\n settingsPath: readonly string[],\n afterModels: unknown,\n afterCompat: unknown,\n willWriteCompat: boolean,\n): string | undefined {\n const modelsNode = schema.nodeAtPath(root, [...settingsPath, 'models'])\n if (modelsNode !== undefined) {\n const error = schema.validate(modelsNode, afterModels)\n if (error !== undefined) return error\n }\n if (willWriteCompat) {\n const compatNode = schema.nodeAtPath(root, [...settingsPath, 'compat'])\n if (compatNode !== undefined) {\n const error = schema.validate(compatNode, afterCompat)\n if (error !== undefined) return error\n }\n }\n return undefined\n}\n","/**\n * Settings section: per-model reasoningEfforts + openai-completions compat\n * for hand-declared llm-pi-ai routes.\n */\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { LLM_PI_AI_NS, THINKING_LEVELS_WITHOUT_OFF } from '../core/catalog.ts'\nimport {\n alignDraft,\n applySaveSuccess,\n draftDirty,\n generationIsCurrent,\n mergeLoadedDrafts,\n nextGeneration,\n thinkingFormatChoices,\n type RouteDraft,\n} from '../core/drafts.ts'\nimport {\n hasLevel,\n readEfforts,\n readOff,\n setWireSpelling,\n toggleLevel,\n writeEfforts,\n writeOff,\n clearReasoningEfforts,\n} from '../core/efforts.ts'\nimport { applyPresetCompat, applyPresetEfforts, PRESETS, type PresetId } from '../core/presets.ts'\nimport { buildSaveOps } from '../core/path-ops.ts'\nimport { cloneModels, cloneObject } from '../core/paths.ts'\nimport { modelEffortError } from '../core/validate.ts'\nimport { loadDrafts } from './load-drafts.ts'\nimport { validateSaveDraft, type SchemaOps } from './schema-ops.ts'\nimport type { EffortDeclareKey } from './locales.ts'\nimport css from './effort-declare.module.css'\n\nexport type InvalidationSource = 'settings' | 'directory' | 'writable'\n\nexport interface EffortDeclareSectionInjected {\n api: Pick<IApiClient, 'settings' | 'llm'>\n describe: SettingsDescribeFace\n schema: SchemaOps\n subscribeInvalidate: (listener: (source: InvalidationSource) => void) => () => void\n}\n\nexport interface EffortDeclareSectionProps extends Partial<EffortDeclareSectionInjected> {\n t: (key: EffortDeclareKey) => string\n close: () => void\n}\n\nexport { loadDrafts } from './load-drafts.ts'\n\ntype CardNotice = { kind: 'saved' | 'conflict' | 'error'; text: string }\n\nfunction compatSummary(compat: Record<string, unknown>): string {\n const parts: string[] = []\n if (typeof compat.thinkingFormat === 'string') parts.push(`thinkingFormat=${compat.thinkingFormat}`)\n if (compat.supportsDeveloperRole === false) parts.push('supportsDeveloperRole=false')\n if (compat.supportsReasoningEffort === false) parts.push('supportsReasoningEffort=false')\n return parts.join(' · ')\n}\n\nfunction errorText(code: ReturnType<typeof modelEffortError>, t: (key: EffortDeclareKey) => string): string | undefined {\n if (code === 'empty') return t('errorEmpty')\n if (code === 'off-only') return t('errorOffOnly')\n if (code === 'bad-wire') return t('errorBadWire')\n return undefined\n}\n\nfunction ModelRowEditor(props: {\n row: Record<string, unknown>\n index: number\n radioName: string\n disabled: boolean\n t: (key: EffortDeclareKey) => string\n onChange: (row: Record<string, unknown>) => void\n}): ReactNode {\n const { row, disabled, t, onChange } = props\n const efforts = readEfforts(row) ?? {}\n const off = readOff(readEfforts(row))\n const id = typeof row.id === 'string' ? row.id : ''\n const name = typeof row.name === 'string' ? row.name : ''\n\n const patchEfforts = (next: typeof efforts): void => {\n onChange(writeEfforts(row, Object.keys(next).length === 0 ? undefined : next))\n }\n\n return (\n <div className={css.modelEntry}>\n <div className={css.modelHead}>\n <span className={css.modelId}>{id || t('model')}</span>\n {name !== '' && name !== id ? <span className={css.modelName}>{name}</span> : null}\n <button\n type=\"button\"\n className={css.linkButton}\n disabled={disabled || !('reasoningEfforts' in row)}\n onClick={() => { onChange(clearReasoningEfforts(row)) }}\n >\n {t('clear')}\n </button>\n </div>\n <span className={css.fieldLabel}>{t('levels')}</span>\n <div className={css.levels}>\n {THINKING_LEVELS_WITHOUT_OFF.map((level) => (\n <label key={level} className={css.level}>\n <input\n type=\"checkbox\"\n checked={hasLevel(efforts, level)}\n disabled={disabled}\n onChange={(event) => { patchEfforts(toggleLevel(efforts, level, event.target.checked)) }}\n />\n {level}\n </label>\n ))}\n </div>\n <div className={css.wireRow}>\n <span className={css.fieldLabel}>{t('wire')}</span>\n {THINKING_LEVELS_WITHOUT_OFF.filter(level => hasLevel(efforts, level)).map((level) => (\n <label key={level} className={css.level}>\n {level}\n <input\n className={`${css.input} ${css.wireInput}`}\n type=\"text\"\n value={efforts[level] ?? level}\n disabled={disabled}\n aria-label={`${t('wire')} ${level}`}\n onChange={(event) => { patchEfforts(setWireSpelling(efforts, level, event.target.value)) }}\n />\n </label>\n ))}\n </div>\n <div className={css.offGroup}>\n <span className={css.fieldLabel}>{t('offMode')}</span>\n {(['absent', 'empty', 'value'] as const).map((mode) => (\n <label key={mode} className={css.level}>\n <input\n type=\"radio\"\n name={props.radioName}\n checked={off.mode === mode}\n disabled={disabled}\n onChange={() => { patchEfforts(writeOff(efforts, mode, off.value)) }}\n />\n {mode === 'absent' ? t('offAbsent') : mode === 'empty' ? t('offEmpty') : t('offValue')}\n </label>\n ))}\n {off.mode === 'value'\n ? (\n <input\n className={`${css.input} ${css.wireInput}`}\n type=\"text\"\n value={off.value}\n placeholder={t('offValuePlaceholder')}\n disabled={disabled}\n onChange={(event) => { patchEfforts(writeOff(efforts, 'value', event.target.value)) }}\n />\n )\n : null}\n </div>\n </div>\n )\n}\n\nfunction RouteCard(props: {\n draft: RouteDraft\n formats: readonly string[]\n writable: boolean\n /** This card is the in-flight mutate — show “Saving…”. */\n busy: boolean\n /** Namespace-level lock: any mutate, read-only, or first load. */\n saveLocked: boolean\n notice: CardNotice | undefined\n t: (key: EffortDeclareKey) => string\n onChange: (draft: RouteDraft) => void\n onSave: (draft: RouteDraft) => void\n onCancel: (draft: RouteDraft) => void\n}): ReactNode {\n const { draft, writable, busy, saveLocked, t, onChange } = props\n const noModels = draft.models.length === 0\n const editDisabled = !writable || busy || noModels\n const saveDisabled = saveLocked || noModels\n const formats = thinkingFormatChoices(props.formats, draft.compat.thinkingFormat)\n const summary = compatSummary(draft.compat)\n const sameWire = draft.compat.supportsReasoningEffort === false\n const clientError = draft.models\n .map(row => errorText(modelEffortError(row), t))\n .find(text => text !== undefined)\n const dirty = draftDirty(draft)\n\n const applyPreset = (id: PresetId): void => {\n const preset = PRESETS[id]\n onChange({\n ...draft,\n models: applyPresetEfforts(draft.models, preset),\n compat: applyPresetCompat(draft.compat, preset),\n })\n }\n\n return (\n <li className={css.rowCard}>\n <div className={css.rowHead}>\n <span className={css.rowName}>{draft.displayName}</span>\n <span className={css.rowTag}>{draft.provider}</span>\n </div>\n <p className={css.compatSummary}>\n {t('compatSummary')}\n {summary === '' ? '' : `: ${summary}`}\n </p>\n <div className={css.presetRow}>\n <span className={css.fieldLabel}>{t('presets')}</span>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('deepseek') }}>\n {t('presetDeepSeek')}\n </button>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('openai') }}>\n {t('presetOpenAI')}\n </button>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('toggle') }}>\n {t('presetToggle')}\n </button>\n </div>\n {sameWire ? <p className={css.notice}>{t('presetToggleWarn')}</p> : null}\n {noModels ? <p className={css.notice}>{t('noModels')}</p> : null}\n {draft.models.map((row, index) => (\n <ModelRowEditor\n key={`${String(row.id)}-${String(index)}`}\n row={row}\n index={index}\n radioName={`off-${draft.provider}-${String(index)}`}\n disabled={editDisabled}\n t={t}\n onChange={(next) => {\n const models = draft.models.map((candidate, at) => at === index ? next : candidate)\n onChange({ ...draft, models })\n }}\n />\n ))}\n <details className={css.advanced}>\n <summary>{t('advanced')}</summary>\n <div className={css.advancedBody}>\n <label className={css.fieldLabel}>\n {t('thinkingFormat')}\n <select\n className={`${css.input} ${css.selectInput}`}\n value={typeof draft.compat.thinkingFormat === 'string' ? draft.compat.thinkingFormat : ''}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.value === '') delete compat.thinkingFormat\n else compat.thinkingFormat = event.target.value\n onChange({ ...draft, compat })\n }}\n >\n <option value=\"\">{t('thinkingFormatDefault')}</option>\n {formats.map(format => <option key={format} value={format}>{format}</option>)}\n </select>\n </label>\n {draft.compat.supportsDeveloperRole === true\n ? <p className={css.notice}>{t('developerTrueHint')}</p>\n : null}\n <label className={css.check}>\n <input\n type=\"checkbox\"\n checked={draft.compat.supportsDeveloperRole === false}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.checked) compat.supportsDeveloperRole = false\n else delete compat.supportsDeveloperRole\n onChange({ ...draft, compat })\n }}\n />\n {t('supportsDeveloperRole')}\n </label>\n <label className={css.check}>\n <input\n type=\"checkbox\"\n checked={draft.compat.supportsReasoningEffort === false}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.checked) compat.supportsReasoningEffort = false\n else delete compat.supportsReasoningEffort\n onChange({ ...draft, compat })\n }}\n />\n {t('supportsReasoningEffort')}\n </label>\n </div>\n </details>\n {clientError !== undefined ? <p className={css.error}>{clientError}</p> : null}\n {props.notice?.kind === 'saved' ? <p className={css.savedNotice}>{props.notice.text}</p> : null}\n {props.notice?.kind === 'conflict' || props.notice?.kind === 'error'\n ? <p className={css.error}>{props.notice.text}</p>\n : null}\n <div className={css.actions}>\n <button\n type=\"button\"\n className={css.secondaryButton}\n disabled={busy || !dirty}\n onClick={() => { props.onCancel(draft) }}\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n className={css.primaryButton}\n disabled={saveDisabled || !dirty || clientError !== undefined}\n onClick={() => { props.onSave(draft) }}\n >\n {busy ? t('saving') : t('save')}\n </button>\n </div>\n </li>\n )\n}\n\nexport function EffortDeclareSection(props: EffortDeclareSectionProps): ReactNode {\n const t = props.t\n const api = props.api\n const describe = props.describe\n const schema = props.schema\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading')\n const [error, setError] = useState('')\n const [writable, setWritable] = useState(false)\n const [formats, setFormats] = useState<string[]>([])\n const [drafts, setDrafts] = useState<RouteDraft[]>([])\n const [busyRoute, setBusyRoute] = useState<string | null>(null)\n const [notices, setNotices] = useState<Record<string, CardNotice>>({})\n const generationRef = useRef(0)\n const draftsRef = useRef(drafts)\n draftsRef.current = drafts\n\n const reload = useCallback((preserveDirty: boolean): void => {\n if (api === undefined || describe === undefined || schema === undefined) {\n setStatus('error')\n setError(t('loadError'))\n return\n }\n const generation = nextGeneration(generationRef)\n if (draftsRef.current.length === 0) setStatus('loading')\n setError('')\n void loadDrafts(api, describe, schema).then((result) => {\n if (!generationIsCurrent(generationRef, generation)) return\n setWritable(result.writable)\n setFormats(result.formats)\n if (result.error !== undefined) {\n setStatus('error')\n setError(result.error)\n return\n }\n const merged = mergeLoadedDrafts(draftsRef.current, result.drafts, { preserveDirty })\n setDrafts(merged.drafts)\n if (merged.conflicted.length > 0) {\n setNotices(current => {\n const next = { ...current }\n for (const provider of merged.conflicted) {\n next[provider] = { kind: 'conflict', text: t('dirtyConflict') }\n }\n return next\n })\n }\n setStatus('ready')\n }, (failure: unknown) => {\n if (!generationIsCurrent(generationRef, generation)) return\n setStatus('error')\n setError(failure instanceof Error ? failure.message : t('loadError'))\n })\n }, [api, describe, schema, t])\n\n useEffect(() => { reload(false) }, [reload])\n\n useEffect(() => {\n if (props.subscribeInvalidate === undefined) return undefined\n return props.subscribeInvalidate((source) => {\n if (source === 'writable') {\n const view = describe?.getSnapshot().view\n if (view !== undefined) setWritable(view.writable)\n return\n }\n if (source === 'settings' || source === 'directory') reload(true)\n })\n }, [describe, props.subscribeInvalidate, reload])\n\n const patchNotice = (provider: string, notice: CardNotice | undefined): void => {\n setNotices(current => {\n const copy = { ...current }\n if (notice === undefined) delete copy[provider]\n else copy[provider] = notice\n return copy\n })\n }\n\n const save = async (draft: RouteDraft): Promise<void> => {\n if (api === undefined || describe === undefined || schema === undefined) return\n if (status === 'loading' || busyRoute !== null) {\n patchNotice(draft.provider, { kind: 'error', text: t('saveBusy') })\n return\n }\n const blocking = draft.models\n .map(row => errorText(modelEffortError(row), t))\n .find(text => text !== undefined)\n if (blocking !== undefined) {\n patchNotice(draft.provider, { kind: 'error', text: blocking })\n return\n }\n setBusyRoute(draft.provider)\n patchNotice(draft.provider, undefined)\n try {\n const ops = buildSaveOps({\n settingsPath: draft.settingsPath,\n beforeModels: draft.originalModels,\n afterModels: draft.models,\n beforeCompat: draft.compatPresent ? draft.originalCompat : undefined,\n afterCompat: draft.compat,\n })\n if (ops.length === 0) {\n setDrafts(current => current.map(row => row.provider === draft.provider ? alignDraft(row) : row))\n return\n }\n const willWriteCompat = ops.some(op => (\n op.path.length > draft.settingsPath.length && op.path[draft.settingsPath.length] === 'compat'\n ))\n const pi = describe.getSnapshot().view?.namespaces.find(view => view.ns === LLM_PI_AI_NS)\n if (pi !== undefined) {\n let root: unknown\n try {\n root = schema.rehydrate(pi.schema)\n } catch {\n root = undefined\n }\n if (root !== undefined) {\n const schemaError = validateSaveDraft(\n schema,\n root,\n draft.settingsPath,\n draft.models,\n draft.compat,\n willWriteCompat,\n )\n if (schemaError !== undefined) {\n patchNotice(draft.provider, { kind: 'error', text: schemaError })\n return\n }\n }\n }\n const response = await api.settings.mutate({\n ns: LLM_PI_AI_NS,\n ops,\n expectedRevision: draft.revision,\n })\n if (!response.result.ok) {\n const conflict = response.result.error.code === 'settings-conflict'\n patchNotice(draft.provider, {\n kind: conflict ? 'conflict' : 'error',\n text: conflict ? t('conflict') : response.result.error.message,\n })\n if (conflict) reload(true)\n return\n }\n const view = response.result.value\n describe.acceptView(view)\n setDrafts(current => applySaveSuccess(current, draft.provider, {\n user: view.user ?? {},\n revision: view.revision,\n }))\n patchNotice(draft.provider, { kind: 'saved', text: t('saved') })\n } catch (failure) {\n patchNotice(draft.provider, {\n kind: 'error',\n text: failure instanceof Error ? failure.message : t('loadError'),\n })\n } finally {\n setBusyRoute(null)\n }\n }\n\n const showLoading = status === 'loading' && drafts.length === 0\n const showEmpty = status === 'ready' && drafts.length === 0\n const showList = drafts.length > 0\n const hasCardFailure = Object.values(notices).some(\n notice => notice.kind === 'conflict' || notice.kind === 'error',\n )\n const showReload = status === 'error' || hasCardFailure || showEmpty || !writable || status === 'loading' || showList\n\n return (\n <div className={css.section}>\n <h2 className={css.title}>{t('title')}</h2>\n <p className={css.intro}>{t('intro')}</p>\n {!writable && status === 'ready' ? <p className={css.notice}>{t('readOnly')}</p> : null}\n {showLoading ? <p className={css.intro}>{t('loading')}</p> : null}\n {status === 'error' ? <p className={css.error}>{error}</p> : null}\n {showReload\n ? (\n <button type=\"button\" className={css.secondaryButton} onClick={() => { reload(true) }}>{t('reload')}</button>\n )\n : null}\n {showEmpty\n ? (\n <>\n <p className={css.notice}>{t('empty')}</p>\n <p className={css.intro}>{t('emptyHint')}</p>\n </>\n )\n : null}\n {showList\n ? (\n <ul className={css.rows}>\n {drafts.map(draft => (\n <RouteCard\n key={draft.provider}\n draft={draft}\n formats={formats.length > 0 ? formats : []}\n writable={writable}\n busy={busyRoute === draft.provider}\n saveLocked={!writable || busyRoute !== null || status === 'loading'}\n notice={notices[draft.provider]}\n t={t}\n onChange={(next) => {\n patchNotice(next.provider, undefined)\n setDrafts(current => current.map(row => row.provider === next.provider ? next : row))\n }}\n onSave={(next) => { void save(next) }}\n onCancel={(next) => {\n patchNotice(next.provider, undefined)\n setDrafts(current => current.map(row => row.provider === next.provider\n ? {\n ...row,\n models: cloneModels(row.originalModels),\n compat: cloneObject(row.originalCompat),\n }\n : row))\n }}\n />\n ))}\n </ul>\n )\n : null}\n </div>\n )\n}\n","/**\n * Dictionary namespace for the effort-declare settings section.\n */\n\nexport type EffortDeclareKey =\n | 'nav'\n | 'title'\n | 'intro'\n | 'empty'\n | 'emptyHint'\n | 'loadError'\n | 'loading'\n | 'readOnly'\n | 'save'\n | 'saving'\n | 'saveBusy'\n | 'cancel'\n | 'saved'\n | 'conflict'\n | 'dirtyConflict'\n | 'presets'\n | 'presetDeepSeek'\n | 'presetOpenAI'\n | 'presetToggle'\n | 'presetToggleWarn'\n | 'model'\n | 'levels'\n | 'wire'\n | 'offMode'\n | 'offAbsent'\n | 'offEmpty'\n | 'offValue'\n | 'offValuePlaceholder'\n | 'clear'\n | 'advanced'\n | 'thinkingFormat'\n | 'thinkingFormatDefault'\n | 'supportsDeveloperRole'\n | 'supportsReasoningEffort'\n | 'developerTrueHint'\n | 'compatSummary'\n | 'errorEmpty'\n | 'errorOffOnly'\n | 'errorBadWire'\n | 'noModels'\n | 'reload'\n\nexport const NS = 'plugin-effort-declare'\n\nexport const zh: Record<EffortDeclareKey, string> = {\n nav: '推理档位',\n title: '推理档位声明',\n intro: '本页声明「这模型能选哪些推理档」。对话里的档位选择仍在输入框模型菜单。没声明 = 和现在一样没有 Effort 行。不会改密钥、目录或当次选择。',\n empty: '没有可编辑的手工 openai-completions 路由。',\n emptyHint: '请先到「模型」页添加提供方(llm-pi-ai 手工路由)。官方 DeepSeek 与 catalog 路由不在本页编辑。需要 DSH ≥ 0.1.0-rc.8(providers.declared)。',\n loadError: '无法加载提供方或设置。',\n loading: '正在加载…',\n readOnly: '当前设置为只读,无法保存。',\n save: '保存',\n saving: '保存中…',\n saveBusy: '另有路由正在保存,请稍候。',\n cancel: '取消',\n saved: '已保存。对话选择器会按新的能力声明显示 Effort 行。',\n conflict: '设置已被其他地方改过,请重新加载后再保存。',\n dirtyConflict: '此路由有未保存修改,设置已在其他地方更新。保存会写到最新文档上,或先取消再改。',\n presets: '预设',\n presetDeepSeek: 'DeepSeek 兼容',\n presetOpenAI: 'OpenAI 兼容',\n presetToggle: '仅开/关',\n presetToggleWarn: '选择器里多档在线上没有区别:除 Off 外请求体相同。',\n model: '模型',\n levels: '可选档位',\n wire: '线上拼写',\n offMode: 'Off',\n offAbsent: '无 Off',\n offEmpty: 'Off 且不发参数',\n offValue: 'Off 且发字符串',\n offValuePlaceholder: 'none',\n clear: '清除本模型声明',\n advanced: '高级:协议方言',\n thinkingFormat: 'thinkingFormat',\n thinkingFormatDefault: '默认(省略该键)',\n supportsDeveloperRole: '系统提示走 system 而不是 developer(supportsDeveloperRole: false)',\n supportsReasoningEffort: '不发 reasoning_effort,只发开关(supportsReasoningEffort: false)',\n developerTrueHint: '当前文档是 supportsDeveloperRole: true。v1 只能强制 false 或缺席;勾选会写成 false,取消勾选会删除该键。',\n compatSummary: '协议',\n errorEmpty: '不能保存空的 reasoningEfforts。请选择档位,或清除声明。',\n errorOffOnly: '不能只开 Off,必须再开一档思考档。',\n errorBadWire: '思考档必须填写线上拼写;只有 Off 可以留空。不能使用未知档位键。',\n noModels: '这条路由还没有 models 列表。请先到「模型」页添加模型。',\n reload: '重新加载',\n}\n\nexport const en: Record<EffortDeclareKey, string> = {\n nav: 'Reasoning efforts',\n title: 'Reasoning effort declarations',\n intro: 'This page declares which reasoning levels a model can offer. The per-turn choice stays in the composer model menu. Undeclared models keep having no Effort row. Keys, catalogs, and the current selection are not edited here.',\n empty: 'No editable hand-declared openai-completions routes.',\n emptyHint: 'Add a provider on the Models page first (an llm-pi-ai hand-declared route). Official DeepSeek and catalog routes are not edited here. Requires DSH ≥ 0.1.0-rc.8 (providers.declared).',\n loadError: 'Could not load providers or settings.',\n loading: 'Loading…',\n readOnly: 'Settings are read-only; saving is disabled.',\n save: 'Save',\n saving: 'Saving…',\n saveBusy: 'Another route is saving. Wait, then save this card.',\n cancel: 'Cancel',\n saved: 'Saved. The composer Effort row follows this capability declaration.',\n conflict: 'Settings changed elsewhere. Reload, then save again.',\n dirtyConflict: 'This route has unsaved edits and settings changed elsewhere. Save writes onto the latest document, or cancel first.',\n presets: 'Presets',\n presetDeepSeek: 'DeepSeek compatible',\n presetOpenAI: 'OpenAI compatible',\n presetToggle: 'On/off only',\n presetToggleWarn: 'Multiple selector levels are identical on the wire except Off.',\n model: 'Model',\n levels: 'Offered levels',\n wire: 'Wire spelling',\n offMode: 'Off',\n offAbsent: 'No Off',\n offEmpty: 'Off, send nothing',\n offValue: 'Off, send a string',\n offValuePlaceholder: 'none',\n clear: 'Clear this model’s declaration',\n advanced: 'Advanced: protocol dialect',\n thinkingFormat: 'thinkingFormat',\n thinkingFormatDefault: 'Default (omit the key)',\n supportsDeveloperRole: 'Send system prompts as system, not developer (supportsDeveloperRole: false)',\n supportsReasoningEffort: 'Do not send reasoning_effort; switch only (supportsReasoningEffort: false)',\n developerTrueHint: 'The document has supportsDeveloperRole: true. v1 can only force false or omit the key; checking writes false, unchecking deletes the key.',\n compatSummary: 'Protocol',\n errorEmpty: 'Empty reasoningEfforts cannot be saved. Pick levels, or clear the declaration.',\n errorOffOnly: 'Off alone is not enough; declare at least one thinking level.',\n errorBadWire: 'Thinking levels need a wire spelling; only Off may be empty. Unknown effort keys are rejected.',\n noModels: 'This route has no models list yet. Add models on the Models page first.',\n reload: 'Reload',\n}\n","/**\n * dsh-plugin-effort-declare — browser half: settings.section for per-model\n * reasoning effort declarations.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport { EffortDeclareSection } from './EffortDeclareSection.tsx'\nimport type { EffortDeclareSectionInjected, InvalidationSource } from './EffortDeclareSection.tsx'\nimport { bindSchema } from './schema-ops.ts'\nimport { LLM_PI_AI_NS } from '../core/catalog.ts'\nimport { NS, en, zh, type EffortDeclareKey } from './locales.ts'\nimport { cssTagId, cssText } from './effort-declare.module.css'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Effort-declare settings section copy. */\n 'plugin-effort-declare': EffortDeclareKey\n }\n}\n\nexport const inject = ['slots', 'locale', 'connection', 'remote', 'settingsScope', 'settingsSchema']\n\nconst PLUGIN_ID = 'dsh-plugin-effort-declare'\n\nfunction mountPluginCss(): () => void {\n if (typeof document === 'undefined') return () => {}\n const selector = `style[data-plugin-css=${JSON.stringify(cssTagId)}]`\n let tag = document.querySelector(selector) as HTMLStyleElement | null\n if (tag === null) {\n tag = document.createElement('style')\n tag.dataset.plugin = PLUGIN_ID\n tag.dataset.pluginCss = cssTagId\n document.head.appendChild(tag)\n }\n tag.textContent = cssText\n return () => { tag?.remove() }\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), `${PLUGIN_ID}: dictionaries`)\n ctx.effect(() => mountPluginCss(), `${PLUGIN_ID}: css`)\n\n const connection = ctx.get('connection') as ConnectionHandle\n const settingsSchema = ctx.settingsSchema\n const schema = bindSchema({\n rehydrate: serialized => settingsSchema.rehydrate(serialized),\n nodeAtPath: (root, path) => settingsSchema.nodeAtPath(\n root as Parameters<typeof settingsSchema.nodeAtPath>[0],\n path,\n ),\n getPath: (value, path) => settingsSchema.getPath(value, path),\n hasPath: (value, path) => settingsSchema.hasPath(value, path),\n validate: (node, draft) => settingsSchema.validate(\n node as Parameters<typeof settingsSchema.validate>[0],\n draft,\n ),\n })\n const t = ctx.locale.bind(NS)\n const describe = ctx.settingsScope.describe()\n const invalidation = new Set<(source: InvalidationSource) => void>()\n\n ctx.effect(() => {\n const emit = (source: InvalidationSource) => {\n for (const listener of invalidation) listener(source)\n }\n // Mirror subscribe fires on every namespace (theme, locale, own acceptView).\n // Only fold writable from that; llm-pi-ai document changes come from the\n // Host event below so a dirty card is not treated as a conflict.\n const disposers = [\n describe.subscribe(() => { emit('writable') }),\n ctx.remote.$on('settings/document-updated', (ns: string) => {\n if (ns !== LLM_PI_AI_NS) return\n emit('settings')\n }),\n ctx.remote.$on('llm/adapters-updated', () => { emit('directory') }),\n ctx.on('connection/reset', () => { emit('directory') }),\n ]\n return () => {\n for (const dispose of disposers) dispose()\n }\n }, `${PLUGIN_ID}: invalidations`)\n\n const subscribeInvalidate: EffortDeclareSectionInjected['subscribeInvalidate'] = (listener) => {\n invalidation.add(listener)\n return () => { invalidation.delete(listener) }\n }\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'effort-declare',\n order: 12,\n label: () => t('nav'),\n locale: NS,\n inject: (): EffortDeclareSectionInjected => ({\n api: connection.api,\n describe,\n schema,\n subscribeInvalidate,\n }),\n }, EffortDeclareSection))\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["css"],"sources":["../src/core/catalog.ts","../src/core/paths.ts","../src/core/filter.ts","../src/core/path-ops.ts","../src/core/drafts.ts","../src/core/efforts.ts","../src/core/presets.ts","../src/core/validate.ts","../src/core/attribution.ts","../src/client/build-info.ts","../src/client/load-drafts.ts","../src/client/schema-ops.ts","../src/client/EffortDeclareSection.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Canonical thinking levels and openai-completions thinkingFormat names.\n *\n * Levels match `@deepseek-ai/dsh-llm-pi-ai` catalog.ts `THINKING_LEVELS`.\n * Formats match `SUPPORTED_THINKING_FORMATS` in the same file (rc.8).\n * Tests pin these lists against a checked-in schema fixture\n * (`tests/fixtures/pi-ai-thinking-format-union.ts`) and the local level\n * whitelist. The settings page never offers the handwritten thinkingFormat\n * list as writable choices — only the live schema union, plus a stored\n * value that the union omitted.\n */\n\n/** Selectable reasoning levels, in pi-ai escalation order. */\nexport const THINKING_LEVELS = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'max',\n] as const\n\nexport type ThinkingLevel = (typeof THINKING_LEVELS)[number]\n\n/** Thinking levels other than Off; Off has its own tri-state control. */\nexport const THINKING_LEVELS_WITHOUT_OFF = THINKING_LEVELS.filter(\n (level): level is Exclude<ThinkingLevel, 'off'> => level !== 'off',\n)\n\n/**\n * openai-completions thinkingFormat values from llm-pi-ai catalog.ts rc.8.\n * Test pin only — not a writable UI fallback.\n */\nexport const FALLBACK_THINKING_FORMATS = [\n 'openai',\n 'deepseek',\n 'openrouter',\n 'together',\n 'zai',\n 'qwen',\n 'chat-template',\n 'qwen-chat-template',\n 'string-thinking',\n 'ant-ling',\n] as const\n\nexport type ThinkingFormat = (typeof FALLBACK_THINKING_FORMATS)[number]\n\n/** Wire protocol this plugin's v1 editor supports. */\nexport const OPENAI_COMPLETIONS = 'openai-completions'\n\n/** Settings namespace this plugin writes. */\nexport const LLM_PI_AI_NS = 'llm-pi-ai'\n\n/** Official DeepSeek adapter namespace — skip. */\nexport const LLM_DEEPSEEK_NS = 'llm-deepseek'\n\n/** Official DeepSeek provider route — skip. */\nexport const DEEPSEEK_OFFICIAL = 'deepseek-official'\n\n/** Any route key walks a dict schema to the same profile node. */\nexport const SCHEMA_PROBE_ROUTE = '\\u0000probe'\n","/**\n * Nested get/has over plain JSON, matching ui-settings SettingsSchemaService\n * for the paths this plugin needs. Kept in-repo so tests do not import a\n * Cordis service.\n */\n\n/** Read a nested value by string keys / array indexes. */\nexport function getPath(value: unknown, path: readonly string[]): unknown {\n let current: unknown = value\n for (const key of path) {\n if (Array.isArray(current)) {\n current = current[Number(key)]\n continue\n }\n if (typeof current !== 'object' || current === null) return undefined\n current = (current as Record<string, unknown>)[key]\n }\n return current\n}\n\n/** Whether the final path key exists, independently of its value. */\nexport function hasPath(value: unknown, path: readonly string[]): boolean {\n if (path.length === 0) return value !== undefined\n const parent = getPath(value, path.slice(0, -1))\n const key = path[path.length - 1] as string\n if (Array.isArray(parent)) return Number(key) < parent.length\n if (typeof parent !== 'object' || parent === null) return false\n return key in parent\n}\n\n/** Plain object (not array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** Structured clone of a JSON object, or `{}` when the source is not one. */\nexport function cloneObject(value: unknown): Record<string, unknown> {\n return isPlainObject(value) ? structuredClone(value) : {}\n}\n\n/** Structured clone of a models array; non-arrays and non-object rows are skipped. */\nexport function cloneModels(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return []\n return value.flatMap((row) => (isPlainObject(row) ? [structuredClone(row)] : []))\n}\n","import {\n DEEPSEEK_OFFICIAL,\n LLM_DEEPSEEK_NS,\n LLM_PI_AI_NS,\n OPENAI_COMPLETIONS,\n} from './catalog.ts'\nimport { getPath, isPlainObject } from './paths.ts'\n\n/** Directory row from `llm.providers()` (the fields v1 filtering reads). */\nexport interface ProviderDirectoryEntry {\n provider: string\n displayName?: string\n settingsNs?: string\n settingsPath?: readonly string[]\n declared?: boolean\n active?: boolean\n}\n\n/**\n * Resolve the wire protocol for a route.\n * User/effective `api` wins; then schema default; then openai-completions.\n */\nexport function resolveRouteApi(\n profile: unknown,\n schemaDefault: string | undefined,\n): string {\n if (isPlainObject(profile) && typeof profile.api === 'string' && profile.api.length > 0) {\n return profile.api\n }\n if (schemaDefault !== undefined && schemaDefault.length > 0) return schemaDefault\n return OPENAI_COMPLETIONS\n}\n\nexport interface EditableDecision {\n editable: boolean\n reason?: 'not-pi-ai' | 'official-deepseek' | 'catalog' | 'not-completions'\n}\n\n/**\n * v1 editable routes: hand-declared llm-pi-ai openai-completions.\n * Catalog routes are excluded (writing `models` replaces the whole catalog).\n */\nexport function classifyRoute(\n entry: ProviderDirectoryEntry,\n profile: unknown,\n schemaDefaultApi?: string,\n): EditableDecision {\n if (entry.provider === DEEPSEEK_OFFICIAL || entry.settingsNs === LLM_DEEPSEEK_NS) {\n return { editable: false, reason: 'official-deepseek' }\n }\n if (entry.settingsNs !== LLM_PI_AI_NS) {\n return { editable: false, reason: 'not-pi-ai' }\n }\n if (entry.declared !== true) {\n return { editable: false, reason: 'catalog' }\n }\n const api = resolveRouteApi(profile, schemaDefaultApi)\n if (api !== OPENAI_COMPLETIONS) {\n return { editable: false, reason: 'not-completions' }\n }\n return { editable: true }\n}\n\n/** Profile object at `providers.<route>` from an llm-pi-ai section value. */\nexport function profileAt(\n section: unknown,\n settingsPath: readonly string[] | undefined,\n provider: string,\n): unknown {\n const path = settingsPath !== undefined && settingsPath.length > 0\n ? settingsPath\n : ['providers', provider]\n return getPath(section, path)\n}\n\n/** String choices from a schemastery union node (`type: 'union'`). */\nexport function unionStringChoices(node: unknown): string[] {\n if (!isPlainObject(node) || node.type !== 'union' || !Array.isArray(node.list)) return []\n return node.list\n .map((entry) => (isPlainObject(entry) ? entry.value : undefined))\n .filter((value): value is string => typeof value === 'string')\n}\n","/**\n * Minimal path ops, same one-level-key algorithm as the official\n * ProviderEditor.pathOps: only keys that differ produce a set/unset.\n */\n\nexport type PathOp =\n | { op: 'set'; path: string[]; value: unknown }\n | { op: 'unset'; path: string[] }\n\n/**\n * The minimal path ops carrying `after` over `before`.\n * @param base - path of the edited subtree.\n * @param before - subtree as loaded, or undefined when new.\n * @param after - subtree as edited.\n */\nexport function pathOps(\n base: readonly string[],\n before: unknown,\n after: Record<string, unknown>,\n): PathOp[] {\n const previous = typeof before === 'object' && before !== null && !Array.isArray(before)\n ? before as Record<string, unknown>\n : {}\n const ops: PathOp[] = []\n for (const [key, value] of Object.entries(after)) {\n if (JSON.stringify(previous[key]) === JSON.stringify(value)) continue\n ops.push({ op: 'set', path: [...base, key], value })\n }\n for (const key of Object.keys(previous)) {\n if (!(key in after)) ops.push({ op: 'unset', path: [...base, key] })\n }\n return ops\n}\n\nexport interface SaveSlices {\n /** Profile path from `llm.providers[].settingsPath` (not a hardcoded route id). */\n settingsPath: readonly string[]\n /** Models array before the edit (user layer). */\n beforeModels: unknown\n /** Models array after the edit — every existing row, spread intact. */\n afterModels: unknown[]\n /** Route-level compat before the edit (`undefined` = field absent on user). */\n beforeCompat: unknown\n /**\n * Route-level compat after the edit. `undefined` means leave the field\n * untouched (no compat ops at all).\n */\n afterCompat: Record<string, unknown> | undefined\n}\n\n/**\n * Ops for one route: whole-array `models` replace when the table changed,\n * plus one-level compat path ops. Never replace the `llm-pi-ai` section.\n */\nexport function buildSaveOps(slices: SaveSlices): PathOp[] {\n const base = [...slices.settingsPath]\n const ops: PathOp[] = []\n if (JSON.stringify(slices.beforeModels) !== JSON.stringify(slices.afterModels)) {\n ops.push({ op: 'set', path: [...base, 'models'], value: slices.afterModels })\n }\n if (slices.afterCompat !== undefined) {\n ops.push(...pathOps([...base, 'compat'], slices.beforeCompat, slices.afterCompat))\n }\n return ops\n}\n","/**\n * Route-card draft merge: user-layer slices, namespace revision, dirty preserve.\n * No React — settings UI and tests share these helpers.\n */\nimport { profileAt } from './filter.ts'\nimport { buildSaveOps } from './path-ops.ts'\nimport { cloneModels, cloneObject, isPlainObject } from './paths.ts'\n\n/** Editable llm-pi-ai route as the settings section holds it. */\nexport interface RouteDraft {\n provider: string\n displayName: string\n /** Path inside the llm-pi-ai section (`llm.providers[].settingsPath`). */\n settingsPath: readonly string[]\n /** Namespace revision (one value for the whole llm-pi-ai document). */\n revision: number\n models: Record<string, unknown>[]\n originalModels: Record<string, unknown>[]\n compat: Record<string, unknown>\n originalCompat: Record<string, unknown>\n /** Whether `compat` is present on the user profile (not the effective view). */\n compatPresent: boolean\n}\n\n/** JSON-stable equality matching pathOps (key order included). */\nexport function sliceEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right)\n}\n\n/** Whether two settings slices differ. */\nexport function sliceChanged(before: unknown, after: unknown): boolean {\n return !sliceEqual(before, after)\n}\n\n/** Build a draft from the stored user subtree (never from effective `value`). */\nexport function routeDraftFromUserProfile(args: {\n provider: string\n displayName: string\n settingsPath: readonly string[]\n revision: number\n userProfile: unknown\n}): RouteDraft {\n const { provider, displayName, settingsPath, revision, userProfile } = args\n const models = cloneModels(isPlainObject(userProfile) ? userProfile.models : [])\n const compatPresent = isPlainObject(userProfile) && 'compat' in userProfile && isPlainObject(userProfile.compat)\n const compat = cloneObject(isPlainObject(userProfile) ? userProfile.compat : {})\n return {\n provider,\n displayName,\n settingsPath: [...settingsPath],\n revision,\n models,\n originalModels: cloneModels(models),\n compat,\n originalCompat: cloneObject(compat),\n compatPresent,\n }\n}\n\n/** Dirty iff pathOps would emit something (same comparison as save). */\nexport function draftDirty(draft: RouteDraft): boolean {\n return buildSaveOps({\n settingsPath: draft.settingsPath,\n beforeModels: draft.originalModels,\n afterModels: draft.models,\n beforeCompat: draft.compatPresent ? draft.originalCompat : undefined,\n afterCompat: draft.compat,\n }).length > 0\n}\n\n/** Treat the current models/compat as the committed originals (no-op save). */\nexport function alignDraft(draft: RouteDraft): RouteDraft {\n return {\n ...draft,\n originalModels: cloneModels(draft.models),\n originalCompat: cloneObject(draft.compat),\n compatPresent: Object.keys(draft.compat).length > 0 ? true : draft.compatPresent,\n }\n}\n\n/** Fold a successful mutate view: saved card realigns; every card gets the new revision. */\nexport function applySaveSuccess(\n drafts: readonly RouteDraft[],\n savedProvider: string,\n slice: { user: unknown; revision: number },\n): RouteDraft[] {\n return drafts.map((draft) => {\n if (draft.provider !== savedProvider) {\n return { ...draft, revision: slice.revision }\n }\n const userProfile = profileAt(slice.user, draft.settingsPath, draft.provider)\n return routeDraftFromUserProfile({\n provider: draft.provider,\n displayName: draft.displayName,\n settingsPath: draft.settingsPath,\n revision: slice.revision,\n userProfile,\n })\n })\n}\n\nfunction modelRowId(row: Record<string, unknown>): string {\n return String(row.id)\n}\n\nfunction indexById(rows: readonly Record<string, unknown>[]): Map<string, Record<string, unknown>> {\n const map = new Map<string, Record<string, unknown>>()\n for (const row of rows) {\n const id = modelRowId(row)\n if (!map.has(id)) map.set(id, row)\n }\n return map\n}\n\nfunction effortsPresence(row: Record<string, unknown> | undefined): { present: boolean; value: unknown } {\n if (row === undefined || !Object.hasOwn(row, 'reasoningEfforts')) {\n return { present: false, value: undefined }\n }\n return { present: true, value: row.reasoningEfforts }\n}\n\nfunction effortsEqual(\n left: { present: boolean; value: unknown },\n right: { present: boolean; value: unknown },\n): boolean {\n if (left.present !== right.present) return false\n if (!left.present) return true\n return sliceEqual(left.value, right.value)\n}\n\nfunction overlayLocalEfforts(\n incomingRow: Record<string, unknown>,\n prevRow: Record<string, unknown>,\n): Record<string, unknown> {\n const next = structuredClone(incomingRow)\n if (Object.hasOwn(prevRow, 'reasoningEfforts')) {\n next.reasoningEfforts = structuredClone(prevRow.reasoningEfforts)\n } else {\n delete next.reasoningEfforts\n }\n return next\n}\n\nfunction objectKeyChanged(\n left: Record<string, unknown>,\n right: Record<string, unknown>,\n key: string,\n): boolean {\n const leftHas = Object.hasOwn(left, key)\n const rightHas = Object.hasOwn(right, key)\n if (leftHas !== rightHas) return true\n if (!leftHas) return false\n return sliceChanged(left[key], right[key])\n}\n\n/**\n * Membership follows the latest user-layer models list (Models page add/delete).\n * Local unsaved `reasoningEfforts` (including a cleared key) overlay by id.\n */\nexport function mergeModelsById(args: {\n prevModels: readonly Record<string, unknown>[]\n prevOriginal: readonly Record<string, unknown>[]\n incomingModels: readonly Record<string, unknown>[]\n incomingOriginal: readonly Record<string, unknown>[]\n}): { models: Record<string, unknown>[]; conflicted: boolean } {\n const prevById = indexById(args.prevModels)\n const prevOrigById = indexById(args.prevOriginal)\n const incomingOrigById = indexById(args.incomingOriginal)\n const incomingIds = new Set(args.incomingModels.map(modelRowId))\n let conflicted = false\n\n const models = args.incomingModels.map((incomingRow) => {\n const id = modelRowId(incomingRow)\n const prevRow = prevById.get(id)\n if (prevRow === undefined) return structuredClone(incomingRow)\n const prevOrig = prevOrigById.get(id)\n const localDirty = !effortsEqual(effortsPresence(prevRow), effortsPresence(prevOrig))\n if (!localDirty) return structuredClone(incomingRow)\n const incomingOrig = incomingOrigById.get(id)\n if (!effortsEqual(effortsPresence(prevOrig), effortsPresence(incomingOrig))) {\n conflicted = true\n }\n return overlayLocalEfforts(incomingRow, prevRow)\n })\n\n for (const [id, prevRow] of prevById) {\n if (incomingIds.has(id)) continue\n const prevOrig = prevOrigById.get(id)\n if (effortsEqual(effortsPresence(prevRow), effortsPresence(prevOrig))) continue\n if (!effortsEqual(effortsPresence(prevOrig), effortsPresence(incomingOrigById.get(id)))) {\n conflicted = true\n }\n }\n\n return { models, conflicted }\n}\n\n/**\n * Three-way compat merge: locally changed keys stay local; everything else\n * follows incoming. Conflict only when a locally dirty key also moved in originals.\n */\nexport function mergeCompat(args: {\n prev: Record<string, unknown>\n prevOriginal: Record<string, unknown>\n incoming: Record<string, unknown>\n incomingOriginal: Record<string, unknown>\n}): { compat: Record<string, unknown>; conflicted: boolean } {\n if (!sliceChanged(args.prev, args.prevOriginal)) {\n return { compat: cloneObject(args.incoming), conflicted: false }\n }\n const compat = cloneObject(args.incoming)\n let conflicted = false\n const keys = new Set([...Object.keys(args.prev), ...Object.keys(args.prevOriginal)])\n for (const key of keys) {\n if (!objectKeyChanged(args.prev, args.prevOriginal, key)) continue\n if (objectKeyChanged(args.prevOriginal, args.incomingOriginal, key)) conflicted = true\n if (Object.hasOwn(args.prev, key)) compat[key] = structuredClone(args.prev[key])\n else delete compat[key]\n }\n return { compat, conflicted }\n}\n\n/**\n * Apply a freshly loaded table. Membership and metadata follow incoming;\n * unsaved reasoningEfforts / dirty compat keys overlay by id. Conflict only\n * when a locally dirty field also changed in originals (revision-only bumps\n * and sibling-card saves do not warn).\n */\nexport function mergeLoadedDrafts(\n current: readonly RouteDraft[],\n incoming: readonly RouteDraft[],\n options: { preserveDirty: boolean },\n): { drafts: RouteDraft[]; conflicted: string[] } {\n const currentByProvider = new Map(current.map(draft => [draft.provider, draft]))\n const conflicted: string[] = []\n const drafts = incoming.map((next) => {\n const prev = currentByProvider.get(next.provider)\n if (prev === undefined || !options.preserveDirty || !draftDirty(prev)) return next\n const modelsMerge = mergeModelsById({\n prevModels: prev.models,\n prevOriginal: prev.originalModels,\n incomingModels: next.models,\n incomingOriginal: next.originalModels,\n })\n const compatMerge = mergeCompat({\n prev: prev.compat,\n prevOriginal: prev.originalCompat,\n incoming: next.compat,\n incomingOriginal: next.originalCompat,\n })\n if (modelsMerge.conflicted || compatMerge.conflicted) conflicted.push(next.provider)\n return {\n provider: next.provider,\n displayName: next.displayName,\n settingsPath: next.settingsPath,\n revision: next.revision,\n models: modelsMerge.models,\n originalModels: cloneModels(next.originalModels),\n compat: compatMerge.compat,\n originalCompat: cloneObject(next.originalCompat),\n compatPresent: next.compatPresent,\n }\n })\n return { drafts, conflicted }\n}\n\n/** Increment a generation counter; callers discard stale async settlements. */\nexport function nextGeneration(holder: { current: number }): number {\n holder.current += 1\n return holder.current\n}\n\n/** Whether `generation` is still the latest issued token. */\nexport function generationIsCurrent(holder: { current: number }, generation: number): boolean {\n return holder.current === generation\n}\n\n/** Keep a stored thinkingFormat visible even if the schema union omitted it. */\nexport function thinkingFormatChoices(formats: readonly string[], current: unknown): string[] {\n if (typeof current === 'string' && current.length > 0 && !formats.includes(current)) {\n return [current, ...formats]\n }\n return [...formats]\n}\n","import { THINKING_LEVELS, type ThinkingLevel } from './catalog.ts'\n\n/** Per-model reasoningEfforts dict as stored in llm-pi-ai settings. */\nexport type ReasoningEfforts = Partial<Record<ThinkingLevel, string | null>>\n\n/** Off tri-state. Must not be collapsed into a single checkbox. */\nexport type OffMode = 'absent' | 'empty' | 'value'\n\nexport type ReasoningEffortsField = ReasoningEfforts | false | undefined\n\n/** Read Off's three states from a stored dict. */\nexport function readOff(efforts: ReasoningEfforts | undefined): { mode: OffMode; value: string } {\n if (efforts === undefined || !('off' in efforts) || efforts.off === undefined) {\n return { mode: 'absent', value: 'none' }\n }\n if (efforts.off === null) return { mode: 'empty', value: 'none' }\n return { mode: 'value', value: efforts.off }\n}\n\n/** Write Off's three states onto a dict (does not mutate the input). */\nexport function writeOff(\n efforts: ReasoningEfforts,\n mode: OffMode,\n value: string,\n): ReasoningEfforts {\n const next: ReasoningEfforts = { ...efforts }\n delete next.off\n if (mode === 'empty') next.off = null\n else if (mode === 'value') {\n const trimmed = value.trim()\n next.off = trimmed.length > 0 ? trimmed : 'none'\n }\n return next\n}\n\n/** Whether a thinking level (other than Off) is currently declared. */\nexport function hasLevel(efforts: ReasoningEfforts | undefined, level: Exclude<ThinkingLevel, 'off'>): boolean {\n return efforts !== undefined && efforts[level] !== undefined && efforts[level] !== null\n}\n\n/** Toggle a non-off level. New levels default the wire spelling to the key. */\nexport function toggleLevel(\n efforts: ReasoningEfforts,\n level: Exclude<ThinkingLevel, 'off'>,\n enabled: boolean,\n wire?: string,\n): ReasoningEfforts {\n const next: ReasoningEfforts = { ...efforts }\n if (enabled) next[level] = wire !== undefined && wire.length > 0 ? wire : level\n else delete next[level]\n return next\n}\n\n/** Set the wire spelling for a declared non-off level. */\nexport function setWireSpelling(\n efforts: ReasoningEfforts,\n level: Exclude<ThinkingLevel, 'off'>,\n wire: string,\n): ReasoningEfforts {\n if (!hasLevel(efforts, level)) return efforts\n return { ...efforts, [level]: wire }\n}\n\n/**\n * Validate a reasoningEfforts field. Returns an error code; never throws.\n * Absence / `false` are valid (default-off / catalog strip). Empty dict and\n * off-only are rejected by the official resolver.\n */\nexport function validateReasoningEfforts(efforts: unknown): 'empty' | 'off-only' | 'bad-wire' | undefined {\n if (efforts === undefined || efforts === false) return undefined\n if (efforts === null || (typeof efforts === 'object' && !Array.isArray(efforts) && Object.keys(efforts).length === 0)) {\n return 'empty'\n }\n if (typeof efforts !== 'object' || Array.isArray(efforts)) return 'empty'\n const record = efforts as Record<string, unknown>\n const known = new Set<string>(THINKING_LEVELS)\n for (const key of Object.keys(record)) {\n if (!known.has(key)) return 'bad-wire'\n }\n const declared = THINKING_LEVELS.flatMap((level) => {\n if (!(level in record) || record[level] === undefined) return []\n return [[level, record[level]] as const]\n })\n for (const [level, wire] of declared) {\n if (wire === null) {\n if (level !== 'off') return 'bad-wire'\n } else if (typeof wire !== 'string' || wire.length === 0) {\n return 'bad-wire'\n }\n }\n if (!declared.some(([level]) => level !== 'off')) return 'off-only'\n return undefined\n}\n\n/** Drop reasoningEfforts from a model row; keep every other field. */\nexport function clearReasoningEfforts(row: Record<string, unknown>): Record<string, unknown> {\n const next = { ...row }\n delete next.reasoningEfforts\n return next\n}\n\n/** Read reasoningEfforts from a model row. `false` is treated as absent for the editor. */\nexport function readEfforts(row: Record<string, unknown>): ReasoningEfforts | undefined {\n const value = row.reasoningEfforts\n if (value === undefined || value === false || value === null) return undefined\n if (typeof value !== 'object' || Array.isArray(value)) return undefined\n return value as ReasoningEfforts\n}\n\n/** Put a dict (or omit the field) onto a spread row. */\nexport function writeEfforts(\n row: Record<string, unknown>,\n efforts: ReasoningEfforts | undefined,\n): Record<string, unknown> {\n const next = { ...row }\n if (efforts === undefined || Object.keys(efforts).length === 0) {\n delete next.reasoningEfforts\n return next\n }\n next.reasoningEfforts = efforts\n return next\n}\n","import type { ReasoningEfforts } from './efforts.ts'\n\nexport type PresetId = 'deepseek' | 'openai' | 'toggle'\n\nexport interface PresetCompatPatch {\n /**\n * Every preset states all three UI dialect keys. `set` writes the key;\n * `unset` removes it. Unknown extra compat keys are left in place.\n */\n thinkingFormat: 'set' | 'unset'\n thinkingFormatValue?: string\n supportsDeveloperRole: 'set-false' | 'unset'\n supportsReasoningEffort: 'set-false' | 'unset'\n}\n\nexport interface EffortPreset {\n id: PresetId\n efforts: ReasoningEfforts\n compat: PresetCompatPatch\n /** True when selector levels do not change the on-wire request (except Off). */\n warnSameWire: boolean\n}\n\n/** DeepSeek-compatible gateway: explicit thinking.disabled on Off. */\nexport const DEEPSEEK_PRESET: EffortPreset = {\n id: 'deepseek',\n efforts: {\n off: null,\n low: 'low',\n high: 'high',\n max: 'max',\n },\n compat: {\n thinkingFormat: 'set',\n thinkingFormatValue: 'deepseek',\n supportsDeveloperRole: 'set-false',\n supportsReasoningEffort: 'unset',\n },\n warnSameWire: false,\n}\n\n/** OpenAI-compatible gateway: default thinkingFormat (omit the key). */\nexport const OPENAI_PRESET: EffortPreset = {\n id: 'openai',\n efforts: {\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n },\n compat: {\n thinkingFormat: 'unset',\n supportsDeveloperRole: 'unset',\n supportsReasoningEffort: 'unset',\n },\n warnSameWire: false,\n}\n\n/** On/off only: selector may list levels that are identical on the wire. */\nexport const TOGGLE_PRESET: EffortPreset = {\n id: 'toggle',\n efforts: {\n off: null,\n high: 'high',\n },\n compat: {\n thinkingFormat: 'unset',\n supportsDeveloperRole: 'unset',\n supportsReasoningEffort: 'set-false',\n },\n warnSameWire: true,\n}\n\nexport const PRESETS: Record<PresetId, EffortPreset> = {\n deepseek: DEEPSEEK_PRESET,\n openai: OPENAI_PRESET,\n toggle: TOGGLE_PRESET,\n}\n\n/** Apply a preset's efforts onto every model row (spread, keep other fields). */\nexport function applyPresetEfforts(\n models: readonly Record<string, unknown>[],\n preset: EffortPreset,\n): Record<string, unknown>[] {\n return models.map(row => ({ ...row, reasoningEfforts: { ...preset.efforts } }))\n}\n\n/** Merge a preset's compat patch onto the current route-level compat object. */\nexport function applyPresetCompat(\n compat: Record<string, unknown>,\n preset: EffortPreset,\n): Record<string, unknown> {\n const next = { ...compat }\n const { compat: patch } = preset\n if (patch.thinkingFormat === 'unset') delete next.thinkingFormat\n else if (patch.thinkingFormat === 'set' && patch.thinkingFormatValue !== undefined) {\n next.thinkingFormat = patch.thinkingFormatValue\n }\n if (patch.supportsDeveloperRole === 'unset') delete next.supportsDeveloperRole\n else if (patch.supportsDeveloperRole === 'set-false') next.supportsDeveloperRole = false\n if (patch.supportsReasoningEffort === 'unset') delete next.supportsReasoningEffort\n else if (patch.supportsReasoningEffort === 'set-false') next.supportsReasoningEffort = false\n return next\n}\n","import { validateReasoningEfforts } from './efforts.ts'\n\n/** Per-model client-side check used to show errors without throwing. */\nexport function modelEffortError(row: Record<string, unknown>): 'empty' | 'off-only' | 'bad-wire' | undefined {\n if (!('reasoningEfforts' in row) || row.reasoningEfforts === undefined) return undefined\n return validateReasoningEfforts(row.reasoningEfforts)\n}\n","/**\n * Plugin footer attribution. Version and end-year are frozen into the client\n * bundle at pack time; this module only formats the line.\n */\n\n/** First publication year (LICENSE). Not the user's wall clock. */\nexport const COPYRIGHT_FROM = 2026\n\nexport const COPYRIGHT_HOLDER = 'Stardust'\n\n/**\n * `0.1.2 © 2026 Stardust` or `0.1.2 © 2026–2027 Stardust`.\n * Throws if version is empty or `to < from` — a bad stamp must not render.\n */\nexport function formatAttribution(version: string, from: number, to: number): string {\n if (version.trim() === '') {\n throw new Error('plugin version must be a non-empty string')\n }\n if (!Number.isInteger(from) || !Number.isInteger(to) || to < from) {\n throw new Error(`invalid copyright range: ${String(from)}\\u2013${String(to)}`)\n }\n const years = to === from ? String(from) : `${String(from)}\\u2013${String(to)}`\n return `${version} \\u00a9 ${years} ${COPYRIGHT_HOLDER}`\n}\n","/**\n * Footer line frozen into the client bundle. Do not read the clock or\n * package.json at DSH startup — host apply is empty and the settings page\n * runs in the browser.\n */\nimport { COPYRIGHT_FROM, formatAttribution } from '../core/attribution.ts'\n\nexport const PLUGIN_FOOTER_TEXT = formatAttribution(\n __PLUGIN_VERSION__,\n COPYRIGHT_FROM,\n __COPYRIGHT_TO__,\n)\n","/**\n * Load editable route drafts from llm.providers + the llm-pi-ai namespace.\n * Drafts come from the user layer; route protocol classification may use effective value.\n *\n * First paint uses `ensure()` (idle-only). Refresh never calls `ensure()`:\n * wait until the mirror subscribe shows a namespace revision at least as new\n * as the Host event, then `getSnapshot()`. Own mutate echoes are identified\n * by revision (including older delayed echoes), not ignored as a generic\n * document-updated.\n */\nimport type { IApiClient, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport {\n LLM_PI_AI_NS,\n SCHEMA_PROBE_ROUTE,\n} from '../core/catalog.ts'\nimport { routeDraftFromUserProfile, type RouteDraft } from '../core/drafts.ts'\nimport { classifyRoute, profileAt, unionStringChoices } from '../core/filter.ts'\nimport { isPlainObject } from '../core/paths.ts'\nimport type { SchemaOps } from './schema-ops.ts'\n\nfunction schemaDefaultString(node: unknown): string | undefined {\n if (!isPlainObject(node) || !isPlainObject(node.meta)) return undefined\n return typeof node.meta.default === 'string' ? node.meta.default : undefined\n}\n\nexport interface LoadDraftsResult {\n writable: boolean\n formats: string[]\n drafts: RouteDraft[]\n error?: string\n}\n\nexport type LoadDraftsMode = 'ensure' | 'snapshot'\n\ntype MirrorSnapshot = ReturnType<SettingsDescribeFace['getSnapshot']>\ntype MirrorDescribe = Pick<SettingsDescribeFace, 'getSnapshot' | 'subscribe'>\n\n/** Namespace revision on a describe snapshot, if that row exists. */\nexport function namespaceRevision(snapshot: MirrorSnapshot, ns: string): number | undefined {\n return snapshot.view?.namespaces.find(view => view.ns === ns)?.revision\n}\n\n/**\n * True when `incoming` is the Host echo of a mutate this page already folded,\n * or an older revision the snapshot has already passed. `echoed` is undefined\n * until the first successful write.\n */\nexport function isOwnDocumentEcho(echoed: number | undefined, incoming: number): boolean {\n return echoed !== undefined && incoming <= echoed\n}\n\n/**\n * After a preserve-dirty reload: conflicted cards get a conflict notice;\n * live cards drop leftover conflict/error; saved notices stay; gone cards drop.\n */\nexport function foldReloadNotices<T extends { kind: string }>(\n current: Record<string, T>,\n args: {\n conflicted: readonly string[]\n conflictNotice: T\n liveProviders: readonly string[]\n },\n): Record<string, T> {\n const live = new Set(args.liveProviders)\n const conflicted = new Set(args.conflicted)\n const next: Record<string, T> = {}\n for (const [provider, notice] of Object.entries(current)) {\n if (!live.has(provider)) continue\n if (conflicted.has(provider)) continue\n if (notice.kind === 'conflict' || notice.kind === 'error') continue\n next[provider] = notice\n }\n for (const provider of args.conflicted) {\n next[provider] = args.conflictNotice\n }\n return next\n}\n\nfunction waitUntil(\n describe: MirrorDescribe,\n predicate: () => boolean,\n signal?: AbortSignal,\n): Promise<boolean> {\n if (signal?.aborted) return Promise.resolve(false)\n if (predicate()) return Promise.resolve(true)\n return new Promise((resolve) => {\n let settled = false\n const finish = (ok: boolean) => {\n if (settled) return\n settled = true\n stop()\n signal?.removeEventListener('abort', onAbort)\n resolve(ok)\n }\n const onAbort = () => { finish(false) }\n const stop = describe.subscribe(() => {\n if (predicate()) finish(true)\n })\n signal?.addEventListener('abort', onAbort)\n if (predicate()) finish(true)\n else if (signal?.aborted) finish(false)\n })\n}\n\n/** Resolve when the mirror's namespace revision is at least `revision`, or abort. */\nexport async function waitForNamespaceRevision(\n describe: MirrorDescribe,\n ns: string,\n revision: number,\n signal?: AbortSignal,\n): Promise<'matched' | 'aborted'> {\n const matched = await waitUntil(\n describe,\n () => {\n const current = namespaceRevision(describe.getSnapshot(), ns)\n return current !== undefined && current >= revision\n },\n signal,\n )\n return matched ? 'matched' : 'aborted'\n}\n\n/** Resolve when the namespace revision differs from `previous`, or abort. */\nexport async function waitForNamespaceRevisionChange(\n describe: MirrorDescribe,\n ns: string,\n previous: number,\n signal?: AbortSignal,\n): Promise<'changed' | 'aborted'> {\n const changed = await waitUntil(describe, () => {\n const current = namespaceRevision(describe.getSnapshot(), ns)\n return current !== undefined && current !== previous\n }, signal)\n return changed ? 'changed' : 'aborted'\n}\n\nasync function assembleDrafts(\n api: Pick<IApiClient, 'llm'>,\n describe: Pick<SettingsDescribeFace, 'getSnapshot'>,\n schema: SchemaOps,\n): Promise<LoadDraftsResult> {\n const mirrored = describe.getSnapshot()\n if (mirrored.view === undefined) {\n return { writable: false, formats: [], drafts: [], error: mirrored.error ?? undefined }\n }\n const providersResponse = await api.llm.providers({})\n if (!providersResponse.result.ok) {\n return {\n writable: mirrored.view.writable,\n formats: [],\n drafts: [],\n error: providersResponse.result.error.message,\n }\n }\n const namespaces = new Map(mirrored.view.namespaces.map((view: SettingsNamespaceView) => [view.ns, view]))\n const pi = namespaces.get(LLM_PI_AI_NS)\n let formats: string[] = []\n let schemaDefaultApi: string | undefined\n if (pi !== undefined) {\n try {\n const root = schema.rehydrate(pi.schema)\n const formatNode = schema.nodeAtPath(root, ['providers', SCHEMA_PROBE_ROUTE, 'compat', 'thinkingFormat'])\n const fromSchema = unionStringChoices(formatNode)\n if (fromSchema.length > 0) formats = fromSchema\n schemaDefaultApi = schemaDefaultString(schema.nodeAtPath(root, ['providers', SCHEMA_PROBE_ROUTE, 'api']))\n } catch {\n // Live schema walk is best-effort; UI options stay empty rather than a handwritten list.\n }\n }\n const drafts: RouteDraft[] = []\n for (const entry of providersResponse.result.value.providers) {\n const settingsPath = entry.settingsPath !== undefined && entry.settingsPath.length > 0\n ? [...entry.settingsPath]\n : ['providers', entry.provider]\n const effective = profileAt(pi?.value, settingsPath, entry.provider)\n if (!classifyRoute(entry, effective, schemaDefaultApi).editable) continue\n drafts.push(routeDraftFromUserProfile({\n provider: entry.provider,\n displayName: entry.displayName ?? entry.provider,\n settingsPath,\n revision: pi?.revision ?? 0,\n userProfile: profileAt(pi?.user, settingsPath, entry.provider),\n }))\n }\n return { writable: mirrored.view.writable, formats, drafts }\n}\n\n/**\n * `ensure`: first paint / idle recovery (official ensure only reads from idle).\n * `snapshot`: refresh after the mirror revision already moved — do not ensure.\n */\nexport async function loadDrafts(\n api: Pick<IApiClient, 'llm'>,\n describe: Pick<SettingsDescribeFace, 'ensure' | 'getSnapshot'>,\n schema: SchemaOps,\n mode: LoadDraftsMode = 'ensure',\n): Promise<LoadDraftsResult> {\n if (mode === 'ensure') await describe.ensure()\n return assembleDrafts(api, describe, schema)\n}\n","/**\n * Bind the settings-owned schema service without importing executable\n * helpers from another client plugin (bundle purity).\n */\nexport interface SchemaOps {\n rehydrate: (serialized: unknown) => unknown\n nodeAtPath: (root: unknown, path: readonly string[]) => unknown\n getPath: (value: unknown, path: readonly string[]) => unknown\n hasPath: (value: unknown, path: readonly string[]) => boolean\n /**\n * Official `settingsSchema.validate`: failure text, or `undefined` when valid.\n * Missing nodes are skipped by the caller — do not invent a second validator.\n */\n validate: (node: unknown, draft: unknown) => string | undefined\n}\n\n/** Wrap a live settingsSchema service as plain callbacks. */\nexport function bindSchema(service: SchemaOps): SchemaOps {\n return {\n rehydrate: serialized => service.rehydrate(serialized),\n nodeAtPath: (root, path) => service.nodeAtPath(root, path),\n getPath: (value, path) => service.getPath(value, path),\n hasPath: (value, path) => service.hasPath(value, path),\n validate: (node, draft) => service.validate(node, draft),\n }\n}\n\n/**\n * Pre-mutate schema check used by the settings page.\n * A returned string means do not call `settings.mutate`.\n */\nexport function validateSaveDraft(\n schema: SchemaOps,\n root: unknown,\n settingsPath: readonly string[],\n afterModels: unknown,\n afterCompat: unknown,\n willWriteCompat: boolean,\n): string | undefined {\n const modelsNode = schema.nodeAtPath(root, [...settingsPath, 'models'])\n if (modelsNode !== undefined) {\n const error = schema.validate(modelsNode, afterModels)\n if (error !== undefined) return error\n }\n if (willWriteCompat) {\n const compatNode = schema.nodeAtPath(root, [...settingsPath, 'compat'])\n if (compatNode !== undefined) {\n const error = schema.validate(compatNode, afterCompat)\n if (error !== undefined) return error\n }\n }\n return undefined\n}\n","/**\n * Settings section: per-model reasoningEfforts + openai-completions compat\n * for hand-declared llm-pi-ai routes.\n */\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport { LLM_PI_AI_NS, THINKING_LEVELS_WITHOUT_OFF } from '../core/catalog.ts'\nimport {\n alignDraft,\n applySaveSuccess,\n draftDirty,\n generationIsCurrent,\n mergeLoadedDrafts,\n nextGeneration,\n thinkingFormatChoices,\n type RouteDraft,\n} from '../core/drafts.ts'\nimport {\n hasLevel,\n readEfforts,\n readOff,\n setWireSpelling,\n toggleLevel,\n writeEfforts,\n writeOff,\n clearReasoningEfforts,\n} from '../core/efforts.ts'\nimport { applyPresetCompat, applyPresetEfforts, PRESETS, type PresetId } from '../core/presets.ts'\nimport { buildSaveOps } from '../core/path-ops.ts'\nimport { cloneModels, cloneObject } from '../core/paths.ts'\nimport { modelEffortError } from '../core/validate.ts'\nimport { PLUGIN_FOOTER_TEXT } from './build-info.ts'\nimport {\n foldReloadNotices,\n isOwnDocumentEcho,\n loadDrafts,\n waitForNamespaceRevision,\n waitForNamespaceRevisionChange,\n type LoadDraftsMode,\n} from './load-drafts.ts'\nimport { validateSaveDraft, type SchemaOps } from './schema-ops.ts'\nimport type { EffortDeclareKey } from './locales.ts'\nimport css from './effort-declare.module.css'\n\nexport type InvalidationSource = 'settings' | 'directory' | 'reset' | 'writable'\n\nexport type Invalidation =\n | { source: 'writable' }\n | { source: 'directory' }\n | { source: 'reset' }\n | { source: 'settings'; revision: number }\n\nexport interface EffortDeclareSectionInjected {\n api: Pick<IApiClient, 'settings' | 'llm'>\n describe: SettingsDescribeFace\n schema: SchemaOps\n subscribeInvalidate: (listener: (event: Invalidation) => void) => () => void\n}\n\nexport interface EffortDeclareSectionProps extends Partial<EffortDeclareSectionInjected> {\n t: (key: EffortDeclareKey) => string\n close: () => void\n}\n\nexport { loadDrafts } from './load-drafts.ts'\n\ntype CardNotice = { kind: 'saved' | 'conflict' | 'error'; text: string }\n\nfunction compatSummary(compat: Record<string, unknown>): string {\n const parts: string[] = []\n if (typeof compat.thinkingFormat === 'string') parts.push(`thinkingFormat=${compat.thinkingFormat}`)\n if (compat.supportsDeveloperRole === false) parts.push('supportsDeveloperRole=false')\n if (compat.supportsReasoningEffort === false) parts.push('supportsReasoningEffort=false')\n return parts.join(' · ')\n}\n\nfunction errorText(code: ReturnType<typeof modelEffortError>, t: (key: EffortDeclareKey) => string): string | undefined {\n if (code === 'empty') return t('errorEmpty')\n if (code === 'off-only') return t('errorOffOnly')\n if (code === 'bad-wire') return t('errorBadWire')\n return undefined\n}\n\nfunction ModelRowEditor(props: {\n row: Record<string, unknown>\n index: number\n radioName: string\n disabled: boolean\n t: (key: EffortDeclareKey) => string\n onChange: (row: Record<string, unknown>) => void\n}): ReactNode {\n const { row, disabled, t, onChange } = props\n const efforts = readEfforts(row) ?? {}\n const off = readOff(readEfforts(row))\n const id = typeof row.id === 'string' ? row.id : ''\n const name = typeof row.name === 'string' ? row.name : ''\n\n const patchEfforts = (next: typeof efforts): void => {\n onChange(writeEfforts(row, Object.keys(next).length === 0 ? undefined : next))\n }\n\n return (\n <div className={css.modelEntry}>\n <div className={css.modelHead}>\n <span className={css.modelId}>{id || t('model')}</span>\n {name !== '' && name !== id ? <span className={css.modelName}>{name}</span> : null}\n <button\n type=\"button\"\n className={css.linkButton}\n disabled={disabled || !('reasoningEfforts' in row)}\n onClick={() => { onChange(clearReasoningEfforts(row)) }}\n >\n {t('clear')}\n </button>\n </div>\n <span className={css.fieldLabel}>{t('levels')}</span>\n <div className={css.levels}>\n {THINKING_LEVELS_WITHOUT_OFF.map((level) => (\n <label key={level} className={css.level}>\n <input\n type=\"checkbox\"\n checked={hasLevel(efforts, level)}\n disabled={disabled}\n onChange={(event) => { patchEfforts(toggleLevel(efforts, level, event.target.checked)) }}\n />\n {level}\n </label>\n ))}\n </div>\n <div className={css.wireRow}>\n <span className={css.fieldLabel}>{t('wire')}</span>\n {THINKING_LEVELS_WITHOUT_OFF.filter(level => hasLevel(efforts, level)).map((level) => (\n <label key={level} className={css.level}>\n {level}\n <input\n className={`${css.input} ${css.wireInput}`}\n type=\"text\"\n value={efforts[level] ?? level}\n disabled={disabled}\n aria-label={`${t('wire')} ${level}`}\n onChange={(event) => { patchEfforts(setWireSpelling(efforts, level, event.target.value)) }}\n />\n </label>\n ))}\n </div>\n <div className={css.offGroup}>\n <span className={css.fieldLabel}>{t('offMode')}</span>\n {(['absent', 'empty', 'value'] as const).map((mode) => (\n <label key={mode} className={css.level}>\n <input\n type=\"radio\"\n name={props.radioName}\n checked={off.mode === mode}\n disabled={disabled}\n onChange={() => { patchEfforts(writeOff(efforts, mode, off.value)) }}\n />\n {mode === 'absent' ? t('offAbsent') : mode === 'empty' ? t('offEmpty') : t('offValue')}\n </label>\n ))}\n {off.mode === 'value'\n ? (\n <input\n className={`${css.input} ${css.wireInput}`}\n type=\"text\"\n value={off.value}\n placeholder={t('offValuePlaceholder')}\n disabled={disabled}\n onChange={(event) => { patchEfforts(writeOff(efforts, 'value', event.target.value)) }}\n />\n )\n : null}\n </div>\n </div>\n )\n}\n\nfunction RouteCard(props: {\n draft: RouteDraft\n formats: readonly string[]\n writable: boolean\n /** This card is the in-flight mutate — show “Saving…”. */\n busy: boolean\n /** Namespace-level lock: any mutate, read-only, or first load. */\n saveLocked: boolean\n notice: CardNotice | undefined\n t: (key: EffortDeclareKey) => string\n onChange: (draft: RouteDraft) => void\n onSave: (draft: RouteDraft) => void\n onCancel: (draft: RouteDraft) => void\n}): ReactNode {\n const { draft, writable, busy, saveLocked, t, onChange } = props\n const noModels = draft.models.length === 0\n const editDisabled = !writable || busy || noModels\n const saveDisabled = saveLocked || noModels\n const formats = thinkingFormatChoices(props.formats, draft.compat.thinkingFormat)\n const summary = compatSummary(draft.compat)\n const sameWire = draft.compat.supportsReasoningEffort === false\n const clientError = draft.models\n .map(row => errorText(modelEffortError(row), t))\n .find(text => text !== undefined)\n const dirty = draftDirty(draft)\n\n const applyPreset = (id: PresetId): void => {\n const preset = PRESETS[id]\n onChange({\n ...draft,\n models: applyPresetEfforts(draft.models, preset),\n compat: applyPresetCompat(draft.compat, preset),\n })\n }\n\n return (\n <li className={css.rowCard}>\n <div className={css.rowHead}>\n <span className={css.rowName}>{draft.displayName}</span>\n <span className={css.rowTag}>{draft.provider}</span>\n </div>\n <p className={css.compatSummary}>\n {t('compatSummary')}\n {summary === '' ? '' : `: ${summary}`}\n </p>\n <div className={css.presetRow}>\n <span className={css.fieldLabel}>{t('presets')}</span>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('deepseek') }}>\n {t('presetDeepSeek')}\n </button>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('openai') }}>\n {t('presetOpenAI')}\n </button>\n <button type=\"button\" className={css.secondaryButton} disabled={editDisabled} onClick={() => { applyPreset('toggle') }}>\n {t('presetToggle')}\n </button>\n </div>\n {sameWire ? <p className={css.notice}>{t('presetToggleWarn')}</p> : null}\n {noModels ? <p className={css.notice}>{t('noModels')}</p> : null}\n {draft.models.map((row, index) => (\n <ModelRowEditor\n key={`${String(row.id)}-${String(index)}`}\n row={row}\n index={index}\n radioName={`off-${draft.provider}-${String(index)}`}\n disabled={editDisabled}\n t={t}\n onChange={(next) => {\n const models = draft.models.map((candidate, at) => at === index ? next : candidate)\n onChange({ ...draft, models })\n }}\n />\n ))}\n <details className={css.advanced}>\n <summary>{t('advanced')}</summary>\n <div className={css.advancedBody}>\n <label className={css.fieldLabel}>\n {t('thinkingFormat')}\n <select\n className={`${css.input} ${css.selectInput}`}\n value={typeof draft.compat.thinkingFormat === 'string' ? draft.compat.thinkingFormat : ''}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.value === '') delete compat.thinkingFormat\n else compat.thinkingFormat = event.target.value\n onChange({ ...draft, compat })\n }}\n >\n <option value=\"\">{t('thinkingFormatDefault')}</option>\n {formats.map(format => <option key={format} value={format}>{format}</option>)}\n </select>\n </label>\n {draft.compat.supportsDeveloperRole === true\n ? <p className={css.notice}>{t('developerTrueHint')}</p>\n : null}\n <label className={css.check}>\n <input\n type=\"checkbox\"\n checked={draft.compat.supportsDeveloperRole === false}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.checked) compat.supportsDeveloperRole = false\n else delete compat.supportsDeveloperRole\n onChange({ ...draft, compat })\n }}\n />\n {t('supportsDeveloperRole')}\n </label>\n <label className={css.check}>\n <input\n type=\"checkbox\"\n checked={draft.compat.supportsReasoningEffort === false}\n disabled={editDisabled}\n onChange={(event) => {\n const compat = { ...draft.compat }\n if (event.target.checked) compat.supportsReasoningEffort = false\n else delete compat.supportsReasoningEffort\n onChange({ ...draft, compat })\n }}\n />\n {t('supportsReasoningEffort')}\n </label>\n </div>\n </details>\n {clientError !== undefined ? <p className={css.error}>{clientError}</p> : null}\n {props.notice?.kind === 'saved' ? <p className={css.savedNotice}>{props.notice.text}</p> : null}\n {props.notice?.kind === 'conflict' || props.notice?.kind === 'error'\n ? <p className={css.error}>{props.notice.text}</p>\n : null}\n <div className={css.actions}>\n <button\n type=\"button\"\n className={css.secondaryButton}\n disabled={busy || !dirty}\n onClick={() => { props.onCancel(draft) }}\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n className={css.primaryButton}\n disabled={saveDisabled || !dirty || clientError !== undefined}\n onClick={() => { props.onSave(draft) }}\n >\n {busy ? t('saving') : t('save')}\n </button>\n </div>\n </li>\n )\n}\n\nexport function EffortDeclareSection(props: EffortDeclareSectionProps): ReactNode {\n const t = props.t\n const api = props.api\n const describe = props.describe\n const schema = props.schema\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading')\n const [error, setError] = useState('')\n const [writable, setWritable] = useState(false)\n const [formats, setFormats] = useState<string[]>([])\n const [drafts, setDrafts] = useState<RouteDraft[]>([])\n const [busyRoute, setBusyRoute] = useState<string | null>(null)\n const [notices, setNotices] = useState<Record<string, CardNotice>>({})\n const generationRef = useRef(0)\n const draftsRef = useRef(drafts)\n const echoedRevisionRef = useRef<number | undefined>(undefined)\n const pendingRevisionRef = useRef<number | undefined>(undefined)\n const busyRouteRef = useRef<string | null>(null)\n const abortRef = useRef<AbortController | null>(null)\n draftsRef.current = drafts\n\n const applyDrafts = (next: RouteDraft[] | ((current: RouteDraft[]) => RouteDraft[])): void => {\n const resolved = typeof next === 'function' ? next(draftsRef.current) : next\n draftsRef.current = resolved\n setDrafts(resolved)\n }\n\n const snapshotMode = (): LoadDraftsMode => (\n describe === undefined || describe.getSnapshot().status === 'idle' ? 'ensure' : 'snapshot'\n )\n\n const beginGeneration = (): { generation: number; signal: AbortSignal } => {\n abortRef.current?.abort()\n const abort = new AbortController()\n abortRef.current = abort\n return { generation: nextGeneration(generationRef), signal: abort.signal }\n }\n\n const failGeneration = (generation: number, failure: unknown): void => {\n if (!generationIsCurrent(generationRef, generation)) return\n setStatus('error')\n setError(failure instanceof Error ? failure.message : t('loadError'))\n }\n\n const settleReload = (\n generation: number,\n preserveDirty: boolean,\n result: Awaited<ReturnType<typeof loadDrafts>>,\n ): void => {\n if (!generationIsCurrent(generationRef, generation)) return\n setWritable(result.writable)\n setFormats(result.formats)\n if (result.error !== undefined) {\n setStatus('error')\n setError(result.error)\n return\n }\n const merged = mergeLoadedDrafts(draftsRef.current, result.drafts, { preserveDirty })\n applyDrafts(merged.drafts)\n setNotices(current => foldReloadNotices(current, {\n conflicted: merged.conflicted,\n conflictNotice: { kind: 'conflict', text: t('dirtyConflict') },\n liveProviders: merged.drafts.map(draft => draft.provider),\n }))\n setStatus('ready')\n }\n\n const loadSnapshotThenSettle = async (generation: number, preserveDirty: boolean): Promise<void> => {\n if (api === undefined || describe === undefined || schema === undefined) return\n if (!generationIsCurrent(generationRef, generation)) return\n try {\n const result = await loadDrafts(api, describe, schema, 'snapshot')\n settleReload(generation, preserveDirty, result)\n } catch (failure) {\n failGeneration(generation, failure)\n }\n }\n\n const reload = useCallback((preserveDirty: boolean, mode: LoadDraftsMode = 'ensure'): void => {\n if (api === undefined || describe === undefined || schema === undefined) {\n setStatus('error')\n setError(t('loadError'))\n return\n }\n const { generation } = beginGeneration()\n if (draftsRef.current.length === 0) setStatus('loading')\n setError('')\n void loadDrafts(api, describe, schema, mode).then((result) => {\n settleReload(generation, preserveDirty, result)\n }, (failure: unknown) => {\n failGeneration(generation, failure)\n })\n }, [api, describe, schema, t])\n\n const refreshAtRevision = useCallback((revision: number, preserveDirty: boolean): void => {\n if (api === undefined || describe === undefined || schema === undefined) return\n const { generation, signal } = beginGeneration()\n if (draftsRef.current.length === 0) setStatus('loading')\n setError('')\n void waitForNamespaceRevision(describe, LLM_PI_AI_NS, revision, signal).then((outcome) => {\n if (outcome === 'aborted' || !generationIsCurrent(generationRef, generation)) return\n return loadSnapshotThenSettle(generation, preserveDirty)\n }, (failure: unknown) => {\n failGeneration(generation, failure)\n })\n }, [api, describe, schema, t])\n\n const flushPendingSettings = (refresh: (revision: number, preserveDirty: boolean) => void): void => {\n const pending = pendingRevisionRef.current\n pendingRevisionRef.current = undefined\n if (pending === undefined) return\n if (isOwnDocumentEcho(echoedRevisionRef.current, pending)) return\n refresh(pending, true)\n }\n\n useEffect(() => { reload(false, 'ensure') }, [reload])\n useEffect(() => () => {\n abortRef.current?.abort()\n nextGeneration(generationRef)\n }, [])\n\n useEffect(() => {\n if (props.subscribeInvalidate === undefined) return undefined\n return props.subscribeInvalidate((event) => {\n if (event.source === 'writable') {\n const view = describe?.getSnapshot().view\n if (view !== undefined) setWritable(view.writable)\n return\n }\n if (event.source === 'settings') {\n if (busyRouteRef.current !== null) {\n pendingRevisionRef.current = event.revision\n return\n }\n if (isOwnDocumentEcho(echoedRevisionRef.current, event.revision)) return\n refreshAtRevision(event.revision, true)\n return\n }\n if (event.source === 'directory') reload(true, snapshotMode())\n if (event.source === 'reset') reload(true, 'ensure')\n })\n }, [describe, props.subscribeInvalidate, refreshAtRevision, reload])\n\n const patchNotice = (provider: string, notice: CardNotice | undefined): void => {\n setNotices(current => {\n const copy = { ...current }\n if (notice === undefined) delete copy[provider]\n else copy[provider] = notice\n return copy\n })\n }\n\n const save = async (draft: RouteDraft): Promise<void> => {\n if (api === undefined || describe === undefined || schema === undefined) return\n if (status === 'loading' || busyRouteRef.current !== null) {\n patchNotice(draft.provider, { kind: 'error', text: t('saveBusy') })\n return\n }\n const blocking = draft.models\n .map(row => errorText(modelEffortError(row), t))\n .find(text => text !== undefined)\n if (blocking !== undefined) {\n patchNotice(draft.provider, { kind: 'error', text: blocking })\n return\n }\n busyRouteRef.current = draft.provider\n setBusyRoute(draft.provider)\n patchNotice(draft.provider, undefined)\n try {\n const ops = buildSaveOps({\n settingsPath: draft.settingsPath,\n beforeModels: draft.originalModels,\n afterModels: draft.models,\n beforeCompat: draft.compatPresent ? draft.originalCompat : undefined,\n afterCompat: draft.compat,\n })\n if (ops.length === 0) {\n applyDrafts(current => current.map(row => row.provider === draft.provider ? alignDraft(row) : row))\n return\n }\n const willWriteCompat = ops.some(op => (\n op.path.length > draft.settingsPath.length && op.path[draft.settingsPath.length] === 'compat'\n ))\n const pi = describe.getSnapshot().view?.namespaces.find(view => view.ns === LLM_PI_AI_NS)\n if (pi !== undefined) {\n let root: unknown\n try {\n root = schema.rehydrate(pi.schema)\n } catch {\n root = undefined\n }\n if (root !== undefined) {\n const schemaError = validateSaveDraft(\n schema,\n root,\n draft.settingsPath,\n draft.models,\n draft.compat,\n willWriteCompat,\n )\n if (schemaError !== undefined) {\n patchNotice(draft.provider, { kind: 'error', text: schemaError })\n return\n }\n }\n }\n const response = await api.settings.mutate({\n ns: LLM_PI_AI_NS,\n ops,\n expectedRevision: draft.revision,\n })\n if (!response.result.ok) {\n const conflict = response.result.error.code === 'settings-conflict'\n patchNotice(draft.provider, {\n kind: conflict ? 'conflict' : 'error',\n text: conflict ? t('conflict') : response.result.error.message,\n })\n if (conflict) {\n const { generation, signal } = beginGeneration()\n void waitForNamespaceRevisionChange(describe, LLM_PI_AI_NS, draft.revision, signal).then((outcome) => {\n if (outcome === 'aborted' || !generationIsCurrent(generationRef, generation)) return\n return loadSnapshotThenSettle(generation, true)\n }, (failure: unknown) => {\n failGeneration(generation, failure)\n })\n }\n return\n }\n const view = response.result.value\n echoedRevisionRef.current = view.revision\n describe.acceptView(view)\n applyDrafts(applySaveSuccess(draftsRef.current, draft.provider, {\n user: view.user ?? {},\n revision: view.revision,\n }))\n patchNotice(draft.provider, { kind: 'saved', text: t('saved') })\n } catch (failure) {\n patchNotice(draft.provider, {\n kind: 'error',\n text: failure instanceof Error ? failure.message : t('loadError'),\n })\n } finally {\n busyRouteRef.current = null\n setBusyRoute(null)\n flushPendingSettings(refreshAtRevision)\n }\n }\n\n const showLoading = status === 'loading' && drafts.length === 0\n const showEmpty = status === 'ready' && drafts.length === 0\n const showList = drafts.length > 0\n const hasCardFailure = Object.values(notices).some(\n notice => notice.kind === 'conflict' || notice.kind === 'error',\n )\n const showReload = status === 'error' || hasCardFailure || showEmpty || !writable || status === 'loading' || showList\n\n return (\n <div className={css.section}>\n <h2 className={css.title}>{t('title')}</h2>\n <p className={css.intro}>{t('intro')}</p>\n {!writable && status === 'ready' ? <p className={css.notice}>{t('readOnly')}</p> : null}\n {showLoading ? <p className={css.intro}>{t('loading')}</p> : null}\n {status === 'error' ? <p className={css.error}>{error}</p> : null}\n {showReload\n ? (\n <button type=\"button\" className={css.secondaryButton} onClick={() => { reload(true, snapshotMode()) }}>{t('reload')}</button>\n )\n : null}\n {showEmpty\n ? (\n <>\n <p className={css.notice}>{t('empty')}</p>\n <p className={css.intro}>{t('emptyHint')}</p>\n </>\n )\n : null}\n {showList\n ? (\n <ul className={css.rows}>\n {drafts.map(draft => (\n <RouteCard\n key={draft.provider}\n draft={draft}\n formats={formats.length > 0 ? formats : []}\n writable={writable}\n busy={busyRoute === draft.provider}\n saveLocked={!writable || busyRoute !== null || status === 'loading'}\n notice={notices[draft.provider]}\n t={t}\n onChange={(next) => {\n patchNotice(next.provider, undefined)\n applyDrafts(current => current.map(row => row.provider === next.provider ? next : row))\n }}\n onSave={(next) => { void save(next) }}\n onCancel={(next) => {\n patchNotice(next.provider, undefined)\n applyDrafts(current => current.map(row => row.provider === next.provider\n ? {\n ...row,\n models: cloneModels(row.originalModels),\n compat: cloneObject(row.originalCompat),\n }\n : row))\n }}\n />\n ))}\n </ul>\n )\n : null}\n <p className={css.footer}>{PLUGIN_FOOTER_TEXT}</p>\n </div>\n )\n}\n","/**\n * Dictionary namespace for the effort-declare settings section.\n */\n\nexport type EffortDeclareKey =\n | 'nav'\n | 'title'\n | 'intro'\n | 'empty'\n | 'emptyHint'\n | 'loadError'\n | 'loading'\n | 'readOnly'\n | 'save'\n | 'saving'\n | 'saveBusy'\n | 'cancel'\n | 'saved'\n | 'conflict'\n | 'dirtyConflict'\n | 'presets'\n | 'presetDeepSeek'\n | 'presetOpenAI'\n | 'presetToggle'\n | 'presetToggleWarn'\n | 'model'\n | 'levels'\n | 'wire'\n | 'offMode'\n | 'offAbsent'\n | 'offEmpty'\n | 'offValue'\n | 'offValuePlaceholder'\n | 'clear'\n | 'advanced'\n | 'thinkingFormat'\n | 'thinkingFormatDefault'\n | 'supportsDeveloperRole'\n | 'supportsReasoningEffort'\n | 'developerTrueHint'\n | 'compatSummary'\n | 'errorEmpty'\n | 'errorOffOnly'\n | 'errorBadWire'\n | 'noModels'\n | 'reload'\n\nexport const NS = 'plugin-effort-declare'\n\nexport const zh: Record<EffortDeclareKey, string> = {\n nav: '推理档位',\n title: '推理档位声明',\n intro: '本页声明「这模型能选哪些推理档」。对话里的档位选择仍在输入框模型菜单。没声明 = 和现在一样没有 Effort 行。不会改密钥、目录或当次选择。',\n empty: '没有可编辑的手工 openai-completions 路由。',\n emptyHint: '请先到「模型」页添加提供方(llm-pi-ai 手工路由)。官方 DeepSeek 与 catalog 路由不在本页编辑。需要 DSH ≥ 0.1.0-rc.8(providers.declared)。',\n loadError: '无法加载提供方或设置。',\n loading: '正在加载…',\n readOnly: '当前设置为只读,无法保存。',\n save: '保存',\n saving: '保存中…',\n saveBusy: '另有路由正在保存,请稍候。',\n cancel: '取消',\n saved: '已保存。对话选择器会按新的能力声明显示 Effort 行。',\n conflict: '设置已被其他地方改过,请重新加载后再保存。',\n dirtyConflict: '此路由有未保存修改,设置已在其他地方更新。保存会写到最新文档上,或先取消再改。',\n presets: '预设',\n presetDeepSeek: 'DeepSeek 兼容',\n presetOpenAI: 'OpenAI 兼容',\n presetToggle: '仅开/关',\n presetToggleWarn: '选择器里多档在线上没有区别:除 Off 外请求体相同。',\n model: '模型',\n levels: '可选档位',\n wire: '线上拼写',\n offMode: 'Off',\n offAbsent: '无 Off',\n offEmpty: 'Off 且不发参数',\n offValue: 'Off 且发字符串',\n offValuePlaceholder: 'none',\n clear: '清除本模型声明',\n advanced: '高级:协议方言',\n thinkingFormat: 'thinkingFormat',\n thinkingFormatDefault: '默认(省略该键)',\n supportsDeveloperRole: '系统提示走 system 而不是 developer(supportsDeveloperRole: false)',\n supportsReasoningEffort: '不发 reasoning_effort,只发开关(supportsReasoningEffort: false)',\n developerTrueHint: '当前文档是 supportsDeveloperRole: true。v1 只能强制 false 或缺席;勾选会写成 false,取消勾选会删除该键。',\n compatSummary: '协议',\n errorEmpty: '不能保存空的 reasoningEfforts。请选择档位,或清除声明。',\n errorOffOnly: '不能只开 Off,必须再开一档思考档。',\n errorBadWire: '思考档必须填写线上拼写;只有 Off 可以留空。不能使用未知档位键。',\n noModels: '这条路由还没有 models 列表。请先到「模型」页添加模型。',\n reload: '重新加载',\n}\n\nexport const en: Record<EffortDeclareKey, string> = {\n nav: 'Reasoning efforts',\n title: 'Reasoning effort declarations',\n intro: 'This page declares which reasoning levels a model can offer. The per-turn choice stays in the composer model menu. Undeclared models keep having no Effort row. Keys, catalogs, and the current selection are not edited here.',\n empty: 'No editable hand-declared openai-completions routes.',\n emptyHint: 'Add a provider on the Models page first (an llm-pi-ai hand-declared route). Official DeepSeek and catalog routes are not edited here. Requires DSH ≥ 0.1.0-rc.8 (providers.declared).',\n loadError: 'Could not load providers or settings.',\n loading: 'Loading…',\n readOnly: 'Settings are read-only; saving is disabled.',\n save: 'Save',\n saving: 'Saving…',\n saveBusy: 'Another route is saving. Wait, then save this card.',\n cancel: 'Cancel',\n saved: 'Saved. The composer Effort row follows this capability declaration.',\n conflict: 'Settings changed elsewhere. Reload, then save again.',\n dirtyConflict: 'This route has unsaved edits and settings changed elsewhere. Save writes onto the latest document, or cancel first.',\n presets: 'Presets',\n presetDeepSeek: 'DeepSeek compatible',\n presetOpenAI: 'OpenAI compatible',\n presetToggle: 'On/off only',\n presetToggleWarn: 'Multiple selector levels are identical on the wire except Off.',\n model: 'Model',\n levels: 'Offered levels',\n wire: 'Wire spelling',\n offMode: 'Off',\n offAbsent: 'No Off',\n offEmpty: 'Off, send nothing',\n offValue: 'Off, send a string',\n offValuePlaceholder: 'none',\n clear: 'Clear this model’s declaration',\n advanced: 'Advanced: protocol dialect',\n thinkingFormat: 'thinkingFormat',\n thinkingFormatDefault: 'Default (omit the key)',\n supportsDeveloperRole: 'Send system prompts as system, not developer (supportsDeveloperRole: false)',\n supportsReasoningEffort: 'Do not send reasoning_effort; switch only (supportsReasoningEffort: false)',\n developerTrueHint: 'The document has supportsDeveloperRole: true. v1 can only force false or omit the key; checking writes false, unchecking deletes the key.',\n compatSummary: 'Protocol',\n errorEmpty: 'Empty reasoningEfforts cannot be saved. Pick levels, or clear the declaration.',\n errorOffOnly: 'Off alone is not enough; declare at least one thinking level.',\n errorBadWire: 'Thinking levels need a wire spelling; only Off may be empty. Unknown effort keys are rejected.',\n noModels: 'This route has no models list yet. Add models on the Models page first.',\n reload: 'Reload',\n}\n","/**\n * dsh-plugin-effort-declare — browser half: settings.section for per-model\n * reasoning effort declarations.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-api-remotes/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport { EffortDeclareSection } from './EffortDeclareSection.tsx'\nimport type { EffortDeclareSectionInjected, Invalidation } from './EffortDeclareSection.tsx'\nimport { bindSchema } from './schema-ops.ts'\nimport { LLM_PI_AI_NS } from '../core/catalog.ts'\nimport { NS, en, zh, type EffortDeclareKey } from './locales.ts'\nimport { cssTagId, cssText } from './effort-declare.module.css'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Effort-declare settings section copy. */\n 'plugin-effort-declare': EffortDeclareKey\n }\n}\n\nexport const inject = ['slots', 'locale', 'connection', 'remote', 'settingsScope', 'settingsSchema']\n\nconst PLUGIN_ID = 'dsh-plugin-effort-declare'\n\nfunction mountPluginCss(): () => void {\n if (typeof document === 'undefined') return () => {}\n const selector = `style[data-plugin-css=${JSON.stringify(cssTagId)}]`\n let tag = document.querySelector(selector) as HTMLStyleElement | null\n if (tag === null) {\n tag = document.createElement('style')\n tag.dataset.plugin = PLUGIN_ID\n tag.dataset.pluginCss = cssTagId\n document.head.appendChild(tag)\n }\n tag.textContent = cssText\n return () => { tag?.remove() }\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), `${PLUGIN_ID}: dictionaries`)\n ctx.effect(() => mountPluginCss(), `${PLUGIN_ID}: css`)\n\n const connection = ctx.get('connection') as ConnectionHandle\n const settingsSchema = ctx.settingsSchema\n const schema = bindSchema({\n rehydrate: serialized => settingsSchema.rehydrate(serialized),\n nodeAtPath: (root, path) => settingsSchema.nodeAtPath(\n root as Parameters<typeof settingsSchema.nodeAtPath>[0],\n path,\n ),\n getPath: (value, path) => settingsSchema.getPath(value, path),\n hasPath: (value, path) => settingsSchema.hasPath(value, path),\n validate: (node, draft) => settingsSchema.validate(\n node as Parameters<typeof settingsSchema.validate>[0],\n draft,\n ),\n })\n const t = ctx.locale.bind(NS)\n const describe = ctx.settingsScope.describe()\n const invalidation = new Set<(event: Invalidation) => void>()\n\n ctx.effect(() => {\n const emit = (event: Invalidation) => {\n for (const listener of invalidation) listener(event)\n }\n // Mirror subscribe fires on every namespace (theme, locale, own acceptView).\n // Only fold writable from that. llm-pi-ai document changes come from\n // settings/document-updated; the section waits until the mirror revision\n // has caught up instead of calling ensure(), and skips the echo of its\n // own mutate. connection/reset uses ensure() so an in-flight load is awaited.\n const disposers = [\n describe.subscribe(() => { emit({ source: 'writable' }) }),\n ctx.remote.$on('settings/document-updated', (ns: string, revision: number) => {\n if (ns !== LLM_PI_AI_NS) return\n emit({ source: 'settings', revision })\n }),\n ctx.remote.$on('llm/adapters-updated', () => { emit({ source: 'directory' }) }),\n ctx.on('connection/reset', () => { emit({ source: 'reset' }) }),\n ]\n return () => {\n for (const dispose of disposers) dispose()\n }\n }, `${PLUGIN_ID}: invalidations`)\n\n const subscribeInvalidate: EffortDeclareSectionInjected['subscribeInvalidate'] = (listener) => {\n invalidation.add(listener)\n return () => { invalidation.delete(listener) }\n }\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'effort-declare',\n order: 12,\n label: () => t('nav'),\n locale: NS,\n inject: (): EffortDeclareSectionInjected => ({\n api: connection.api,\n describe,\n schema,\n subscribeInvalidate,\n }),\n }, EffortDeclareSection))\n}\n"],"mappings":"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"}
|
|
@@ -7,12 +7,22 @@ import type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client';
|
|
|
7
7
|
import type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client';
|
|
8
8
|
import { type SchemaOps } from './schema-ops.ts';
|
|
9
9
|
import type { EffortDeclareKey } from './locales.ts';
|
|
10
|
-
export type InvalidationSource = 'settings' | 'directory' | 'writable';
|
|
10
|
+
export type InvalidationSource = 'settings' | 'directory' | 'reset' | 'writable';
|
|
11
|
+
export type Invalidation = {
|
|
12
|
+
source: 'writable';
|
|
13
|
+
} | {
|
|
14
|
+
source: 'directory';
|
|
15
|
+
} | {
|
|
16
|
+
source: 'reset';
|
|
17
|
+
} | {
|
|
18
|
+
source: 'settings';
|
|
19
|
+
revision: number;
|
|
20
|
+
};
|
|
11
21
|
export interface EffortDeclareSectionInjected {
|
|
12
22
|
api: Pick<IApiClient, 'settings' | 'llm'>;
|
|
13
23
|
describe: SettingsDescribeFace;
|
|
14
24
|
schema: SchemaOps;
|
|
15
|
-
subscribeInvalidate: (listener: (
|
|
25
|
+
subscribeInvalidate: (listener: (event: Invalidation) => void) => () => void;
|
|
16
26
|
}
|
|
17
27
|
export interface EffortDeclareSectionProps extends Partial<EffortDeclareSectionInjected> {
|
|
18
28
|
t: (key: EffortDeclareKey) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EffortDeclareSection.d.ts","sourceRoot":"","sources":["../../../src/client/EffortDeclareSection.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAA;
|
|
1
|
+
{"version":3,"file":"EffortDeclareSection.d.ts","sourceRoot":"","sources":["../../../src/client/EffortDeclareSection.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAA;AAmCtF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGpD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAA;AAEhF,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAA;IACzC,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,MAAM,EAAE,SAAS,CAAA;IACjB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CAC7E;AAED,MAAM,WAAW,yBAA0B,SAAQ,OAAO,CAAC,4BAA4B,CAAC;IACtF,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,MAAM,CAAA;IACpC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAyQ7C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,SAAS,CAuThF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-info.d.ts","sourceRoot":"","sources":["../../../src/client/build-info.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,QAI9B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAS3E,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,4CAA4C;QAC5C,uBAAuB,EAAE,gBAAgB,CAAA;KAC1C;CACF;AAED,eAAO,MAAM,MAAM,UAAiF,CAAA;AAkBpG,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAS3E,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,4CAA4C;QAC5C,uBAAuB,EAAE,gBAAgB,CAAA;KAC1C;CACF;AAED,eAAO,MAAM,MAAM,UAAiF,CAAA;AAkBpG,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAgE9C"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Load editable route drafts from llm.providers + the llm-pi-ai namespace.
|
|
3
3
|
* Drafts come from the user layer; route protocol classification may use effective value.
|
|
4
|
+
*
|
|
5
|
+
* First paint uses `ensure()` (idle-only). Refresh never calls `ensure()`:
|
|
6
|
+
* wait until the mirror subscribe shows a namespace revision at least as new
|
|
7
|
+
* as the Host event, then `getSnapshot()`. Own mutate echoes are identified
|
|
8
|
+
* by revision (including older delayed echoes), not ignored as a generic
|
|
9
|
+
* document-updated.
|
|
4
10
|
*/
|
|
5
11
|
import type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client';
|
|
6
12
|
import type { SettingsDescribeFace } from '@deepseek-ai/dsh-client-ui-settings/client';
|
|
@@ -12,12 +18,36 @@ export interface LoadDraftsResult {
|
|
|
12
18
|
drafts: RouteDraft[];
|
|
13
19
|
error?: string;
|
|
14
20
|
}
|
|
21
|
+
export type LoadDraftsMode = 'ensure' | 'snapshot';
|
|
22
|
+
type MirrorSnapshot = ReturnType<SettingsDescribeFace['getSnapshot']>;
|
|
23
|
+
type MirrorDescribe = Pick<SettingsDescribeFace, 'getSnapshot' | 'subscribe'>;
|
|
24
|
+
/** Namespace revision on a describe snapshot, if that row exists. */
|
|
25
|
+
export declare function namespaceRevision(snapshot: MirrorSnapshot, ns: string): number | undefined;
|
|
15
26
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
* True when `incoming` is the Host echo of a mutate this page already folded,
|
|
28
|
+
* or an older revision the snapshot has already passed. `echoed` is undefined
|
|
29
|
+
* until the first successful write.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isOwnDocumentEcho(echoed: number | undefined, incoming: number): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* After a preserve-dirty reload: conflicted cards get a conflict notice;
|
|
34
|
+
* live cards drop leftover conflict/error; saved notices stay; gone cards drop.
|
|
35
|
+
*/
|
|
36
|
+
export declare function foldReloadNotices<T extends {
|
|
37
|
+
kind: string;
|
|
38
|
+
}>(current: Record<string, T>, args: {
|
|
39
|
+
conflicted: readonly string[];
|
|
40
|
+
conflictNotice: T;
|
|
41
|
+
liveProviders: readonly string[];
|
|
42
|
+
}): Record<string, T>;
|
|
43
|
+
/** Resolve when the mirror's namespace revision is at least `revision`, or abort. */
|
|
44
|
+
export declare function waitForNamespaceRevision(describe: MirrorDescribe, ns: string, revision: number, signal?: AbortSignal): Promise<'matched' | 'aborted'>;
|
|
45
|
+
/** Resolve when the namespace revision differs from `previous`, or abort. */
|
|
46
|
+
export declare function waitForNamespaceRevisionChange(describe: MirrorDescribe, ns: string, previous: number, signal?: AbortSignal): Promise<'changed' | 'aborted'>;
|
|
47
|
+
/**
|
|
48
|
+
* `ensure`: first paint / idle recovery (official ensure only reads from idle).
|
|
49
|
+
* `snapshot`: refresh after the mirror revision already moved — do not ensure.
|
|
21
50
|
*/
|
|
22
|
-
export declare function loadDrafts(api: Pick<IApiClient, 'llm'>, describe: Pick<SettingsDescribeFace, 'ensure' | 'getSnapshot'>, schema: SchemaOps): Promise<LoadDraftsResult>;
|
|
51
|
+
export declare function loadDrafts(api: Pick<IApiClient, 'llm'>, describe: Pick<SettingsDescribeFace, 'ensure' | 'getSnapshot'>, schema: SchemaOps, mode?: LoadDraftsMode): Promise<LoadDraftsResult>;
|
|
52
|
+
export {};
|
|
23
53
|
//# sourceMappingURL=load-drafts.d.ts.map
|